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_typeruta 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_typeXpara 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_dirno 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
dirdeshell dirnamecreación interna en lugar de obtener el nombre de ruta con el/carácter final .DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))$MAKEFILE_LISTdebe preceder a cualquierincludeoperació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 congmakev3.81. Pero tienes razón simakese llama comomake -f xxx/Makefile.CURDIRfunciona para mí dondePWDno lo hizo. Hicemkdir -p a/s/dentonces en cada carpeta tenía un makefile que imprimióPWDyCURDIRantes+$(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,abspathyrealpathno 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
whereverporcurrent_diry el camino absoluto awhereverpormkfile_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.makese 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
Makefilearchivo 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_LISThaciendo 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