2012-10-11 42 views
0

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

我想要做的是为第二个模型使用不同的文件夹,因此它存储* .d和* .o文件的单独副本。我不必“干净”,只重新编译更改的源代码。我研究过makefile的语法,并且对于Linux来说是新手,只能在这些东西的神秘性质上搔头。

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

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

+2

显示您尝试的'Makefile'-s的相关规则。 –

+0

如果你向我们展示了你的目录结构和makefile,那真的会有所帮助。否则,我们所能做的最好的是提供高水平的建议,您可能会发现难以实施。 – Beta

回答

0

你可以将你的源文件编译成不同目录中的目标文件(“文件夹”在Unix上并不是真正适合的文字)。您只需设置适当的make规则。你可能会使用其他制造商一样omakescons,...

你可以使用remake调试你的GNU Makefile -s。你可以像

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
     $(COMPILE.c) -c $^ -o [email protected] 

的规则内,你可以(在你的前面Makefile)与例如设置的变量

OBJDIR:=obj-$(shell uname -m) 

或更好的东西

我建议阅读GNU make的manual;它有一个makefile的介绍。

+0

如果我只是创建一个简单的makefile(目前称为'test'),将源文件从model1目录更新到model2目录,我认为它会更容易。这是我的。它从'model2'目录运行。 \ *。c:../model1/\*.c cp $ <$ @我正在用'make -f test -n'来测试它,所以它实际上并没有做任何事情,只是告诉我结果。它只显示第一个更改的文件,而不是所有更改的文件。 (注意:两个空格不能用作换行符。) – pwrgreg007

+0

\ *。c:../model1/\*.c cp $ <$ @ @不起作用。这看起来应该如何? – pwrgreg007

+0

在* make *规则中使用'%',而不是'*' –

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是目录,你希望有存储生成的文件变量的名称。这将检查对依赖关系的更改并在需要时重新编译。

如果您仍有问题,请回复并提供反馈意见,并尝试将您整理出来。

+0

如果我只是创建一个简单的makefile(目前称为'test'),将源文件从model1目录更新到model2目录,我认为它会更容易。 model2目录具有自己的makefile,专门用于构建此模型。这是我的。它从'model2'目录运行。 %.c:../model1/%.c cp $ < [email protected]我正在用'make -f test -n'来测试它,所以它实际上没有做任何事情,只是告诉我结果。它回复“make:*** no targets。Stop”。我已阅读了GNU Make文档,没有得到它。 (注意:两个空格不能用作换行符。) – pwrgreg007

+0

主持人:该线程是否可以删除?我原来的问题可能太模糊了,我从来没有得到我期待的答案。 – pwrgreg007

0

这可以通过makepp的存储库机制轻松实现。如果您拨打makepp -R../src ARCH=whatever,那么它将象征性地链接当前目录下../src的所有部分并在此编译。

你甚至可以创建一个文件.makepprc并放入特定于此体系结构的任何选项,以便您永远不会混淆哪个命令调用哪里。

如果您的不同体系结构具有相同的生成文件(如生成的源文件),您甚至可以在../src中构建,而其他体系结构将挑选与当前编译选项无关的所有内容。

makepp还有很多。除了几乎所有的GNU make功能之外,还有更多有用的东西,甚至可以用一些Perl编程扩展makefile。

相关问题