2010-07-18 12 views
15

estoy tratando de decir "la descarga del repositorio git sólo funcionará si el tirón directorio/existe si el tirón directorio/no existe, entonces lo hacen."¿Puede un archivo MAKE tener un directorio como destino?

yank/gist.el/gist.el : yank 
    cd yank ; git clone http://github.com/defunkt/gist.el.git 

yank: 
    mkdir yank 

estoy usando makepp - http://makepp.sf.net y estoy consiguiendo el error:

[[email protected] ~/edan/pkg/gist.el] makepp 
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile' 
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el' 
mkdir yank 
mkdir: cannot create directory `yank': File exists 
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1] 
makepp: 0 files updated, 0 phony targets built and 1 target failed 
[[email protected] ~/edan/pkg/gist.el] 

Pero por qué iba a tratar de hacer que el directorio tirón si es que existe? La "fuente" ya ha creado ben ...

+0

Ya tuvimos una discusión sobre la creación de directorios: http://stackoverflow.com/questions/1950926/create-directories-using-make-file. También es posible que desee saber que [la forma en que crea directorios no es segura para subprocesos] (http://stackoverflow.com/questions/1894427/makefile-with-directory-tree-creation-suitable-for-parallel-j- construir). –

+0

@Pavel: la forma en que se crea el directorio está bien, porque es una dependencia del archivo. En el ejemplo que cita, el problema es precisamente que el directorio no es una dependencia de los objetivos que lo utilizan, sino de otro objetivo, lo que no sirve de nada. – Gilles

+0

@Gilles, vale, tienes razón, mezclé los problemas. Solo quería persuadirlo de que los directorios como objetivos no son una buena opción ... –

Respuesta

16

Sí, un Makefile puede tener un directorio como destino.

Su problema podría ser que el cd no hace lo que quiere: lo hace cd y la git clone se lleva a cabo en el directorio original (el que cd ed partir, no el que cd ed a) . Esto se debe a que para cada comando en el Makefile se crea un shell adicional. Una solución alternativa es ejecutar cd y clonar como un comando con el shell &&.

Esto debería funcionar:

bla/f: dir 
    cd dir && touch f 

dir: 
    mkdir dir 
+1

Es cierto, y en general, los archivos make siempre deben '&&' en vez de ';'. Sin embargo, esto no puede ser un problema aquí: 'cd' solo se ejecuta * después * de que se haya rehecho el objetivo' yank'. – Gilles

+6

Normalmente utilizo un objetivo de 'dir/.dirstamp' en lugar de' dir' con una regla de 'mkdir -p dir && touch $ @'. Las marcas de tiempo en los directorios en Unix cambian cuando los contenidos del directorio cambian impidiendo que se ejecuten las reglas dependientes. –

1

Su makefile debe hacer lo que usted espera. Como yank no tiene ninguna dependencia, no se rehecha si existe. Así que esto parece un error en makepp. Puede confirmar esto probando su archivo MAKE con una implementación tradicional de make.

+0

Lo intenté, y no fue reproducido. –

Cuestiones relacionadas