【问题标题】:Creating Application Structure创建应用程序结构
【发布时间】:2013-08-31 21:38:40
【问题描述】:

我正在尝试使用 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 命令而无法运行所有命令。不幸的是,如果我添加了使NOTFILE 目标依赖于所需文件和目录的DEPENDS 命令,我会收到奇怪的循环引用错误、未运行规则(可能是由于循环依赖)等等。我该怎么办?

(在make 中,这非常简单,因为make 每次都按照输入的顺序运行命令。我将创建一个make 规则并让它调用mkdir 和@987654335 @酌情重复。)

【问题讨论】:

    标签: macos jam


    【解决方案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,因此如果您需要不同的行为,您必须在之后重置它。

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

    【讨论】:

    • 注意:rule Application application : infoFile 是无效的语法;它应该只是rule Application;如果要指定参数,请使用注释。
    • 那么您显然没有使用 Haiku 的 Jam(它只是稍微扩展的 Perforce Jam 2.5rc3)甚至是“最近的” Perforce Jam。命名规则参数已于 2002 年在 Perforce Jam 中引入。请注意,某些 Linux 发行版(至少是 openSUSE)附带 Boost Jam,它是旧 Perforce Jam 版本的一个分支。它也不支持返回/中断/继续(分别只返回意外语义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2020-01-12
    • 2018-10-26
    • 2018-12-04
    相关资源
    最近更新 更多