¿Cómo obtener el directorio relativo actual de su Makefile?
Tengo varios Makefiles en directorios específicos de aplicaciones como este:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Cada Makefile incluye un archivo .inc en esta ruta un nivel más arriba:
/project1/apps/app_rules.inc
Dentro de app_rules.inc estoy configurando el destino donde quiero que se coloquen los archivos binarios cuando se construyan. Quiero que todos los binarios estén en su respectiva app_type
ruta:
/project1/bin/app_typeA/
Intenté usar$(CURDIR)
, así:
OUTPUT_PATH = /project1/bin/$(CURDIR)
pero en lugar de eso, conseguí los binarios enterrados en el nombre completo de la ruta de esta manera: (observe la redundancia)
/project1/bin/projects/users/bob/project1/apps/app_typeA
¿Qué puedo hacer para obtener el "directorio actual" de ejecución para poder saber exactamente cómo app_typeX
colocar los archivos binarios en sus respectivas carpetas de tipos?
La función del caparazón.
Puedes utilizar shell
la función: current_dir = $(shell pwd)
. O shell
en combinación con notdir
, si no necesita una ruta absoluta:
current_dir = $(notdir $(shell pwd))
.
Actualizar.
La solución dada solo funciona cuando se ejecuta make
desde el directorio actual del Makefile.
Como señaló @Flimm:
Tenga en cuenta que esto devuelve el directorio de trabajo actual, no el directorio principal del Makefile.
Por ejemplo, si ejecutacd /; make -f /home/username/project/Makefile
, lacurrent_dir
variable será/
, no/home/username/project/
.
El siguiente código funcionará para Makefiles invocados desde cualquier directorio:
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path))))
Tomado de aquí ;
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
Aparece como;
$ cd /home/user/
$ make -f test/Makefile
/home/user/test
$ cd test; make Makefile
/home/user/test