2

Makefile A の一部を別のBにオーバーロードして、 Aを拡張する方法を探しています。

たとえば、次のメイクファイルAがあります。

TEXT="AHAHA"

default: after-default

before-default: 
    echo "BEFORE DEFAULT"

default: before-default
    echo ${TEXT}

after-default: default
    echo "AFTER DEFAULT"

次のように新しい Makefile Bで再利用したい:

TEXT="HIHIHI"

before-default: 
    echo "NEW BEFORE DEFAULT"

新しいメイクファイルは次のように表示されます。

NEW BEFORE DEFAULT
HIHIHI
AFTER DEFAULT

この例は少しばかげています。このようにすることはできませんが、このような Makefile 構成をこの考えに近づけることができるかどうかを知りたいです。

4

2 に答える 2

2

include Aあなたの例は、の先頭に追加することで簡単に実現されBます。新しいbefore-defaultターゲットは古いターゲットをオーバーライドします。

vnix$ tail *
==> A <==
TEXT="AHAHA"

before-default: default
        echo "BEFORE DEFAULT"

default: after-default
        echo ${TEXT}

after-default:
        echo "AFTER DEFAULT"

==> B <==
include A

TEXT="HIHIHI"

before-default: default
        echo "NEW BEFORE DEFAULT"

vnix$ make -sf A
AFTER DEFAULT
AHAHA
BEFORE DEFAULT

vnix$ make -sf B
B:6: warning: overriding commands for target `before-default'
A:4: warning: ignoring old commands for target `before-default'
AFTER DEFAULT
HIHIHI
NEW BEFORE DEFAULT

ただし、これはあまり良い設計ではありません。すでに行っているようなことをパラメーター化することTEXTは、他の場所でオーバーライドされているコードを使用することよりも驚きが少なくなります。

(上記の私のコメントを参照してください:なぜ出力があなたが望んでいたものとは反対の順序になっているのか。)

于 2014-05-28T08:10:52.090 に答える