创建应用程序结构

时间:2013-08-31 21:38:40

标签: macos jam

我正在尝试使用Haiku Jam创建OS X桌面应用程序。我需要的唯一文件是:

  • <appname>.app(目录)
  • <appname>.app/Contents(目录)
  • <appname>.app/Contents/Info.plist(档案)
  • <appname>.app/Contents/MacOS(目录)
  • <appname.app>/Contents/MacOS/<appname>(可执行文件;这是实际构建的二进制文件)

问题是我不知道正确的Jamfile代码告诉Jam创建这些文件和目录。您认为我会创建一个调用内置MkDirFile规则的“应用程序”规则。这是我的方法,除了由于缺少DEPENDS命令而没有运行所有命令。不幸的是,如果我添加DEPENDS命令使NOTFILE目标依赖于所需的文件和目录,我会得到奇怪的循环引用错误,规则未运行(可能是由于循环依赖)等。我该怎么办?

(在make中,这很简单,因为make每次都按照键入的顺序运行命令。我会创建一个make规则并让它调用酌情反复mkdircp。)

1 个答案:

答案 0 :(得分:0)

我不明白为什么采用简单规则的方法不起作用:

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进行构建。如果info文件总是这样命名并位于相应的子目录中,则可以将相应的代码移动到Application规则中并简化调用。或者,如果您只需要一次,您也可以将所有代码移出应用程序规则并仅保留操作。

或者你甚至可以在不写任何动作的情况下完成所有这些工作。在你的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,因此如果您需要不同的行为,则必须在之后重置它。

免责声明:我没有测试过任何上述代码,因此很有可能出现拼写错误或其他小错误。但原则上,事情应该像概述的那样起作用。