制作和增量构建

时间:2011-12-29 03:13:59

标签: c makefile environment

我在想......

当您对file1.cfile2.cfile1.h进行更改时,以下makefile仅重新编译所需内容(这很好)

# Link to executable
result: file1.o file2.o
    gcc file1.o file2.o -o result23

# Assemble to .o object files
file1.o:    file1.s
    gcc -c dist/file1.s

file2.o:    file2.s
    gcc -c dist/file2.s

# Compile to .s assembly files
file1.s:    file1.c
    gcc -S file1.c

file2.s:    file2.c
    gcc -S file2.c

但是,当我将构建的对象移动到另一个目录时,无论是否只更改了1个文件的内容,所有内容都会一直重建。

# Link to executable
result: file1.o file2.o
    gcc file1.o file2.o -o result23

# Assemble to .o object files
file1.o:    file1.s
    gcc -c dist/file1.s
    mv file1.o dist

file2.o:    file2.s
    gcc -c dist/file2.s
    mv file2.o dist

# Compile to .s assembly files
file1.s:    file1.c
    gcc -S file1.c
    mv file1.s dist

file2.s:    file2.c
    gcc -S file2.c
    mv file2.s dist

似乎发生了这种情况,因为make不知道.o文件在其环境中的位置。

有几个问题:

  • 可以访问环境变量吗?如果是这样,你能提供一个例子吗?
  • 当分发目录与当前目录不同时,是否可以了解增量构建?

2 个答案:

答案 0 :(得分:5)

要修复您的构建,您需要执行以下操作:

# Link to executable
result: dist/file1.o dist/file2.o
    gcc dist/file1.o dist/file2.o -o result

# Assemble to .o object files in main directory
dist/file1.o:    dist/file1.s
    gcc -c dist/file1.s -o dist/file1.o

dist/file2.o:    dist/file2.s
    gcc -c dist/file2.s -o dist/file2.o

# Compile to .s assembly files
dist/file1.s:    file1.c
    gcc -S file1.c -o dist/file1.s

dist/file2.s:    file2.c
    gcc -S file2.c -o dist/file2.s

你当然可以在make中使用环境变量..虽然我不确定这与你的问题的核心有什么关系:只需使用这样的东西,设置BUILDDIR和OBJDIR并有一个像这样的makefile:

$(BUILDDIR)/foo : $(OBJDIR)/bar.o
   g++ $(OBJDIR)/bar.o -o $(BUILDDIR)/foo

虽然你可以使用automatic variables来改善这个(以及我的固定makefile):

$(BUILDDIR)/foo : $(OBJDIR)/bar.o
  g++ $? -o $@

答案 1 :(得分:1)

1,您可以像任何其他变量一样访问您的环境变量;例如,$(TERM)

2,只需更改您的make目标以包含目标目录:

 dist/file1.o:    file1.s
      gcc -c dist/file1.s -o $@

其中$@是表示目标的隐式变量,在此示例中为dist/file1.o