2013-08-31 41 views
0

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

  • <appname>.app(目录)
  • <appname>.app/Contents(目录)
  • <appname>.app/Contents/Info.plist(文件)
  • <appname>.app/Contents/MacOS(目录)
  • <appname.app>/Contents/MacOS/<appname>(可执行文件,这是实际的内置二进制)

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

(在make,这将是死的简单,因为在顺序make运行命令他们打字,每一次,我将创建一个make规则,并把它称之为mkdircp多次为合适。)

回答

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。显然,如果你想重新使用代码,你可以将它移动到规则中。应用程序和infoFile将再次成为参数。请注意,源文件的File规则将SEARCH设置为SEARCH_SOURCE,因此如果您需要不同的行为,则必须在之后重置该源文件。

声明:我没有测试任何上述代码,所以错别字或其他小的事故是很有可能的。但原则上,事情应该像概述一样工作。

+0

注意:'规则应用程序应用程序:infoFile'是无效的语法;它应该只是'规则应用程序';如果你想指定参数,请使用注释。 – wjk

+0

然后,你显然不使用Haiku的Jam(这只是一个稍微扩展的Perforce Jam 2.5rc3),或者甚至是“最近”的Perforce Jam。命名规则参数已在2002年引入到Perforce Jam中。请注意,一些Linux发行版(至少openSUSE)附带了Boost Jam,这是旧版Perforce Jam版本的一个分支。它也不支持return/break/continue(分别只在意外的语义下返回)。 – user686249

+0

我不知道。 – wjk