Pregunta

He tenido problemas para que mis archivos Makefile funcionen como yo quiero. En primer lugar, me gustaría decir que esto es POSIX make, como en http: / /www.opengroup.org/onlinepubs/009695399/utilities/make.html Necesito que mi sistema de compilación funcione tanto con BSD como con GNU (Linux).

Lo que quiero es un archivo MAKE de mantenimiento cero. Quiero que solo compile todos los archivos .c y .asm en src / y coloque los archivos de objetos en objs / y luego vincule todo en objs / a un archivo binario.

Puedo hacer mucho, pero no puedo separar los archivos fuente y obj.

Estoy bien si esto requiere una pequeña secuencia de comandos de shell incorporada (usando POSIX definido / bin / sh), pero no puedo hacer que las dependencias funcionen correctamente. Quiero que solo compile el archivo objeto si el archivo fuente es más nuevo.

Mi más cercano es este:

${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c
    ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o

Esto tiene el problema de que todavía debo especificar C_OBJS = objs / foo.o y tal, y tampoco es POSIX y, por lo tanto, compila con BSD make pero no GNU make.

¿Fue útil?

Solución

La versión POSIX de make no admite explícitamente nombres de archivo con barras inclinadas, ni prevé la separación de archivos fuente en un directorio diferente de los archivos objeto. Y, como señaló @caskey, no admite ninguna notación que use caracteres '%', aunque señala que tales reglas existen y recomienda que se reserven para su uso como metacaracteres.

En consecuencia, probablemente no pueda hacer lo que quiera con POSIX estándar make.

En la práctica, a menudo puedes hacer lo que buscas con implementaciones específicas de makefile, pero el cmake resultante tiene una portabilidad limitada.

Considere utilizar un sistema de generación de archivos MAKE de algún tipo: autoconf o las herramientas automáticas (libtool, automake, <=>, etc.). O una de las muchas reelaboraciones de los conceptos básicos de <=>:

  • scons
  • hormiga
  • pastel
  • cocinar
  • sujetadores
  • ... y una docena que he olvidado o no he oído de ...

Otros consejos

POSIX make no admite construcciones como?

  objs/%.o : src/%.c
    ${CC} ${CFLAGS} -c $< -o $@

Olvidé el signo de interrogación al final, espero que mi comentario sea más claro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top