From 1b473cbeee2dd4398df1d446e223e52e06b6ccb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 10 Feb 2019 00:47:43 +0100 Subject: [PATCH] [SDK:CMAKE] Fix LINK command-line from the VS IDE for CMake VSSolution configurations, when using MSVC "linker script" files. MSBuild, via the VS IDE, uses response files when calling CL or LINK. We cannot specify a custom response file on the linker command-line, since specifying response files from within response files is forbidden. We therefore have to pre-process, at configuration time, the linker script so as to retrieve the custom linker options to be appended to the linker command-line. --- sdk/cmake/msvc.cmake | 49 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/sdk/cmake/msvc.cmake b/sdk/cmake/msvc.cmake index 7f0ec9851b9..4d76d914379 100644 --- a/sdk/cmake/msvc.cmake +++ b/sdk/cmake/msvc.cmake @@ -575,16 +575,43 @@ function(add_linker_script _target _linker_script_file) else() set(_no_std_includes_flag "/X") endif() - add_custom_command( - #OUTPUT ${_generated_file} - TARGET ${_target} PRE_LINK - COMMAND ${CMAKE_C_COMPILER} /nologo ${_no_std_includes_flag} /D__LINKER__ /EP /c "${_file_full_path}" > "${_generated_file}" - DEPENDS ${_file_full_path} - VERBATIM) - set_source_files_properties(${_generated_file} PROPERTIES GENERATED TRUE) - add_target_link_flags(${_target} "@${_generated_file}") + if(MSVC_IDE AND (CMAKE_VERSION MATCHES "ReactOS")) + # MSBuild, via the VS IDE, uses response files when calling CL or LINK. + # We cannot specify a custom response file on the linker command-line, + # since specifying response files from within response files is forbidden. + # We therefore have to pre-process, at configuration time, the linker + # script so as to retrieve the custom linker options to be appended + # to the linker command-line. + execute_process( + COMMAND ${CMAKE_C_COMPILER} /nologo ${_no_std_includes_flag} /D__LINKER__ /EP /c "${_file_full_path}" + # OUTPUT_FILE "${_generated_file}" + OUTPUT_VARIABLE linker_options + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + RESULT_VARIABLE linker_rsp_result + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT linker_rsp_result EQUAL 0) + message(FATAL_ERROR "Generating pre-processed linker options for target '${_target}' failed with error ${linker_rsp_result}.") + endif() + # file(STRINGS ${_generated_file} linker_options NEWLINE_CONSUME) + string(REGEX REPLACE "[\r\n]+" " " linker_options "${linker_options}") + add_target_link_flags(${_target} ${linker_options}) + else() + # Generate at compile-time a linker response file and append it + # to the linker command-line. + add_custom_command( + # OUTPUT ${_generated_file} + TARGET ${_target} PRE_LINK # PRE_BUILD + COMMAND ${CMAKE_C_COMPILER} /nologo ${_no_std_includes_flag} /D__LINKER__ /EP /c "${_file_full_path}" > "${_generated_file}" + DEPENDS ${_file_full_path} + VERBATIM) + set_source_files_properties(${_generated_file} PROPERTIES GENERATED TRUE) + # add_custom_target("${_target}_${_file_name}" ALL DEPENDS ${_generated_file}) + # add_dependencies(${_target} "${_target}_${_file_name}") + add_target_link_flags(${_target} "@${_generated_file}") - # Unfortunately LINK_DEPENDS is ignored in non-Makefile generators (for now...) - # See also http://www.cmake.org/pipermail/cmake/2010-May/037206.html - add_target_property(${_target} LINK_DEPENDS ${_generated_file}) + # Unfortunately LINK_DEPENDS is ignored in non-Makefile generators (for now...) + # See also http://www.cmake.org/pipermail/cmake/2010-May/037206.html + add_target_property(${_target} LINK_DEPENDS ${_generated_file}) + endif() endfunction()