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

ここでは、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

おすすめ記事