web-dev-qa-db-ja.com

Makefileのエイリアスターゲット名

問題:

元のターゲット名またはエイリアスを使用して呼び出すことができるように、ターゲットに別の名前またはエイリアスを指定することは可能ですか?.

たとえば次のようなもの

/very/long/path/my_binary: dep_a dep_b dep_c
    # Compile

# Desired command
ALIAS my_binary = /very/long/path/my_binary

# NOTE: Notice the use of 'my_binary' in the dependencies
data1: my_binary datafile
    # Build data file using compiled my_binary

試行1:.PHONY

.PHONYターゲットを使用してみました:

.PHONY: my_binary
my_binary: /very/long/path/my_binary

これは、コマンドラインから呼び出すとうまく機能します。

# Runs rule 'my_binary' and then *only* runs rule '/very/long/path/my_binary'
# if the rule '/very/long/path/my_binary' needs updating.
make my_binary

ただし、エイリアスmy_binaryが依存関係としてリストされている場合、これはうまく機能しません。

# *Always* thinks that rule 'data1' needs updating, because it always thinks that
# the .PHONY target 'my_binary' "needs updating". As a result, 'data1' is
# rebuilt every time.
make /very/long/path/my_binary

ハッキングの可能性はありますか?

考えられるハックは この質問への回答 で提案されているように空のターゲットを使用することですが、エイリアスに対応する名前の偽のファイルを導入する必要があります:

my_binary: /very/long/path/my_binary
    touch my_binary

これにより、メインディレクトリがファイルでいっぱいになります。偽のファイルをサブディレクトリに配置すると、エイリアスを「ディレクトリ/ my_binary」として参照する必要があるため、目的が損なわれます。

25
WaelJ

これらの一時ファイルを作成することを除いて、コマンドラインだけでなく、メイクファイル内からエイリアスを使用できるようにする方法はないと思います。

次のように、makefileに変数を設定できないのはなぜですか。

_my_binary = /very/long/path/my_binary
_

その後、メイクファイルのどこでも$(my_binary)を使用しますか?使用する実際のエイリアスターゲットinsideメイクファイルを作成しても意味がありません。

14
MadScientist

さて、私は同様のものが必要でした。出力アーティファクトへのパスは非常に長くなりましたが、短いターゲット名が必要で、bash補完からも簡単にメリットを得られました。

これが私が思いついたものです:

os := [arbitrary long path to an artifact]
platform := [arbitrary long path to a differ artifact]
packer := [common parts of my packer build command]

.PHONY: all
all: $(platform)

.PHONY: platform
platform: $(platform)

$(platform): platform.json  $(os)
    @$(packer) $<

.PHONY: os
os: $(os)

$(os): os.json
    @$(packer) $<

.PHONY: clean
clean:
    rm -fr build/

上記のMakefileを使用すると、次のように言うことができます。

$ make os
$ make platform

長いアーティファクト名のエイリアスになります。 .PHONYエイリアスと実際のターゲットとの関係を確認することが重要であるため、上記のスニペットをかなり長くしました。それがうまくいくことを願っています。

注:上記の例からcleanターゲットを削除しなかったのは、多くの人が.PHONYターゲットを作成していないためです。しかし、意味的にはそうであるべきです。

15
frncmx