Nombre de destino de alias en Makefile
target synonym (2)
No creo que haya ninguna forma de hacerlo para que pueda usar el alias desde su archivo MAKE y la línea de comandos, excepto creando esos archivos temporales.
¿Por qué no puedes simplemente establecer una variable en el archivo MAKE, como:
my_binary = /very/long/path/my_binary
luego usa $(my_binary)
en todas partes en el archivo MAKE? No veo ningún sentido al crear un objetivo de alias real para usar dentro del archivo MAKE.
El problema:
¿Es posible darle a un destino un nombre o alias diferente, de modo que pueda invocarse utilizando el nombre del objetivo original o el alias?
Por ejemplo, algo así como
/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
Intento 1: .PHONY
He intentado usar un objetivo .PHONY
:
.PHONY: my_binary
my_binary: /very/long/path/my_binary
Esto funciona muy bien cuando se invoca desde la línea de comandos:
# 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
Sin embargo, esto no funciona bien cuando el alias my_binary
aparece como una dependencia:
# *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
Posible pirateo?
Un posible truco es usar un objetivo vacío como se sugiere en una respuesta a esta pregunta , pero eso requeriría la introducción de archivos falsos con los nombres correspondientes al alias:
my_binary: /very/long/path/my_binary
touch my_binary
¡Esto desordenará el directorio principal con archivos! Colocar los archivos falsos en un subdirectorio frustraría el propósito, ya que el alias debería denominarse ''directory / my_binary''.
De acuerdo, necesitaba algo similar. La ruta a mis artefactos de salida era bastante larga, pero quería nombres de objetivos cortos y también me beneficiaba fácilmente de la finalización de bash.
Esto es lo que se me ocurrió:
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/
Con el archivo Makefile anterior puede decir:
$ make os
$ make platform
Que serán alias para los nombres de artefactos largos. He hecho el fragmento anterior bastante largo, porque es importante ver las relaciones entre los alias .PHONY y los objetivos reales. Espero que eso funcione para usted.
Nota: No eliminé el objetivo limpio del ejemplo anterior porque muchas personas no lo convierten en un objetivo .PHONY. Sin embargo, semánticamente debería ser.