无法在配方内分配变量

43

怎样让这个代码工作?它报错 "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

你找到更好的解决方案了吗? - Pritesh Acharya
1
请参见https://dev59.com/93I-5IYBdhLWcg3wVWvv。 - Alexey
1
Pritesh:我现在在所有的C/C++项目中都使用tup构建系统。http://gittup.org/tup/ - Blub
可能是[在规则执行时定义make变量]的重复问题。Define make variable at rule execution time - Josip Rodin
2个回答

81

我找到了一个使用eval函数的解决方案:

$(eval variablename=whatever)

这个可以运行 :)

(虽然我现在可能会尝试寻找一个更简单的构建系统 ;))

感谢大家阅读,当然也要感谢@eriktous的编写!


4
如果你像你那样编写,赋值将被执行为shell命令,这就是你收到的错误。
我会尝试组织类似这样的代码:
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结构。我需要更深入地思考才能想出避免这种情况的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接