将依赖项添加到库中,并将它们添加到依赖于该库的二进制文件中
add dependencies to a library, and add them to a binary which depends on that library
我有:
我有一个非递归生成文件,它搜索 module.mk
个文件,并包含它们
modules := $(shell find . -name module.mk)
include $(modules)
如果我想创建一个静态库,module.mk
看起来像这样:
$(eval $(call make-lib, test_lib))
这将找到当前目录中所有 .cpp
个文件的列表,并调用 do-make-lib
,其中:
</code> 是库名</li>
<li><code>
是源文件列表
do-make-lib
定义如下(省略部分细节):
define do-make-lib
$(addprefix $(addprefix $(LIB_DIR)lib,),.a): $(call src_to_obj, )
@$(AR) $(ARFLAGS) $$@ $$?
endef
现在,当我构建一个 binary 时,module.mk
看起来像这样:
$(eval $(call make-bin, test_bin, test_lib))
同样,make-bin
会找到当前目录下所有.cpp
个文件的列表,调用do-make-bin
,with:
</code> 是二进制名称</li>
<li><code>
是源文件列表
</code> 是 link 反对 </li> 的静态库列表
</ul>
<p><code>do-make-bin
定义如下:
define do-make-bin
$(addprefix $(BIN_DIR),): $(call src_to_obj,) \
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,))))
@$(CXX) $(call src_to_obj,) \
-L/usr/lib -L$(LIB_DIR) \
-Wl$(,)-Bstatic $(addprefix -l,) \
-o $$@
endef
我的问题:
库依赖于其他库。当我 link 二进制文件时,我需要以正确的顺序给出它所依赖的 所有 库的列表。
$(eval $(call make-bin, my_bin, lib5 lib4 lib3 lib2 lib1))
我想要的:
我想向 make-lib
传递一个附加参数,它是 dependencies
的列表
$(eval $(call make-lib, test_lib, lib3 lib2 lib1))
在 do-make-lib
中,我可以创建一个变量,其中包含正在构建的库的名称,它捕获依赖关系
伪代码(不确定语法 - 如何从另一个变量构建变量?)
_DEPS =
然后在构建我的二进制文件时,我可以将库的依赖项作为二进制文件的依赖项,并将它们添加到 link 行
伪代码(语法不确定)
define do-make-bin
# build a list of dependencies, eg: lib2_DEPS lib2_DEPS lib1_DEPS
_DEPS = $(addsuffix _DEPS,)
$(addprefix $(BIN_DIR),): $(call src_to_obj,) \
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,)) \
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,$(_DEPS))))) # include the libs dependencies as dependencies of the binary
@$(CXX) $(call src_to_obj,) \
-L/usr/lib -L$(LIB_DIR) \
-Wl$(,)-Bstatic $(addprefix -l,) $(addprefix -l,$(_DEPS))) \ # link against dependencies' dependencies
-o $$@
endef
问题:
- 这样可行吗?
- 谁能帮我解决语法问题?
所以,你有这些定义(比方说)
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 _,,$_ $(call expand,${$__DEPS}))
$(error [$(call expand,${test_lib_DEPS})])
这给出了
$ make
1:9: *** [lib5 lib6 lib1 lib3 lib4 lib3 lib2 lib1 lib1 ]. Stop.
还不错。您可能希望梳理出这些重复项。 $(sort)
符合要求,但在链接时您可能希望保留顺序。按照类似的参数,我们可以用函数式风格编写一个 uniq
函数:return 参数的第一个元素,然后是 uniq
的递归调用,但是缺少第一个元素,因为我们已经有了。
test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1
uniq = $(if ,$(firstword ) $(call uniq,$(filter-out $(firstword ),)))
depth-first = $(foreach _,,$_ $(call depth-first,${$__DEPS}))
expand = $(call uniq,$(call depth-first,))
$(error [$(call expand,${test_lib_DEPS})])
给予
$ make
1:10: *** [lib5 lib6 lib1 lib3 lib4 lib2 ]. Stop.
我有:
我有一个非递归生成文件,它搜索 module.mk
个文件,并包含它们
modules := $(shell find . -name module.mk)
include $(modules)
如果我想创建一个静态库,module.mk
看起来像这样:
$(eval $(call make-lib, test_lib))
这将找到当前目录中所有 .cpp
个文件的列表,并调用 do-make-lib
,其中:
</code> 是库名</li> <li><code>
是源文件列表
do-make-lib
定义如下(省略部分细节):
define do-make-lib
$(addprefix $(addprefix $(LIB_DIR)lib,),.a): $(call src_to_obj, )
@$(AR) $(ARFLAGS) $$@ $$?
endef
现在,当我构建一个 binary 时,module.mk
看起来像这样:
$(eval $(call make-bin, test_bin, test_lib))
同样,make-bin
会找到当前目录下所有.cpp
个文件的列表,调用do-make-bin
,with:
</code> 是二进制名称</li> <li><code>
是源文件列表</code> 是 link 反对 </li> 的静态库列表 </ul> <p><code>do-make-bin
定义如下:define do-make-bin $(addprefix $(BIN_DIR),): $(call src_to_obj,) \ $(addsuffix .a,$(addprefix $(LIB_DIR)lib,)))) @$(CXX) $(call src_to_obj,) \ -L/usr/lib -L$(LIB_DIR) \ -Wl$(,)-Bstatic $(addprefix -l,) \ -o $$@ endef
我的问题:
库依赖于其他库。当我 link 二进制文件时,我需要以正确的顺序给出它所依赖的 所有 库的列表。
$(eval $(call make-bin, my_bin, lib5 lib4 lib3 lib2 lib1))
我想要的:
我想向
的列表make-lib
传递一个附加参数,它是 dependencies$(eval $(call make-lib, test_lib, lib3 lib2 lib1))
在
do-make-lib
中,我可以创建一个变量,其中包含正在构建的库的名称,它捕获依赖关系伪代码(不确定语法 - 如何从另一个变量构建变量?)
_DEPS =
然后在构建我的二进制文件时,我可以将库的依赖项作为二进制文件的依赖项,并将它们添加到 link 行
伪代码(语法不确定)
define do-make-bin # build a list of dependencies, eg: lib2_DEPS lib2_DEPS lib1_DEPS _DEPS = $(addsuffix _DEPS,) $(addprefix $(BIN_DIR),): $(call src_to_obj,) \ $(addsuffix .a,$(addprefix $(LIB_DIR)lib,)) \ $(addsuffix .a,$(addprefix $(LIB_DIR)lib,$(_DEPS))))) # include the libs dependencies as dependencies of the binary @$(CXX) $(call src_to_obj,) \ -L/usr/lib -L$(LIB_DIR) \ -Wl$(,)-Bstatic $(addprefix -l,) $(addprefix -l,$(_DEPS))) \ # link against dependencies' dependencies -o $$@ endef
问题:
- 这样可行吗?
- 谁能帮我解决语法问题?
所以,你有这些定义(比方说)
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 _,,$_ $(call expand,${$__DEPS}))
$(error [$(call expand,${test_lib_DEPS})])
这给出了
$ make
1:9: *** [lib5 lib6 lib1 lib3 lib4 lib3 lib2 lib1 lib1 ]. Stop.
还不错。您可能希望梳理出这些重复项。 $(sort)
符合要求,但在链接时您可能希望保留顺序。按照类似的参数,我们可以用函数式风格编写一个 uniq
函数:return 参数的第一个元素,然后是 uniq
的递归调用,但是缺少第一个元素,因为我们已经有了。
test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1
uniq = $(if ,$(firstword ) $(call uniq,$(filter-out $(firstword ),)))
depth-first = $(foreach _,,$_ $(call depth-first,${$__DEPS}))
expand = $(call uniq,$(call depth-first,))
$(error [$(call expand,${test_lib_DEPS})])
给予
$ make
1:10: *** [lib5 lib6 lib1 lib3 lib4 lib2 ]. Stop.