рекурсивный случай создания
Вы говорите так, как будто вы используете рекурсивный сборку с одним верхним уровнем 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, который я построил для этого .