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 de donde quiero que se coloquen los binarios cuando se construyan. Quiero que todos los binarios estén en su app_type
ruta respectiva :
/project1/bin/app_typeA/
Intenté usar$(CURDIR)
, así:
OUTPUT_PATH = /project1/bin/$(CURDIR)
pero en cambio obtuve 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 de modo que pueda saber exactamente app_typeX
para colocar los archivos binarios en sus respectivas carpetas de tipos?
fuente
$(lastword "$(MAKEFILE_LIST)")
de un makefile en el camino"Sub Directory/Makefile"
te dará"Directory/Makefile"
. No creo que haya alguna forma de evitar esto, ya que$(MAKEFILE_LIST)
con dos archivos MAKE le da una sola cadena"Makefile One Makefile Two
, que no puede manejar espacioscurrent_dir
no me funciona.$(PWD)
hace y es mucho más simple."solution only works when you are running make from the Makefile's current directory"
es una manera suave de decir "realmente no funciona". Pondría la última pieza en la parte superior de la respuesta.Como tomado de aquí ;
Aparece como;
Espero que esto ayude
fuente
dir
deshell dirname
creación interna en lugar de obtener el nombre de ruta con el/
carácter final .DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
debe preceder a cualquierinclude
operación ( docs ).dirname
, en caso de que haya espacios en la ruta.Si está utilizando GNU make, $ (CURDIR) es en realidad una variable incorporada. Es la
ubicación donde el Makefile reside enel directorio de trabajo actual, que es probablemente donde está el Makefile, pero no siempre .Consulte el Apéndice A Referencia rápida en http://www.gnu.org/software/make/manual/make.html
fuente
/
. Intenté empatar congmake
v3.81. Pero tienes razón simake
se llama comomake -f xxx/Makefile
.CURDIR
funciona para mí dondePWD
no lo hizo. Hicemkdir -p a/s/d
entonces en cada carpeta tenía un makefile que imprimióPWD
yCURDIR
antes+$(MAKE) <subdir>
.fuente
Intenté muchas de estas respuestas, pero en mi sistema AIX con gnu make 3.80 necesitaba hacer algunas cosas de la vieja escuela.
Resulta que
lastword
,abspath
yrealpath
no se agregaron hasta 3.81. :(Como otros han dicho, no es el más elegante, ya que invoca un caparazón dos veces, y todavía tiene problemas de espacio.
Pero como no tengo espacios en mi camino, funciona para mí, independientemente de cómo empecé
make
:Todos me dan
wherever
porcurrent_dir
y el camino absoluto awherever
pormkfile_dir
.fuente
Me gusta la respuesta elegida, pero creo que sería más útil mostrarla realmente funcionando que explicarla.
/tmp/makefile_path_test.sh
Salida:
NOTA: La función
$(patsubst %/,%,[path/goes/here/])
se usa para quitar la barra inclinada final.fuente
Solución encontrada aquí: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
La solución es : $ (CURDIR)
Puedes usarlo así:
fuente
$(CURDIR)
ya se intentó sin éxito.make
se inició). Es, de hecho, lo que OP realmente quería, pero el título de la pregunta es falso, por lo que la pregunta en sí es inconsistente. Entonces, esta es una respuesta correcta a una pregunta incorrecta. ;)Aquí hay una línea para obtener la ruta absoluta a su
Makefile
archivo usando la sintaxis de shell:Y aquí hay una versión sin shell basada en la respuesta @ 0xff :
Pruébelo imprimiéndolo, como:
fuente
Hasta donde sé, esta es la única respuesta aquí que funciona correctamente con espacios:
En esencia, funciona al escapar los caracteres de espacio mediante la sustitución
' '
de'\ '
los cuales permite Make a analizar correctamente, y entonces se elimina el nombre de archivo del archivo MAKE enMAKEFILE_LIST
haciendo otra sustitución por lo que se queda con el directorio que está en makefile. No es exactamente el más compacto cosa en el mundo pero funciona.Terminarás con algo como esto donde se escapan todos los espacios:
fuente
Ejemplo para su referencia, como a continuación:
La estructura de la carpeta puede ser como:
Donde hay dos Makefiles, cada uno de los siguientes;
Ahora, veamos el contenido de los Makefiles.
Ahora, ejecute la muestra / Makefile, como;
Explicación, sería que el directorio padre / inicio se puede almacenar en el indicador de entorno y se puede exportar, de modo que se pueda usar en todos los archivos MAKE del subdirectorio.
fuente
actualización 2018/03/05 finalmente uso esto:
Se puede ejecutar correctamente en ruta relativa o ruta absoluta. Ejecutado correcto invocado por crontab. Ejecutado correcto en otro shell.
muestre el ejemplo, a.sh print self path.
viejo: yo uso esto:
Puede mostrarse correcto si se ejecuta en otro shell y otro directorio.
fuente
Una línea en el Makefile debería ser suficiente:
DIR := $(notdir $(CURDIR))
fuente