makefile alias target synonym

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.