make: Изменить переменную в зависимости от выбранной цели
usage:
@echo 'Type "make debug" or "make release"'
all:
echo $$CFLAGS
release:
CFLAGS="-O3 -Wall -c -I$(BOOST)" make all
debug:
CFLAGS="-g3 -ggdb -O0 -fnoinline -Wall -c -I$(BOOST)" make all
У тебя точно так работает? У меня ошибка, что типа CFLAGS commnad not found
Задача автора решается разбором параметров команды make.
Работает. Тогда export CFLAGS="..."; make all.
А, понятно: у тебя CFLAGS=... входит в команду make, а , наверное, перенёс make на следующую строку.
А это как понимать:
bash-2.05b$ make release
CFLAGS="-O3 -Wall -c -I" make all
make[1]: Entering directory `...'
echo $CFLAGS
-O3 -Wall -c -I
make[1]: Leaving directory `...'
bash-2.05b$ make debug
CFLAGS="-g3 -ggdb -O0 -fnoinline -Wall -c -I" make all
make[1]: Entering directory `...'
echo $CFLAGS
-g3 -ggdb -O0 -fnoinline -Wall -c -I
make[1]: Leaving directory `...'
Можно написать, например, вот так: PROJECT_DIR=smth ./configure --prefix=...
В этом случае присваивание переменной входит в команду configure.
Такую хреновину можно написать в правиле сборки Makefile'а.
Такой случай ты и привёл в качестве примера.
Но нельзя написать в Makefile'е просто присваивание переменной:
my_target:
PROJECT_DIR=smth
$(GCC) ...
Вот это последнее - недопустимо.
В таком смысле, конечно нельзя.
make debug CFLAGS='-g3 -O0 -Wall -c''
make reeas CFLAGS='-O3 -Wall -c''
никогда такого просто не видел, думаю что можно как-то и внутри поменять
Если ты ответы не будешь читать, вряд ли поможет тред.
Смысл в том, что если присваивание переменной находится на одной строке с командой, то это всё воспринимается как единая команда, а в правиле сборки цели допустимы только команды.
Внутри тоже можно поменять:
Перед тем, как начинаются описания правил сборки, синтаксически допустимы и присваивания переменных, и команды. Поэтому до описания правил можешь проанализировать строку параметров, которую получила make, и в зависимости от целей, которые найдёшь в этой строке, выставляй переменные. В правилах тогда переменные вообще менять не нужно.
P.S. Как это всё осуществить, писать не буду, это уже RTFM.
Читаю, идею, кажись понял, всё равно пока не работает)
Большое всем спасибо за помощь и поддержку
#Compile only once, because it is need 6 minutes for this
#Boost library should be in include path's
BOOST = ../include/
LIBPATH = ../libs/
TARGET = libbgl-read.a
SOURCE = src/read_graphviz_spirit.cpp
OBJS = $(SOURCE:.cpp=.o)
ifneq $(findstring --unix,$(MAKEFLAGS
CC = g++
else
CC = cl.exe
endif
ifeq ($(MAKECMDGOALSdebug)
TESTVAR = Compilim debug
endif
ifeq ($(MAKECMDGOALSreleas)
TESTVAR = Compilim releas
endif
ifndef TESTVAR
#echo "Damn you";
#exit(1);
endif
ifeq ($(CCg++)
CFLAGS = -Wall -c -fmessage-length=0 -ftemplate-depth-50 -I$(BOOST)
else
#echo "cl.exe has very complicated flags, please take care about them yourself"
#exit(1)
endif
DEBUG_EXTRAFLAGS = -g3 -O0
RELEAS_EXTRAFLAGS = -O3
AR = ar
#############
pathsearch = $(firstword $(wildcard $(addsuffix /$(1$(subst :, ,$(PATH
LS := $(call pathsearch,ls)
####################
debug: CFLAGS += $(DEBUG_EXTRAFLAGS)
debug: $(TARGET)
echo $(TESTVAR);
echo Compiler was $(CC)
releas: CFLAGS += $(RELEAS_EXTRAFLAGS)
releas: $(TARGET)
echo $(TESTVAR)
$(TARGET): $(OBJS)
$(AR) -rc -o libbgl-read.a $(OBJS)
cp libbgl-read.a $(LIBPATH)
%.o : %.cpp
$(CC) $(CFLAGS) -o $@ $<
clean:
rm -f $(OBJS) libbgl-read.a
¡¡Вот он почти идеальный make файл!Проект automake можно отправлять на свалку?
Нет, нет, чтоты, ничего не имею против этих проектов)
Оставить комментарий
Sebasten
Как сделать так:make debug
чудесным образом
CFLAGS = -g3 -Wall -c -I$(BOOST)
make releas
CFLAGS = -O3 -Wall -c -I$(BOOST)
Что-то типа этого
########################################debug: set_debug_flags $(TARGET)
set_debug_flags:?
releas: set_releas_flags $(TARGET)
set_releas_flags:
echo "Quero que: CFLAGS = -O3 -Wall -c -I$(BOOST)"
$(TARGET): src/read_graphviz_spirit.cpp
$(CC) -o read_graphviz_spirit.o $(CFLAGS) src/read_graphviz_spirit.cpp
$(AR) -rc -o libbgl-read.a read_graphviz_spirit.o
ln -s libbgl-read.a $(LIBSPATH)
Заранее спасибо за ответ