簡體   English   中英

makefile 庫依賴 - 解決循環依賴

[英]makefile library dependencies - resolve circular dependency

我正在嘗試在我的 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))

運行上面的 makefile 會產生以下結果:

$ 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))

makefile 將陷入無限循環。

如何讓用戶指定循環依賴,跳出無限循環?

所以,你的問題是你遞歸地擴展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將其替換為傳遞的參數。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM