GNU Makeのレシピでは、コマンドライン引数の代わりに環境変数を使用して、各コマンドの変更に集中できるように短くしたいと思います。たとえば、次を見るのではなく:
g++ -g -I/path1 -I/path2 -DFLAG -Wall -c hello.cpp -o hello.o
私は次のことを見たいです:
g++ -c hello.cpp -o hello.o
ここでは、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++
その引数が受け取られていないようです。
私は同様の結果を得るための代替案(例えば、より短いレシピ)にも開いています。
ベストアンサー1
次の場所にあるいわゆるコンパイラ応答ファイルを使用できます。マイクロソフトツールチェーン。明らかに、最新バージョンの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