mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
add tests for using target_link_libraries() with imported managed targets
This commit is contained in:
@@ -435,4 +435,5 @@ endif()
|
|||||||
|
|
||||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio ([^9]|9[0-9])")
|
if(${CMAKE_GENERATOR} MATCHES "Visual Studio ([^9]|9[0-9])")
|
||||||
add_RunCMake_test(CSharpCustomCommand)
|
add_RunCMake_test(CSharpCustomCommand)
|
||||||
|
add_RunCMake_test(CSharpReferenceImport)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
3
Tests/RunCMake/CSharpReferenceImport/CMakeLists.txt
Normal file
3
Tests/RunCMake/CSharpReferenceImport/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.3)
|
||||||
|
project(${RunCMake_TEST} NONE)
|
||||||
|
include(${RunCMake_TEST}.cmake)
|
||||||
45
Tests/RunCMake/CSharpReferenceImport/ImportLib.cmake
Normal file
45
Tests/RunCMake/CSharpReferenceImport/ImportLib.cmake
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
enable_language(CXX CSharp)
|
||||||
|
|
||||||
|
if(NOT DEFINED exportFileName OR
|
||||||
|
NOT DEFINED exportNameSpace OR
|
||||||
|
NOT DEFINED exportTargetName)
|
||||||
|
message(FATAL_ERROR "export information missing")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(${exportTargetName}CSharp SHARED
|
||||||
|
ImportLib.cs)
|
||||||
|
|
||||||
|
# native c++ dll
|
||||||
|
add_library(${exportTargetName}Native SHARED
|
||||||
|
ImportLibNative.h
|
||||||
|
ImportLibNative.cxx)
|
||||||
|
|
||||||
|
# mixed c++ dll
|
||||||
|
add_library(${exportTargetName}Mixed SHARED
|
||||||
|
ImportLibMixed.cxx
|
||||||
|
ImportLibMixedNative.h
|
||||||
|
ImportLibMixedNative.cxx)
|
||||||
|
set_target_properties(${exportTargetName}Mixed PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "")
|
||||||
|
|
||||||
|
# pure c++ dll
|
||||||
|
add_library(${exportTargetName}Pure SHARED
|
||||||
|
ImportLibPure.cxx)
|
||||||
|
set_target_properties(${exportTargetName}Pure PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "pure")
|
||||||
|
|
||||||
|
# safe c++ dll
|
||||||
|
add_library(${exportTargetName}Safe SHARED
|
||||||
|
ImportLibSafe.cxx)
|
||||||
|
set_target_properties(${exportTargetName}Safe PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "safe")
|
||||||
|
|
||||||
|
# generate export file
|
||||||
|
export(TARGETS
|
||||||
|
${exportTargetName}CSharp
|
||||||
|
${exportTargetName}Native
|
||||||
|
${exportTargetName}Mixed
|
||||||
|
${exportTargetName}Pure
|
||||||
|
${exportTargetName}Safe
|
||||||
|
NAMESPACE "${exportNameSpace}:"
|
||||||
|
FILE "${exportFileName}")
|
||||||
8
Tests/RunCMake/CSharpReferenceImport/ImportLib.cs
Normal file
8
Tests/RunCMake/CSharpReferenceImport/ImportLib.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
public
|
||||||
|
class ImportLibCSharp
|
||||||
|
{
|
||||||
|
public
|
||||||
|
static void Message() { Console.WriteLine("ImportLibCSharp"); }
|
||||||
|
}
|
||||||
8
Tests/RunCMake/CSharpReferenceImport/ImportLibMixed.cxx
Normal file
8
Tests/RunCMake/CSharpReferenceImport/ImportLibMixed.cxx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using namespace System;
|
||||||
|
|
||||||
|
public
|
||||||
|
ref class ImportLibMixed
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Message() { Console::WriteLine("ImportLibMixed"); }
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "ImportLibMixedNative.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void ImportLibMixedNative::Message()
|
||||||
|
{
|
||||||
|
std::cout << "ImportLibMixedNative" << std::endl;
|
||||||
|
}
|
||||||
13
Tests/RunCMake/CSharpReferenceImport/ImportLibMixedNative.h
Normal file
13
Tests/RunCMake/CSharpReferenceImport/ImportLibMixedNative.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef ImportLibMixed_EXPORTS
|
||||||
|
#define mixedAPI __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define mixedAPI __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class mixedAPI ImportLibMixedNative
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Message();
|
||||||
|
};
|
||||||
8
Tests/RunCMake/CSharpReferenceImport/ImportLibNative.cxx
Normal file
8
Tests/RunCMake/CSharpReferenceImport/ImportLibNative.cxx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#include "ImportLibNative.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void ImportLibNative::Message()
|
||||||
|
{
|
||||||
|
std::cout << "ImportLibNative" << std::endl;
|
||||||
|
}
|
||||||
13
Tests/RunCMake/CSharpReferenceImport/ImportLibNative.h
Normal file
13
Tests/RunCMake/CSharpReferenceImport/ImportLibNative.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef ImportLibNative_EXPORTS
|
||||||
|
#define nativeAPI __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define nativeAPI __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class nativeAPI ImportLibNative
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Message();
|
||||||
|
};
|
||||||
8
Tests/RunCMake/CSharpReferenceImport/ImportLibPure.cxx
Normal file
8
Tests/RunCMake/CSharpReferenceImport/ImportLibPure.cxx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using namespace System;
|
||||||
|
|
||||||
|
public
|
||||||
|
ref class ImportLibPure
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Message() { Console::WriteLine("ImportLibPure"); }
|
||||||
|
};
|
||||||
8
Tests/RunCMake/CSharpReferenceImport/ImportLibSafe.cxx
Normal file
8
Tests/RunCMake/CSharpReferenceImport/ImportLibSafe.cxx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using namespace System;
|
||||||
|
|
||||||
|
public
|
||||||
|
ref class ImportLibSafe
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Message() { Console::WriteLine("ImportLibSafe"); }
|
||||||
|
};
|
||||||
88
Tests/RunCMake/CSharpReferenceImport/ReferenceImport.cmake
Normal file
88
Tests/RunCMake/CSharpReferenceImport/ReferenceImport.cmake
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
enable_language(CXX CSharp)
|
||||||
|
|
||||||
|
if(NOT DEFINED exportFileName OR
|
||||||
|
NOT DEFINED exportNameSpace OR
|
||||||
|
NOT DEFINED exportTargetName)
|
||||||
|
message(FATAL_ERROR "export information missing")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include generated export file.
|
||||||
|
if(NOT EXISTS "${exportFileName}")
|
||||||
|
message(FATAL_ERROR "exportFileNameCSharp does not exist: ${exportFileName}")
|
||||||
|
endif()
|
||||||
|
include(${exportFileName})
|
||||||
|
|
||||||
|
# Verify expected targets are imported
|
||||||
|
set(linkNames linkNameCSharp linkNameNative linkNameMixed
|
||||||
|
linkNamePure linkNameSafe)
|
||||||
|
set(linkNameCSharp "${exportNameSpace}:${exportTargetName}CSharp")
|
||||||
|
set(linkNameNative "${exportNameSpace}:${exportTargetName}Native")
|
||||||
|
set(linkNameMixed "${exportNameSpace}:${exportTargetName}Mixed")
|
||||||
|
set(linkNamePure "${exportNameSpace}:${exportTargetName}Pure")
|
||||||
|
set(linkNameSafe "${exportNameSpace}:${exportTargetName}Safe")
|
||||||
|
foreach(l ${linkNames})
|
||||||
|
if(NOT TARGET ${${l}})
|
||||||
|
message(FATAL_ERROR "imported target not found (${${l}})")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Test referencing managed assemblies from C# executable.
|
||||||
|
add_executable(ReferenceImportCSharp ReferenceImport.cs)
|
||||||
|
target_link_libraries(ReferenceImportCSharp
|
||||||
|
${linkNameCSharp}
|
||||||
|
${linkNameNative} # ignored
|
||||||
|
${linkNameMixed}
|
||||||
|
${linkNamePure}
|
||||||
|
${linkNameSafe}
|
||||||
|
)
|
||||||
|
|
||||||
|
# native C++ executable.
|
||||||
|
add_executable(ReferenceImportNative ReferenceImportNative.cxx)
|
||||||
|
target_link_libraries(ReferenceImportNative
|
||||||
|
${linkNameCSharp} # ignored
|
||||||
|
${linkNameNative}
|
||||||
|
${linkNameMixed}
|
||||||
|
${linkNamePure} # ignored
|
||||||
|
${linkNameSafe} # ignored
|
||||||
|
)
|
||||||
|
add_custom_command(TARGET ReferenceImportNative POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"$<TARGET_FILE:${linkNameNative}>"
|
||||||
|
"${CMAKE_BINARY_DIR}/$<CONFIG>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# mixed C++ executable.
|
||||||
|
add_executable(ReferenceImportMixed ReferenceImportMixed.cxx)
|
||||||
|
target_link_libraries(ReferenceImportMixed
|
||||||
|
${linkNameCSharp}
|
||||||
|
${linkNameNative}
|
||||||
|
${linkNameMixed}
|
||||||
|
${linkNamePure}
|
||||||
|
${linkNameSafe}
|
||||||
|
)
|
||||||
|
set_target_properties(ReferenceImportMixed PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "")
|
||||||
|
|
||||||
|
# pure C++ executable.
|
||||||
|
add_executable(ReferenceImportPure ReferenceImportPure.cxx)
|
||||||
|
target_link_libraries(ReferenceImportPure
|
||||||
|
${linkNameCSharp}
|
||||||
|
${linkNameNative} # ignored
|
||||||
|
${linkNameMixed}
|
||||||
|
${linkNamePure}
|
||||||
|
${linkNameSafe}
|
||||||
|
)
|
||||||
|
set_target_properties(ReferenceImportPure PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "pure")
|
||||||
|
|
||||||
|
# native C++ executable.
|
||||||
|
add_executable(ReferenceImportSafe ReferenceImportSafe.cxx)
|
||||||
|
target_link_libraries(ReferenceImportSafe
|
||||||
|
${linkNameCSharp}
|
||||||
|
${linkNameNative} # ignored
|
||||||
|
${linkNameMixed}
|
||||||
|
${linkNamePure}
|
||||||
|
${linkNameSafe}
|
||||||
|
)
|
||||||
|
set_target_properties(ReferenceImportSafe PROPERTIES
|
||||||
|
COMMON_LANGUAGE_RUNTIME "safe")
|
||||||
13
Tests/RunCMake/CSharpReferenceImport/ReferenceImport.cs
Normal file
13
Tests/RunCMake/CSharpReferenceImport/ReferenceImport.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
public class ReferenceImport
|
||||||
|
{
|
||||||
|
public static void Main()
|
||||||
|
{
|
||||||
|
Console.WriteLine("ReferenceImportCSharp");
|
||||||
|
ImportLibMixed.Message();
|
||||||
|
ImportLibPure.Message();
|
||||||
|
ImportLibSafe.Message();
|
||||||
|
ImportLibCSharp.Message();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// clang-format off
|
||||||
|
|
||||||
|
using namespace System;
|
||||||
|
|
||||||
|
#using <ImportLibMixed.dll>
|
||||||
|
#using <ImportLibPure.dll>
|
||||||
|
#using <ImportLibSafe.dll>
|
||||||
|
#using <ImportLibCSharp.dll>
|
||||||
|
|
||||||
|
#include "ImportLibNative.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
Console::WriteLine("ReferenceImportMixed");
|
||||||
|
ImportLibNative::Message();
|
||||||
|
ImportLibMixed::Message();
|
||||||
|
ImportLibPure::Message();
|
||||||
|
ImportLibSafe::Message();
|
||||||
|
ImportLibCSharp::Message();
|
||||||
|
};
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#include "ImportLibNative.h"
|
||||||
|
#include "ImportLibMixedNative.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::cout << "ReferenceImportNative" << std::endl;
|
||||||
|
ImportLibNative::Message();
|
||||||
|
ImportLibMixedNative::Message();
|
||||||
|
};
|
||||||
17
Tests/RunCMake/CSharpReferenceImport/ReferenceImportPure.cxx
Normal file
17
Tests/RunCMake/CSharpReferenceImport/ReferenceImportPure.cxx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// clang-format off
|
||||||
|
|
||||||
|
using namespace System;
|
||||||
|
|
||||||
|
#using <ImportLibMixed.dll>
|
||||||
|
#using <ImportLibPure.dll>
|
||||||
|
#using <ImportLibSafe.dll>
|
||||||
|
#using <ImportLibCSharp.dll>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
Console::WriteLine("ReferenceImportPure");
|
||||||
|
ImportLibMixed::Message();
|
||||||
|
ImportLibPure::Message();
|
||||||
|
ImportLibSafe::Message();
|
||||||
|
ImportLibCSharp::Message();
|
||||||
|
};
|
||||||
17
Tests/RunCMake/CSharpReferenceImport/ReferenceImportSafe.cxx
Normal file
17
Tests/RunCMake/CSharpReferenceImport/ReferenceImportSafe.cxx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// clang-format off
|
||||||
|
|
||||||
|
using namespace System;
|
||||||
|
|
||||||
|
#using <ImportLibMixed.dll>
|
||||||
|
#using <ImportLibPure.dll>
|
||||||
|
#using <ImportLibSafe.dll>
|
||||||
|
#using <ImportLibCSharp.dll>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
Console::WriteLine("ReferenceImportSafe");
|
||||||
|
ImportLibMixed::Message();
|
||||||
|
ImportLibPure::Message();
|
||||||
|
ImportLibSafe::Message();
|
||||||
|
ImportLibCSharp::Message();
|
||||||
|
};
|
||||||
41
Tests/RunCMake/CSharpReferenceImport/RunCMakeTest.cmake
Normal file
41
Tests/RunCMake/CSharpReferenceImport/RunCMakeTest.cmake
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
include(RunCMake)
|
||||||
|
|
||||||
|
set(RunCMake_TEST_NO_CLEAN 1)
|
||||||
|
|
||||||
|
set(exportFileName "${RunCMake_BINARY_DIR}/module.cmake")
|
||||||
|
set(exportNameSpace "ex")
|
||||||
|
set(exportTargetName "ImportLib")
|
||||||
|
|
||||||
|
set(RunCMake_TEST_OPTIONS_BASE ${RunCMake_TEST_OPTIONS}
|
||||||
|
"-DexportNameSpace:INTERNAL=${exportNameSpace}"
|
||||||
|
"-DexportTargetName:INTERNAL=${exportTargetName}")
|
||||||
|
|
||||||
|
file(REMOVE "${exportFileName}")
|
||||||
|
|
||||||
|
# generate C# & C++ assemblies for use as imported target
|
||||||
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ImportLib-build)
|
||||||
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
|
||||||
|
set(RunCMake_TEST_OPTIONS ${RunCMake_TEST_OPTIONS_BASE}
|
||||||
|
"-DexportFileName:INTERNAL=${exportFileName}"
|
||||||
|
# make sure we know the RunCMake_TEST if configuring the project again
|
||||||
|
# with cmake-gui for debugging.
|
||||||
|
"-DRunCMake_TEST:INTERNAL=ImportLib")
|
||||||
|
|
||||||
|
run_cmake(ImportLib)
|
||||||
|
run_cmake_command(ImportLib-build ${CMAKE_COMMAND} --build . --config Debug)
|
||||||
|
|
||||||
|
# generate C# & managed C++ programs which reference imported managed assemblies.
|
||||||
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ReferenceImport-build)
|
||||||
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
|
||||||
|
set(RunCMake_TEST_OPTIONS ${RunCMake_TEST_OPTIONS_BASE}
|
||||||
|
"-DexportFileName:INTERNAL=${exportFileName}"
|
||||||
|
# make sure we know the RunCMake_TEST if configuring the project again
|
||||||
|
# with cmake-gui for debugging.
|
||||||
|
"-DRunCMake_TEST:INTERNAL=ReferenceImport")
|
||||||
|
|
||||||
|
run_cmake(ReferenceImport)
|
||||||
|
run_cmake_command(ReferenceImport-build ${CMAKE_COMMAND} --build . --config Debug)
|
||||||
Reference in New Issue
Block a user