2014-12-31 2 views
0

Я хочу использовать многострочную строку json-encoded в качестве входной информации для команды в make-файле. Прямо сейчас, ничто, кажется, не передается команде watchman-typescript или watchman-debug.Makefile: используйте многострочную строку в качестве входных данных для команды

Makefile

.PHONY: typescript 
typescript: 
    tsc --target ES5 ts/main.ts 

.PHONY: watch 
watch: 
    watchman watch . 

define WATCHMAN_TYPESCRIPT_TRIGGER = 
["trigger", "./ts", { 
    "name": "tsTrigger", 
    "expression": ["suffix", "ts"], 
    "command": ["make", "typescript"] 
}] 
endef 

.PHONY: watchman-typescript 
watchman-typescript: 
    watchman -j '$(WATCHMAN_TYPESCRIPT_TRIGGER)' 

.PHONY: watchman-debug 
watchman-debug: 
    echo $(WATCHMAN_TYPESCRIPT_TRIGGER) 
+0

Должен ли JSON передаваться 'watchman' как несколько строк, или вы просто хотите записать его таким образом в make-файле для удобства чтения? – Wintermute

+0

Я собирался читать и старался избегать обратной косой черты. – Joe

ответ

3

Хотя это не представляется возможным в сделать сам - make в конечном итоге интерпретирует каждую строку переменной как команду в рецепте - существует обходное решение: вы можете экспортировать переменную в качестве переменной оболочки и ссылаться на нее в команде. То есть:

define WATCHMAN_TYPESCRIPT_TRIGGER = 
["trigger", "./ts", { 
    "name": "tsTrigger", 
    "expression": ["suffix", "ts"], 
    "command": ["make" "typescript"] 
}] 
endef 

# export as shell variable 
export WATCHMAN_TYPESCRIPT_TRIGGER 

# ... 

# use shell variable in the command. $$ in make means $ in the shell command. 
watchman-typescript: 
    watchman -j "$$WATCHMAN_TYPESCRIPT_TRIGGER" 
1

В Makefiles, вы можете использовать line continuation character\ разделить что-то по нескольким линиям:

define WATCHMAN_TYPESCRIPT_TRIGGER = \ 
["trigger", "./ts", { \ 
    "name": "tsTrigger", \ 
    "expression": ["suffix", "ts"], \ 
    "command": ["make" "typescript"] \ 
}] \ 
endef