Quelle est la manière la plus fiable d’utiliser GNUMake avec des noms de fichiers contenant des espaces?

Je veux utiliser GNUMake pour exécuter un fichier makefile basé sur des règles qui génère un ensemble de fichiers C dans une structure de répertoire (sur un système de fichiers Windows).

Le répertoire racine, certains sous-répertoires et certains fichiers contiennent des espaces.

Exemple de fichier: "C:\Documents and Settings\\My Documents\Test Dir\Build Me.c"

GNUMake ne fonctionne pas vraiment lorsque les chemins de fichiers contiennent des espaces. J’ai lu les méthodes possibles pour contourner ce problème (en supprimant les espaces de mes noms de fichiers, en utilisant le format 8.3, en remplaçant les espaces par ? Ou \\ etc.), mais aucun n’est parfait (ou est-ce?)

Y a-t-il une solution miracle pour résoudre ce problème?

BTW je suis coincé avec GNUMake, je ne peux pas utiliser un autre outil de fabrication.

    Le plus simple est en effet de corriger les noms de fichiers.

    Toutefois, si vous ne le faites pas, écrivez vos commandes pour placer des guillemets doubles autour des noms de fichiers. Le plus simple et le plus sûr est de mettre tous les noms de fichiers dans des macros; L’astuce est que vous devez échapper aux guillemets doubles, que Make va autrement vouloir manger.

    Donc: FN = “\” C: \ Mes documents \ myfiles.c \ “” FN2 = “C: \ Mes documents \ myfile2.c”

    ou utilisez $ (CC) $ (CFLAGS) “$ (FN2)”

    L’astuce ici est de faire écho à votre ligne de commande avec echo

     echo $(CC) $(CFLAGS) "$(FN2)" 

    ou utilisez make -d pour obtenir tous les détails de ce que make tente de faire.

    Vous devrez peut-être vous attaquer un peu à cela, en particulier, vous devrez peut-être doubler les fuites.

    Vous pourrez peut-être échapper aux espaces de votre fichier Make, à savoir:

     $(CC) $(CFLAGS) 'C:\Documents\ and\ Settings\\My\ Documents\Test\ Dir\Build Me.c' 

    J’ai ajouté les guillemets simples au cas où, mais je ne sais pas si cela fonctionne si vous utilisez le terminal Windows (plutôt que cygwin, etc.).

    J’ai trouvé une grande source d’inspiration sur http://www.mail-archive.com/[email protected]/msg05201.html, ce qui m’a permis d’aller de l’avant. Ma propre application de test consiste en un répertoire de fichiers Jazz FLV datant de la Seconde Guerre mondiale, téléchargés depuis YouTube et un sous-répertoire audio dans lequel je souhaite stocker les versions audio OGA de chacun. Et, bien sûr, les noms de fichiers contiennent des espaces. Je voudrais alors lancer ffmpeg2theora pour

    Voici le Makefile de GNUMake que j’ai piraté pour travailler. Merci à tous les conseils sur ce site et aussi au site référencé ci-dessus!

     sq = $(subst $(sp),?,$1) qs = $(subst ?,$(sp),$1) e := sp := $(e) $(e) FLVS := $(foreach file,var,$(call sq,$(wildcard *.flv))) FLVS := $(subst .flv?,.flv ,$(FLVS)) AUDIOS := $(patsubst %.flv,audio/%.oga,$(FLVS)) .PHONY: audios show audios: $(AUDIOS) $(AUDIOS) : $(FLVS) ffmpeg2theora --novideo -o "$(call qs,$@)" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,$@)))" show: echo $(FLVS) echo $(AUDIOS) 

    J’ai en général utilisé une sorte de combinaison de la réponse de Dana the Sane et de la réponse de Brian Yoder.

    Vous utilisez simplement la fonction $(subst) pour remplacer toutes les occurrences d’espaces par des espaces d’échappement. PAR EXEMPLE:

     empty := space := $(empty) $(empty) program_files := $(subst $(space),\$(space),$(ProgramFiles)) 

    (Notez qu’avec certaines anciennes versions de make sur Windows, vous devez également utiliser un autre $(subst) pour changer les barres obliques inverses)

    Si les espaces sont uniquement dans la partie “root” du chemin, vous pouvez monter ce répertoire sur un chemin sans espace. Il existe plusieurs façons de procéder: à partir de la ligne de commande (“net use” ou “subst”) ou à partir de l’Explorateur (Outils> Mapper un lecteur réseau). Donc C: \ Documents and Settings \\ Mes documents \ Test Dir “pourrait devenir X: \ BuildMe.c

    Cependant, s’il y a des espaces dans les noms de fichiers ou dans les répertoires sous le répertoire de génération “root”, il n’y a probablement pas de solution parfaite. J’ai utilisé les autres suggestions que vous avez mentionnées (8.3 noms, remplacement des blancs avec un caractère différent) et celles-ci fonctionnent mais elles ont leurs propres problèmes.

    J’ajoute simplement des guillemets simples autour de la chaîne incriminée: – ‘$ (TARGET_DIR)’

    Exemple: (ceci m’a aidé à obtenir que erlang.mk fonctionne correctement sous Windows!)

     app:: $(C_SRC_ENV) @mkdir -p priv/ $(c_src_verbose) $(CC) $(CFLAGS) $(C_SRC_DIR)/*.c -fPIC -shared -o $(C_SRC_OUTPUT) \ -I '$(ERTS_INCLUDE_DIR)' $(C_SRC_OPTS) 

    '$(ERTS_INCLUDE_DIR)' se développe désormais correctement en 'c:/Program Files/erl7.0/erts-7.0/include/'

    using make -d aide également à révéler des chemins non valides