Obter diretório de nível superior da variável makefile

8

Qual é o código mais simples para obter a parte do diretório de nível superior de uma variável makefile? Exemplo:

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

PS: Não quero dizer $(dir $(dir $(BUILD_DIR))), mas algo que obtém a primeira parte do diretório de qualquer valor variável.

l0b0
fonte
dirname /tmp/foo/barvai dar /tmpou dirname foo/bar/bazvai darfoo
Abhishek A
1
@ greenmang0: sinalizou sua resposta. Primeiro, está completamente errado (você executou esses comandos?), E segundo é para um makefile , não para o Bash.
L0b0
@ l0b0 É um comentário, e "é errado" não é uma boa razão para sinalizar qualquer coisa, basta deixar um comentário dizendo qual é o problema
Michael Mrozek
@ MichaelMrozek: Eu sinalizei como "tópico não construtivo / off", o que se aplica a ele.
L0b0
Não entendi sua pergunta: o que você quer dizer com "parte do diretório de nível superior"? Você quer dizer a parte antes da primeira /? Você garante que o argumento é um caminho relativo? Você está assumindo o GNU make?
Gilles 'SO- stop be evil'

Respostas:

5

Você quer dizer o primeiro componente do diretório? Nesse caso, transforme o caminho em uma lista de componentes e extraia o primeiro componente. Suponho que você esteja usando o GNU make e não esteja fazendo algo insano, como esperar que os nomes de arquivos com espaço em branco passem ilesos. Não tente isso com um caminho absoluto.

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

Eu BUILD_DIRsubstituo o que o usuário possa ter passado na linha de comando, para evitar que alguém a passe acidentalmente e que algo indesejado seja excluído.

Gilles 'SO- parar de ser mau'
fonte
BUILD_DIRdeveria ser uma variável interna, mas você está certo, ainda há a possibilidade de alguém definir algo perigoso. Então, aceitar esta resposta, com a ressalva de que a solução não deve ser usado :)
l0b0
1
@ l0b0 Como assumimos que o GNU make:override BUILD_DIR = …
Gilles 'SO- stop be evil'
0

Se você tem certeza de que BUILD_DIR nunca começará com um '/':

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

Caso contrário, pode ser necessário considerar os caminhos que começam com '/':

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

echo $rootdir

Ou talvez seja melhor ignorar qualquer caminho que comece com '/'.

Tim Kennedy
fonte
1
Isto é para um makefile, não Bash. Este é um problema trivial no Bash, mas estou interessado em uma solução simples de makefile .
l0b0
Uma coisa que você pode fazer em um Makefile é executar comandos. Então você cria um script de shell, no seu caminho, chamado rootdir, e no seu makefile, execute "rm -rf $ (rootdir $ BUILD_DIR)" ou algo assim. Ou você terá que fazer algo como pré-definir a raiz da construção, para que você possa rm -rfposteriormente. Definitivamente, eu checaria rootdirnovamente a resposta que o script pode transmitir, para que você não acabe com um erro de sintaxe ao fornecer o script rm -rf /.
Tim Tim