make: Изменить переменную в зависимости от выбранной цели

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)
Заранее спасибо за ответ

Olyalyau

 
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

Sebasten

У тебя точно так работает? У меня ошибка, что типа CFLAGS commnad not found

sevast82

Всё верно, в правилах сборки цели нельзя использовать присваивания переменным.
Задача автора решается разбором параметров команды make.

Olyalyau

Работает. Тогда export CFLAGS="..."; make all.

sevast82

А, понятно: у тебя CFLAGS=... входит в команду make, а , наверное, перенёс make на следующую строку.

Olyalyau

Нельзя говоришь?
А это как понимать:
 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 `...'

sevast82

Да я об этом и писал выше:
Можно написать, например, вот так: PROJECT_DIR=smth ./configure --prefix=...
В этом случае присваивание переменной входит в команду configure.
Такую хреновину можно написать в правиле сборки Makefile'а.
Такой случай ты и привёл в качестве примера.
Но нельзя написать в Makefile'е просто присваивание переменной:
my_target:
PROJECT_DIR=smth
$(GCC) ...
Вот это последнее - недопустимо.

Olyalyau

В таком смысле, конечно нельзя.

Sebasten

то есть вызывать так:
make debug CFLAGS='-g3 -O0 -Wall -c''
make reeas CFLAGS='-O3 -Wall -c''
никогда такого просто не видел, думаю что можно как-то и внутри поменять

ruler

Если ты ответы не будешь читать, вряд ли поможет тред.

sevast82

Да.
Смысл в том, что если присваивание переменной находится на одной строке с командой, то это всё воспринимается как единая команда, а в правиле сборки цели допустимы только команды.
Внутри тоже можно поменять:
Перед тем, как начинаются описания правил сборки, синтаксически допустимы и присваивания переменных, и команды. Поэтому до описания правил можешь проанализировать строку параметров, которую получила make, и в зависимости от целей, которые найдёшь в этой строке, выставляй переменные. В правилах тогда переменные вообще менять не нужно.
P.S. Как это всё осуществить, писать не буду, это уже RTFM.

Sebasten

Они очень быстро просто это всё написали, пока я свой коммент писал
Читаю, идею, кажись понял, всё равно пока не работает)

Sebasten

¡¡Вот он почти идеальный make файл!
Большое всем спасибо за помощь и поддержку

#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

shlyumper

¡¡Вот он почти идеальный make файл!
Проект automake можно отправлять на свалку?

Sebasten

Нет, нет, чтоты, ничего не имею против этих проектов)
Оставить комментарий
Имя или ник:
Комментарий: