我有一个Linux GNU C项目,需要为两个不同的硬件设备构建输出,使用通用的C源代码库,但不同的makefile。目前我在同一个文件夹中有两个makefile,每个设备一个,当我对代码进行更改时,我必须先做“make clean”来制作第一个模型,然后“make clean”来制作第二个模型。这是因为他们使用不同的编译器和处理器。即使代码文件没有改变,我也必须为其他设备重新编译它。
我想要做的是为第二个模型使用不同的文件夹,因此它会存储* .d和* .o文件的单独副本。我不必“干净”,只需重新编译已更改的源。我已经看过了makefile语法,并且对Linux不熟悉,只能抓住这些东西的神秘性。
我正在考虑的一种方法是更新.c& .h文件从model_1文件夹到model_2文件夹。有人能为我提供一个简单的makefile,它只会将较新的* .c和* .h文件从一个文件夹复制到另一个文件夹吗?
或者,必须有一种方法可以拥有一个公共源文件夹和单独的输出文件夹,因此不需要复制的源文件。任何帮助实现这一点是值得赞赏的。如果你想看看它们,我可以提供makefile。
答案 0 :(得分:0)
您可以将源文件编译为不同目录中的目标文件(“文件夹”在Unix上不是合适的单词)。您只需设置适当的make
规则即可。您可以使用其他构建器,例如omake,scons
,...
您可以使用remake调试GNU Makefile
- s。你可以拥有像
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(COMPILE.c) -c $^ -o $@
您可以使用例如
设置(Makefile
之前的)变量
OBJDIR:=obj-$(shell uname -m)
或更好的东西
我建议阅读GNU make的manual;它介绍了makefile。
答案 1 :(得分:0)
您希望生成的文件(对象和依赖项)在编译时为每个构建类型放入单独的文件夹中。以下是我可以为您做的事情:
$(PRODUCT1_OBJDIR)/%.o $(PRODUCT1_OBJDIR)/%.d: %.cpp
@mkdir -p $(@D)
$(CXX) $(PRODUCT1_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT1_OBJDIR)/$*.o
$(PRODUCT2_OBJDIR)/%.o $(PRODUCT2_OBJDIR)/%.d: %.cpp
@mkdir -p $(@D)
$(CXX) $(PRODUCT2_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT2_OBJDIR)/$*.o
$ PRODUCT1_OBJDIR和$ PRODUCT2_OBJDIR是您希望存储生成文件的目录的变量名称。这将检查依赖项的更改并在需要时重新编译。
如果您仍然遇到问题,请回复反馈意见,并尝试将您排除在外。
答案 2 :(得分:0)
使用makepp的存储库机制可以轻松实现这一点。如果你打电话给makepp -R../src ARCH=whatever
,它会象征性地链接当前目录下../src
的所有部分并在这里编译。
您甚至可以创建一个文件.makepprc
并输入特定于此体系结构的任何选项,因此您永远不会混淆哪个命令调用哪里。
如果您的不同架构具有相同的生成文件(如生成的源),您甚至可以构建../src
,而其他架构将获取所有不依赖于您当前编译选项的内容。
makepp还有很多。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。