添加依赖到库,并将其添加到依赖于该库的二进制(add dependencies to a libra

2019-10-30 02:25发布

我有的:

我有一个非递归的Makefile其搜索module.mk文件,其中包括

modules := $(shell find . -name module.mk)
include $(modules)

如果我想创建一个静态库中, module.mk看起来是这样的:

$(eval $(call make-lib, test_lib))

这会发现所有的列表.cpp在当前目录下的文件,并要求do-make-lib ,有:

  • $1是库名
  • $2是源文件的列表

do-make-lib定义如下(一些细节不再赘述):

define do-make-lib
    $(addprefix $(addprefix $(LIB_DIR)lib,$1),.a): $(call src_to_obj, $2)
    @$(AR) $(ARFLAGS) $$@ $$?
endef

现在,当我建立一个二进制module.mk看起来是这样的:

$(eval $(call make-bin, test_bin, test_lib))

同样地, make-bin会发现所有的列表.cpp在当前目录下的文件,并要求do-make-bin ,具有:

  • $1是二进制名称
  • $2是源文件的列表
  • $3是静态库来链接的列表

do-make-bin的定义如下:

define do-make-bin
    $(addprefix $(BIN_DIR),$1): $(call src_to_obj,$2) \
        $(addsuffix .a,$(addprefix $(LIB_DIR)lib,$3))))
    @$(CXX) $(call src_to_obj,$2) \
        -L/usr/lib -L$(LIB_DIR) \
        -Wl$(,)-Bstatic $(addprefix -l,$3) \
        -o $$@
endef

我的问题:

图书馆依赖于其他库。 当我链接的二进制文件,我需要给是取决于所有库的列表,以正确的顺序。

$(eval $(call make-bin, my_bin, lib5 lib4 lib3 lib2 lib1))

我想要的是:

我想传递一个额外的参数,以make-lib依赖列表

$(eval $(call make-lib, test_lib, lib3 lib2 lib1))

do-make-lib ,我可以再作变量,包括库的名称被修建,这抓住了依赖性

伪代码(不知道语法- ?我怎么建立一个变量从另一个变量)

$1_DEPS = $3

然后建立我的二进制文件时,我可以包括库依赖关系二进制的依赖,并将他们添加到链接线

伪代码(不知道语法)

define do-make-bin

    # build a list of dependencies, eg: lib2_DEPS lib2_DEPS lib1_DEPS
    $1_DEPS = $(addsuffix _DEPS,$3)

    $(addprefix $(BIN_DIR),$1): $(call src_to_obj,$2) \
        $(addsuffix .a,$(addprefix $(LIB_DIR)lib,$3)) \
        $(addsuffix .a,$(addprefix $(LIB_DIR)lib,$($1_DEPS))))) # include the libs dependencies as dependencies of the binary
    @$(CXX) $(call src_to_obj,$2) \
        -L/usr/lib -L$(LIB_DIR) \
        -Wl$(,)-Bstatic $(addprefix -l,$3) $(addprefix -l,$($1_DEPS))) \ # link against dependencies' dependencies
        -o $$@
endef

问题:

  • 这是可行的?
  • 有人可以帮助我的语法?

Answer 1:

所以,你有这些定义(比方说)

test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1

扩大test_lib_DEPS牵手,我们发现,我们首先要lib5 ,随后的递归扩展$lib5_DEPS ,然后lib4$lib4_DEPS等深度优先扩张。

expand = $(foreach _,$1,$_ $(call expand,${$__DEPS}))

$(error [$(call expand,${test_lib_DEPS})])

这使

$ make
1:9: *** [lib5 lib6 lib1  lib3  lib4  lib3  lib2 lib1  lib1 ].  Stop.

非常好。 你不妨梳理出这些重复。 $(sort)符合该法案,但链接时,你可能想保留订购。 按相似的论点,我们可以写一个uniq函数式功能:返回的参数的第一要素,其次是递归调用uniq ,但第一个元素缺失,因为我们已经拥有了它。

test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1

uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
depth-first = $(foreach _,$1,$_ $(call depth-first,${$__DEPS}))
expand = $(call uniq,$(call depth-first,$1))

$(error [$(call expand,${test_lib_DEPS})])

给予

$ make
1:10: *** [lib5 lib6 lib1 lib3 lib4 lib2 ].  Stop.


文章来源: add dependencies to a library, and add them to a binary which depends on that library