https://git.reactos.org/?p=reactos.git;a=commitdiff;h=23e04ae1eec666118a2359...
commit 23e04ae1eec666118a2359a17fc442e0332c258b Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Thu Oct 22 16:29:40 2020 +0200 Commit: Jérôme Gardou zefklop@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)