CMake の助けを借りて ImageMagick をバンドルで展開するための完全なソリューションを見つけました。CMake を使用しない場合は、@Tomasz の回答も役立ちます。それでは始めましょう:
まず、独自のコードから ImageMagick を使用する場合、ImageMagick が何をどこで見つけようとしているのかを知る必要があります。それを見つけるには、これらのパラメーターに設定できるMAGICK_DEBUG環境変数を使用できます。ImageMagick をデバッグするときに非常に役立ちます。
前提条件: FIND_PACKAGE と FIXUP_BUNDLE を使用して ImageMagick を見つけ、そのバイナリ パスをバンドル内に設定したと仮定します。あとはコーダーを配置するだけです。また、Mac Ports から ImageMagick をインストールしたと仮定します。
コーダーを正しく見つけるには、ImageMagick のバージョン文字列を取得する必要があります。
STRING(REGEX REPLACE "-.+" "" ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
ImageMagick_SHORT_VERSIONには、サブバージョンのないフル バージョンが含まれるようになりました。
次に、すべてのコーダーを事前定義されたフォルダーにコピーする必要があります (バンドルの MacOS 部分の下にある ImageMagick/coders サブフォルダーを使用しました)。
FILE(COPY /opt/local/lib/ImageMagick-${ImageMagick_SHORT_VERSION}/modules-Q16/coders/ DESTINATION ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/)
今、私たちが持っているすべての *.so ライブラリを修正する必要があるので、それをリストして fixup_bundle に渡します
FILE(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)
ここで、コーダー *.so に付随する *.la ファイルを更新する必要があります。それを達成するために、スクリプトを使用しました:
INSTALL(SCRIPT LaScript.cmake COMPONENT Runtime)
スクリプトの内容:
SET(TARGET_BINARY_DIR "${PATH_TO_YOUR_BUNDLE}")
FILE(GLOB IMAGEMAGICK_CODERS_LA ${TARGET_BINARY_DIR}/Contents/MacOS/ImageMagick/coders/*.la)
FOREACH(file ${IMAGEMAGICK_CODERS_LA})
FILE(READ ${file} FILE_CONTENT)
STRING(REGEX REPLACE "dependency_libs='.*'" " " MODIFIED_FILE_CONTENT ${FILE_CONTENT})
STRING(REGEX REPLACE "libdir='.*'" " " MODIFIED_FILE_CONTENT ${MODIFIED_FILE_CONTENT})
FILE(WRITE ${file} ${MODIFIED_FILE_CONTENT})
ENDFOREACH()
やるべきことは、アプリケーションの起動方法を変更することだけです。しかし、少し脱線して、ImageMagick がコーダーを検索する場所を調べてみましょう。
- MAGICK_CODER_MODULE_PATH環境変数の内容を取得しようとします
- 次に、MAGICKCORE_CODER_PATHマクロが定義されているかどうかをチェックし (実際に定義されています!)、その値を使用します。
次に、MAGICK_HOME環境変数とMAGICCORE_CODER_RELATIVE_PATHを使用してモジュールへのパスを取得しようとしますが、とにかく #2 で停止するので気にしません!(注: Mac Ports のインストールには当てはまります)
したがって、検索を妨害できる唯一の方法は、MAGICK_CODER_MODULE_PATH環境変数を設定することです (libMagickCodre を編集して、MAGICKCORE_CODER_PATHを必要な静的パスに置き換えることもできますが、それはあまりにも脆弱な方法であり、誰かが設定した場合、私たちを救うことはできませんとにかくMAGICK_CODER_MODULE_PATH)ユーザーのインストールを中断する可能性があるため、システム全体に設定しないでください。2つのオプションがあります。
- LSEnvironment を使用して、MAGICK_CODER_MODULE_PATHを事前定義された場所に設定します。
- スクリプトを使用してアプリを起動し、その中にこの変数を設定します。
より柔軟であるため、後者を選択しました。次のスクリプトがあります。
#!/bin/bash
working_dir="${0%/*}"
export MAGICK_CODER_MODULE_PATH=$working_dir/ImageMagick/coders
executable="${working_dir}/ApplicationName"
"$executable"
CFBundleExecutable
スクリプトの名前に設定します。
以上で、誰かが時間を節約するのに役立つことを願っています。