2013-05-14 3 views
0

Вот мой экспериментальный Makefile.

.SECONDEXPANSION: 

~/hello.txt: $(shell echo '$$(@D)/')$(shell echo '$$(@F)' | sed -e 's/hello/bye/') 
    echo "$^" 

Как-то СЕПГ команда не работает, и сделать жалуется на циклическую зависимость

gmake: Circular /users/sim/hello.txt <- /users/me/hello.txt dependency dropped. 
gmake: *** No rule to make target `echo', needed by `/users/me/hello.txt'. Stop. 

Мой ожидаемое поведение было GNU Make ищет ~/bye.txt вместо этого. Что я делаю не так?

Хотя я могу просто указать «bye.txt» явно в этом маленьком примере, мне все равно хотелось бы знать, почему команда sed не применяется. Спасибо за помощь.

+0

-1 за вводящую в заблуждение название. Принятое решение не имеет ничего общего с трубами или sed. – danorton

ответ

1

Я не понимаю, почему у вас есть $(shell echo '$$(@D)/'); почему бы просто написать $$(@D)/ напрямую?

Что касается второго, это не работает, потому что функция $(shell ...) оценивается немедленно, а не во время второго расширения. Вы также должны отложить функцию оболочки, написав $$(shell ...).

Однако я не уверен, что это сработает. Я не понимаю, почему вы это делаете; Я предполагаю, что есть еще больший контекст, который делает его полезным. Потому что, вы можете делать то, что вы хотите сделать выше НАМНОГО более прямолинейно с помощью статических шаблонных правил:

~/hello.txt : %/hello.txt : %/bye.txt 
     echo "$^" 
+0

ТЫ СЕЙЧАС, УДИВИТЕЛЬНО. Огромное спасибо!!!! – xorxorxor

Смежные вопросы