Przedstawiona składnia nazywana jest regułą wzoru w GNU make parlance i stanowi kamień węgielny rozwiązania. Wszystko, czego potrzebujesz, to dodać sposób, aby dynamicznie uzyskać listę plików .C. Inni pokazali rozwiązania, które wykorzystują do tego celu $(shell)
, ale to niepotrzebnie nieefektywne. Proponuję zamiast użyć $ (wildcard), który jest GNU make wbudowaną funkcję zaprojektowane tylko dla tego celu:
SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
$(CC) -o [email protected] $^
%.o: %.C
$(CC) $(CPFLAGS) -c $<
Jeśli szukasz czegoś bardziej zwięzły, co następuje będzie działać zbyt:
foo: $(patsubst %.C,%.o,$(wildcard *.C))
Po prostu eliminuje zmienne i wykorzystuje fakt, że GNU make udostępnia domyślną regułę wzoru %.o: %.C
, a także domyślną regułę łączenia pliku wykonywalnego ze zbioru obiektów. Osobiście użyłbym bardziej szczegółowej wersji, ponieważ uważam ją za łatwiejszą do przeczytania i utrzymania, ale do każdej z nich.
nadzieję, że pomoże,
Eric Melski
Mylisz; OP pokazuje standardową regułę wzorca, a nie regułę statycznego wzorca, i nie ma żadnego powodu, aby używać $ (powłoka) w tym miejscu, w którym $ (wieloznaczny) będzie działał bez dodatkowego obciążenia. –
@Eric: Oczywiście, jeśli chodzi o regułę statycznego wzorca. Naprawiony. Używam $ (shell) dużo pomimo dodatkowego widelca, ponieważ często generalizuję polecenie. Korzystając z: = zadania, cierpię, że dodatkowo tylko raz. – dmckee
możesz równie łatwo użyć: = z $ (wildcard), jeśli chcesz. –