2009-03-20 13 views
7

voglio usare gnumake per eseguire un makefile rule-based che costruisce un insieme di file C in una struttura di directory (su un file di sistema di Windows).Qual è il modo più affidabile di usare GNUMake con nomi di file contenenti spazi?

La directory principale, alcune sotto-cartelle e alcuni file contengono spazi.

di file Esempio: "C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

gnumake in realtà non funziona quando i percorsi dei file contengono spazi. Ho letto sui possibili modi di aggirare questo problema (rimuovendo gli spazi dai miei nomi di file, utilizzando il formato 8.3, sostituendo gli spazi con ? o \\ ecc.) Ma nessuno di essi è perfetto (o sono?)

C'è un proiettile d'argento che risolverà questo problema?

BTW io sono bloccato con gnumake, non riesco a utilizzare un diverso strumento di marca.

risposta

2

Si può essere in grado di sfuggire gli spazi nel makefile, vale a dire:

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

ho aggiunto le virgolette singole solo nel caso in cui, ma non so se questo funziona se siete usando il terminale di Windows (piuttosto che cygwin ecc.).

+0

Quindi questo potrebbe funzionare, o potrebbe non? –

+0

Potrebbe essere in grado, in quanto non ho una installazione di Windows a portata di mano per verificare con per essere sicuro. Non riesco a pensare a una ragione per cui questo non funzionerà comunque. –

3

La cosa più semplice è infatti quello di fissare i nomi dei file.

In mancanza di questo, però, scrivere i tuoi comandi di mettere le virgolette attorno ai nomi dei file. La cosa più semplice e sicura è mettere tutti i nomi dei file in macro; il trucco è che devi sfuggire alle doppie virgolette, che Make vorrebbe altrimenti mangiare da solo.

Quindi: FN = "\" C: \ Documenti \ myfiles.c \ "" FN2 = "C: \ Documenti \ myfile2.c"

o utilizzare $ (CC) $ (CFLAGS) "$ (FN2)"

Il trucco è fare eco la linea di comando con eco

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

o utilizzare make -d per avere tutti i dettagli di ciò che fare sta cercando di fare.

Potrebbe essere necessario incidere su questo un po ', in particolare, potrebbe essere necessario raddoppiare le fughe

+10

"Correggere i nomi dei file"? I nomi non sono rotti. Gli strumenti che non possono gestire gli spazi sono rotti. Il percorso di esempio è uno standard MS, anche (sospetto che questa fosse una tattica per spingere gli sviluppatori a correggere i loro strumenti rotti che non possono gestire gli spazi.) – Qwertie

+1

Nah, sono gli strumenti che usano nomi di file che non corrispondono allo standard UNIX che Sono rotti. Anche sistemi operativi. –

+0

I sistemi operativi e gli strumenti che * consentono * spazi sono interrotti ?! – Qwertie

0

Se gli spazi sono solo nella parte "root" del percorso, è possibile montare quella directory su un percorso senza spazi vuoti. Ci sono molti modi per farlo: dalla riga di comando ("net use" o "subst") o da Explorer (Strumenti> Map Network Drive). Quindi C: \ Documents and Settings \\ My Documents \ Test Dir "potrebbe diventare X: \ BuildMe.c

Tuttavia, se ci sono spazi nei nomi di file, o in directory sotto la directory di build" root ", quindi probabilmente non ci sono soluzioni perfette Ho usato gli altri suggerimenti che hai citato (8,3 nomi, sostituendo spazi con un altro carattere) e questi funzionano ma hanno i loro problemi

+0

Deve funzionare in tutti i casi. vale a dire quando la directory radice contiene uno spazio, così come le sottodirectory stesse e anche i nomi dei file stessi. – demoncodemonkey

2

Ho trovato una grande ispirazione a http://www.mail-archive.com/[email protected]/msg05201.html che mi ha fatto andare.La mia applicazione di prova consiste in una directory di file FLV Jazz di epoca WW2 scaricati da YouTube e una sottodirectory audio in cui mi piacerebbe memorizzare le versioni audio OGA di ognuno di essi. E, naturalmente, i nomi dei file contengono spazi. Vorrei quindi eseguire ffmpeg2theora su

Ecco il Makefile GNUMake che ho hackerato insieme per funzionare. Grazie a tutti i suggerimenti su questo sito e anche il sito di riferimento sopra!

+0

Oppure puoi sostituire altri personaggi e convertirli in spazi quando necessario. 's + = $ (subst \, +, $ 1)' '+ s = $ (subst +, \, $ 1)' '$ (call s +, foo bar): $ (chiamata s +, bar baz) ' ' @echo Making $ (chiama + s, $ @) da $ (chiama + s, $ <) ' –

1

In genere ho usato ciò che è una sorta di combinazione tra la risposta di Dana il Sano e la risposta di Brian Yoder.

È sufficiente utilizzare la funzione $(subst) per sostituire tutte le occorrenze di spazi con spazi in escape. EG:

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

(Si noti che con alcune vecchie versioni di fare su Windows si sarebbe anche bisogno di utilizzare un altro $(subst) cambiare backslash percorso a barre)

0

ho semplicemente Aggiungi 'apici' attorno alla stringa incriminata : - '$ (target_dir)'

Esempio: (questo mi ha aiutato a erlang.mk per funzionare correttamente su 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)' ora si espande correttamente per 'c:/Program Files/erl7.0/erts-7.0/include/'

utilizzando make -d aiuta anche rivelare i percorsi non validi