LINUX.ORG.RU

Conditionals in makefile


0

1

Подскажите, пожалуйста, как вставлять условия в мейкфайлы? полинета перерыл — не нашел.... :( в смысле, те примеры что есть — не рабочие. даже с сайта gnu.org

Лови универсальный Makefile, будет компилировать всё - что есть в директории, хоть и тысячи файлов. И не надо будет притрагиваться к таргетам вообще:

------8<------

SOURCES.c := $(wildcard *.c)
CCFLAGS= -ansi -mno-cygwin
debug : CFLAGS = $(CCFLAGS) -g -Wall -Wundef -DAUDIT
pedantic : CFLAGS = $(CCFLAGS) -g -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
release : CFLAGS = $(CCFLAGS) -Wall -O2
#unit tests are here:
ut : CFLAGS = $(CCFLAGS) -g -DUNIT_TEST -DUTIL_UNIT_TEST
base64 : CFLAGS = $(CCFLAGS) -g -DUNIT_TEST -DBASE64_TEST
ut1 : CFLAGS = $(CCFLAGS) -g -DUNIT_TEST -DSOMETHING_ELSE

LFLAGS=-lm

CC=gcc
BIN=your_output
OBJS=$(SOURCES.c:.c=.o)
LINK=gcc $(CFLAGS)

.SUFFIXES:
.SUFFIXES: .d .o .h .c
.c.o: ; $(CC) $(CFLAGS) -MMD -c $*.c

.PHONY: clean

%.d: %.c
   @set -e; rm -f $@; \
   $(CC) -M $(CFLAGS) $< > $@.$$$$; \
   sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
   rm -f $@.$$$$

all release debug pedantic ut ut1: $(BIN)

$(BIN): $(OBJS)
   $(LINK) $(FLAGS) -o $(BIN) $(OBJS) $(LFLAGS)

clean:
   -rm -f $(BIN) $(OBJS) *.d

include $(sources:.c=.d)

------8<------


siberean ()
Ответ на: комментарий от siberean

я когда писал на си - только менял одно: название выходного файла.

Поменяй там на g++, свои юнит-тесты итд.

(просьба за стиль не пинать: взял самое простое что подвернулось. Считаю - чем проще оно - тем лучше)

siberean ()
Ответ на: комментарий от siberean

спасибо, конечно, но мне мейкфайл нужен в данном случае для других целей: в папке есть несколько самостоятельнх .tex файлов. их нужно скомпилить в пдфки и положить в другую папку.

TheWanderer ()
Ответ на: комментарий от TheWanderer

ну тогда ман «Makefile»,
первый в гугле:
http://www.opussoftware.com/tutorial/TutMakefile.htm

(условие начинается с новой строки, левая часть заканчивается ":", после - идут зависимости.
не оставляй «белых» символов итд, это всё описано в туториалах)

anonymous ()
Ответ на: комментарий от TheWanderer

ну как, вот же условия:

project.exe : main.obj io.obj
   tlink c0s main.obj io.obj, project.exe,, cs /Lf:\bc\lib

main.obj : main.c
   bcc –ms –c main.c

io.obj : io.c
   bcc –ms –c io.c


или в моём Makefile. Это же и есть условия. Только пишешь - что тебе надо сделать (вместо tlink и bcc - твой компилятор. Твои .tex будут будут и в виде аргументов, и как кондишены (что после чего).
Или я не правильно понял вопрос?

anonymous ()
Ответ на: комментарий от anonymous

сам Makefile - это же и есть правила, условия: что после чего делать (в строке с ":"). И как делать - например в следующей строке.

anonymous ()
Ответ на: комментарий от anonymous

да я знаю что такое мейкфайл и как с ним «бороться» :) проблема в том, что мейкфайл будет использоваться и под макосью и под линуксом. названия утилит разные — для макоси latex2pdf, а для линя — texi2pdf. вот и хочу поставить проверку на ось и в зависимости от оси вызывать нужную прогу

TheWanderer ()

Условия в makefile лучше не вставлять, ибо у всех диалектов make синтаксис разный. Лучше использовать cmake.

Reset ★★★★★ ()
Ответ на: комментарий от TheWanderer
$ cat Makefile 
OS = $(shell uname -s)

ifeq ($(OS),Linux)
        MESSAGE=Hello
else
        MESSAGE=Goodbye
endif

all:
        echo $(MESSAGE), World!

$ make
echo Hello, World!
Hello, World!
$

у вас там что, винда?

arsi ★★★★★ ()
Ответ на: комментарий от TheWanderer

ясно. во всём виновата кубунта, т.к. в убунте всё собирается точно так же, как в слаке (где и проверялся вышеприведённый код).

arsi ★★★★★ ()
Ответ на: комментарий от TheWanderer

а, значит кубунта здесь ни при чём? обидно :(

кстати, для таких случаев есть свой if, сейчас попробую вспомнить…

arsi ★★★★★ ()
Ответ на: комментарий от arsi

>а, значит кубунта здесь ни при чём? обидно :(

а чо это так? на много приятней чем убунта ;) кедытеперь торт ^^

TheWanderer ()
Ответ на: комментарий от true_admin

Что-то от анонима не запостилось, советую посмотреть на waf. В моем случае он значительно превзошел scons(надо было обрабатывать сишным препроцессором файлы фортрана, а потом компилировать + использовались директивы use и include[как написано в комментах к исходному коду scons, она не поддерживается полностью scons] ). Сразу заработали как надо mod файлы: фортран при компиляции файла может создавать несколько файлов .o и .mod(в итоге у меня получалось, что mod файлы генерировались в одной директории, а obj в другой). Говорят на больших проектах он существенно быстрее scons. Единственный недостаток, что почему-то он у меня не заработал на python 2.5, надо будет разбираться.

gameover__ ()
Ответ на: комментарий от gameover__

спасибо, гляну. Хотя, читая доки, выглядит она как-то совсем по-гиковски: самораспаковывающиеся скрипты, waf-lite, итд итп.

true_admin ★★★★★ ()
Ответ на: комментарий от gameover__

Смотрю, это вершина прогресса в системах сборки :). Спасибо за наводку, читаю waf book...

true_admin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.