强制makefile两次构建源代码

时间:2012-04-18 07:25:44

标签: c++ makefile

我有以下makefile:

all: a.out b.out
.PHONY: gen_hdr1
gen_hdr1:
    #call script 1 that generates x.h
    rm a.o #try to force rebuild of a.cpp

.PHONY: gen_hdr2
gen_hdr2:
    #call script 2 that generates x.h
    rm a.o #try to force rebuild of a.cpp

b.out: gen_hdr2 a.o
    g++ -o b.out a.o

a.out: gen_hdr1 a.o
    g++ -o a.out a.o
*.o : *.cpp
    g++ -c $< -o $@

a.cpp includex x.h

我想做什么:

  1. 如果存在则删除a.o
  2. 为App A生成x.h
  3. 编译a.cpp
  4. 构建App A
  5. 如果存在则删除a.o
  6. 为App B生成x.h
  7. 再次编译a.cpp
  8. 构建App B
  9. 运行makefile的输出是:

    #call script 1 that generates x.h
    rm -f a.o #try to force rebuild of a.cpp
    g++    -c -o a.o a.cpp
    g++ -o a.out a.o
    #call script 2 that generates x.h
    rm -f a.o #try to force rebuild of a.cpp
    g++ -o b.out a.o
    g++: a.o: No such file or directory
    g++: no input files
    make: *** [b.out] Error 1
    

    基本上,在构建App B时找不到a.o. 如何强制make系统重建它?

1 个答案:

答案 0 :(得分:2)

对于这类问题的良好解决方案是使用单独的构建对象文件夹,每个目标还有一个子文件夹。

所以你会有类似的东西:

build/first/a.o: src/a.cpp gen/a.h
    # Do you stuff in here
gen/a.h:
    # Generate you .h file if needed

build/second/a.o: src/a.cpp gen/a.h
    # Same thing

使用此解决方案,您将在build文件夹中拥有所有构建对象,因此clean命令更简单:

clean:
    rm -rf build/*
    rm -rf gen/*
    rm -rf bin/*

你应该确保唯一的事情就是在构建之前存在目录,但这不是一件可行的工作:)

如果你必须生成两个版本的a.h,你可以使用相同的设计(gen / first&amp; gen / second文件夹)。

希望它有所帮助,告诉我,如果我错过了什么