В некотором контексте: Я пытаюсь создать общий Makefile с генерацией автоматической зависимости (используя GCC, как описано here, не рекурсивный, который может использоваться с любого уровня моих проектов. С этой целью файлы зависимостей, сгенерированные должен иметь следующий вид:.Как перенаправить вывод в определенный файл в команду sed?
$(DIR)file.o: $(DIR)file.c $(DIR)file.h
$(DIR)file.h
таким образом, независимо от уровня добавочного вызова, сделать может правильно расположить файлы
для того, чтобы сделать это, у меня есть следующее неявное правило:
DEPFLAGS = -MT [email protected] -MP -MMD -MF $(word 2,$^).tmp
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $<
POSTCOMPILE = sed -E 's|([0-9a-z_.:]*/)?([0-9a-z_.:]+)|$$(DIR)\2|g' $(word 2,$^).tmp > $(word 2,$^)
%.o: %.c %.dep
$(COMPILE)
$(POSTCOMPILE)
$(RM) $(word 2,$^).tmp
touch [email protected]
СЕПГ призывание заменить любую директорию часть перед именем файла по $(DIR)
Проблема в том, что, поскольку файл зависимостей генерируется после объектного файла, он вызывает файл сборки перелинковать каждый раз. И поэтому я должен добавить команду touch, чтобы быть уверенным, что объектный файл будет считаться актуальным. Что не очень элегантно. Итак, у меня есть вопрос: вместо использования временного файла есть способ напрямую перенаправить выход gcc (который направлен в файл .tmp) в команду sed?
Другими словами, существует ли способ сделать эквивалент перенаправления трубок, но для другого дескриптора потока/файла, чем для stdout?
в GNU sed есть 's/pattern/replacement/w file', который будет писать подстановку в именованный файл. Вы можете использовать 's /.*/&/ w yourFile'. – potong
Ответ на ваш вопрос - нет, нет никакого способа сделать это. В любом случае вам понадобится «touch», так как нет возможности быть на 100% уверенным, что команда sed завершит запись своего файла до того, как компилятор завершит запись объектного файла: они работают параллельно, поэтому вы не можете гарантия, которую вы закончите первым. – MadScientist