@sehe , ... , ,
, ( ) ( Makefile).
" make",
A_DEPS=dep1 dep2
C_DEPS=dep2
bin/%/A bin/%/B bin/%/C:
$(MAKE) BUILD="$*" TARGET=$(@F) DEPS="$($(@F)_DEPS)" GENRULE
, "" . Makefile " ", GENRULE:
%/*.o:
mkdir -p "$(@D)" && touch "$@"
GENRULE: obj/$(BUILD)/$(TARGET).o $(DEPS:%=obj/$(BUILD)/%.o)
echo gcc -o "bin/$(BUILD)/$(TARGET)" $^
mkdir -p "bin/$(BUILD)" && touch "bin/$(BUILD)/$(TARGET)"
.PHONY: GENRULE
, :
$ for target in bin/{debug,release}/{A,B,C}; do make -Bs "$target"; done
gcc -o bin/debug/A obj/debug/A.o obj/debug/dep1.o obj/debug/dep2.o
gcc -o bin/debug/B obj/debug/B.o
gcc -o bin/debug/C obj/debug/C.o obj/debug/dep2.o
gcc -o bin/release/A obj/release/A.o obj/release/dep1.o obj/release/dep2.o
gcc -o bin/release/B obj/release/B.o
gcc -o bin/release/C obj/release/C.o obj/release/dep2.o
:
$ find bin obj
bin
bin/debug
bin/debug/A
bin/debug/B
bin/debug/C
bin/release
bin/release/A
bin/release/B
bin/release/C
obj
obj/debug
obj/debug/A.o
obj/debug/B.o
obj/debug/C.o
obj/debug/dep1.o
obj/debug/dep2.o
obj/release
obj/release/A.o
obj/release/B.o
obj/release/C.o
obj/release/dep1.o
obj/release/dep2.o
( ) $@ $(@F):
EXTRA="--standardopts"
A_FLAGS="--a-opts"
B_FLAGS="--b-opts"
.SECONDEXPANSION:
debug/% release/%: EXTRA+=$($(@F)_FLAGS)
%/A %/B %/C:
echo building $@ with $(EXTRA)