Makefile foreach составление тем - PullRequest
0 голосов
/ 29 мая 2018

Я сейчас пытаюсь скомпилировать все свои темы за один раз, но я не могу заставить его работать.

Например:

THEMES := theme_a theme_b theme_c theme_d
build_themes: 
     $(foreach THEME, $(THEMES), sass web/themes/$(THEME)/scss/style.scss web/themes/$(THEME)/css/style.css)

Но он просто компилируетсяпервая тема и не все.

Что-то не так с моей итерацией?

РЕДАКТИРОВАТЬ После предложения Рено Пакале:

RUBY    =$(whereis ruby)
SASSC   = $(RUBY) sass --style compressed

THEMES  := theme_a theme_b theme_c theme_d
SASSDIR = build/scss
CSSDIR  = web/themes/custom-themes
SASS    := $(wildcard $(SASSDIR)/style_*.scss)
CSS     := $(patsubst $(SASSDIR)/style_%.scss, $(CSSDIR)/%/css/style.css, $(SASS))

all: $(CSS)

$(CSSDIR)/%/css/style.css: $(SASSDIR)/style_%.scss
    $(SASSC) $< $@

Но я все еще не могу заставить его работать

1 Ответ

0 голосов
/ 29 мая 2018

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 $< $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...