2013-03-14 6 views
4

서문 : C# 및 C++/CLI 코드 기반 cmake 빌드의 나머지 부분과 C# csproj를 통합하려고합니다. Visual Studio에서 CMake가 .Net과 잘 작동하지 않기 때문에이 작업을 시도하지 말라고 조언을 받았지만 일부 사용자 지정을 구현 한 후에는 매우 가까이에 있다고 생각합니다.cmake에서 특정 vcproj에 대해 생성 된 GUake를 CMake에서 얻을 수 있습니까?

내 맞춤 기능 중 일부는 CMake 시간에 csproj 파일을 편집하기 위해 configure_file 명령을 사용하여 발생하는 빌드 유형 (예 : x86, x64)에 따라 맞춤 설정합니다.

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

... 그리고 CMake 캐시가 재건 될 때마다 GUID를들이이 프로젝트에 대한 변경 때문에, 정적으로 유지 할 수 없습니다

문제는 내가 C++/CLI 프로젝트를 참조하는 일부 ProjectReference 태그를 사용한다는 것입니다 (내가 잘못하면 나를 바로 잡아라.)

그래서 내가하고 싶은 것은 CMake가이 프로젝트를 위해 어떤 GUID를 계획하고 그에 따라 vcproj 파일을 편집 할 것인지를 찾는 것입니다.

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

을 ...하지만 나는 게터 동등한를 찾을 수 없습니다 :

구글은 사람들과 같이, GUID를 설정하는 'set_property'를 사용할 수 있음을 알려줍니다. 나는이 같은 일을 시도했다 :

get_property (WRAPPER_GUID 캐시 내부 속성 WrapperTargetName_GUID_CMAKE)

... 행운을하지 않고. 귀하의 도움을 주시면 감사하겠습니다!

+1

CMake에서 고정 프로젝트 GUID를 설정할 수 있으므로 고정 된 ProjectReference 태그도 작성할 수 있어야합니다. 맞습니까? – ronkot

답변

4

프레이저가 지적한 바를 깨닫고 나면,이 방법은 항상 작동하지 않을 것입니다. GUake를 신선한 CMake에서 사용할 수 있기를 기대할 수 없기 때문입니다. 그래서 내가 명시 적으로 GUID 값을 직접 설정하는 것입니다 CMake 메일 링리스트에 제안했다 본 경로를 갔다.

get_property(CMAKE_WRAPPER_GUID GLOBAL PROPERTY Wrapper_GUID) 
MESSAGE(STATUS "Setting Wrapper GUID to: ${CMAKE_WRAPPER_GUID}") 
:
# 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에서

, 나는이 있습니다

그래서 각 C++/CLI 래퍼 프로젝트의 CMakeLists.txt에서,이 같은 뭔가를

... 다음 CMAKE_WRAPPER_GUID는 configure_file 명령 중에 채워지는 .csproj 파일의 변수로 사용됩니다.

이것이 효율적인 지 확실하지 않지만 작동하는 것 같습니다.

+1

누구나 궁금해 할 경우이 GUID 캐시 항목은 cmGlobalVisualStudio7Generator :: GetGUID 함수의 CMake 소스 코드에서 사용됩니다. CMake Git 커밋 c85367f408befa419185a4fec4816ea0ee3e1ee6는 CMake가 더 이상 결정적인 GUID를 사용하여 _GUID_CMAKE 캐시 변수를 생성하지 않도록 동작을 수정합니다. 그러나 그것은 여전히 ​​그 변수에서 사용자가 제공 한 GUID를 존중할 것처럼 보입니다. –

2

구문이 약간 꺼져 있습니다. 아마도 :

get_property(WRAPPER_GUID CACHE WrapperTargetName_GUID_CMAKE PROPERTY VALUE) 

그러나이 값을 얻는 데는 비교적 복잡한 방법입니다.

set(WRAPPER_GUID ${WrapperTargetName_GUID_CMAKE}) 

마지막으로, CMake를 처음 실행 한 후에야 GUID를 사용할 수 있으므로 이상적이지 않습니다. 따라서 신선한 빌드 트리의 경우 CMake를 두 번 실행해야만 사용할 수 있습니다.

+0

고맙습니다.도움이됩니다. 당신이 지적한 딜레마를 피하기 위해 약간 다른 방법으로 문제를 해결했습니다. 간단히 말해, 각 C++/CLI 프로젝트에 대한 CMakeLists.txt의 값을 명시 적으로 설정 한 다음 C# 프로젝트에 대한 CMakeLists.txt에서 값을 검색하고 해당 값을 사용하여 ProjectReference 노드를 생성합니다. – Kohanz