https://git.reactos.org/?p=reactos.git;a=commitdiff;h=23e04ae1eec666118a2359a17fc442e0332c258b

commit 23e04ae1eec666118a2359a17fc442e0332c258b
Author:     Jérôme Gardou <[email protected]>
AuthorDate: Thu Oct 22 16:29:40 2020 +0200
Commit:     Jérôme Gardou <[email protected]>
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)

Reply via email to