Вопрос по – Как обеспечить выполнение цели перед всеми остальными правилами сборки в make-файле?

5

У меня есть проект C ++, который содержит сгенерированный файл, от которого зависят все остальные файлы C ++. Я пытаюсь принудительно сгенерировать и скомпилировать этот файл перед началом любой другой компиляции. Обычно это так же просто, как поместить этот файл первым вall: цель, но сложность в том, что мой Makefile также генерируется системой сборки, и я могу только добавлять фрагменты в Makefile, но не редактировать его вообще.

Итак, есть ли способ заставить этот сгенерированный целевой файл запускаться первым, через зависимости или иным образом? Я подумал об использовании чего-то подобного:

cpp_files := $(wildcard src/*.cpp)
$(cpp_files): generated_file.cpp
generated_file.cpp:
    # generate the file here

Но это, похоже, не работает. Для справки, моя исходная структура dir выглядит следующим образом, поэтому мне нужно рекурсивно собирать файлы cpp:

src/
|---file1.cpp
|---file2.cpp
|---subdir1/
    |---file3.cpp

gen/
|---generated_file.cpp

Ваш Ответ

2   ответа
2

На самом деле, другиеcpp файлы не зависят от сгенерированного (с точки зрения правил Make). График зависимостей по-прежнему выглядит так:

program
 |
 ^- file1.o
 |   ^- file1.c
 |
 ^- file2.o
 |   ^- file2.c
 |
 ^- generated_file.o
     ^- generated_file.c
         ^- <generator prerequisites>

Ваши исходные файлы могут зависеть только от какого-то сгенерированного заголовочного файла (в случае, если это#includeпо этим источникам).

Если вам нужно сгенерировать толькоcpp файл, то следующий make-файл должен быть достаточным:

srcs := $(wildcard src/*.cpp src/*/*.cpp)

gen_file := gen/generated_file.cpp
srcs += $(gen_file)

objs := $(srcs:.cpp=.o)

.PHONY : all
all : program

program : $(objs)
    @$(LD) ...

%.o : %.c
    @$(CC) ...

$(gen_file) :
    # generate the file here

UPD.

Небольшое улучшение на основеБета-ответ.

-include generator-task
.PHONY : generator-task

generator-task : $(gen_files)

$(gen_files) : $(gen_prerequisites)
    # generate the file here

Вместо запуска генератора при каждом вызове Make, он будет регенерировать файл только тогда, когда изменится одно из его предварительных условий.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededcppError: User Rate Limit Exceeded andrei
17

Если вы уверены, что это действительно то, что вам нужно, вот один из способов сделать это: иметь правило для фиктивного файла, которое будет делать make-файл.include.

.PHONY: dummy
dummy:
    # generate the file here

-include dummy

Независимо от того, какую цель вы указали, Make сначала запуститdummy правило, затем перезагрузите себя.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededfollowError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы