我有一个makefile for Advent of Code,我决定在chicken scheme中做。
但是,它开始增长,我想删除重复。
这是我到目前为止得到的一部分,但我如何使它能够自动找到所有的日子,而不是每天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
目标进行小更改,但make完全跳过了生成目标。
没问题:
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
我不确定这些命令是否正确,但它们是你上面提供的,所以如果不正确,你可以修复它们。
您可能会发现csm蛋很有用。我知道这意味着摆脱你的makefile,但它应该更容易做到这一点。
或者,beaker提供了基于.egg
文件的构建方法,就像chicken-install
所使用的那样。