275 votes

Comment obtenir le répertoire relatif actuel de votre Makefile ?

J'ai plusieurs Makefiles dans des répertoires d'applications spécifiques comme celui-ci :

/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile

Chaque Makefile inclut un fichier .inc dans ce chemin un niveau au-dessus :

/project1/apps/app_rules.inc

Dans app_rules.inc, je définis la destination de l'endroit où je veux que les binaires soient placés lors de la construction. Je veux que tous les fichiers binaires soient dans leurs dossiers respectifs. app_type chemin :

/project1/bin/app_typeA/

J'ai essayé d'utiliser $(CURDIR) comme ceci :

OUTPUT_PATH = /project1/bin/$(CURDIR)

mais à la place, j'ai les binaires cachés dans le nom du chemin entier comme ceci : (remarquez la redondance)

/project1/bin/projects/users/bob/project1/apps/app_typeA

Que puis-je faire pour obtenir le "répertoire courant" d'exécution afin de connaître juste le app_typeX afin de placer les binaires dans leurs dossiers types respectifs ?

-2voto

zhukunqian Points 73

Mise à jour 2018/03/05 enfin je l'utilise :


shellPath=`echo $PWD/``echo ${0%/*}`

# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
    shellPath=${shellPath2}
fi

Il peut être exécuté correctement en chemin relatif ou en chemin absolu. Exécuté correctement invoqué par crontab. Exécuté correctement dans un autre shell.

montrer l'exemple, a.sh print self path.

[root@izbp1a7wyzv7b5hitowq2yz /]# more /root/test/a.sh
shellPath=`echo $PWD/``echo ${0%/*}`

# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
    shellPath=${shellPath2}
fi

echo $shellPath
[root@izbp1a7wyzv7b5hitowq2yz /]# more /root/b.sh
shellPath=`echo $PWD/``echo ${0%/*}`

# process absolute path
shellPath1=`echo $PWD/`
shellPath2=`echo ${0%/*}`
if [ ${shellPath2:0:1} == '/' ] ; then
    shellPath=${shellPath2}
fi

$shellPath/test/a.sh
[root@izbp1a7wyzv7b5hitowq2yz /]# ~/b.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]# /root/b.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]# cd ~
[root@izbp1a7wyzv7b5hitowq2yz ~]# ./b.sh
/root/./test
[root@izbp1a7wyzv7b5hitowq2yz ~]# test/a.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz ~]# cd test
[root@izbp1a7wyzv7b5hitowq2yz test]# ./a.sh
/root/test/.
[root@izbp1a7wyzv7b5hitowq2yz test]# cd /
[root@izbp1a7wyzv7b5hitowq2yz /]# /root/test/a.sh
/root/test
[root@izbp1a7wyzv7b5hitowq2yz /]# 

vieux : J'utilise ça :

MAKEFILE_PATH := $(PWD)/$({0%/*})

Il peut s'avérer correct s'il est exécuté dans un autre shell et un autre répertoire.

-3voto

Thach Van Points 675

Une ligne dans le Makefile devrait être suffisante :

DIR := $(notdir $(CURDIR))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X