https://git.reactos.org/?p=reactos.git;a=commitdiff;h=23e04ae1eec666118a235…
commit 23e04ae1eec666118a2359a17fc442e0332c258b
Author: Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Thu Oct 22 16:29:40 2020 +0200
Commit: Jérôme Gardou <zefklop(a)users.noreply.github.com>
CommitDate: Thu Oct 22 18:07:27 2020 +0200
[CMAKE] Use an INTERFACE library to perform the msvcrt <-> msvcrtex binding
---
dll/win32/msvcrt/CMakeLists.txt | 14 +++++++++++---
sdk/cmake/CMakeMacros.cmake | 6 ------
sdk/lib/crt/msvcrtex.cmake | 3 +++
3 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/dll/win32/msvcrt/CMakeLists.txt b/dll/win32/msvcrt/CMakeLists.txt
index 2b558d18191..2e0c6625971 100644
--- a/dll/win32/msvcrt/CMakeLists.txt
+++ b/dll/win32/msvcrt/CMakeLists.txt
@@ -1,6 +1,14 @@
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/crt/include)
-spec2def(msvcrt.dll msvcrt.spec ADD_IMPORTLIB)
+spec2def(msvcrt.dll msvcrt.spec)
+
+# The msvcrt <-> msvcrtex trick
+generate_import_lib(libmsvcrt_real msvcrt.dll msvcrt.spec)
+add_library(libmsvcrt INTERFACE)
+target_compile_definitions(libmsvcrt INTERFACE _DLL __USE_CRTIMP)
+# if the linked module is one of win32gui;win32cui;win32dll;win32ocx;cpl link it with
msvcrtex, which itself is linked to libmsvcrt_real
+# Otherwise, just link to libmsvcrt_real
+target_link_libraries(libmsvcrt INTERFACE
"$<IF:$<IN_LIST:$<TARGET_PROPERTY:REACTOS_MODULE_TYPE>,win32gui;win32cui;win32dll;win32ocx;cpl>,msvcrtex,libmsvcrt_real>")
add_definitions(
-DUSE_MSVCRT_PREFIX
@@ -26,8 +34,8 @@ target_link_libraries(msvcrt crt wine ${PSEH_LIB})
if(MSVC)
# export of deleting destructor "name"
- add_target_link_flags(msvcrt "/ignore:4102")
- add_target_property(libmsvcrt STATIC_LIBRARY_FLAGS "/ignore:4102")
+ target_link_options(msvcrt PRIVATE "/ignore:4102")
+ set_property(TARGET libmsvcrt_real APPEND PROPERTY STATIC_LIBRARY_OPTIONS
"/ignore:4102")
endif()
add_importlibs(msvcrt kernel32 ntdll)
diff --git a/sdk/cmake/CMakeMacros.cmake b/sdk/cmake/CMakeMacros.cmake
index f4d7cb1f1b1..6458e75fdaf 100644
--- a/sdk/cmake/CMakeMacros.cmake
+++ b/sdk/cmake/CMakeMacros.cmake
@@ -531,13 +531,7 @@ endif()
function(add_importlibs _module)
add_dependency_node(${_module})
foreach(LIB ${ARGN})
- if("${LIB}" MATCHES "msvcrt")
- target_compile_definitions(${_module} PRIVATE _DLL __USE_CRTIMP)
- # set_module_type might not have been called at this point, so use a
generator expression
- target_link_libraries(${_module}
"$<$<IN_LIST:$<TARGET_PROPERTY:${_module},REACTOS_MODULE_TYPE>,win32gui;win32cui;win32dll;win32ocx;cpl>:msvcrtex>")
- endif()
target_link_libraries(${_module} lib${LIB})
- add_dependencies(${_module} lib${LIB})
add_dependency_edge(${_module} ${LIB})
endforeach()
endfunction()
diff --git a/sdk/lib/crt/msvcrtex.cmake b/sdk/lib/crt/msvcrtex.cmake
index 9d4182ffb4d..593622e277d 100644
--- a/sdk/lib/crt/msvcrtex.cmake
+++ b/sdk/lib/crt/msvcrtex.cmake
@@ -96,6 +96,9 @@ add_asm_files(msvcrtex_asm ${MSVCRTEX_ASM_SOURCE})
add_library(msvcrtex ${MSVCRTEX_SOURCE} ${msvcrtex_asm})
target_compile_definitions(msvcrtex PRIVATE _DLL _MSVCRTEX_)
+# Link msvcrtex to the "real" msvcrt.dll library. See msvcrt.dll CMakeLists.txt
to see what really happens here
+target_link_libraries(msvcrtex libmsvcrt_real libkernel32)
+
if(GCC OR CLANG)
target_compile_options(msvcrtex PRIVATE
$<$<COMPILE_LANGUAGE:C>:-Wno-main>)
if(LTCG)