Automake включает все библиотеки - PullRequest
0 голосов
/ 08 февраля 2020

Моя структура каталогов выглядит следующим образом:

-misc
-- misc.h
-- misc.c
-- misc.la

-dict
-- dict.h
-- dict.c
-- dict.la

-main
-- main.c

Я пытаюсь встроить main.c в программу. main.c содержит ссылку на функцию в dict.c, а dict.c содержит ссылки на misc.c

Как я могу сказать automake включить dict.la, misc.la для сборки main? Другими словами, я хочу включить все файлы * .la, которые были созданы make верхнего уровня.

Это, конечно, всего лишь пример, в реальном сценарии я имею дело с более чем 20 каждая такая библиотека находится в каталоге, аналогичном указанному выше.

1 Ответ

1 голос
/ 19 февраля 2020

рекурсивный случай создания

Вы говорите так, как будто вы используете рекурсивный сборку с одним верхним уровнем Makefile.am, одним main/Makefile.am и одним FOO/Makefile.am для FOO в misc, dict, и 20 других таких библиотек.

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

В этом случае рекурсивного make вы необходимо адаптировать main/Makefile.am, чтобы связать main со всеми этими библиотеками, и убедиться, что эти библиотеки действительно (пере) собраны, если необходимо:

bin_PROGRAMS     = mainprog
mainprog_SOURCES = main.c
mainprog_LDADD   =

mainprog_LDADD += $(top_builddir)/misc/libmisc.la
$(top_builddir)/misc/libmisc.la:
        cd $(top_builddir)/misc && $(MAKE) libmisc.la

Вам нужно будет повторить это _LDADD += и правило сборки шаблон для каждой из этих 20+ библиотек.

нерекурсивный случай создания

Лично я бы переключился на использование нерекурсивного создания с одним единственным верхним уровнем Makefile.am, в то время как помещая как mainprog исполняемый файл, так и 20+ libfoo.la файлы в $(top_builddir). Затем добавление библиотеки в основную программу может быть сведено к добавлению одной строки

mainprog_LDADD += libmisc.la

без каких-либо дополнительных правил. Это также распараллеливает построение этих 20+ библиотек, что является весьма приятным побочным эффектом.

Новый верхний уровень Makefile.am будет содержать одну строку на библиотеку, например

include misc/Makefile-files

, заканчивающуюся одной строка

include main/Makefile-files

и файл misc/Makefile-files будет содержать что-то вроде

# -*- Makefile -*-
lib_LTLIBRARIES   += libmisc.la
libmisc_la_SOURCES = %reldir%/misc.c

, тогда как main/Makefile-files будет выглядеть как

# -*- Makefile -*-
bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =

# repeat for 20+ libraries
mainprog_LDADD += dict/libdict.la
mainprog_LDADD += misc/libmisc.la

Если ваша основная программа использует #include "misc.h", вам понадобится 20+ на библиотеку mainprog_CPPFLAGS += -I$(top_srcdir)/misc дополнений. Если бы вы могли изменить это значение на #include "misc/misc.h", вместо него подойдет один mainprog_CPPFLAGS = -I$(top_srcdir).

Вы также можете включить main/Makefile-files в перед всеми этими библиотеками Makefile-files и последовательно добавить соответствующую библиотеку в mainprog в библиотека Makefile-files:

bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =

с misc/Makefile-files, содержащая

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = %reldir%/misc.c
mainprog_CPPFLAGS  += -I$(top_srcdir)/%reldir%
mainprog_LDADD     += libmisc.la

Если вы можете гарантировать, что все библиотеки lib_LTLIBRARIES, созданные из верхнего уровня Makefile.am, будут связаны с основная программа, и что источники основной программы могут использовать #include "misc/misc.h", следующий верхний уровень Makefile.am будет делать:

include main/Makefile-files

# 20+ library includes
include dict/Makefile-files
include misc/Makefile-files

mainprog_LDADD += $(lib_LTLIBRARIES)

с main/Makefile-files, равным

bin_PROGRAMS     += mainprog
mainprog_SOURCES  = main.c
mainprog_LDADD    =

и misc/Makefile-files и другие библиотеки:

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = misc.c

Полный рабочий пример отдельной библиотеки и основной программы, использующей нерекурсивный make для вдохновения, см. В моем ответе { ссылка } и пример github, который я построил для этого .

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