makefile - генератор зависимостей - PullRequest
1 голос
/ 16 мая 2011

У меня есть два вопроса к одной проблеме, с которой я сталкиваюсь.

Мы приняли нерекурсивный steammake для проектов, использующих gcc.В дальнейшем мы хотели бы использовать его для некоторых других кросс-компиляторов, скажем, микрочип C18, который не поддерживает опцию -MM / MD для генерации зависимостей.

Я не хочу использовать makedepend, так как он очень старый идобавляет зависимости в make-файлы;далее, я считаю, будет сложно отделить объекты от источников с помощью makedepend.

Напоследок мои вопросы:

  1. Существуют ли какие-либо легкодоступные генераторы зависимостей C / C ++ (аналогично -MM / -MD опциям)?(Поддержка сборки требуется как для Windows, так и для Linux.)

  2. Могу ли я использовать gcc только для генерации файлов зависимостей и выполнения фактической компиляции с другим компилятором?Буду ли я сталкиваться с проблемами с этим подходом?Если да, какие изменения потребуются для следующего

    # COMPILE_C_CMDS - Commands for compiling C source code.
    define COMPILE_C_CMDS
        @mkdir -p $(dir $@)
        $(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \
            ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
        @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
         sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
             -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
             >> ${@:%$(suffix $@)=%.P}; \
             rm -f ${@:%$(suffix $@)=%.d}
    endef
    

1 Ответ

1 голос
/ 16 мая 2011
  1. Я не знаю ничего, кроме makedepend (но я не совсем понимаю, как вы к этому не относитесь).
  2. Да, определенно. Обработка зависимостей полностью зависит от GCC, говорящего с GNUMake (я надеюсь вы используете GNUMake). Другому компилятору не нужно ничего знать об этом.
# COMPILE_C_CMDS - Commands for compiling C source code.
define COMPILE_C_CMDS
    @mkdir -p $(dir $@)
    # This line generates the dependency file foo.d
    $(strip ${CC} -o $@ -MM -MF ${@:%$(suffix $@)=%.d} ${CFLAGS} ${SRC_CFLAGS} \
        ${INCDIRS} ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
    # This one actually compiles. You must adapt the sytax for your compiler.
    $(strip ${SOME_OTHER_COMPILER} -o $@ -c ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \
        ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
    @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
     sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
         -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
         >> ${@:%$(suffix $@)=%.P}; \
         rm -f ${@:%$(suffix $@)=%.d}
endef

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...