From e5fd973b14e25055bd686b55f518ad76cf1ed9fd Mon Sep 17 00:00:00 2001 From: Nikita Nemkin Date: Sat, 8 Feb 2025 03:54:26 +0500 Subject: VS: Set the linker image version using the target's VERSION property This matches the behavior of NMake, Ninja and older Visual Studio generators. Fixes: #13130 --- Source/cmVisualStudio10TargetGenerator.cxx | 7 ++++++ Tests/RunCMake/VS10Project/RunCMakeTest.cmake | 1 + .../VS10Project/VsImageVersion-check.cmake | 28 ++++++++++++++++++++++ Tests/RunCMake/VS10Project/VsImageVersion.cmake | 11 +++++++++ 4 files changed, 47 insertions(+) create mode 100644 Tests/RunCMake/VS10Project/VsImageVersion-check.cmake create mode 100644 Tests/RunCMake/VS10Project/VsImageVersion.cmake diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 57ba964..88b3e9a 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -4590,6 +4590,13 @@ bool cmVisualStudio10TargetGenerator::ComputeLinkOptions( } linkOptions.AddFlag("ProgramDataBaseFile", pdb); + // Add image version + int major, minor; + this->GeneratorTarget->GetTargetVersion(major, minor); + if (major || minor) { + linkOptions.AddFlag("Version", cmStrCat(major, '.', minor)); + } + // A Windows Runtime component uses internal .NET metadata, // so does not have an import library. if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT") && diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake index ac3d2b2..232e637 100644 --- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake +++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake @@ -49,6 +49,7 @@ run_cmake(VsSourceSettingsTool) run_cmake(VsPlatformToolset) run_cmake(VsControlFlowGuardLinkSetting) run_cmake(VsToolOverride) +run_cmake(VsImageVersion) run_cmake(VsWinRTByDefault) diff --git a/Tests/RunCMake/VS10Project/VsImageVersion-check.cmake b/Tests/RunCMake/VS10Project/VsImageVersion-check.cmake new file mode 100644 index 0000000..f0eeecd --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsImageVersion-check.cmake @@ -0,0 +1,28 @@ +macro(ensure_link_version projectFile expected) + if(NOT EXISTS "${projectFile}") + set(RunCMake_TEST_FAILED "Project file ${projectFile} does not exist.") + return() + endif() + + file(STRINGS "${projectFile}" lines) + set(version "") + foreach(line IN LISTS lines) + if(line MATCHES "") + set(in_link TRUE) + elseif(line MATCHES "") + if(NOT version STREQUAL "${expected}") + set(RunCMake_TEST_FAILED " not found or incorrect: ${version} vs ${expected}") + return() + endif() + set(in_link FALSE) + set(version "") + elseif(in_link AND line MATCHES "([^<]+)") + set(version ${CMAKE_MATCH_1}) + endif() + endforeach() +endmacro() + +ensure_link_version("${RunCMake_TEST_BINARY_DIR}/app-C.vcxproj" 0.1) +ensure_link_version("${RunCMake_TEST_BINARY_DIR}/app-CXX.vcxproj" 1.0) +ensure_link_version("${RunCMake_TEST_BINARY_DIR}/lib-C.vcxproj" 65535.65535) +ensure_link_version("${RunCMake_TEST_BINARY_DIR}/lib-CXX.vcxproj" "") diff --git a/Tests/RunCMake/VS10Project/VsImageVersion.cmake b/Tests/RunCMake/VS10Project/VsImageVersion.cmake new file mode 100644 index 0000000..80e49a6 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsImageVersion.cmake @@ -0,0 +1,11 @@ +enable_language(C CXX) + +add_executable(app-C empty.c) +add_executable(app-CXX empty.cxx) +add_library(lib-C SHARED empty.c) +add_library(lib-CXX SHARED empty.cxx) + +set_property(TARGET app-C PROPERTY VERSION 0.1) +set_property(TARGET app-CXX PROPERTY VERSION 1.0) +set_property(TARGET lib-C PROPERTY VERSION 65535.65535) +set_property(TARGET lib-CXX PROPERTY VERSION "") -- cgit v0.12