Obtener el directorio de nivel superior de la variable makefile

8

¿Cuál es el código más simple para obtener la parte del directorio de nivel superior de una variable de archivo MAKE? Ejemplo:

BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>

PD: No quiero decir $(dir $(dir $(BUILD_DIR))), pero es algo que obtiene la primera parte del directorio de cualquier valor variable.

l0b0
fuente
dirname /tmp/foo/bardará /tmpo dirname foo/bar/bazdaráfoo
Abhishek A
1
@ greenmang0: Marcó su respuesta. Primero, es simplemente incorrecto (¿incluso ejecutaste esos comandos?), Y segundo, es para un archivo MAKE , no Bash.
l0b0
@ l0b0 Es un comentario, y "está mal" no es una buena razón para marcar nada, solo deje un comentario diciendo cuál es el problema
Michael Mrozek
@MichaelMrozek: lo marqué "no es constructivo / fuera de tema", lo que se aplica a él.
l0b0
No entiendo su pregunta: ¿qué quiere decir con "la parte del directorio de nivel superior"? ¿Te refieres a la parte anterior a la primera /? ¿Garantizan que el argumento es un camino relativo? ¿Estás asumiendo que GNU make?
Gilles 'SO- deja de ser malvado'

Respuestas:

5

¿Te refieres al primer componente del directorio? Si es así, convierta la ruta en una lista de componentes, luego extraiga el primer componente. Supongo que está utilizando GNU make, y no está haciendo algo loco como esperar que los nombres de archivos con espacios en blanco pasen indemnes. No intentes esto con un camino absoluto.

override BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf $(firstword $(subst /, ,$(BUILD_DIR)))

Hago BUILD_DIRanular lo que el usuario haya pasado en la línea de comando, para evitar que alguien lo pase accidentalmente y se elimine algo no deseado.

Gilles 'SO- deja de ser malvado'
fuente
BUILD_DIRse suponía que era una variable interna, pero tienes razón, todavía existe la posibilidad de que alguien lo configure como algo peligroso. Entonces, aceptando esta respuesta, con la advertencia de que la solución no debe usarse :)
l0b0
1
@ l0b0 Dado que asumimos que GNU hace:override BUILD_DIR = …
Gilles 'SO- deja de ser malvado'
0

Si está seguro de que BUILD_DIR nunca comenzará con un '/':

rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )

De lo contrario, es posible que deba tener en cuenta las rutas que comienzan con '/':

if [[ $BUILD_DIR =~ "^/" ]]; then
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1,2 )
else
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )
fi

echo $rootdir

O tal vez sea mejor ignorar cualquier ruta que comience con '/'.

Tim Kennedy
fuente
1
Esto es para un archivo MAKE, no Bash. Este es un problema trivial en Bash, pero estoy interesado en una solución simple de makefile .
l0b0
Una cosa que puede hacer en un Makefile es ejecutar comandos. Entonces crea un script de shell, en su ruta, llamado rootdir, y en su archivo MAKE, ejecute "rm -rf $ (rootdir $ BUILD_DIR)", o algo así. O tendrá que hacer algo como predefinir la raíz de compilación, para que pueda rm -rfhacerlo más tarde. Definitivamente, volvería a verificar la respuesta que el rootdirscript puede transmitir, para que no termine con un error de sintaxis al darle su script rm -rf /.
Tim Kennedy el