Мне нужно правило Makefile.am для обновления включаемого файла - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть Makefile.am, который выглядит примерно так:

bin_PROGRAMS = prog

AM_CFLAGS = $(prog_CFLAGS)

prog_SOURCES = \
    data.h \
    src1.c \
    src2.c \
    ...
    src30.c

Файл data.h иногда обновляется скриптом update_data.pl perl в зависимости от определенных условий. Я попытался добавить это в конец Makefile.am:

.PHONY: data.h
data.h:
    perl update_data.pl

, но скрипт никогда не запускается. Я уверен, что упускаю что-то простое, но я просто не могу понять это.

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Поскольку у вас уже есть файл data.h, и он ни от чего не зависит, make считает, что ничего не нужно для его обновления.

На самом деле не очень хороший способ сказать make чтобы всегда воссоздавать файл. Вы можете использовать его в зависимости от файла update_data.pl, если хотите обновить его при обновлении скрипта. Или это может зависеть от файла данных (а также от сценария), если он анализирует и преобразует файл данных.

Но если ваша сборка не является герметичной c, а содержимое зависит от чего-то make не могу знать, нет хорошего способа решить вашу проблему.

0 голосов
/ 11 апреля 2020

Вот так я наконец-то и начал работать. Использование $(shell) может быть не лучшим способом, но это работает.

bin_PROGRAMS = prog

AM_CFLAGS = $(prog_CFLAGS)

update_data := $(shell ./update_data.pl > /dev/tty)

prog_SOURCES = \
    data.h \
    src1.c \
    src2.c \
    ...
    src30.c
0 голосов
/ 10 апреля 2020

Я делаю что-то похожее для обновления заголовочного файла с несколькими определениями в зависимости от текущей ветви git, фиксации HEAD, грязного состояния дерева.

Может быть несколько необработанных угловых случаев, но это работает для меня. Пусть это вдохновит вас.

CLEANFILES    += git-info.h
BUILT_SOURCES += git-info.h.stamp
git-info.h.stamp:
        echo "#ifndef GIT_INFO_H" > git-info.h.new
        echo "#define GIT_INFO_H" >> git-info.h.new
        echo "..." >> git-info.h.new
        echo "#endif" >> git-info.h.new
        if test -f git-info.h && cmp git-info.h.new git-info.h; then :; \
        else cat git-info.h.new > git-info.h; fi; \
        rm -f git-info.h.new

Примечания:

  • Файл штампа никогда не создается, и поэтому это правило всегда будет выполняться при "make all" (но не в «make my-program»).

  • git-info.h затрагивается только в том случае, если он действительно изменился. Это позволяет избежать перестроений, вызванных только обновленной отметкой времени git-info.h, без каких-либо изменений содержимого.

  • Чтобы сократить усилия по перестроению, когда git-info.h изменилось , Я включаю только сгенерированный заголовок git-info.h из одного обычного C my_program_SOURCES исходного файла git-info.c, который затем определяет несколько глобальных char foo[] = FOO; символов, которые затем будут связаны с конечным исполняемым файлом.

  • Файл git-info.o будет автоматически зависеть от git-info.h, что приведет к перестроению при изменении заголовка.

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