Создание структуры приложения

Я пытаюсь создать настольное приложение для 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, так что вам придется сбросить его позже, если вам нужно другое поведение.

Отказ от ответственности: я не проверял ни один из вышеприведенного кода, поэтому опечатки или другие мелкие ошибки вполне возможны. Но в принципе все должно работать как указано.

Другие вопросы по тегам