ventajas usar tutorial make español configurar compilacion comando makefile design-patterns whitespace filenames rule

usar - makefile wikipedia



¿Cómo obtener reglas de patrones para unir nombres de archivos con espacios en Makefile? (2)

En GNU make docs, ''%'' está documentado para que coincida con "cualquier subcadena no vacía". Sin embargo, parece que en realidad solo coincide con subcadenas no vacías que no contienen espacios en blanco. Por ejemplo, di que haces esto:

mkdir /tmp/foo cd /tmp/foo echo ''int main() { return 0; }'' > "test.c" echo ''int main() { return 0; }'' > "test space.c"

Ahora, debería poder construir estos usando las reglas de patrones incorporados de GNU Make:

anthony@Zia:/tmp/foo$ make "test" cc test.c -o test anthony@Zia:/tmp/foo$ make "test space" make: *** No rule to make target `test space''. Stop.

El mismo problema ocurre cuando escribe un archivo MAKE.

anthony@Zia:/tmp/foo$ rm test anthony@Zia:/tmp/foo$ echo ''all: test test/ space'' > Makefile anthony@Zia:/tmp/foo$ make cc test.c -o test make: *** No rule to make target `test space'', needed by `all''. Stop.

Incluso si agrega explícitamente una regla %: %.c , el resultado es el mismo. Pero si agrega una regla explícita al Makefile, así, funciona:

test/ space: test/ space.c $(CC) -o "$@" "$<" # first char is tab, of course.

¿Hay algún truco para hacer que los espacios funcionen con reglas implícitas?

editar

He enviado un informe de error: http://lists.gnu.org/archive/html/bug-make/2011-06/msg00002.html


Yo no lo creo. La idea de una lista de tokens separados por espacios en blanco que se pasan como una cadena está muy profundamente arraigada en make. Esas listas son analizadas y repasadas. Hay una razón por la que los espacios en el directorio y los nombres de archivos se consideran malas prácticas en el mundo de UNIX.


Esto es un desafío, pero a partir de hoy, las personas todavía reciben caminos con espacios en algunas ocasiones.

De todos modos, hacer un enlace en lugar de acceder directamente al directorio en la regla% funciona bien.

# GNU makefile DIR_WITH_SPACE=/c/Users/me/My/ Code # *** DOESN''T WORK *** %.h : $(DIR_WITH_SPACE)/%.h cp -v "$<" "$@" fix: ln -s $(DIR_WITH_SPACES) dir_fixed # Does work :) %.h : dir_fixed/%.h cp -v "$<" "$@"