2013-03-14 44 views
4

序言:我正在嘗試將我的C#csproj與其餘的C++和C++/CLI代碼庫cmake版本集成。我收到了建議不要嘗試這樣做,因爲CMake在Visual Studio中與.NET不能很好地協作,但是在實現一些定製之後,我感覺我非常接近。我可以在cmake時間獲取由CMake爲特定vcproj生成的GUID嗎?

我的一部分自定義是使用configure_file命令在CMake時編輯csproj文件,根據正在發生的構建類型(例如x86,x64)對其進行自定義。

的問題是,我使用一些ProjectReference標籤引用C++/CLI項目:

<ProjectReference Include="..\..\WrapperProject\WrapperProject.vcproj"> 
    <Project>{7BD6E175-CDD1-4F8D-A3B2-0AC862E62C03}</Project> 
    <Name>WrapperProject</Name> 
</ProjectReference> 

...每當CMake的緩存重建的GUID不能一成不變,因爲他們更改項目(糾正我,如果我錯了)。

所以我想要做的是找到我們在CMake時間什麼GUIDs計劃這些項目,並相應地編輯vcproj文件。

谷歌告訴我,人都能夠使用「set_property」設置GUID,就像這樣:

set_property(CACHE ${target_name}_GUID_CMAKE PROPERTY VALUE ${MY_GUID}) 

...但我似乎無法找到吸氣等同。我已經試過這樣的事情:

get_property(WRAPPER_GUID CACHE內部屬性WrapperTargetName_GUID_CMAKE)

...沒有運氣。感謝您的幫助!

+1

由於可以從CMake中設置固定的項目GUID,因此您應該也可以編寫固定的ProjectReference標籤,對嗎? – ronkot 2013-03-15 07:04:22

回答

4

玩過這個之後,我意識到Fraser指出的 - 這種方法並不總是奏效,因爲我不能指望在新的CMake上運行GUID。所以我走了我在CMake郵件列表上看到的建議路線,即自己明確設置GUID值。

所以在的CMakeLists.txt每個C++/CLI包裝項目,我有這樣的事情:

# Set a global cache variable for this project GUID 
# The TestAppNet csproj needs this GUID to properly reference this project 
set_property(GLOBAL PROPERTY Wrapper_GUID "1897F4D1-E929-444E-9343-00F094113772") 
get_property(projectGUID GLOBAL PROPERTY Wrapper_GUID) 
MESSAGE(STATUS "Setting project GUID to: ${projectGUID}") 
set(Wrapper_GUID_CMAKE "${projectGUID}" CACHE INTERNAL "Project GUID") 

和C#項目的CMakeLists.txt,我有這樣的:

get_property(CMAKE_WRAPPER_GUID GLOBAL PROPERTY Wrapper_GUID) 
MESSAGE(STATUS "Setting Wrapper GUID to: ${CMAKE_WRAPPER_GUID}") 

...然後將CMAKE_WRAPPER_GUID用作在configure_file命令期間填充的.csproj文件中的變量。

我不確定這是否有效,但它似乎工作!

+1

如果有人想知道,這個GUID緩存條目用在CMGlobalVisualStudio7Generator :: GetGUID函數中的CMake源代碼中。 CMake Git commit c85367f408befa419185a4fec4816ea0ee3e1ee6修改了行爲,以便CMake不再創建_GUID_CMAKE緩存變量(用於確定性GUID)。然而,它看起來仍然會遵守用戶在該變量中提供的GUID。 – 2015-08-04 13:53:56

2

您的語法稍微偏離。你大概的意思是:

get_property(WRAPPER_GUID CACHE WrapperTargetName_GUID_CMAKE PROPERTY VALUE) 

然而,這是一個比較令人費解的方式來獲得的價值。你可以這樣做:

set(WRAPPER_GUID ${WrapperTargetName_GUID_CMAKE}) 

最後,這是不理想的,因爲GUID不可用,直到CMake的第一次運行之後。所以對於一個新的構建樹,你必須在可用之前運行CMake兩次。

+0

謝謝。這很有幫助。我最終以一種稍微不同的方式解決了這個問題,以避免你指出的困境。簡而言之,我明確地爲每個C++/CLI項目設置CMakeLists.txt中的值,然後在C#項目的CMakeLists.txt中檢索它們,並使用這些值生成ProjectReference節點。 – Kohanz 2013-03-15 12:29:27