La sintaxis que ha mostrado se llama una regla de patrón en GNU make lenguage, y constituye la piedra angular de su solución. Todo lo que necesita es agregar una forma de obtener la lista de archivos .C dinámicamente. Otros han mostrado soluciones que usan $(shell)
para hacer esto, pero eso es innecesariamente ineficiente. Le sugiero que en lugar de utilizar $ (comodín), que es un GNU make función integrada diseñada para este propósito:
SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
$(CC) -o [email protected] $^
%.o: %.C
$(CC) $(CPFLAGS) -c $<
Si están buscando algo más concisa, la siguiente también funcionará:
foo: $(patsubst %.C,%.o,$(wildcard *.C))
Esto simplemente elimina las variables y aprovecha el hecho de que GNU make proporciona una regla de patrón predeterminada %.o: %.C
, así como una regla predeterminada para vincular un archivo ejecutable a partir de un conjunto de objetos. Personalmente usaría la versión más detallada ya que me parece más fácil de leer y mantener, pero a cada uno la suya.
Espero que ayude,
Eric melski
Usted está equivocado; el OP muestra una regla de patrón estándar, no una regla de patrón estático, y no hay una buena razón para usar $ (shell) aquí donde $ (comodín) hará el truco sin la sobrecarga adicional. –
@Eric: Correcto sobre la regla del patrón estático, por supuesto. Fijo. Uso $ (shell) mucho a pesar del fork extra porque a menudo generalizo el comando. Al usar: = asignación, sufro el extra solo una vez. – dmckee
puede usar tan fácilmente: = con $ (comodín) si lo desea. –