2017-09-07 6 views
1

私はこのファイルに変更を加えた後でのみ、一部の.makファイルに対してincludeを実行したいと私が取り組んでいる大きなプロジェクトを持っていますオリジナルのメイクファイルの中のコマンドを使って大規模なプロジェクトなので、コードを書くのは難しいでしょうから、代わりにこのばかげた例を挙げてみましょう。makefile:特定の操作を行った後に.makファイルにインクルードする

Cプロジェクトとヘッダファイルが同じディレクトリにあり、書く必要がある小さなCプロジェクトがありますメークファイル。私は書き込みするメイクファイルにcleanルールを使用することはできませんが、メイクファイルに含めることができるfile.makという名前のファイルがあります。 file.makの内容:

.PHONY: clean 

cleam: 
    $(RM) $(objs) test 

問題ここでは、ルールがcleamないcleanであるということです。私も手動でfile.makを変更することは許されていませんが、私は元のmakefileの中のコマンドでこれを行うことができます。

CC = gcc 
srcs = $(wildcard ./*.c) 
objs = $(srcs:.c=.o) 


test: $(objs) change_file include_file 
    $(CC) $^ -o [email protected] 

%.o: %.c 
    $(CC) -c $< -o [email protected] 

change_file: 
    $(shell sed -i 's/cleam/clean/g' file.mak) 

include_file: change_file 
    include file.mak 

しかし、私は次のエラーを取得する:だから私はこのようにメイクファイルを書くことを考え

sed -i 's/cleam/clean/g' file.mak 

include: Command not found     

だから私はそれが理解これはで簡単に行うことができますルールの中にincludeを使用することの問題です、それで私が望むものを達成する方法はありますか?

答えて

1

(GNU)makeにはこのようなシナリオで使用できる機能Remaking Makefilesがありますが、あなたのアプローチは間違っています。 includeは指令であり、レシピでは使用できません。

代わりに、ときincludeファイル、この正確なファイルを作成するルールのmake最初にチェックし、それらを実行します。あなたの場合と同様に、含めるファイルがすでに存在するので、強制的にこのルールを.PHONYにする必要があります。私は月

file_fixed.mak: file.mak 
    sed -e 's/cleam/clean/g' <file.mak >file_fixed.mak 

include file_fixed.mak 
+0

:固定バージョン(コピー)を作成することを検討(ルールを必要とせずに)、より堅牢な代替手段として

.PHONY: file.mak file.mak: sed -i 's/cleam/clean/g' file.mak include file.mak 

をして、これを含める:それはこのようになります。 makeと同じくらいよく書かれていて、最終的にはツールが低すぎるので、CMakeのようなツールでmakefileを生成することを提案します。彼らは信頼性が高く、予測可能なほど長く使用されています。私見では。 –

+0

GNU makeで**独自のビルドシステム**のみ**を使用していますが、私はこれに同意しません:)しかし、学習量は正しく、柔軟にGNU makeを使用するためにたくさんあることを認めなければなりません。より簡単に追加ツールを使うことができます...ちょうどIMHOはGNUのautotoolsから離れてください。それ以外の場合はあなたの髪がゆるむかもしれません:) –

+0

autotoolsの問題は、一度あなたがautotoolsを激しく動かすと、あなたの時間の多くを食べる、それはすべてのautotoolsを使用しています。 私にとって、それは単純なものになります。 「自分のビルドシステム」は、そのアプローチに正反対です。 あなたがそれをやっているなら、あなたはあなたの顧客/雇用者にあなたにそれをさせるように納得させました。ただ、明確にしておきましょう。それは彼らの最大の関心事ではありません。 (あなたがscons、cmake、またはそれらの新しいもののようなオープンプロジェクトの著者でない限り、私はその名前を覚えていない) –

関連する問題