2009-03-20 11 views
7

Quiero utilizar GNUMake para ejecutar un archivo MAKE basado en reglas que construye un conjunto de archivos C en una estructura de directorios (en un sistema de archivos de Windows).¿Cuál es la forma más confiable de usar GNUMake con nombres de archivos que contienen espacios?

El directorio raíz, algunos subdirectorios y algunos archivos contienen espacios.

archivo Ejemplo: "C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

gnumake no funciona muy bien cuando las rutas de archivos contienen espacios. He leído sobre las posibles formas de solucionar este problema (eliminando los espacios de mis nombres de archivo, usando el formato 8.3, sustituyendo espacios con ? o \\ etc.) pero ninguno de ellos es perfecto (¿o no?)

¿Hay una bala de plata que resuelva este problema?

BTW Estoy atrapado con GNUMake, no puedo usar una herramienta de marca diferente.

Respuesta

2

Usted puede ser capaz de escapar de los espacios en su makefile, es decir:

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

He añadido las comillas simples por si acaso, pero no sé si esto funciona si estás usando el terminal de Windows (en lugar de cygwin, etc.)

+0

Así que esto podría funcionar, o puede que no? –

+0

Puede, ya que no tengo una instalación de Windows a mano para probar para estar seguro. Sin embargo, no puedo pensar en una razón por la que esto no funcione. –

3

Lo más fácil es fijar los nombres de los archivos.

En su defecto, escriba sus comandos para poner comillas dobles alrededor de los nombres de los archivos. Lo más fácil y más seguro es poner todos los nombres de archivo en macros; el truco es que tienes que escapar de las comillas dobles, que de lo contrario, Make querrá comerse a sí mismo.

Así: FN = "\" C: \ Mis documentos \ myfiles.c \ "" FN2 = "C: \ Mis documentos \ myfile2.c"

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

El truco aquí es hacer eco de la línea de comandos con eco

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

o utilizar make -d para obtener todos los detalles de lo que está tratando de hacer.

Es posible que tenga que cortar alrededor con esto un poco, en particular, puede que tenga que doblar los escapes

+10

"¿Corregir los nombres de archivo"? Los nombres no están rotos. Las herramientas que no pueden manejar espacios están rotas. El ejemplo de ruta es un estándar de MS, incluso (sospecho que esta fue una táctica para impulsar a los desarrolladores a reparar sus herramientas rotas que no pueden manejar espacios). – Qwertie

+1

Nah, son herramientas que usan nombres de archivo que no coinciden con el estándar UNIX que estan rotos. También sistemas operativos. –

+0

Los sistemas operativos y las herramientas que * permiten * espacios están rotos ?! – Qwertie

0

Si los espacios son sólo en la parte de "raíz" de la ruta, se puede montar ese directorio en un camino sin espacios en blanco. Hay varias maneras de hacerlo: desde la línea de comando ("net use" o "subst") o desde Explorer (Herramientas> Map Network Drive). Así que C: \ Documents and Settings \\ My Documents \ Test Dir "podría convertirse en X: \ BuildMe.c

Sin embargo, si hay espacios en blanco en los nombres de archivo, o en directorios debajo del directorio de compilación" raíz ", entonces probablemente no haya soluciones perfectas. He utilizado las otras sugerencias que mencionaste (8.3 nombres, reemplazando espacios en blanco con un personaje diferente) y estos funcionan pero tienen sus propios problemas.

+0

Tiene que funcionar en todos los casos. es decir, cuando el directorio raíz contiene un espacio, así como los propios subdirectorios, y también los nombres de los archivos. – demoncodemonkey

2

Encontré una gran inspiración en http://www.mail-archive.com/[email protected]/msg05201.html que me puso en marcha.Mi propia aplicación de prueba consiste en un directorio de archivos FLV Jazz de la era WW2 descargados de YouTube y un subdirectorio de audio en el que me gustaría almacenar las versiones de audio OGA de cada uno. Y, por supuesto, los nombres de los archivos contienen espacios. A continuación, me gustaría ejecutar ffmpeg2theora en

Aquí está GNUMake Makefile que he pirateado para trabajar. ¡Gracias a todos los consejos en este sitio y también al sitio mencionado más arriba!

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,[email protected])" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,[email protected])))" 

show: 
    echo $(FLVS) 
    echo $(AUDIOS) 
+0

O puede sustituir otros caracteres y convertirlos de nuevo en espacios cuando sea necesario. 's + = $ (subst \, +, $ 1)' '+ s = $ (subst +, \, $ 1)' '$ (llamada s +, foo bar): $ (llamada s +, bar baz) ' ' @echo Making $ (call + s, $ @) from $ (call + s, $ <) ' –

1

Normalmente he utilizado lo que es una especie de combinación de la respuesta de Dana the Sane y la respuesta de Brian Yoder.

Usted acaba de utilizar la función $(subst) para reemplazar todas las ocurrencias de espacios con espacios escapados. EG:

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

(Tenga en cuenta que con algunas versiones anteriores de hacer en Windows también tendría que utilizar otro $(subst) para cambiar las barras invertidas de ruta a rayas verticales)

0

simplemente agrego 'comillas simples' alrededor de la cadena infractor : - '$ (target_dir)'

Ejemplo: (esto me ayudó a conseguir erlang.mk para que funcione correctamente en las ventanas!)

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)' ahora se expande correctamente a 'c:/Program Files/erl7.0/erts-7.0/include/'

usando make -d también ayuda a revelar caminos válidos

Cuestiones relacionadas