J'ai plusieurs Makefiles dans des répertoires spécifiques à l'application 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 d'un niveau supérieur:
/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 binaires soient dans leur app_type
chemin respectif :
/project1/bin/app_typeA/
J'ai essayé d'utiliser$(CURDIR)
, comme ceci:
OUTPUT_PATH = /project1/bin/$(CURDIR)
mais à la place, j'ai fait enterrer les binaires 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 que je puisse connaître juste le app_typeX
afin de mettre les binaires dans leur dossier de types respectifs?
la source
$(lastword "$(MAKEFILE_LIST)")
d'un makefile au chemin"Sub Directory/Makefile"
vous donnera"Directory/Makefile"
. Je ne pense pas qu'il y ait moyen de contourner cela car$(MAKEFILE_LIST)
avec deux makefiles vous donne une seule chaîne"Makefile One Makefile Two
, qui ne peut pas gérer les espacescurrent_dir
ne marche pas pour moi.$(PWD)
fait et c'est beaucoup plus simple."solution only works when you are running make from the Makefile's current directory"
est une manière douce de dire "ne fonctionne pas vraiment". Je mettrais le dernier morceau en haut de la réponse.Tiré d' ici ;
Apparaît comme;
J'espère que cela t'aides
la source
dir
deshell dirname
création interne plutôt que d'obtenir un nom de chemin avec un/
caractère de fin .DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
doit précéder touteinclude
opération ( docs ).dirname
- au cas où il y aurait des espaces dans le chemin.Si vous utilisez GNU make, $ (CURDIR) est en fait une variable intégrée. C'est l'
emplacement où le Makefile réside dansle répertoire de travail actuel, qui est probablement où se trouve le Makefile, mais pas toujours .Voir l'annexe A Référence rapide sur http://www.gnu.org/software/make/manual/make.html
la source
/
. J'ai essayé à égalité avec lagmake
v3.81. Mais vous avez raison simake
est appelé commemake -f xxx/Makefile
.CURDIR
travaille pour moi oùPWD
n'a pas. J'aimkdir -p a/s/d
ensuite fait dans chaque dossier un makefile qui s'imprimaitPWD
etCURDIR
avant+$(MAKE) <subdir>
.la source
J'ai essayé plusieurs de ces réponses, mais sur mon système AIX avec GNU make 3.80, je devais faire certaines choses à l'ancienne.
Il s'avère que
lastword
,abspath
etrealpath
n'ont pas été ajoutés avant 3,81. :(Comme d'autres l'ont dit, pas le plus élégant car il invoque deux fois un shell, et il a toujours des problèmes d'espace.
Mais comme je n'ai pas d'espace sur mes chemins, cela fonctionne pour moi quelle que soit la façon dont j'ai commencé
make
:Tous me donnent
wherever
pourcurrent_dir
et le chemin absolu verswherever
pourmkfile_dir
.la source
J'aime la réponse choisie, mais je pense qu'il serait plus utile de la montrer réellement que de l'expliquer.
/tmp/makefile_path_test.sh
Production:
REMARQUE: la fonction
$(patsubst %/,%,[path/goes/here/])
est utilisée pour supprimer la barre oblique de fin.la source
Solution trouvée ici: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
La solution est : $ (CURDIR)
Vous pouvez l'utiliser comme ça:
la source
$(CURDIR)
a déjà été tenté sans succès.make
été lancé en). C'est, en effet, ce que voulait vraiment OP, mais le titre de la question est faux, donc la question elle-même est incohérente. Donc, c'est une bonne réponse à une question incorrecte. ;)Voici une ligne pour obtenir le chemin absolu vers votre
Makefile
fichier en utilisant la syntaxe shell:Et voici la version sans shell basée sur la réponse @ 0xff :
Testez-le en l'imprimant, comme:
la source
Pour autant que je sache, c'est la seule réponse ici qui fonctionne correctement avec les espaces:
Il fonctionne essentiellement en échappant les caractères d'espace en les remplaçant
' '
par'\ '
ce qui permet à Make de l'analyser correctement, puis il supprime le nom de fichier du makefile enMAKEFILE_LIST
faisant une autre substitution de sorte que vous vous retrouvez avec le répertoire dans lequel se trouve makefile. Pas exactement le plus compact chose dans le monde, mais cela fonctionne.Vous vous retrouverez avec quelque chose comme ça où tous les espaces sont échappés:
la source
Exemple pour votre référence, comme ci-dessous:
La structure des dossiers peut être la suivante:
Où il y a deux Makefiles, chacun comme ci-dessous;
Voyons maintenant le contenu des Makefiles.
Maintenant, exécutez l'exemple / Makefile, en tant que;
L'explication serait que le répertoire parent / home peut être stocké dans l'indicateur d'environnement, et peut être exporté, afin qu'il puisse être utilisé dans tous les makefiles du sous-répertoire.
la source
update 2018/03/05 finnaly j'utilise ceci:
Il peut être exécuté correctement dans un chemin relatif ou un chemin absolu. Exécuté correctement appelé par crontab. Exécuté correctement dans un autre shell.
montrer l'exemple, a .sh print self path.
vieux: j'utilise ceci:
Il peut s'afficher correctement s'il est exécuté dans un autre shell et un autre répertoire.
la source
Une ligne dans le Makefile devrait suffire:
DIR := $(notdir $(CURDIR))
la source