2017-10-19 13 views
0

GNU Makefileに依存しないフォニーターゲットを作成するにはどうすればよいですか?GNU Makefileに依存しない偽のターゲットを作成するには?

要件:

  1. 特定のセットアップをチェックするルール - 以下の例よりも複雑であることができます。
  2. このルールが失敗すると、特定のターゲットの構築が失敗します。
  3. このルールが成功する場合、特定のターゲットの構築はソースが変更されている場合にのみ行う必要があります。そのルールも非特異的目標

ルールは、すべての特定のターゲットのコンパイルルールの前に挿入されている場合、これは達成可能であるために実行すべきではありませんので、

  • ルールは、グローバルにすることはできません。 これらは多くの特定のターゲットになる可能性があるので、私はこのルールのために偽のターゲットを作成し、この偽のターゲットをすべての特定のターゲットの依存関係として指定することをお勧めします。 これは、偽のターゲットが成功すると、ソースが変更されていない場合でも、特定のターゲットが再構築されるという望ましくない副作用があります。

    つまり、ソースが最新である場合、従属ターゲットを強制的に再構築するように偽のターゲットを指定するにはどうすればよいですか。

    $ make --version | grep Make 
    GNU Make 3.82 
    
    $ make -f try.mk clean setup 
    rm -f try.out? 
    touch try.C#Dummy create source 
    
    $ make -f try.mk 
    touch try.out1 #Dummy compile 
    touch try.out2 #Dummy compile 
    touch try.out3 #Dummy compile 
    
    $ make -f try.mk 
    touch try.out3 #Dummy compile 
    

    try.out3はませは/上記の最後のmakeでコンパイルしてしまっているはずです。

    $ cat try.mk 
    #try.mk 
    base=try 
    
    all: $(base).out1 $(base).out2 $(base).out3 #... 
    
    clean: 
        rm -f $(base).out? 
    
    setup: 
        touch $(base).C#Dummy create source 
    
    .PHONY: all clean platform_ok 
    
    #------------------------------------------------------------ 
    #Specific targets 
    #------------------------------------------------------------ 
    
    #Attempt 1: works, but platform check is a rule, and hence needs to be inserted wherever it is needed. 
    $(base).out1: $(base.c) 
        @if [ $(shell uname -i) == x86_64 ]; then exit 0; else exit 1; fi 
        touch $(base).out1 #Dummy compile 
    
    #Attempt 2: works, but platform check is global, which gets executed even when building Non-OS specific targets 
    $(eval platform_check:=$(shell (if [ $(shell uname -i) == x86_64 ]; then echo 0; else echo 1; fi))) 
    $(base).out2: $(base).c 
        @exit $(platform_check) 
        touch $(base).out2 #Dummy compile 
    
    #Attempt 3: works partially when platform check is a phony target, but target gets rebuilt even if source is uptodate. 
    $(base).out3: $(base).c platform_ok 
        touch $(base).out3 #Dummy compile 
    platform_ok: 
        @if [ $(shell uname -i) == x86_64 ]; then exit 0; else exit 1; fi 
    
    #------------------------------------------------------------ 
    #Non-Specific targets 
    #------------------------------------------------------------ 
    #... 
    
  • 答えて

    0

    私はそれについて少し違う行くだろう:

    base=try 
    ARCH := $(shell test `uname -i` = "x86_64"; echo $$?) 
    
    ifeq ($(ARCH),0) 
    define PLATFORM_64 = 
    out3 
    endef 
    endif 
    
    define ALL = 
    out1 
    out2 
    $(PLATFORM_64) 
    endef 
    
    all: $(addprefix $(base)., $(ALL)) 
    

    と私は完全にplatform_okを失うでしょう:

    $(base).out3: $(base).c 
        touch $(base).out3 #Dummy compile 
    
    +0

    おかげで、それはありません:それは依存関係グラフで発見された場合は常に、このルールを実行しますが、その通常の前提条件は、より最近であれば、それに応じて、ターゲットにのみ実行されます確認します第4の要件に対処しないでください(ルールは非特定のターゲットに対して実行すべきではありません)。あなたの答えでは、ARCHは常に計算されます。ちょうどfyi、私の実際の問題は、他の(非特定の)ターゲットに対して実行されるのを避けたい、より複雑なチェックをしています。 –

    2

    は単にオーダーのみの前提条件として、偽のターゲットを使用します。代替ソリューションのための

    base=try 
    
    all: $(base).out1 $(base).out2 $(base).out3 #... 
    
    clean: 
        rm -f $(base).out? 
    
    setup: 
        touch $(base).C#Dummy create source 
    
    .PHONY: all clean platform_ok 
    
    #------------------------------------------------------------ 
    #Specific targets 
    #------------------------------------------------------------ 
    
    $(base).out1: $(base).c | platform_ok 
        touch $(base).out1 #Dummy compile 
    
    $(base).out2: $(base).c | platform_ok 
        touch $(base).out2 #Dummy compile 
    
    $(base).out3: $(base).c | platform_ok 
        touch $(base).out3 #Dummy compile 
    
    platform_ok: 
        @if [ $(shell uname -i) == x86_64 ]; then exit 0; else exit 1; fi 
    
    +0

    makeのmanページにはこれがありません。同様の問題に直面している可能性がある他の人には、このトピックに関する追加情報を提供するために、注文のみの前提条件のリンクを追加します。 https://www.gnu.org/software/make/manual/make.html#Prerequisite-タイプ –

    関連する問題