Gnu-Make

在 GNU Make 中使用環境變數來縮短配方

  • June 30, 2015

我希望 GNU Make 中的配方使用環境變數而不是命令行參數,以使它們更短,這樣我就可以更好地專注於每個命令的變化。例如,而不是看到:

g++ -g -I/path1 -I/path2 -DFLAG  -Wall -c hello.cpp -o hello.o

我想看到類似的東西:

g++ -c hello.cpp -o hello.o

whereg++會從環境變數中讀取包含目錄和其他所有內容。因此,而不是使用這個:

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

引用自:https://unix.stackexchange.com/questions/212843