与 Makefile 中的变量扩展混淆
Confusion with variable expansion in Makefile
我有以下催眠制作文件:
all: SOURCE = $(wildcard src/*.cpp)
unity: SOURCE = $(wildcard unity/*.cpp)
OBJECTS = $(SOURCE:.cpp=.o)
all: prog
unity: prog
prog: $(OBJECTS)
$(CXX) $(OBJECTS) -o prog
我需要根据初始目标使用不同的源文件/对象进行编译。在我看来,变量扩展在依赖项上发生的时间比在目标主体中发生的时间要早得多,因为上面的编译器命令可以使用正确的文件名调用,但是 prog 依赖项中的$OBJECTS仍然是空的,因此没有构建任何对象。
unity 文件夹包含一个组合的源文件,其中包含用于执行 Unity 构建的所有其他源文件。此 Unity 文件由 makefile 生成,但被省略了,实际上可能是多个 Unity 对象文件。
我的设计是失败的事业吗?我是否必须诉诸递归制作来实现这一点?
那样做。因为一般来说,可能需要构建多个目标。在命令行上,或作为中间目标。因此,设置变量将是模棱两可的。因此,目标特定变量的值"仅在目标命令脚本的上下文中可用(以及其他特定于目标的赋值)。(请参阅文件:make.info,节点:特定于目标)
但是你可以检查 MAKECMDGOALS变量。
您遇到的问题是,当生成文件被读取时,RULES(目标和依赖项列表)中的变量会扩展,而为目标设置的变量(如上面的$(SOURCES))仅在触发taget时设置。 这意味着特定于目标的变量仅在 ACTIONS 中有用,因为这是设置它们后唯一发生的事情。
综上所述,您可以通过递归调用 make 来获得所需的效果:
all:
$(MAKE) SOURCE="$(wildcard src/*.cpp)" prog
unity:
$(MAKE) SOURCE="$(wildcard unity/*.cpp)" prog
OBJECTS = $(SOURCE:.cpp=.o)
prog: $(OBJECTS)
$(CXX) $(OBJECTS) -o prog
.PHONY: all unity
但这不是我通常推荐的。
您不能根据执行的 make 目标使用$SOURCE来表示不同的事情。您可以在此处很好地了解生成文件解析:http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles
对于您的问题,您必须为每种类型的源文件定义不同的变量。例如:
all: SOURCE_ALL = $(wildcard src/*.cpp)
unity: SOURCE_UNITY = $(wildcard unity/*.cpp)
OBJECTS_ALL = $(SOURCE_ALL:.cpp=.o)
OBJECTS_UNITY = $(SOURCE_UNITY:.cpp=.o)
etc ...
- 扩展可变参数模板中的变量名称
- c++ 变量在宏的扩展中没有在这个范围内声明
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- PHP-CPP 扩展,它跨页面保留变量的值
- 如何将矢量大小扩展一个元素并用变量填充它
- QProcess::执行环境变量扩展字符串
- 如何使用静态变量,使用自定义Getter和设置器在SWIG中扩展结构
- 如何基于模板变量参数多次扩展语句
- 调试宏中的字符串变量扩展
- 生成文件 :从变量中按扩展名选择文件
- 如何在不扩展的情况下基于 RHIDE 中的环境变量添加包含目录
- 如何从 Python 扩展检查输入变量的有效性
- 与 Makefile 中的变量扩展混淆
- 如何在C++中扩展包含环境变量的路径
- 静态变量的参数包扩展
- 扩展QMessageBox类时,如何访问QMessageBoxPrivate中的标签变量
- C++在私有扩展后将变量变成公共变量
- 是否可以C++引用扩展到多个变量
- 未扩展常量引用变量的生存期
- 为什么包扩展变量不通过引用传递?