Как выполнить новую команду компиляции в Makefile.am?

#makefile #autotools #automake

Вопрос:

Я создаю библиотеку (с использованием Autotools), которая выглядит следующим образом. Создание библиотеки работает нормально, когда я добавляю файл *.cpp в libmytest_la_SOURCES .

 lib_LTLIBRARIES = libmytest.la  libmytest_la_SOURCES = test.capnp.c    libmytest_la_CXXFLAGS = -I/usr/include -I$(top_srcdir)/src/includes   libmytest_la_LDFLAGS = -version-info 0:0:0 -L/usr/lib64  libmytest_la_LIBADD = -lcapnp  

Проблема в том, что мне нужно вызвать сторонний компилятор для генерации кода перед выполнением обычного процесса компиляции. Следующий capnp инструмент создаст выходной файл c с именем test.capnp.c .

 capnp compile -oc   test.capnp  

И если я подключу вывод этого ( test.capnp.c ) в файл makefile выше, моя библиотека будет построена. Чего я не понимаю, так это как вызвать эту команду в файле Makefile.я должен сгенерировать необходимый исходный файл и подключить его к libmytest_la_SOURCES переменной.

Есть какие-нибудь мысли?

Ответ №1:

Automake не имеет прямой поддержки capnp , и добавление поддержки нового языка или инструмента повлечет за собой взлом программы. Но вы можете указать обычные make правила в своем Makefile.am файле, и они будут перенесены в конечный сгенерированный Makefile файл . Это основная точка расширения Automake.

Таким образом, вы можете добавить это в свой файл Makefile:

 test.capnp.c   : test.capnp  capnp compile -oc   $lt;  # or # $(CAPNP) compile -oc   $lt; # where $(CAPNP) is the capnp binary as discovered by configure  

Вы также хотели бы указать test.capnp в качестве дополнительного файла для распространения:

 EXTRA_DIST = test.capnp  

Вам также следует подумать о том, хотите ли вы, чтобы файл .c был включен в пакеты распространения, чтобы уменьшить зависимость от времени сборки capnp . Если нет, то вместо того , чтобы включать его в список libmytest_la_SOURCES , вы должны включить его в список nodist_libmytest_la_SOURCES , а также в CLEANFILES :

 # # test.capnp.c   is a built file that we choose not to distribute # nodist_libmytest_la_SOURCES = test.capnp.c   CLEANFILES = test.capnp.c    # or: CLEANFILES = $(nodist_libmytest_la_SOURCES)