Make не является еще одним языком сценариев.Это утилита управления зависимостями с возможностью построения.Расскажите, как скомпилировать любую тему:
web/themes/%/css/style.css: web/themes/%/scss/style.scss
sass $< $@
Обратите внимание, что строка рецепта (sass $@ $<
) начинается с табуляции, а не пробелов.
Это шаблонное правило .$<
и $@
- это две автоматические переменные , которые make заменяет соответственно первым предварительным условием правила и его целью.
Это правило означает, что любой CCS с именем web/themes/<something>/css/style.css
зависит от (только) предпосылки web/themes/<something>/scss/style.scss
.Если make приказано создать CSS, он будет искать соответствующий SCSS.Если он не найдет SCSS, возникнет ошибка.Если он найдет его, он сравнит даты последнего изменения CSS и SCSS.Если CSS новее, чем SCSS, make будет считать, что CSS обновлен и ничего не будет делать.В противном случае он будет считать, что CSS устарел, и он расширит рецепт (подставив $@
и $<
) и передаст его оболочке.
Далее, скажите make, что вы хотите, чтобы все ваши темыбыть скомпилированным:
THEMES := theme_a theme_b theme_c theme_d
CSS := $(patsubst %,web/themes/%/css/style.css,$(THEMES))
all: $(CSS)
И это все.Просто вызовите make all
, чтобы выполнить работу.
Самое важное, что здесь следует помнить, это то, что благодаря этой структуре:
target: prerequisite
recipe
make будет работать намного лучше, чем простой скриптцикл: он будет перекомпилировать тему, только если CSS отсутствует или старше, чем соответствующий SCSS.Если вызывается с параметром -j8
(make -j8 all
), он даже распараллелит работу, запустив до 8 параллельных заданий.
Бонус: make также может найти все ваши SCSS и вычислить список всех сборочныхCSS:
DIR := web/themes
SCSS := $(wildcard $(DIR)/*/scss/style.scss)
CSS := $(patsubst $(DIR)/%/scss/style.scss,$(DIR)/%/css/style.css,$(SCSS))
all: $(CSS)
$(DIR)/%/css/style.css: $(DIR)/%/scss/style.scss
sass $< $@