2012-08-09 82 views
3

創建空的框架,我想使用CMake的功能FIXUP_BUNDLE修復了一個應用程序包,但我越來越安裝時的警告和缺乏更好的術語,而不是一個固定起來捆綁。CMake的:FIXUP_BUNDLE在OS X

的安裝包具有合理的結構,但它使用的框架是不正確的複製。在只有每個框架的目錄結構被複制,而不是實際的共享庫二進制文件。例如,我的包使用SFML 2.0的System框架。請注意,我使用的所有SFML框架都存儲在/Library/Frameworks中。以下是我得到MyApp.app/Contents/Frameworks/相對於這個SFML組件:

sfml-system.framework/ 
    Versions/ 
     2.0.0/ 

這就是我得到的,只是目錄。實際SFML系統框架具有這樣的結構:

sfml-system.framework/ 
    Resources (this is a symlink) 
    sfml-system (this is a symlink) 
    Versions/ 
     2.0.0/ 
      Resources/ 
       Info.plist 
      sfml-system (this is the actual library binary) 
     Current (this is a symlink) 

在我的項目,可執行文件都具有相同的格式,所以我有一個小的功能,使用這種通用格式進行添加。該功能只是增加了可執行文件,設置庫在對鏈接和安裝時間,安裝的應用程序包和調用FIXUP_BUNDLE。下面是函數:

FUNCTION(ADD_CUSTOM_EXECUTABLE TARGET HEADERS SOURCES DEPENDENCIES) 
    ADD_EXECUTABLE(${TARGET} MACOSX_BUNDLE ${HEADERS} ${SOURCES} ${ARGN}) 
    TARGET_LINK_LIBRARIES(${TARGET} ${DEPENDENCIES}) 

    INSTALL(TARGETS ${TARGET} BUNDLE DESTINATION .) 

    INSTALL(CODE " 
     INCLUDE(BundleUtilities) 
     FIXUP_BUNDLE(${CMAKE_INSTALL_PREFIX}/${TARGET}.app \"\" \"\") 
    ") 
ENDFUNCTION(ADD_CUSTOM_EXECUTABLE) 

,因爲我目前沒有使用任何插件,我不爲任何的FIXUP_BUNDLE的LIBS或DIRS參數傳遞。該項目ALL_BUILD在Xcode中建立的罰款,並安裝項目不會失敗運行,但會產生許多警告像這樣通過otool -L發現每個庫。下面是顯示警告,SFML的制度框架開始一個例子,幾乎立即FIXUP_BUNDLE被調用後:

fixup_bundle 
    app='/Users/user/Desktop/SFML_Testing_BUILD/dist/MyApp.app' 
    libs='' 
    dirs='' 
fixup_bundle: preparing... 
warning: embedded item does not exist 'Users/user/Desktop/SFML_Testing_BUILD/ 
dist/MyApp.app/Contents/Frameworks/sfml-system.framework/Versions/2.0.0/ 
sfml-system' 
warning: cannot resolve item '@executable_path/../Frameworks/ 
sfml-system.framework/Versions/2.0.0/sfml-system' 

possible problems: 
    need more directories? 
    need to use InstallRequiredSystemLibraries? 
    run in install tree instead of build tree? 

和短位後,像這樣的東西:

warning: target '@executable_path/../Frameworks/sfml-system.framework/Versions/ 
2.0.0/sfml-system' is not absolute... 
warning: target '@executable_path/../Frameworks/sfml-system.framework/Versions/ 
2.0.0/sfml-system' does not exist... 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ 
usr/bin/otool: can't open file: @executable_path/../Frameworks/ 
sfml-system.framework/Versions/2.0.0/sfml-system (No such file or directory) 
otool: can't open file: @executable_path/../Frameworks/ 
sfml-system.framework/Versions/2.0.0/sfml-system 
(No such file or directory) 

有誰知道如何解決這個問題?我搜索了互聯網尋求解決方案,但沒有運氣。

回答

2

如果您正試圖將在框架中處於「/庫/框架」,那麼它被認爲是一個「系統庫」,它實際上並不需要...假設被拉出的是,如果你取決於已安裝的系統庫(而不是您自己創建的系統庫),那麼最終用戶也將擁有相同的已安裝系統庫。 (您必須要求他們在安裝您的應用程序之前安裝SFML。)

我們這樣做的目的是爲了防止人們意外地將捆綁系統中的系統框架包含進來,而這些系統框架在法律上並不包含這些框架。無論您是否合法捆綁SFML框架都是您的負擔。

如果這個假設是錯誤的,你的情況,你想要的東西SFML被認爲是「非系統」,你可以定製BundleUtilities來處理它。

儘管如此,首先嚐試這一點會更容易:首先編寫一個腳本,將它們複製到構建樹束中,然後安裝該束,並在嘗試執行以下自定義覆蓋之前查看fixup_bundle是否可用。

如果有必要,你可以嘗試自定義如下:

首先,內嵌代碼更改安裝(代碼片段到安裝(腳本調用,它調用配置/生成的腳本文件。否則,將會有太多的代碼放在該塊中,並且所有的轉義會變得討厭。

接下來,在將BundleUtilities包括在腳本中之前,爲GetPrerequisites gp_resolved_file_type函數添加一個覆蓋函數。這就是BundleUtilities用來聲明庫是否是「系統」庫的原因。您的覆蓋函數名爲gp_resolved_file_type_override將針對BundleUtilities需要的每個文件類型解析進行調用。你可以寫它來簡單地將庫名稱與字符串「sfml」相匹配,如果匹配,則將該類型聲明爲「other」,並且你的聲明將獲勝。

之後,上面的一些警告應該消失,但您可能會遇到其他需要進一步定製的問題。

這是一個有點討厭的和複雜的,但應該是可行的和現有的CMake ...

但是:

是BundleUtilities任何東西拉在所有的系統庫的事實是錯誤的,那應作爲CMake bug跟蹤器中的錯誤報告:http://www.cmake.org/Bug