#makefile #chicken-scheme
Вопрос:
У меня есть файл для создания кода, который я решил сделать в 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)
lt; -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)lt; -j aoc2015day01 -emit-types-file aoc2015day01.types -o $@
$(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day01.import.scmaoc2015day01.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)lt; -j aoc2015day02 -emit-types-file aoc2015day02.types -o $@
$(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day02.import.scmaoc2015day02.import.so: aoc2015day02.so
$(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) aoc2015day02.import.scm
Я попытался внести небольшое изменение вadvent2015
цель, указав подстановочный знак в файлах so, которые она использует, но полностью пропустил создание целей.
Комментарии:
1. Ну,
wildcard
будут найдены только файлы, которые уже существуют на диске. Если файл еще не существует (потому что, например, make должен его создать), тоwildcard
он не вернется, точно так же, как при запускеls
он не отображается.2. Вы действительно не даете здесь достаточно информации. Вы говорите, как мне сделать так, чтобы он мог автоматически находить все дни , но вы не говорите, что такое «все дни» или как make должен знать, что это такое. Вы имеете в виду, что хотите подняться до 365? Если да, то почему в ваших днях всего две цифры (
01
,02
, и т.д.)? Каковы исходные файлы; являются ли они...scm
файлами?3. извините, когда я говорю «все дни», головоломки длятся 25 дней, поэтому будут «aoc2015day01», «aoc2015day02», … «aoc2015day25», что означает, что я должен добавлять 2 цели каждый раз, когда я добавляю еще один день. Но каждая цель одна и та же, независимо от того, какой сегодня день. например «aoc2015day01.so» цель идентична «aoc2015day02″, за исключением ссылки 02 вместо 01. Я хотел бы каким-то образом использовать»%», чтобы мне не нужно было каждый день выполнять 25 правил х 2.
4. в идеале я мог бы использовать переменную, например «ДНИ = 01 02 03», а затем правила могли бы работать над списком для создания целей по мере необходимости, но я не смог найти синтаксис, который бы работал.
Ответ №1:
Без проблем:
DAYS := 01 02 03 04 <...> 24 25 all: advent2015 advent2015: $(ADVENTS_SRC)2015/advent2015.scm $(foreach D,$(DAYS),aoc2015day$(D).so) $(CSC) $(INCLUDE_FLAGS)
lt; -d3 -O2 -compile-syntax -o $@
%.so: $(ADVENTS_SRC)2015/%.scm aoc-files.so
$(CSC) $(INCLUDE_FLAGS) $(LIBFLAGS)lt; -j $* -emit-types-file $*.types -o $@
$(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) $*.import.scm%.import.so: %.so
$(CSC) $(INCLUDE_FLAGS) $(IMPORTFLAGS) $*.import.scm
Я не уверен, что эти команды на самом деле верны, но это то, что вы указали выше, так что вы можете исправить их, если нет.
Комментарии:
1. работает отлично, спасибо. Есть пара дополнительных мест, где я смогу использовать эту технику в своем файле makefile, так что это как раз то, что мне нужно.
2. не могли бы вы объяснить ВТОРОЕ РАСШИРЕНИЕ здесь, пожалуйста, @madscientist? Я (случайно) не включил его, и сборка все еще работала как для чистой, так и для инкрементной сборки, поэтому мне интересно, нужна ли она, или я еще не понял, зачем она нужна.
3. О, извини, тебе это не нужно. Я забыл его снять.
Ответ №2:
Вы можете найти яйцо csm полезным. Я знаю, что это означает избавиться от вашего файла makefile, но это должно сделать трюк намного проще.
В качестве альтернативы, beaker предоставляет способы построения на основе .egg
файлов, подобных тем, которые используются chicken-install
.
Комментарии:
1. csm может быть вариантом. он также может выводить формат файла makefile, чтобы я мог найти способ объединить его с остальной частью файла makefile. У меня будет спектакль. было бы неплохо знать, есть ли собственный способ сделать это в файле makefile, хотя для аналогичных сценариев, не относящихся к курице