Как сделать так, чтобы Make генерировал заголовки перед компиляцией? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь скомпилировать мои CPP файлы, потому что отсутствует заголовочный файл. Я знаю, что это отсутствует, потому что я хочу создать это. Как?

Вот что у меня так далеко. Проблема заключается в том, что когда «the_header.hpp» используется в нескольких CPP файлах, рекурсивные вызовы make неэффективны (и не являются удовлетворительными), так как заголовки, включенные в «the_header.hpp», кажутся перестроенными несколько раз из-за параллелизма .

CPP файлов%. cpp:

#include "the_header.hpp"

// ...

Мой Makefile:

#
include *.g *.d

# *.g like generator
%.g: %.cpp
    g++ -MM -MF $@ -MP -MG -MT $@ $<
    make $@

#
%.d: %.g ;

#
%.o : %.cpp %.d
    // g++ with auto-dependencies generation

# the_header.hpp matches
%.hpp : %.lcm
    // Generate it

И только чтобы очиститься от моих намерений : когда я компилирую CPP файлы, я генерирую файлы% .g, цель которых добавит дополнительные предпосылки для себя. В результате рекурсивный вызов увидит «the_header.hpp» как необходимое условие (а не обновленное), сгенерирует его и создаст% .g. Рекурсивный вызов покажет «the_header.hpp» в актуальном состоянии, ничего не делать, конец рекурсии. Процессы компиляции.

Более того, "the_header.hpp" - это файл, сгенерированный LCM с lcmgen из файла% .lcm.

Перед этим у меня было просто (что прекрасно работает с параллелизмом, но не является удовлетворительным):

#
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm)

Не зная, какие файлы lcm действительно использовались. Кроме того, я смешал проекты C и C ++, которые могут привести к:

# lcmgen can be used with both C++ or C...
%.o : %.cpp %.d $(patsubst %.lcm,%.hpp,$(wildcard *.lcm) $(patsubst %.lcm,%.h,$(wildcard *.lcm)

Надеюсь, вам будет интересно!

1 Ответ

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

Невозможно использовать какую-либо форму современных автоматов. c Генерация предпосылок с созданными заголовками. Любой генератор пререквизитов на основе компилятора просто выйдет из строя, когда заголовок не существует.

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

Предположим, у вас есть исходные файлы foo.c, bar.c и baz.c и первые два зависит от сгенерированного заголовка, но последний не сделал. Просто добавьте эти строки в ваш make-файл:

foo.o bar.o : the_header.hpp

Вот и все. Не нужно связываться с правилами шаблона.

...