Редактировать - после некоторых ревизий похоже, что единственная проблема с моим оригиналом была не из-за пробелов, а с MAKE_O
. Я исправил его в своей версии, но в основном я удаляю их ниже.
Кстати, было написано оригинальное сообщение, я не уверен, будет ли мое решение релевантным. Тем не менее, я оказался в середине define
уже внутри foreach
и не мог понять, как вставить новую строку, используя любой из других ответов, как указано.
Решение:
define BR
$(1)
endef
define MAKE_O
$(1): $(wildcard $(1:obj/%.o=src/%.cpp)); \
$(CXX) ... -c $$< \$(call BR)-o $1 ... \
\$(call BR)&& touch [email protected]
endef
$(foreach N,main.o,$(eval $(call MAKE_O,$(N))))
Желаемый выход (составление усекается от auto-dependency generation, отсюда и touch
):
> make obj/main.o
g++ ... -c src/main.cpp \
-o obj/main.o ... \
&& touch obj/main.o
Я изменил BR
выполнить выемку, но оставить конец строки до вы:
define BR
$(1)
$(1:%=) #<remove this comment
endef
define MAKE_O
$(1): $(wildcard $(1:obj/%.o=src/%.cpp)); \
$(CXX) ... -c $$< $(call BR,\)-o $1 ... \
$(call BR,\)&& touch [email protected]
endef
$(foreach N,main.o,$(eval $(call MAKE_O,$(N))))
Разметка не поможет, чтобы показать это, но линия 2 из BR
является $(1:%=_space_)_tab_
Результат (комментарий сам не допускается.):
> make -n obj/main.o
g++ obj/main.o -c \
-o obj/main.o && \
echo statement on new line
Я использовал $(call BR,\)
так, чтобы новая строка не была распознана как побег новая линия, и $(1:%=
пространство)
вкладка так, что язычок принуждается (многие аналогичные правила были определены, как SPACE:=$(SPACE) $(SPACE)
без предварительного значения.) переменная слева от пробела должны вычисляться то. Чтобы было ясно, удаляя пробелы до и после вызова: ...lastword$(call BR,\)firstword...
выходов ...lastword\n\tfirstword...
или выписаны,
[^]...lastword \[$]
[^]$(call BR,\)firstword...[$]
... урожайности ...
[^]...lastword \[$]
[^] firstword...[$]
для достижения того же (используя^$ для обозначения начала и конца строки. Кто-то еще, вероятно, знает, как форматировать/комментировать это лучше.)
Мой синтаксический ярлык явно не впечатлен «скопированными» круглыми скобками и конечными пробелами, но результат приличный ,
Я предполагаю, что ваша настоящая цель сложнее, чем «эхо» в цикле? Потому что нет причин использовать 'foreach' для этого примера вообще. Вы можете просто 'echo $ ^' напрямую. –
@ EtanReisner, не будет ли это ставить все на одной линии? –
@JonathanWakely Ah, true, 'printf '% s \ n' then. –