Как настроить и упаковать Graphviz для Mac App Store?

Я хотел бы распространять приложение через Mac App Store и, следовательно, должен использовать песочницу. Проблема в том, что я не знаю, как настроить Graphviz для совместимости с песочницей. Graphviz основан на плагинах и требует, чтобы я:

  1. Используйте переменную среды (GVBINDIR), чтобы установить каталог плагина. Переменная должна указывать на каталог в песочнице.
  2. Имейте файл в папке GVBINDIR с именем config6, который используется для регистрации библиотек плагинов. Я мог бы скопировать туда файл из Name.app/Contents/Resources.
  3. Имейте 2 dylib плагина в том же GVBINDIR. Если я правильно понимаю, то настройки Mach-O Linker должны быть правильно установлены для библиотеки плагинов до развертывания и в соответствии с каталогом.

Следующий снимок экрана основан на запуске с инструментами Xcode, мониторинге доступа к файлам, но с фильтрацией для плагина dot_layout. dydl доступ к одной из библиотек Как вы можете видеть, он находится при запуске приложения (у меня это как зависимость, вы видите, что FD возвращает "3" - я действительно не знаю, что это означает). Но позже, когда graphviz инициирует доступ к плагину, dyld не может его найти.

Что я делаю неправильно?

Любые идеи? Спасибо заранее!


person Wizard of Kneup    schedule 24.03.2017    source источник


Ответы (1)


Это заняло у меня некоторое время, но в конце концов я нашел решение. Я создал скрипт со следующим содержимым, которое помещаю в каталог graphviz.

INSTALLER_ROOT="/Users/wizardofkneup"
GVROOT="${INSTALLER_ROOT}/graphviz"  
GVTARGET="${INSTALLER_ROOT}/Documents/xcode/VisualThinkingWorkspace/graphviz"
PLATFORM_DEVELOPER_BIN_DIR="/usr/bin"

./configure \
  --disable-dependency-tracking \
  --enable-shared=no \
  --enable-static=yes \
  --enable-ltdl=no \
  --enable-swig=no \
  --enable-tcl=no \
  -srcdir=/Users/wizardofkneup/graphviz \
  --with-codegens=no \
  --with-cgraph=yes \
  --with-expat=no \
  --with-fontconfig=no \
  --with-freetype2=no \
  --with-ipsepcola=yes \
  --with-libgd=no \
  --with-xdot=yes \
 --with-quartz=yes \
  --with-visio=yes \
   --with-x=no \
   CC="${PLATFORM_DEVELOPER_BIN_DIR}/clang" \
   CPP="${PLATFORM_DEVELOPER_BIN_DIR}/clang -E" \
   CXX="${PLATFORM_DEVELOPER_BIN_DIR}/clang++" \
   OBJC="${PLATFORM_DEVELOPER_BIN_DIR}/clang" \
   LD="${PLATFORM_DEVELOPER_BIN_DIR}/ld" 

make

rm -rf ${GVTARGET}
mkdir -p ${GVTARGET}
find . -type f -name '*_C.a' -exec cp -i {} ${GVTARGET} \;
find . -type f -name '*.h' -exec cp {} -i ${GVTARGET} \;

Еще несколько комментариев:

  • Используйте Homebrew, чтобы получить исходники для graphviz. brew install --build-from-source graphviz
  • скопируйте и разархивируйте загруженные исходники из ~/Library/Caches/Homebrew в директорию GRVIZ. (В моем случае /Users/wizardofkneup/graphviz)
  • беги sh autogen.sh
  • скомпилируйте исходники с помощью вышеуказанного скрипта. Он копирует файлы, необходимые для вашего проекта, в ${GVTARGET}

Теперь мы можем сосредоточиться на нашем проекте Swift в Xcode.

Похоже, что текущие (= 2019) сборки graphviz зависят от glib. Чтобы иметь статический glib, его нужно сначала собрать локально. Для этого примените meson _build -Diconv=native при его сборке. Возможно, сначала потребуется установить libiconv.

Мой файл buildins.c:

#include "builtins.h"

extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
extern gvplugin_library_t gvplugin_neato_layout_LTX_library;
extern gvplugin_library_t gvplugin_core_LTX_library;
extern gvplugin_library_t gvplugin_quartz_LTX_library;
extern gvplugin_library_t gvplugin_visio_LTX_library;

void loadGraphvizLibraries(GVC_t *gvc) {
    gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
    gvAddLibrary(gvc, &gvplugin_neato_layout_LTX_library);
    gvAddLibrary(gvc, &gvplugin_core_LTX_library);
    gvAddLibrary(gvc, &gvplugin_quartz_LTX_library);
    gvAddLibrary(gvc, &gvplugin_visio_LTX_library);
}

Мой встроенный файл.h:

#ifndef builtins_h
#define builtins_h

#include "/Users/wizardofkneup/graphviz/lib/gvc/gvplugin.h" //
#include "gvc.h"

extern lt_symlist_t lt_preloaded_symbols[];
void loadGraphvizLibraries(GVC_t *gvc);

#endif /* builtins_h */

приложение Bridging-header.h

#include <gvc.h>
#import "builtins.h"

И конфигурация в Xcode. введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения

Мне понадобилось позже это: не уверен, связано ли это с графикой. введите здесь описание изображения

Надеюсь, это поможет. Удачи. Дайте мне знать, если я что-то пропустил.

person Wizard of Kneup    schedule 18.05.2017