Gnu Make:如何处理子项目
Gnu Make: how to handle sub-projects
ProjFolder
Subfolder
sources.cpp
makefile
makefile
Subfolder
应该是一个单独的外部存储库,在签出项目时拉入。当我调用make all
到顶级生成文件时,将执行以下配方:
all: $(NAME).elf $(NAME).s19 $(NAME).hex
$(NAME).elf: $(OBJECTS) $(LDSCRIPT) Subfolder/lib.a
make -C CppAudioPeriphs all
@ echo "...linking"
$(CC) $(OBJECTS) Subfolder/lib.a $(LDFLAGS) $(LIBS) -o $@
如您所见,如果Subfolder
的最终产品 - 文件lib.a
被更改,则会调用Subfolder
makefile以重新制作它,然后所有产品都将链接到最终的Flash映像中。
问题是顺序。我想总是首先调用子生成文件。它知道何时以及如何重制lib.a
.然后检查lib.a
是否被修改以确定是否重新制作$(NAME).elf。
这是一个解决方案。
.PHONY all $(NAME).elf
这只是指示make
无论如何都要重制$(NAME).elf。我过去曾将此解决方案用于小型项目,但对于当前的项目,这是不可接受的。
正如MadScientist(以及谁更好)指出的那样,我错过了这个问题的明显解决方案。
解决方案是FORCE
始终尝试Subfolder/lib.a
目标。只要Subfolder
makefile只更新lib.a
当某些东西发生了变化时,其余的就会正确消失。
因此,您需要为Subfolder/lib.a
目标提供以下内容。其余的可以保持原样。如前所述,这里的诀窍是,您可以强制 make 运行Subfolder/lib.a
目标本身,但如果文件Subfolder/lib.a
时间戳没有更改,则不需要重新生成Subfolder/lib.a
列为先决条件的内容。
FORCE: ;
Subfolder/lib.a: FORCE
$(MAKE) -C $(@D) target-to-build-lib.a*
你可以尝试把你的东西放在一个子文件夹中(例如Mystuff),它有自己的makefile。然后,您可以按照以下行编写顶级生成文件
all: Mystuff
Mystuff: Subfolder
Subfolder Mystuff:
${MAKE} -C $@
但是,递归使被认为是有害的:)
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 如何使用自动工具处理子项目
- Gnu Make:如何处理子项目