8
votes

Obtenir le nom de base du dossier dans GNU Gake

Il semble que la fonction baseName comme interprétée par GNU marque n'est pas la même que celle de Bash's Basename. L'ancien lande le suffixe, tandis que ces derniers dépouilleront également le chemin. Comment puis-je obtenir le nom de base d'un dossier dans mon maquillage?

En outre, pourquoi ont-ils changé? (Cela m'a fallu 20 minutes pour trouver la source de mon erreur)


0 commentaires

4 Réponses :


3
votes


2
votes

Vous pouvez toujours utiliser la version de Bash:

SHELL := /bin/bash
basename := $(shell basename /why/in/gods/name)


0 commentaires

4
votes

Je suppose que le basseName (1) dispose de deux fonctionnalités orthogonales - suffit aux suffrages de décapage, à dénuder des portions de directeurs de premier plan - et les auteurs de GNU souhaitent pouvoir invoquer chaque fonctionnalité séparément. Et bien sûr, un seul concept pourrait obtenir le nom basename .

Certainement dans un maquillage, il est utile de pouvoir convertir foo / bar / baz.c to foo / bar / baz afin que vous puissiez clouer un nouveau suffixe sur la fin pour construire un nom de fichier associé dans le même répertoire qu'un fichier source.

Les commentaires sur @ire_and_curses Réponse NOTE QUE $ (NOTDIR $ (CURDIR)) ne suffit pas Pour vos besoins, comme (étant un répertoire) Curdir peut avoir été spécifié comme xxx

et le code notdir bandes le tout en raison de la barre oblique . Pour permettre cette façon d'écrire un chemin de répertoire, vous devez supprimer une barre oblique de fuite explicitement avec E.G. $ (nodir $ (CURDIR:% / =%)) .


2 commentaires

Existe-t-il un moyen de modifier cela pour tenir compte du fait qu'il peut être accidentellement deux slashes à la fin d'un chemin? Il y a un $ (abspath ...) fonctionnerait le chemin, mais il ne peut pas être utilisé avec le :% / =% .


:% / =% est juste un raccourci pour Patsubst , vous pouvez donc écrire $ (Patsubst% /,%, $ (ABSPATH $ (BOB))) . Cependant, comme Abspath prend en charge les barres obliques elles-mêmes, vous n'aurez pas besoin du Patsubst là-bas.