makepp 关键字介绍参考这里。
makepp介绍参考这里。
makepp之所以称为makepp,是因为其针对C++设计了特定的支持,比如支持自动将cpp file include的头文件作为该cpp文件的依赖,换言之如果该头文件是需要用脚本来生成的话,cpp文件在被编译之前,调用脚本生成该头文件的目标-依赖-命令 块会得到执行,参考这里和这里:“automatic scanning for include files”。
makepp之于make,有点儿类似于CPP之于C,makepp几乎100%兼容make,只是在make的基础上增加了一些新的特性来方便使用。
考虑一个场景,某些cpp文件是通过脚本生成的,并且生成的文件数目还很多,所以想用$(wildcard )来模糊匹配出生成的所有cpp文件,想用make/makepp来构建工程。
Linux 实验环境如下:
make版本: /home/utils/make-3.81/bin/make
makepp版本: /home/utils/makepp-2.0/bin/makepp
main.cpp
#include
using namespace std;
int main() {
cout << "hello world" << endl;
}
### gen.sh
#!/bin/bash
mkdir gen
cd gen
echo "" > a.cpp
echo "" > b.cpp
gen:
gen.sh
CPPFILES = main.cpp
CPPFILES += $(wildcard gen/*.cpp)
main : $(CPPFILES)
@echo CPPFILES = $(CPPFILES)
@echo folder = $(folder)
/home/utils/gcc-5.2.0/bin/g++ $(CPPFILES) -o main
$(phony clean):
rm -rf gen main
$ makepp main
makepp: Loading makefile /home/<…>/File/cpp/makepp/Makeppfile
makepp: Entering directory /home/<…>/File/cpp/makepp
CPPFILES = main.cpp
folder =
/home/utils/gcc-5.2.0/bin/g++ main.cpp -o main
makepp: 1 file updated and 0 phony targets built
可以看到a.cpp和b.cpp 并没有被编译。这主要是因为求CPPFILES这个变量的值的时候,gen这个target还没有被执行(在本例中其压根不会被执行),所以$(wildcard )执行结束之后结果为空。
### Makefile
$(shell gen.sh)
CPPFILES = main.cpp
CPPFILES += $(wildcard gen/*.cpp)
main : $(CPPFILES)
@echo CPPFILES = $(CPPFILES)
/home/utils/gcc-5.2.0/bin/g++ $(CPPFILES) -o main
$(phony clean):
rm -rf gen main
$ make main
make: Warning: File `gen/a.cpp’ has modification time 0.0044 s in the future
CPPFILES = main.cpp gen/a.cpp gen/b.cpp
/home/utils/gcc-5.2.0/bin/g++ main.cpp gen/a.cpp gen/b.cpp -o main
make: warning: Clock skew detected. Your build may be incomplete.
注意此时有warning,不确定是否有影响。
### Makeppfile
gen:
gen.sh
#prebuild gen
folder := $(shell echo $(prebuild gen))
CPPFILES = main.cpp
CPPFILES += $(wildcard gen/*.cpp)
main : $(CPPFILES)
@echo CPPFILES = $(CPPFILES)
@echo folder = $(folder)
/home/utils/gcc-5.2.0/bin/g++ $(CPPFILES) -o main
$(phony clean):
rm -rf gen main
pdx-xterm-24:/home/<…>/File/cpp/makepp> makepp main
makepp: Loading makefile /home/<…>/File/cpp/makepp/Makeppfile
makepp: Entering directory /home/<…>/File/cpp/makepp
gen.sh
makepp: Scanning /home/<…>/File/cpp/makepp/gen/a.cpp
makepp: Scanning /home/<…>/File/cpp/makepp/gen/b.cpp
CPPFILES = main.cpp gen/a.cpp gen/b.cpp
folder = gen
/home/utils/gcc-5.2.0/bin/g++ main.cpp gen/a.cpp gen/b.cpp -o main
makepp: 2 files updated and 0 phony targets built
如果此处改为 =, 会产生奇怪的现象,我目前还无法解释:
### Makeppfile2
gen:
gen.sh
#prebuild gen
folder = $(shell echo $(prebuild gen))
CPPFILES = main.cpp
CPPFILES += $(wildcard gen/*.cpp)
main : $(CPPFILES)
@echo CPPFILES = $(CPPFILES)
@echo folder = $(folder)
/home/utils/gcc-5.2.0/bin/g++ $(CPPFILES) -o main
$(phony clean):
rm -rf gen main
$ makepp main
makepp: Loading makefile /home/<…>/File/cpp/makepp/Makeppfile
makepp: Entering directory /home/<…>/File/cpp/makepp
gen.sh
makepp: Scanning /home/<…>/File/cpp/makepp/gen/a.cpp’
makepp: Scanning `/home/<…>/File/cpp/makepp/gen/b.cpp’
CPPFILES = main.cpp
folder = gen
/home/utils/gcc-5.2.0/bin/g++ main.cpp gen/a.cpp gen/b.cpp -o main
makepp: 2 files updated and 0 phony targets built