我不明白爲什麼一個簡單的規則的做法不應該工作:
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
,因此如果您需要不同的行爲,則必須在之後重置該源文件。
聲明:我沒有測試任何上述代碼,所以錯別字或其他小的事故是很有可能的。但原則上,事情應該像概述一樣工作。
注意:'規則應用程序應用程序:infoFile'是無效的語法;它應該只是'規則應用程序';如果你想指定參數,請使用註釋。 – wjk
然後,你顯然不使用Haiku的Jam(這只是一個稍微擴展的Perforce Jam 2.5rc3),或者甚至是「最近」的Perforce Jam。命名規則參數已在2002年引入到Perforce Jam中。請注意,一些Linux發行版(至少openSUSE)附帶了Boost Jam,這是舊版Perforce Jam版本的一個分支。它也不支持return/break/continue(分別只在意外的語義下返回)。 – user686249
我不知道。 – wjk