我不明白为什么使用简单规则的方法不起作用:
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
,因此如果您需要不同的行为,您必须在之后将其重置。
免责声明:我没有测试过上述任何代码,因此很可能出现拼写错误或其他小事故。但原则上,事情应该像概述的那样工作。