From 6cf7ebd0cadd1ab0f41f4c038a4508fbacda251c Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 27 Nov 2020 23:50:57 +0800 Subject: [PATCH] cmake: do not always require extra link flags for std::filesystem since GCC-9 > Using the types and functions in does not require linking > with -lstdc++fs now. see https://gcc.gnu.org/gcc-9/changes.html#libstdcxx Signed-off-by: Kefu Chai --- cmake/modules/FindStdFilesystem.cmake | 44 ++++++++++++++++++--------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/cmake/modules/FindStdFilesystem.cmake b/cmake/modules/FindStdFilesystem.cmake index 8a1ec4264ae..5d3336571ce 100644 --- a/cmake/modules/FindStdFilesystem.cmake +++ b/cmake/modules/FindStdFilesystem.cmake @@ -1,43 +1,57 @@ set(_std_filesystem_test_src ${CMAKE_CURRENT_LIST_DIR}/FindStdFilesystem_test.cc) -macro(try_std_filesystem_library _library _result) +macro(try_std_filesystem_library _library _result _already_included) set(_std_filesystem_try_compile_arg CXX_STANDARD 17) + if(NOT _library STREQUAL "") + list(APPEND _std_filesystem_try_compile_arg + LINK_LIBRARIES ${_library}) + endif() try_compile(_std_filesystem_compiles ${CMAKE_CURRENT_BINARY_DIR} SOURCES ${_std_filesystem_test_src} - LINK_LIBRARIES ${_library} ${_std_filesystem_try_compile_arg}) unset(_std_filesystem_try_compile_arg) if(_std_filesystem_compiles) - set(${_result} ${_library}) + if(NOT _library STREQUAL "") + set(${_result} ${_library}) + else() + set(${_already_included} "included by standard library") + endif() endif() unset(_std_filesystem_compiles) endmacro() - -if(NOT StdFilesystem_LIBRARY) - try_std_filesystem_library("stdc++fs" StdFilesystem_LIBRARY) -endif() -if(NOT StdFilesystem_LIBRARY) - try_std_filesystem_library("c++experimental" StdFilesystem_LIBRARY) -endif() -if(NOT StdFilesystem_LIBRARY) - try_std_filesystem_library("c++fs" StdFilesystem_LIBRARY) -endif() +set(_std_filesystem_required_var "StdFilesystem_LIBRARY") +set(_std_filesystem_already_included FALSE) +foreach(library + "" + "stdc++fs" + "c++experimental" + "c++fs") + try_std_filesystem_library("${library}" StdFilesystem_LIBRARY _std_filesystem_already_included) + if(_std_filesystem_already_included) + set(_std_filesystem_required_var "_std_filesystem_already_included") + break() + elseif(StdFilesystem_LIBRARY) + break() + endif() +endforeach() unset(_std_filesystem_test_src) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(StdFilesystem FOUND_VAR StdFilesystem_FOUND - REQUIRED_VARS StdFilesystem_LIBRARY) + REQUIRED_VARS ${_std_filesystem_required_var}) mark_as_advanced(StdFilesystem_LIBRARY) if(StdFilesystem_FOUND AND NOT (TARGET StdFilesystem::filesystem)) add_library(StdFilesystem::filesystem INTERFACE IMPORTED) - set_target_properties(StdFilesystem::filesystem PROPERTIES + if(StdFilesystem_LIBRARY) + set_target_properties(StdFilesystem::filesystem PROPERTIES INTERFACE_LINK_LIBRARIES ${StdFilesystem_LIBRARY}) + endif() endif() -- 2.39.5