Gnu-Make
在 GNU Make 中使用環境變數來縮短配方
我希望 GNU Make 中的配方使用環境變數而不是命令行參數,以使它們更短,這樣我就可以更好地專注於每個命令的變化。例如,而不是看到:
g++ -g -I/path1 -I/path2 -DFLAG -Wall -c hello.cpp -o hello.o
我想看到類似的東西:
g++ -c hello.cpp -o hello.o
where
g++
會從環境變數中讀取包含目錄和其他所有內容。因此,而不是使用這個:compile.cxx = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c %.o: %.cpp $(compile.cxx) $< -o $@
我正在使用這個:
compile.cxx = CPATH="$(CPATH)" LIBRARY_PATH="$(LIBRARY_PATH)" bash -c $(CXX) -c %.o: %.cpp $(compile.cxx) $< -o $@
但我得到這個輸出:
CPATH="irrelevant" LIBRARY_PATH="irrelevant" bash -c g++ -c hello.cpp -o hello.o g++: fatal error: no input files
因此,似乎
g++
沒有收到它的論點。我也對達到類似效果的替代品持開放態度(即:短食譜)。
您可能想要使用在MS 工具鏈中非常常見的所謂編譯器響應文件。顯然最新版本的 GCC 也支持它(參見手冊)。
CXX = g++ CPPFLAGS = -I/path1 -I/path2 -DFLAG CXXFLAGS = -g -Wall CXXOPTS = $(CURDIR)/cxx.opts %.o: %.cpp $(CXXOPTS) $(CXX) @$(CXXOPTS) -c -o $@ $< $(CXXOPTS): echo "$(CPPFLAGS) $(CXXFLAGS)" >$@ clean: rm -f *.o rm -f $(CXXOPTS)
範例會話:
$ touch a.cpp b.cpp c.cpp $ make a.o b.o c.o echo "-I/path1 -I/path2 -DFLAG -g -Wall" >cxx.opts g++ @cxx.opts -c -o a.o a.cpp g++ @cxx.opts -c -o b.o b.cpp g++ @cxx.opts -c -o c.o c.cpp $ make clean rm -f *.o rm -f cxx.opts