2013-08-31 63 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