From 17df25f92c38cfff4d8cbc618dd7c016b5594eea Mon Sep 17 00:00:00 2001 From: DRC Date: Thu, 25 Jan 2024 13:52:58 -0500 Subject: [PATCH] Build/Win: Eliminate MSVC run-time DLL dependency (regression introduced by 1644bdb7d2fac66cd0ce25adef7754e008b5bc1e) Setting a maximum version in cmake_minimum_required() effectively sets the behavior to NEW for all policies introduced in all CMake versions up to and including that maximum version. The NEW behavior for CMP0091, introduced in CMake 3.15, uses CMake variables to specify the MSVC runtime library against which to link, rather than placing the relevant flags in CMAKE_C_FLAGS*. Thus, replacing /MD with /MT in CMAKE_C_FLAGS* no longer has any effect when using CMake 3.15+. --- CMakeLists.txt | 25 +++++++++++++++++-------- ChangeLog.md | 11 +++++++++++ sharedlib/CMakeLists.txt | 19 ++++++++++++++----- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index adb0ca45..d423c563 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ if(CMAKE_EXECUTABLE_SUFFIX) endif() project(libjpeg-turbo C) -set(VERSION 3.0.2) +set(VERSION 3.0.3) set(COPYRIGHT_YEAR "1991-2024") string(REPLACE "." ";" VERSION_TRIPLET ${VERSION}) list(GET VERSION_TRIPLET 0 VERSION_MAJOR) @@ -379,18 +379,29 @@ set(TURBOJPEG_SO_VERSION 0.${TURBOJPEG_SO_AGE}.0) # COMPILER SETTINGS ############################################################################### +string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC) + if(MSVC) option(WITH_CRT_DLL "Link all ${CMAKE_PROJECT_NAME} libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.) The default is to use the C run-time DLL only with the libraries and executables that need it." FALSE) if(NOT WITH_CRT_DLL) # Use the static C library for all build types - foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) - if(${var} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") + if(CMAKE_VERSION VERSION_EQUAL "3.15" OR + CMAKE_VERSION VERSION_GREATER "3.15") + if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug) + else() + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded) endif() - endforeach() + else() + foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + if(${var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") + endif() + endforeach() + endif() endif() add_definitions(-D_CRT_NONSTDC_NO_WARNINGS) endif() @@ -418,8 +429,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") endif() endif() -string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC) - set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}") message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}") diff --git a/ChangeLog.md b/ChangeLog.md index a929b62a..3982dcd8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,14 @@ +3.0.3 +===== + +### Significant changes relative to 3.0.2: + +1. Fixed an issue in the build system, introduced in 3.0.2, that caused all +libjpeg-turbo components to depend on the Visual C++ run-time DLL when built +with Visual C++ and CMake 3.15 or later, regardless of value of the +`WITH_CRT_DLL` CMake variable. + + 3.0.2 ===== diff --git a/sharedlib/CMakeLists.txt b/sharedlib/CMakeLists.txt index 8e942569..d10b8ac8 100644 --- a/sharedlib/CMakeLists.txt +++ b/sharedlib/CMakeLists.txt @@ -11,12 +11,21 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..) if(MSVC) # Build all configurations against shared C library - foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) - if(${var} MATCHES "/MT") - string(REGEX REPLACE "/MT" "/MD" ${var} "${${var}}") + if(CMAKE_VERSION VERSION_EQUAL "3.15" OR + CMAKE_VERSION VERSION_GREATER "3.15") + if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL) + else() + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL) endif() - endforeach() + else() + foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + if(${var} MATCHES "/MT") + string(REGEX REPLACE "/MT" "/MD" ${var} "${${var}}") + endif() + endforeach() + endif() endif() foreach(src ${JPEG_SOURCES})