如何为 Mac App Store 配置和打包 Graphviz?
How to configure & package Graphviz for Mac App Store?
我想通过 Mac App Store 分发应用程序,因此需要使用沙盒。问题是我不知道如何以沙盒兼容的方式配置 Graphviz。 Graphviz 基于插件并要求我:
- 使用环境变量(GVBINDIR)设置插件目录。该变量必须指向沙盒中的目录。
- 在 GVBINDIR 目录位置有一个名为 config6 的文件,用于注册插件库。我可以从 Name.app/Contents/Resources 那里复制文件。
- 在同一个 GVBINDIR 中有 2 个插件 dylib。如果我理解正确,那么必须在部署之前为插件库正确设置 Mach-O 链接器设置并与目录对齐。
以下屏幕截图基于 运行 和 Xcode 工具,监控文件访问,但过滤到 dot_layout 插件。
如您所见,它是在应用程序启动时找到的(我将其作为依赖项,您会看到 FD return“3”——我真的不知道那是什么意思)。但是后来graphviz触发访问plugin的时候dyld找不到了
我做错了什么?
有什么想法吗?非常感谢!
我花了一段时间,但最后我找到了解决办法。
我创建了一个脚本,其中包含我放置在 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}
现在我们可以在 Xcode 内专注于我们的 Swift 项目。
- 定义环境变量GRVIZ,指向dev目录。
将 header 路径和 swift 导入路径设置为 ${GRVIZ}/**
- 为了链接 C++ 标准库(插件需要),您需要一个空的 .mm 文件(遵循 walter 的想法:Compile errors with C++ static library include in Swift project)
- 包括所有 _C.a 文件 -> 我们想要 C 接口。
- Create Builtins.c 需要是 c-file 以避免名称混淆问题。在文件检查器中设置
- 出于未知原因我需要两者:GRVIZ 和 GVTARGET
目录。
- 加载库:
Unable to use dot layout (graphviz as a library)
看起来当前 (=2019) graphviz 构建依赖于 glib。
为了拥有一个静态的 glib,它需要首先在本地构建。
为此,在构建它时应用 meson _build -Diconv=native
。可能需要先安装 libiconv
。
我的builtins.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);
}
我的builtins.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"
希望对您有所帮助。祝你好运。如果我遗漏了什么,请告诉我。
我想通过 Mac App Store 分发应用程序,因此需要使用沙盒。问题是我不知道如何以沙盒兼容的方式配置 Graphviz。 Graphviz 基于插件并要求我:
- 使用环境变量(GVBINDIR)设置插件目录。该变量必须指向沙盒中的目录。
- 在 GVBINDIR 目录位置有一个名为 config6 的文件,用于注册插件库。我可以从 Name.app/Contents/Resources 那里复制文件。
- 在同一个 GVBINDIR 中有 2 个插件 dylib。如果我理解正确,那么必须在部署之前为插件库正确设置 Mach-O 链接器设置并与目录对齐。
以下屏幕截图基于 运行 和 Xcode 工具,监控文件访问,但过滤到 dot_layout 插件。
我做错了什么?
有什么想法吗?非常感谢!
我花了一段时间,但最后我找到了解决办法。 我创建了一个脚本,其中包含我放置在 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}
现在我们可以在 Xcode 内专注于我们的 Swift 项目。
- 定义环境变量GRVIZ,指向dev目录。 将 header 路径和 swift 导入路径设置为 ${GRVIZ}/**
- 为了链接 C++ 标准库(插件需要),您需要一个空的 .mm 文件(遵循 walter 的想法:Compile errors with C++ static library include in Swift project)
- 包括所有 _C.a 文件 -> 我们想要 C 接口。
- Create Builtins.c 需要是 c-file 以避免名称混淆问题。在文件检查器中设置
- 出于未知原因我需要两者:GRVIZ 和 GVTARGET 目录。
- 加载库: Unable to use dot layout (graphviz as a library)
看起来当前 (=2019) graphviz 构建依赖于 glib。
为了拥有一个静态的 glib,它需要首先在本地构建。
为此,在构建它时应用 meson _build -Diconv=native
。可能需要先安装 libiconv
。
我的builtins.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);
}
我的builtins.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"
希望对您有所帮助。祝你好运。如果我遗漏了什么,请告诉我。