递归make case
您听起来好像在使用递归 make,其中一个顶级 Makefile.am、一个 main/Makefile.am 和一个用于 misc、dict 中的 FOO 的 FOO/Makefile.am 以及其他 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 多个库中的每一个构建规则模式。
非递归make case
就个人而言,我会切换到使用具有一个顶级Makefile.am 的非递归make,同时将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)。
您还可以在所有这些库Makefile-files 之前包含main/Makefile-files,并始终将相应的库添加到库Makefile-files 中的mainprog:
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
如果你能保证从顶层Makefile.am构建的所有lib_LTLIBRARIES都链接到主程序,并且主程序源可以使用#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 获得灵感的单个库和主程序的完整工作示例,请参阅我的回答 https://stackoverflow.com/a/60306382/182675 和 github example I built for that。