Псевдоним имени цели в 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

Это загромождает основной каталог файлами! Размещение поддельных файлов в подкаталоге приведет к поражению цели, поскольку псевдоним следует называть "directory/my_binary"

Ответ 1

Я не думаю, что есть способ сделать это, чтобы вы могли использовать псевдоним из своего файла makefile, а также из командной строки, за исключением создания этих временных файлов.

Почему вы не можете просто установить переменную в make файле, например:

my_binary = /very/long/path/my_binary

то используйте $(my_binary) всюду в make файле? Я не вижу смысла создавать реальный псевдоним для использования внутри make файла.

Ответ 2

Хорошо, мне нужно было что-то подобное. Путь к моим выходным артефактам был довольно длинным, но мне нужны короткие имена целей, а также легко извлечь выгоду из bash -completion.

Вот что я придумал:

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 и реальными целями. Я надеюсь, что это сработает для вас.

Примечание. Я не удалял чистую цель из приведенного выше примера, потому что многие люди не делают эту цель .PHONY. Однако семантически это должно быть.