makefile文件库的依赖 - 解决循环依赖(makefile library dependenc

2019-10-23 09:49发布

我想建立一个功能到我的makefile,让我来指定库列表中的特定库依赖于

这将允许图书馆的家属自动重建,如果该库的依赖关系重建,也有添加到链接线的依赖关系。

我问的SO一个相关的问题在这里 ,并通过给定答案的工作,我想出了下面的测试

uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
expand-deps = $1 $(foreach _,$1, $(call expand-deps,$($__deps)))
make-dep-list = $(call uniq,$(call expand-deps,$1))

define make-lib
    $(warning $1_deps: $2)
    # capture the list of libraries this library depends on
    $1_deps = $2
endef

define make-bin
    # show the fully expanded list of libraries this binary depends on
    $(warning $1 dep-list: [$(call make-dep-list,$2)])
endef

#$(eval $(call make-lib, thread, log utils)) circular-dependency log->thread; thread->log
$(eval $(call make-lib, thread, utils))
$(eval $(call make-lib, log, thread))
$(eval $(call make-lib, order, log))
$(eval $(call make-lib, price, log))
$(eval $(call make-bin, test, order price))

运行以上生成文件产生以下结果:

$ make
makefile:15:  thread_deps:  utils
makefile:16:  log_deps:  thread
makefile:17:  order_deps:  log
makefile:18:  price_deps:  log
makefile:19:  test dep-list: [order price log thread utils ]
make: *** No targets.  Stop.

这是可能的图书馆有循环依赖。

作为一个例子:该日志库是多线程的,所以,需要线程库。 线程库可以发出日志报表,所以需要日志库。

如果我取消了具有循环依赖行

$(eval $(call make-lib, thread, log utils))
$(eval $(call make-lib, log, thread))

生成文件会卡死在一个无限循环。

我怎么能允许用户指定循环依赖,并打破了无限循环的?

Answer 1:

所以,你的问题是,你是递归扩展lib_deps (说)。 虽然这样做,你开始扩大lib_deps一次。 无限循环(呃,堆栈崩溃)。 要停止自己,你需要保持你已经扩大了事情的清单。 掉下来的实用的风格,并保持在全球的答案expansion (啊!),是这样的:

expand-deps = \
  $(foreach _,$1, \
    $(if $(filter $_,${expansion}),, \
      $(eval expansion += $_)$(call expand-deps,${$__deps})))

make-dep-list = $(eval expansion :=)$(call expand-deps,$1)${expansion}

define make-lib
  $(warning $1_deps: $2)
  # capture the list of libraries this library depends on
  $1_deps := $2
endef

define make-bin
  # show the fully expanded list of libraries this binary depends on
  $(warning $1 dep-list: [$(call make-dep-list,$2)])
endef

$(eval $(call make-lib,thread,log utils))#circular-dependency log->thread; thread->log
#$(eval $(call make-lib,thread,utils))
$(eval $(call make-lib,log,thread))
$(eval $(call make-lib,order,log))
$(eval $(call make-lib,price,log))
$(eval $(call make-bin,test,order price))

(作为一个练习你可能会喜欢函数式改写这一点,即摆脱了全球的$expansion与被传来传参数替换它。)



文章来源: makefile library dependencies - resolve circular dependency