如何使用通配符删除 makefile 中的重复项?

How can I use wildcards to remove repetition in my makefile?

我有一个代码降临的 makefile,我决定在小鸡方案中使用它。

不过,它开始变大了,我想删除重复的内容。

这是我目前所掌握的部分内容,但我如何制作它才能自动查找所有日期,而不是每天 2 个条目和不断增加的主要目标?

all: advent2015

# advent years - this is ever increasing with the *.so targets
advent2015: $(ADVENTS_SRC)2015/advent2015.scm \
 aoc2015day01.so aoc2015day02.so
    $(CSC) $(INCLUDE_FLAGS) $< -d3 -O2 -compile-syntax -o $@

# individual days - how do i write a single rule that works for all days?
aoc2015day01.so: $(ADVENTS_SRC)2015/aoc2015day01.scm aoc-files.so
    $(CSC) $(INCLUDE_FLAGS) $(LIBFLAGS) $< -j aoc2015day01 -emit-types-file aoc2015day01.types -o $@
    $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day01.import.scm

aoc2015day01.import.so: aoc2015day01.so
    $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day01.import.scm

# day02...
aoc2015day02.so: $(ADVENTS_SRC)2015/aoc2015day02.scm aoc-files.so
    $(CSC) $(INCLUDE_FLAGS) $(LIBFLAGS) $< -j aoc2015day02 -emit-types-file aoc2015day02.types -o $@
    $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day02.import.scm

aoc2015day02.import.so: aoc2015day02.so
    $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day02.import.scm

我尝试通过在它使用的 so 文件中指定通配符来对 advent2015 目标进行小的更改,但完全跳过了生成目标。

您可能会发现 csm egg 很有用。我知道这意味着摆脱你的 makefile,但它应该更容易做到这一点。

或者,beaker 提供了基于 .egg 文件的构建方法,就像 chicken-install 所使用的那样。

没问题:

DAYS := 01 02 03 04 <...> 24 25

all: advent2015

advent2015: $(ADVENTS_SRC)2015/advent2015.scm \
     $(foreach D,$(DAYS),aoc2015day$(D).so)
        $(CSC) $(INCLUDE_FLAGS) $< -d3 -O2 -compile-syntax -o $@

%.so: $(ADVENTS_SRC)2015/%.scm aoc-files.so
        $(CSC) $(INCLUDE_FLAGS) $(LIBFLAGS) $< -j $* -emit-types-file $*.types -o $@
        $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) $*.import.scm

%.import.so: %.so
        $(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) $*.import.scm

我不确定这些命令是否真的正确,但它们是您上面提供的,所以如果不正确,您可以修复它们。