Добавление (без новых строк) к автоматически сгенерированному списку зависимостей для Makefiles - PullRequest
1 голос
/ 27 июля 2010

Не уверен, что название имеет смысл ... поэтому я немного уточню.

Я играю с этим make-файлом, который использует генератор списка автозависимостей gcc.

AtВ то же время я хотел сохранить хорошую сортированную структуру каталогов, которая разделяет источник, заголовки и ресурсы.

Макет приятный и простой, как, например,

  • MAIN
    • src
    • включает
    • объекты
    • зависимости

Теперь atm генератора списка зависимостей makefile выглядит так:

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< > $(DEP_PATH)$*.d
include $@

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

и получаем, например, foo1.o:

foo1.o: src/foo1.c include/foo1.h include/foo2.h include/foo3.h

Это будет работать нормально, если я предоставлю все свои объекты для поиска в главном каталоге ... однако, поскольку они находятся в / main / objects вместо ... make говорит, что не может найти правило для / main / objects/foo1.o

Теперь я попробовал это:

@echo "$(OBJ_PATH)" > $(DEP_PATH)$*.d
@${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d

, который> подает путь объекта к новой / oveЗаписанный файл, затем объединяет генерацию правила автозависимости GCC к нему ... но он добавляет новую строку между двумя наборами.

Я также попытался кошки два отдельных файла с указанной информацией ... ноони также получают переводы строк.

Есть ли хороший способ добавить файл зависимостей без добавления новой строки?

Кроме того, если у вас есть какие-то действительно хорошие учебники по make-файлам, catИ, эхо, я бы очень признателен.

Спасибо за любые ответы.

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

Ответ на заданный вами вопрос: sed:

@${CC} blah blah blah | sed 's|^|$(OBJ_PATH)|' > $(DEP_PATH)$*.d

Но у вас возникнет другая проблема с этой частью:

include $@

include Директива предназначена для Make непосредственно, это не команда оболочки (как $(CC)...).И $@ - это автоматическая переменная, определенная в правиле, которая недоступна для директив вне правила.Вместо этого попробуйте что-то вроде этого:

include $(DEP_PATH)/*.d

и взгляните на Advanced Auto-Dependency Generation .

0 голосов
/ 27 июля 2010

Хотя я представляю, что есть альтернативы, возможно, лучшие ... Думаю, я нашел решение своей проблемы.

Я могу передать эхо в tr, чтобы удалить символ новой строки.Таким образом, результирующий код:

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @echo "$(OBJ_PATH)" | tr -d '\n' > $(DEP_PATH)$*.d
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d
cat $@
include $@

, который делает следующее сейчас ...

1) Для каждого .d убедитесь, что .c есть и обновлен.

2) echo путь к объекту, | (pipe) до tr , который удалит символ новой строки,затем > заставит результат перезаписать / создать в .d файл

3) у $ (CC) сформировать список зависимостей ... который, к сожалению, исключает предполагаемое местоположение объектного файла (котороевот почему существует 1-2 строки)

4) просто объединить полученный файл с терминалом (не нужно, но мне нравится видеть, что это работает сейчас!)

5) сделать, чтобы включитьрезультирующий список зависимостей в сборке.

Стоит отметить, что при последующих запусках ... У меня есть это в верхней части списка:

all: $(MAIN)
-include $(DEP)

, который проверит основной исполняемый файл и затем включитфайлы зависимостей, если они созданы.(здесь - чтобы игнорировать ошибки, если файлы еще не созданы ... это нормально, так как мой фрагмент с самого начала будет выполняться после.)

Опять же, любые предложения и конструктивная критика приветствуются.

...