Пакеты Homebrew в PKG_CONFIG_PATH

Вопрос или проблема

У меня установлено много библиотек с помощью homebrew, но я не знаю, как правильно добавить их в путь поиска pkg-config. Сейчас у меня есть

export PKG_CONFIG_PATH=$(find /usr/local/Cellar -name 'pkgconfig' -type d | grep lib/pkgconfig | tr '\n' ':' | sed s/.$//)

Это работает нормально, но замедляет время запуска моей оболочки, сейчас это занимает около 2 секунд. Я уверен, что в homebrew есть встроенный более оптимальный способ, но не могу найти его в документации.

Преобразуйте find в статичный список PKG_CONFIG_PATH, разделенный двоеточием :, чтобы уменьшить время запуска.

Шаг 1. Выполните pkg-config --list-all, чтобы определить, какие пакеты уже известны

pkg-config --list-all

# tidy         tidy - HTML проверка синтаксиса
# tesseract    tesseract - OCR движок
# …    

Шаг 2. Выполните find, чтобы определить директории pkgconfig, которые содержат файлы *.pc.

### длинная форма `find`
find /usr/local/Cellar -name 'pkgconfig' -type d | grep lib/pkgconfig | tr '\n' ':' | sed s/.$//
find /usr/local/Cellar -name 'pkgconfig' -type d | grep share/pkgconfig | tr '\n' ':' | sed s/.$//
# - или -
find /usr/local/Cellar -name 'pkgconfig' -type d | grep pkgconfig | tr '\n' ':' | sed s/.$//

### короткая форма `find`
find / -name "pkgconfig" -print

# /usr/local/Cellar/abc/0.1.5/lib/pkgconfig:…/usr/local/Cellar/xyz/2.6/lib/pkgconfig

Шаг 3. Добавьте пути библиотек, которые вы хотите использовать, которые еще не обнаруживаются pkg-config, в PKG_CONFIG_PATH.

Опция: используйте путь /usr/local/Cellar/…, который нужно будет обновлять при изменении номера версии.

export PKG_CONFIG_PATH=/usr/local/Cellar/abc/0.1.5/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/Cellar/abc/0.1.5/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/my/build/from/source/mmmm/0.1.5/lib/pkgconfig

Опции: Когда Cellar связан с /usr/local/opt/…, можно использовать версию независимый путь.

sudo find / -name "uvw" -print
# /usr/local/Cellar/uvw
# /usr/local/opt/uvw
ls -l /usr/local/opt/uvw
# /usr/local/opt/uvw@ -> ../Cellar/uvw/4.2_1

Установите эти:

export PKG_CONFIG_PATH=/usr/local/opt/uvw/share/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opt/xyz/lib/pkgconfig

Примечание: Apple ARM и Apple Intel имеют разные расположения Cellar в homebrew.

  • Apple ARM: /opt/homebrew/Cellar
  • Apple Intel: /usr/local/Cellar

У меня была похожая проблема на Mac Mojave, так как /usr/include отсутствует в Xcode 10, и для его восстановления нужно установить отдельный пакет.

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

источник: https://github.com/r-lib/xml2/issues/232

Я использую следующий скрипт shell, чтобы найти все и установить PKG_CONFIG_PATH на Apple Intel:

# Базовый каталог для поиска
BASE_DIR=/usr/local/Cellar

# Шаблон для сопоставления каталогов
PATTERN=*pkgconfig

# Найдите каталоги по шаблону и добавьте их в PATH
for dir in $(find "$BASE_DIR" -type d -name "$PATTERN"); do
    PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$dir"
    echo $dir
done

# Экспортируйте обновленный PATH
export PKG_CONFIG_PATH=$(echo $PKG_CONFIG_PATH | sed 's/^://')

# При желании, выведите обновленный PATH для проверки
echo "Обновленный PATH: $PKG_CONFIG_PATH"

Ответ или решение

Настройка среды разработки и управление зависимостями при помощи инструментов, таких как Homebrew и pkg-config, может стать сложной задачей, особенно когда речь идет о корректном указании путей поиска для pkg-config. Рассмотрим подробнее, как оптимизировать процесс и устранить возникающие проблемы, обеспечив согласованное и производительное рабочее окружение.

Теория

Homebrew – это популярный пакетный менеджер для macOS, который упрощает установку и управление программным обеспечением. При установке библиотеки через Homebrew, ее файлы, включая файлы конфигурации pkg-config (*.pc), обычно размещаются внутри каталога Cellar. Pkg-config – это инструмент, который используется для определения параметров компиляции и сборки при работе с библиотеками, установленными в системе. Он позволяет разработчикам указывать, какие библиотеки требуются для сборки проекта и где их искать.

Однако, если пути к этим пакетам не указаны корректно в переменной окружения PKG_CONFIG_PATH, pkg-config может не найти необходимые файлы *.pc, что приведет к сбоям при компиляции и сборке. Наиболее распространенное решение состоит в том, чтобы добавить необходимые пути в PKG_CONFIG_PATH, но автоматическая генерация этого списка может занимать значительное время, особенно если используется команда find при запуске оболочки.

Пример

В приведенном вами примере используется командлет find, чтобы автоматически находить все каталоги pkgconfig и формировать значение для переменной PKG_CONFIG_PATH. Эта техника, хоть и функциональна, замедляет запуск оболочки, так как каждый раз требует выполнения поиска по файловой системе.

Приведенные шаги позволят создать статический список путей для PKG_CONFIG_PATH, уменьшив время запуска:

  1. Сначала выполните команду pkg-config --list-all, чтобы понять, какие пакеты уже доступны для pkg-config. Это позволит избежать добавления избыточных путей.

  2. Используйте команду find для определения всех доступных каталогов pkgconfig. В вашем случае вы можете использовать такую команду:

    find /usr/local/Cellar -name 'pkgconfig' -type d | grep pkgconfig

    Убедитесь, что учитываете не только каталоги lib/pkgconfig, но и share/pkgconfig, так как некоторые библиотеки могут располагать свои конфигурации там.

  3. На основе этой информации вы можете вручную уточнить переменную PKG_CONFIG_PATH:

    export PKG_CONFIG_PATH="/usr/local/opt/xyz/lib/pkgconfig:/usr/local/opt/uvw/share/pkgconfig"

    Эти команды задают конкретные пути, что исключает необходимость проведения поиска при каждом запуске оболочки.

Применение

Наиболее подходящий способ управления ПКД_CONFIGПУТЬ в контексте использования Homebrew включает уточнение путей до установленных библиотек. При этом стоит воспользоваться символическими ссылками в /usr/local/opt, позволяющими использовать версии без фиксации на номер версии установленных пакетов. Это не только облегчает обновление библиотек, но и снижает вероятность конфликтов и необходимости модификаций при каждом обновлении.

Например, если вы хотите добавить библиотеку uvw в PKG_CONFIG_PATH, желательно использовать версию из /usr/local/opt, так как эта папка резко добавляется через символическую ссылку на текущую версию в каталоге Cellar. Это выглядит так:

export PKG_CONFIG_PATH="/usr/local/opt/uvw/lib/pkgconfig:"

Таким образом, изменения автоматически подхватываются при обновлении соединения ссылки.

Заключение

Адекватная настройка PKG_CONFIG_PATH позволяет избежать множества возможных проблем, связанных с компиляцией и сборкой проектов, обеспечивая удобство и эффективность работы разработчиков. Вместо использования динамической генерации путей рекомендуется заранее определить статический список, что значительно сократит время запуска и упростит задачи сопровождения. Следуя приведенным рекомендациям, можно создать надежную и удобную инфраструктуру для сборки проектов на macOS с использованием Homebrew и pkg-config.

Оцените материал
Добавить комментарий

Капча загружается...