我有的:
我有一个非递归的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
问题:
- 这是可行的?
- 有人可以帮助我的语法?