Создание структуры приложения
Я пытаюсь создать настольное приложение для OS X, используя Haiku Jam. Единственные файлы, которые мне нужны:
<appname>.app
(Каталог)<appname>.app/Contents
(Каталог)<appname>.app/Contents/Info.plist
(файл)<appname>.app/Contents/MacOS
(Каталог)<appname.app>/Contents/MacOS/<appname>
(исполняемый файл; это фактически собранный двоичный файл)
Проблема в том, что я не знаю правильного кода Jamfile, чтобы сообщить Jam о создании этих файлов и каталогов. Можно подумать, я бы создал правило "Приложение", которое вызывает встроенный MkDir
а также File
правила. Это был мой подход, за исключением того, что он не запускает все команды из-за отсутствия DEPENDS
команды. К сожалению, если я добавлю DEPENDS
команды, которые делают NOTFILE
цель зависит от необходимых файлов и каталогов, я получаю странные ошибки циклической ссылки, не выполняющиеся правила (возможно, из-за циклических зависимостей) и т. д. Что я могу сделать?
(В make
Это было бы очень просто, потому что make
запускает команды в порядке их ввода, каждый раз. Я бы создал make
править и позвать mkdir
а также cp
несколько раз в случае необходимости.)
1 ответ
Я не понимаю, почему подход с простым правилом не должен работать:
rule Application application : infoFile
{
local appDir = $(application:BS=.app) ;
MakeLocate $(appDir) : ... some directory ... ;
Depends $(appDir) : $(application) $(infoFile) ;
Application1 $(appDir) : $(application) $(infoFile) ;
}
actions Application1
{
rm -rf $(1)
mkdir -p $(1)/Contents/MacOS
cp $(2[1]) $(1)/Contents/MacOS
cp $(2[2]) $(1)/Contents/Info.plist
}
Первый аргумент - это исполняемая цель (как передано Main
) - правило предполагает, что оно имеет окончательное имя. Второй аргумент является целью для Info.plist (имя не имеет значения). Я предполагаю, что это какой-то уже существующий файл, поэтому вам нужно будет сказать Jam, как его найти. Предполагая, что файл находится в подкаталоге Jamfile, который создает исполняемый файл, интересная часть этого Jamfile может выглядеть так:
Main MyApp : ... ;
local infoFile = [ FGristFiles Info.plist ] ;
SEARCH on $(infoFile) = $(SEARCH_SOURCE) ;
Application MyApp : $(infoFile) ;
Вы бы построить с jam -q MyApp.app
, Если информационный файл всегда называется таким образом и находится в соответствующем подкаталоге, вы можете переместить соответствующий код в правило приложения и упростить вызов. Или, если вам это нужно только один раз, вы можете также удалить весь код из правила приложения и сохранить только действия.
В качестве альтернативы вы можете сделать все это, даже не написав никаких действий. В вашем Jamfile:
local application = MyApp ;
local infoFile = Info.plist ;
local targetDir = ... some directory ... ;
local applicationDir = [ FDirName $(targetDir) $(application:BS=.app) ] ;
local contentsDir = [ FDirName $(applicationDir) Contents ] ;
local macOsDir = [ FDirName $(contentsDir) MacOS ] ;
Main $(application) : ... ;
MakeLocate $(application) : $(macOsDir) ;
local targetInfoFile = <$(application)-info-plist)>Info.plist ;
MakeLocate $(targetInfoFile) : $(contentsDir) ;
File $(targetInfoFile) : [ FGristFiles $(infoFile) ] ;
NotFile $(application)-dir ;
Depends $(application)-dir : $(application) $(targetInfoFile) ;
Псевдо-цель существует, так что вы можете сделать jam -q MyApp-dir
, Очевидно, что если вы хотите повторно использовать код, вы можете переместить его в правило. application и infoFile снова будут параметрами. Обратите внимание, что File
наборы правил SEARCH
исходного файла в SEARCH_SOURCE
, так что вам придется сбросить его позже, если вам нужно другое поведение.
Отказ от ответственности: я не проверял ни один из вышеприведенного кода, поэтому опечатки или другие мелкие ошибки вполне возможны. Но в принципе все должно работать как указано.