Я создаю Makefile
, у которого есть цель, которая связывается с boost_thread
. Есть небольшая проблема в том, что boost_thread
имеет две идентичные вершины : boost_thread
и boost_thread-mt
. Пакет поддержки Fedora предоставляет только boost_thread
, программные ссылки Ubuntu boost_thread
до boost_thread-mt
, а Homebrew на macOS предоставляет только boost_thread-mt
(если вы не устанавливаете с другими флагами).
Это несоответствие вызывает сожаление. И в идеале, я бы хотел, чтобы мой Makefile
мог это согласовать, не прибегая к ручному вмешательству (требуется, чтобы пользователь мягко связывал одно с другим - что может быть невозможно без рута, если вы не хотите много делать искажения). Я имел в виду что-то вроде это :
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
этот список (или условно выбрать правильную библиотеку)?