Невозможно присвоить переменную внутри рецепта

Как мне заставить это работать? Выдает ошибку "make: somevariable: Command not found".

sometarget:
    somevariable = somevalue

Полный пример:

CXXFLAGS = -I/usr/include/test -shared -fPIC

OBJ = main.o Server.o

blabla : $(OBJ) 
ifeq ($(argsexec),true) 
    # Creates an executable
    CXXFLAGS = -I/usr/include/test
    $(CXX) -o blabla $(OBJ) $(CXXFLAGS) 
else 
    # Creates a library
    DESTDIR = /home/pc
    $(CXX) -o blabla $(OBJ) $(CXXFLAGS) 
    ./bn.sh
endif

person Blub    schedule 29.06.2011    source источник
comment
Вы нашли лучшее решение?   -  person Pritesh Acharya    schedule 13.11.2013
comment
См. Также stackoverflow.com/questions / 1909188 /   -  person Alexey    schedule 17.03.2014
comment
Притеш: Теперь я использую систему сборки tup для всех моих проектов c / c ++. gittup.org/tup   -  person Blub    schedule 17.03.2014
comment
Возможный дубликат Определить переменную make во время выполнения правила   -  person Josip Rodin    schedule 16.06.2017


Ответы (2)


Я нашел решение, используя функцию eval:

$(eval variablename=whatever)

Это работает :)

(хотя теперь я могу попытаться найти более простую систему сборки;))

Спасибо всем за чтение и, конечно же, @eriktous за то, что написали!

person Blub    schedule 29.06.2011

Если вы напишете это так, как вы это сделали, назначение будет выполнено как команда оболочки, которая выдаст ошибку, которую вы получили.

Я бы попробовал организовать это примерно так:

CXXFLAGS = -I/usr/include/test
ifneq ($(argsexec),true) 
  CXXFLAGS += -shared -fPIC
  DESTDIR = /home/pc
endif

OBJ = main.o Server.o

blabla : $(OBJ) 
    $(CXX) -o blabla $(OBJ) $(CXXFLAGS) 
ifneq ($(argsexec),true) 
    ./bn.sh
endif

Это должно делать то, что вы хотите, хотя мне не очень нравится использовать конструкцию ifneq дважды. Мне пришлось бы больше подумать, чтобы придумать что-то, что бы этого избежать.

person eriktous    schedule 29.06.2011