Eu tenho vários Makefiles em diretórios específicos de aplicativos como este:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Cada Makefile inclui um arquivo .inc neste caminho um nível acima:
/project1/apps/app_rules.inc
Dentro de app_rules.inc, estou definindo o destino de onde quero que os binários sejam colocados quando criados. Eu quero que todos os binários estejam no respectivo app_type
caminho:
/project1/bin/app_typeA/
Eu tentei usar$(CURDIR)
, assim:
OUTPUT_PATH = /project1/bin/$(CURDIR)
mas, em vez disso, enterrei os binários no nome do caminho inteiro assim: (observe a redundância)
/project1/bin/projects/users/bob/project1/apps/app_typeA
O que posso fazer para obter o "diretório atual" de execução, para que eu possa saber exatamente o que é app_typeX
, para colocar os binários em suas respectivas pastas de tipos?
fonte
$(lastword "$(MAKEFILE_LIST)")
um makefile no caminho"Sub Directory/Makefile"
fornecerá a você"Directory/Makefile"
. Eu não acho que há alguma maneira de contornar isso desde que$(MAKEFILE_LIST)
com dois makefiles dá-lhe uma única corda"Makefile One Makefile Two
, que não pode lidar com espaçoscurrent_dir
não funciona para mim.$(PWD)
faz e é muito mais simples."solution only works when you are running make from the Makefile's current directory"
é uma maneira moderada de dizer "realmente não está funcionando". Eu colocaria a última peça no topo da resposta.Como tirado daqui ;
Aparece como;
Espero que isto ajude
fonte
dir
vez deshell dirname
obter o nome do caminho com/
caracteres finais .DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
deve preceder qualquerinclude
operação ( docs ).dirname
- no caso de haver espaços no caminho.Se você estiver usando o GNU make, $ (CURDIR) é na verdade uma variável interna. É o
local em que o Makefile resideno diretório de trabalho atual, que provavelmente é onde está o Makefile, mas nem sempre .Consulte o Apêndice A, Referência rápida em http://www.gnu.org/software/make/manual/make.html
fonte
/
. Eu tentei amarrado comgmake
v3.81. Mas você está certo semake
for chamado comomake -f xxx/Makefile
.CURDIR
funciona para mim ondePWD
não. Eu fizmkdir -p a/s/d
então em cada pasta tinha um makefile que imprimiaPWD
eCURDIR
antes+$(MAKE) <subdir>
.fonte
Eu tentei muitas dessas respostas, mas no meu sistema AIX com o gnu make 3.80 eu precisava fazer algumas coisas da velha escola.
Acontece que
lastword
,abspath
erealpath
não foram adicionados até 3,81. :(Como outros já disseram, não é o mais elegante, pois invoca uma concha duas vezes e ainda apresenta problemas de espaço.
Mas como não tenho espaços em meus caminhos, funciona para mim, independentemente de como comecei
make
:Todos me dar
wherever
paracurrent_dir
e o caminho absoluto parawherever
paramkfile_dir
.fonte
Gosto da resposta escolhida, mas acho que seria mais útil mostrá-la funcionando do que explicá-la.
/tmp/makefile_path_test.sh
Resultado:
NOTA: A função
$(patsubst %/,%,[path/goes/here/])
é usada para remover a barra final.fonte
Solução encontrada aqui: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
A solução é : $ (CURDIR)
Você pode usá-lo assim:
fonte
$(CURDIR)
já foi tentada sem êxito.make
foi iniciado). É, de fato, o que o OP realmente queria, mas o título da pergunta é falso, então a pergunta em si é inconsistente. Portanto, esta é uma resposta correta para uma pergunta incorreta. ;)Aqui está uma linha para obter o caminho absoluto para o seu
Makefile
arquivo usando a sintaxe do shell:E aqui está a versão sem shell com base na resposta @ 0xff :
Teste-o imprimindo, como:
fonte
Tanto quanto sei, esta é a única resposta aqui que funciona corretamente com espaços:
Ele funciona essencialmente por escapar caracteres de espaço, substituindo
' '
para'\ '
que permita fazer para analisá-lo corretamente, e, em seguida, ele remove o nome do arquivo do makefile emMAKEFILE_LIST
fazendo outra substituição assim que você é deixado com o diretório que makefile está dentro. Não exatamente o mais compacto coisa no mundo, mas funciona.Você vai acabar com algo assim, onde todos os espaços são escapados:
fonte
Exemplo para sua referência, como abaixo:
A estrutura da pasta pode ser como:
Onde existem dois Makefiles, cada um como abaixo;
Agora, vamos ver o conteúdo dos Makefiles.
Agora, execute a amostra / Makefile, como;
Explicação: o diretório pai / home pode ser armazenado no sinalizador do ambiente e exportado, para que possa ser usado em todos os makefiles do subdiretório.
fonte
atualização 2018/03/05 finnaly eu uso isso:
Pode ser executado corretamente no caminho relativo ou no caminho absoluto. Executado corretamente invocado pelo crontab. Executado correto em outro shell.
mostre o exemplo, a.sh imprime o caminho próprio.
old: eu uso isso:
Pode mostrar correto se executado em outro shell e outro diretório.
fonte
Uma linha no Makefile deve ser suficiente:
DIR := $(notdir $(CURDIR))
fonte