在Linux中使用makefile将源文件更新到不同的文件夹

时间:2012-10-11 17:36:54

标签: c linux compilation makefile gnu

我有一个Linux GNU C项目,需要为两个不同的硬件设备构建输出,使用通用的C源代码库,但不同的makefile。目前我在同一个文件夹中有两个makefile,每个设备一个,当我对代码进行更改时,我必须先做“make clean”来制作第一个模型,然后“make clean”来制作第二个模型。这是因为他们使用不同的编译器和处理器。即使代码文件没有改变,我也必须为其他设备重新编译它。

我想要做的是为第二个模型使用不同的文件夹,因此它会存储* .d和* .o文件的单独副本。我不必“干净”,只需重新编译已更改的源。我已经看过了makefile语法,并且对Linux不熟悉,只能抓住这些东西的神秘性。

我正在考虑的一种方法是更新.c& .h文件从model_1文件夹到model_2文件夹。有人能为我提供一个简单的makefile,它只会将较新的* .c和* .h文件从一个文件夹复制到另一个文件夹吗?

或者,必须有一种方法可以拥有一个公共源文件夹和单独的输出文件夹,因此不需要复制的源文件。任何帮助实现这一点是值得赞赏的。如果你想看看它们,我可以提供makefile。

3 个答案:

答案 0 :(得分:0)

您可以将源文件编译为不同目录中的目标文件(“文件夹”在Unix上不是合适的单词)。您只需设置适当的make规则即可。您可以使用其他构建器,例如omakescons,...

您可以使用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。