2016-06-12 18 views
2

スタックオーバーフローからの提案をコピー/貼り付けすることで恐ろしい外観のMakefileを書いたことがあります。しかし、明示的なコンパイラ呼び出しを何度も提供する必要はないかもしれないと私は読んでいます(たとえば、-O3フラグはどこにでもあります)。このMakefileを単純化するには?メイクファイルの簡略化

CFLAGS = -Weverything -Wno-padded -Wno-unused-parameter -Wno-unused-variable -Wno-sign-conversion 
all: fianchetto.o util.o ttable.o movegen.o 
    clang -O3 $(CFLAGS) -D NDEBUG $^ -o fianchetto 
debugf: fianchetto.o ttable.o movegen.o 
    clang -O3 $(CFLAGS) -g3 $^ -o fianchetto 
clean: 
    rm *.o && rm *.gch & rm fianchetto && rm -rf fianchetto.dSYM 
%.o: %.c 
    clang -O3 -c $(CFLAGS) $< -o [email protected] 
fianchetto.o: fianchetto.c 
ttable.o: ttable.h ttable.c 
movegen.o: movegen.h movegen.c 
util.o: util.h util.c 

私は多くの構文で謎に包まれていますが、なぜ単純化が機能するのかについてのリンクや説明がわかります!あなたが作るのビルトインルールを再発明している

  • をリンクする際

    (とにかくCPPFLAGSにする必要があります)
  • +0

    O3フラグの下の最初の行を必要としない場合があります:CFLAGSマクロにそれを組み込みます。 – Evert

    +0

    あなたの 'clean'コマンドに'& 'が1つあります。おそらくそれは他のものと同様に '&&'でなければなりません。 – Evert

    +0

    ほとんどの場合、 '.o'ファイル名とハードコードされた依存関係規則(これは不完全であるように見えます)の繰り返しを除いて大丈夫です:Cソースファイルは他のヘッダファイルに依存しません。独自のものよりも)依存関係は最適なコンパイラによって生成されます。新しくリビルドする場合は必要ありませんが、増分リビルドの場合にのみ必要です。リビルド中に取得することもできます。 – Kaz

    答えて

    2
    • CFLAGSと定義は無用で、その依存関係の1つが「target.oであれば自動的にターゲットをリンクします作ります"(この場合はfianchetto: fianchetto.o)。また、Cソースファイルをコンパイルする方法(ソースとオブジェクトのパスが一致している限り)を知っているので、パターンルールも余分です。
    • clangとGCCの両方が-Mフラグのセットを使用して依存関係を生成できるため、オブジェクトの前提条件は必要ありません。
    • 同じディレクトリ内のリリースとデバッグビルドをコンパイルすると、よりシンプルなmakefileが作成されますが、切り替え時にオブジェクトファイルを掃除する必要があります。デフォルトのmakeが
    • CCからcc割り当て、ccは、システムのデフォルトコンパイラへのリンクである必要があり、そうあなたも
    CC  := clang 
    CPPFLAGS := -MMD -MP 
    CFLAGS := -Weverything -Wno-padded -Wno-unused-parameter -Wno-unused-variable -Wno-sign-conversion -O3 
    
    objs := fianchetto.o util.o ttable.o movegen.o 
    deps := $(objs:.o=.d) 
    
    .PHONY: all debugf clean 
    all: CPPFLAGS += -DNDEBUG 
    debugf: CFLAGS += -g3 
    all debugf: fianchetto 
    fianchetto: $(objs) 
    clean: ; $(RM) $(objs) $(deps) fianchetto fianchetto.dSYM 
    
    -include $(deps)