Існує два способи створення набору додатків на MacOSX - Easy і Ugly.
Найпростіший спосіб - просто використовувати XCode. Готово.
Проблема іноді в тому, що ви не можете.
У моєму випадку я будую додаток, який створює інші додатки. Я не можу припустити, що у користувача встановлений XCode. Я також використовую MacPorts для створення бібліотек, від яких залежить моя програма. Мені потрібно переконатись, що ці диліби входять до комплекту додатка, перш ніж розповсюджувати його.
Застереження: Я абсолютно некваліфікований писати цю публікацію, все, що є, було висвітлено з документів Apple, виділяючи існуючі програми та спроби та помилки. Це працює для мене, але, швидше за все, неправильно. Будь ласка, напишіть мені, якщо у вас є якісь виправлення.
Перше, що ви повинні знати, це те, що набір додатків - це просто каталог.
Давайте вивчимо структуру гіпотетичного foo.app.
foo.app/
Зміст /
Info.plist
MacOS /
foo
Ресурси /
foo.icns
Info.plist - це звичайний XML-файл. Ви можете редагувати його за допомогою текстового редактора або програми редактора списку властивостей, яка постачається в комплекті з XCode. (Він знаходиться в каталозі / Developer / Applications / Utilities /).
Ключові речі, які потрібно включити:
CFBundleName - назва програми.
CFBundleIcon - Файл піктограм, який передбачається знаходити в папці Зміст / Ресурси. Для створення піктограми використовуйте програму Icon Composer. (Це також знаходиться в каталозі / Developer / Applications / Utilities /). Ви можете просто перетягнути PNG у вікно, і він повинен автоматично генерувати для вас рівні mip.
CFBundleExecutable - ім'я виконуваного файлу, який, як передбачається, знаходиться в папці Contents / MacOS /
Є набагато більше варіантів, перераховані вище - це лише мінімальний мінімум. Ось деяка документація Apple щодо
файлу Info.plist та
структури набору додатків .
Крім того, ось зразок Info.plist.
<? xml version = "1.0" encoding = "UTF-8"?>
<! DOCTYPE plist PUBLIC "- // Apple Computer // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version = "1.0">
<вироку>
<key> CFBundleGetInfoString </key>
<string> Фу </string>
<key> CFBundleExecutable </key>
<string> foo </string>
<key> CFBundleIdentifier </key>
<string> com.your-company-name.www </string>
<key> CFBundleName </key>
<string> foo </string>
<key> CFBundleIconFile </key>
<string> foo.icns </string>
<key> CFBundleShortVersionString </key>
<string> 0,01 </string>
<key> CFBundleInfoDictionaryVersion </key>
<string> 6.0 </string>
<key> CFBundlePackageType </key>
<string> APPL </string>
<key> IFMajorVersion </key>
<integer> 0 </integer>
<key> IFMinorVersion </key>
<integer> 1 </integer>
</dict>
</plist>
У ідеальному світі ви можете просто залишити свій виконуваний файл у Contents / MacOS / dir і закінчити. Однак якщо у вашої програми є якісь нестандартні залежності від dylib, вона не буде працювати. Як і Windows, MacOS поставляється зі своїм особливим видом пекла DLL .
Якщо ви використовуєте MacPorts для побудови бібліотек, до яких ви посилаєтеся, розташування дилібів буде жорстко закодовано у ваш виконуваний файл. Якщо ви запускаєте програму на машині, що має диліби в точно такому ж місці, вона буде працювати нормально. Однак більшість користувачів їх не встановлюватимуть; коли вони двічі клацнуть вашу програму, вона просто вийде з ладу.
Перш ніж розповсюджувати виконуваний файл, вам потрібно зібрати всі диліби, які він завантажує, і скопіювати їх у пакет програм. Вам також потрібно буде відредагувати виконуваний файл, щоб він шукав диліби у правильному місці. тобто куди ви їх скопіювали.
Ручне редагування виконуваного файлу звучить небезпечно, чи не так? На щастя, є інструменти командного рядка, які допоможуть.
otool -L ім'я виконуваного файлу
Ця команда перелічить усі диліби, від яких залежить ваш додаток. Якщо ви бачите щось, чого НЕ є в папці System / Library або usr / lib, саме це вам потрібно буде скопіювати в пакет програм. Скопіюйте їх у папку / Contents / MacOS /. Далі вам потрібно буде відредагувати виконуваний файл, щоб використовувати нові диліби.
По-перше, вам потрібно переконатися, що ви посилаєтеся за допомогою прапора -headerpad_max_install_names. Це лише гарантує, що якщо новий шлях Dylib довший за попередній, для нього буде місце.
По-друге, використовуйте install_name_tool для зміни кожного шляху dylib.
install_name_tool -змінити існуючий_ шлях_до_дилібу @ виконуваний_путь / blah.dylib ім'я_виконавчого
Як практичний приклад, припустимо, ваш додаток використовує libSDL , і otool перелічує своє місце розташування як "/opt/local/lib/libSDL-1.2.0.dylib".
Спочатку скопіюйте його в пакет програм.
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
Потім відредагуйте виконуваний файл, щоб використовувати нове розташування (ПРИМІТКА: переконайтеся, що ви створили його за допомогою прапорця -headerpad_max_install_names)
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @ executable_path / libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
Ух, ми майже закінчили. Зараз є невелика проблема з поточним робочим каталогом.
Коли ви запускаєте програму, поточним каталогом буде каталог вище, де знаходиться програма. Наприклад: Якщо ви розмістите foo.app у папці / Applcations, то поточним каталогом під час запуску програми буде папка / Applications. Не /Applications/foo.app/Contents/MacOS/, як ви могли очікувати.
Ви можете змінити свій додаток, щоб це врахувати, або ви можете використовувати цей чарівний скрипт запуску, який змінить поточний каталог і запустить вашу програму.
#! / bin / bash
кд "$ {0% / *}"
./foo
Переконайтеся, що ви налаштували файл Info.plist так, щоб CFBundleExecutable вказував на сценарій запуску, а не на попередній виконуваний файл.
Гаразд, все готово. На щастя, коли ви знаєте все це, ви закопуєте його у сценарій збірки.