Простой файл Makefile для сборки и запуска программы Scala

Я написал этот простой Makefile, но в итоге получился спагетти код. я использовал basename многократно. У меня есть особый случай для first.spec.scala.run и follow.spec.scala.run и, возможно, еще один код антипаттерна, о котором я не знаю. Я недоволен своим кодом и ценю любые отзывы или обзоры. Спасибо.

SPECS=First Follow
EXAMPLES_PATH=../..
ROOT_PATH=../${EXAMPLES_PATH}
SCALAV=2.12
APSLIB=${ROOT_PATH}/lib/aps-library-${SCALAV}.jar
SCALA_FLAGS=.:${APSLIB}
APS2SCALA=${ROOT_PATH}/bin/aps2scala

all: $(addsuffix Spec.compile, $(SPECS)) $(addsuffix Spec.run, $(SPECS))

%.generate:
    ${APS2SCALA} -DCOT -p ${EXAMPLES_PATH}:${ROOT_PATH}/base $*

%.run:
    @scala -cp ${SCALA_FLAGS} $(basename $@)

GrammarUtil.compile: grammar.generate
    scalac -cp ${SCALA_FLAGS} grammar.scala $(basename $@).scala

first.compile:
    scalac -cp ${SCALA_FLAGS} $(basename $@).scala

follow.compile:
    scalac -cp ${SCALA_FLAGS} $(basename $@).scala

Spec.compile:
    scalac -cp ${SCALA_FLAGS} $(basename $@).scala

FirstSpec.compile: Spec.compile grammar.generate GrammarUtil.compile first.generate first.compile
    scalac -cp ${SCALA_FLAGS} $(basename $@).scala

FollowSpec.compile: Spec.compile grammar.generate GrammarUtil.compile follow.generate follow.compile
    scalac -cp ${SCALA_FLAGS} $(basename $@).scala

clean:
    rm -f *.class grammar.scala first.scala follow.scala

1 ответ
1

Я не знаю Scala, но знаю Make, поэтому надеюсь, что это поможет.

Во-первых, отсутствует make-файл .DELETE_ON_ERROR:, который требуется практически каждому make-файлу, чтобы частично записанные выходные файлы не отображались актуальными при сбое команды компиляции (например, при прерывании).

Мы также хотим .PHONY: для тех целей, которые не создают файлы, например all и clean. (И чистый должен использовать $(RM) скорее, чем rm -f, для повышения портативности.)

Я думаю, что нам нужно простое шаблонное правило, которое гласит, что мы можем создать файл с именем foo.compile учитывая ввод под названием foo.scala:

%.compile: %.scala
    scalac -cp ${SCALA_FLAGS} $<

Мне кажется, что -cp это один из флагов scalac, так что это, вероятно, должно быть в ${SCALA_FLAGS} а не в команде.

Я не уверен, что ваши правила действительно создают файлы, на которые они претендуют. Например, GrammarUtil.compile зависит от grammar.generate, но на самом деле использует grammar.scala — должен grammar.generate на самом деле быть grammar.scala там?

  • Большое спасибо за отзыв, но я терплю неудачу. Я получаю сообщение об ошибке: gist.github.com/amir734jj/645a94412475dfb700f6116dd1c7e1bc

    — Node.JS

  • Я получаю сообщение об ошибке: «make: *** Нет правила для создания цели ‘grammar.aps’. Остановить».

    — Node.JS

  • Да. %.generate и %.class существуют и работает по отдельности.

    — Node.JS


  • Я прокомментировал эту ссылку (так как это не часть обзора)

    — Тоби Спейт

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *