使用Make将对象文件和依赖项移动到单独的文件夹中

时间:2016-05-18 02:40:48

标签: makefile

我有一系列源代码目录如下

main --- src1
       |-src2
       |-src3 

我的make系统会生成依赖文件(*.d)以及目标文件(*.o)。

使用以下代码生成dependacy文件。

%.d: %.c 
    @echo calculating dependencies for $*.o
    @if $(CC) $(CPPFLAGS) -MM -MG -MP -MT $*.o $< -MF temp.d; then \
      echo $@ "`cat temp.d`" >$@; \
      rm temp.d; \
    else \
      rm -f temp.d; \
      rm -f $@; \
      false; \
    fi;

我想将依赖项文件和目标文件移动到两个单独的文件夹objectsdependency

它们与主文件夹处于同一级别。如何使用Make子系统

执行此操作

1 个答案:

答案 0 :(得分:1)

你应该看看:

http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/

也许最好的方法是生成依赖文件作为编译的副作用,而不是以特定的规则显式生成它们,这样:

  • 您只需拨打gcc一次,而不是每个目标两次
  • 如果依赖项不存在,那意味着什么都没有构建,所以一切都将被构建,依赖在这个阶段是无用的
  • 在构建时,gcc -MMD将生成.d个文件
  • 使用.d制作包含所有-include个文件的内容,这样如果它们不存在就会发牢骚但如果它们存在则会读取
  • 简单的mv可以在编辑后随时移动它们。

所以我预先删除了你的%.d:%。c规则,删除了.d个文件的依赖关系,并且只包含了依赖项目录中的所有.d个文件。

我也会避免if; then; else; fi,只是做一个简单的事情:

gcc ... -MMD ...
cp ...

(将-MMD和其他依赖关系相关的标志放在像DEPFLAGS这样的变量中。)

如果gcc失败,cp将无法执行,则只会抱怨gcc失败并退出。

然后,要移动目标文件,那么简单:

place_where_you_want_your_obj_files/%.o: place_where_gcc_put_them/%.o
    mv $< $@