我正在构建一个Makefile
,它的目标链接到boost_thread
。有一个小问题,boost_thread
有two identical verities:boost_thread
和boost_thread-mt
。 Fedora的boost软件包仅提供boost_thread
,Ubuntu软链接boost_thread
到boost_thread-mt
,而macOS上的Homebrew仅提供boost_thread-mt
(除非您安装了不同的标志)。
这种差异很不幸。理想情况下,我希望我的Makefile
能够在不需要人工干预的情况下进行调和(要求用户将彼此软链接-除非您愿意,否则没有root可能无法实现)很多扭曲)。我想到了类似this的内容:
LIBBOOST_THREAD:=$(shell ldconfig -p | grep libboost_thread | awk '{print $1}' | cut -d. -f1)
target: $(OBJECTS)
$(CXX) $^ -o $@ $(LDFLAGS) -l$(LIBBOOST_THREAD)
但是,这种方法严重地不能处理LDFLAGS
中的任何额外配置(如果提供了-L
,则ldconfig
将不知道要搜索它)。似乎要求我们解析gcc
标志非常脆弱,这使所有操作变得笨拙。
我最好的刺路
LIBBOOST_THREAD:=$(shell echo $(LDFLAGS) | xargs printf -- '%s\n' | grep '^-L' | cut -b 3- | xargs ldconfig -p | grep libboost_thread | awk '{print $1}' | cut -d. -f1)
这是难看的,并且可能无法正确处理LDFLAGS
中的某些引号或换行符。
在没有那么多脆弱性的情况下,是否有任何合理的方法来自动化此操作?也许是一种向gcc
询问此列表的方法(或有条件地选择适当的lib)?