diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9e60bdd53c91bc5223df9266f0c361ae6d186e01..402fd98ad809f0f85bbf3d4f5a9851e4c5b86ddf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -136,8 +136,7 @@ if("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" AND "${CMAKE_SYSTEM_NAME}" MATCHES "Wi target_link_options(SRB2SDL2 PRIVATE "-Wl,--disable-dynamicbase") if("${SRB2_CONFIG_STATIC_STDLIB}") # On MinGW with internal libraries, link the standard library statically - MESSAGE(STATUS "Forcing static libstdc++ on MinGW?") - target_link_options(SRB2SDL2 PRIVATE "-static") + target_link_options(SRB2SDL2 PRIVATE -Wl,--add-stdcall-alias -static-libgcc -static-libstdc++ -static -lpthread) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) target_link_libraries(SRB2SDL2 PRIVATE Threads::Threads) @@ -501,16 +500,157 @@ endif() # copy DLLs to bin/ directory if building internal shared on windows if("${CMAKE_SYSTEM_NAME}" STREQUAL Windows AND NOT "${SRB2_CONFIG_INTERNAL_LIBRARIES}") + # also copy implicitly linked system libraries set(ADDITIONAL_DLLS "") - if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU AND "${VCPKG_HOST_TRIPLET}" MATCHES "-mingw-static$") - # also copy implicitly linked system libraries - get_filename_component(MINGW_BIN_PATH ${CMAKE_CXX_COMPILER} PATH) - list(APPEND ADDITIONAL_DLLS - "libgcc_s_dw2-1.dll" - "libstdc++-6.dll" - "libwinpthread-1.dll" + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL GNU) + string(CONCAT gcc_search_dirs_path "${CMAKE_BINARY_DIR}" /gcc_search_dirs.txt) + #message(STATUS gcc_search_dirs_path=${gcc_search_dirs_path}) + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} -print-search-dirs + OUTPUT_FILE "${gcc_search_dirs_path}" + #OUTPUT_VARIABLE gcc_search_dirs ) - list(TRANSFORM ADDITIONAL_DLLS PREPEND "${MINGW_BIN_PATH}/") + + file(READ "${gcc_search_dirs_path}" gcc_search_dirs) + #message(STATUS gcc_search_dirs=${gcc_search_dirs}) + + #set(gcc_install_dir "${gcc_search_dirs}") + #string(REGEX MATCH "install: =[ \t]*([^\r\n]*)" gcc_install_dir "${gcc_install_dir}" ) + #set(gcc_install_dir "${CMAKE_MATCH_1}") + #message(STATUS gcc_install_dir="${gcc_install_dir}") + + + string(CONCAT gcc_search_dirs_install_path_1 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_install_1.txt) + #message(STATUS gcc_search_dirs_install_path_1=${gcc_search_dirs_install_path_1}) + execute_process( + COMMAND grep "^install:" + INPUT_FILE "${gcc_search_dirs_path}" + OUTPUT_FILE "${gcc_search_dirs_install_path_1}" + ) + + string(CONCAT gcc_search_dirs_install_path_2 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_install_2.txt) + #message(STATUS gcc_search_dirs_install_path_2=${gcc_search_dirs_install_path_2}) + execute_process( + COMMAND sed -e "s/^install: //" -e "s,=/,/,g" + INPUT_FILE "${gcc_search_dirs_install_path_1}" + OUTPUT_FILE "${gcc_search_dirs_install_path_2}" + ) + + if(NOT ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")) + string(REPLACE ":" ";" gcc_install_dir "${gcc_install_dir}") + endif() + + file(READ ${gcc_search_dirs_install_path_2} gcc_install_dir) + + #set(gcc_programs_dir "${gcc_search_dirs}") + #string(REGEX MATCH "programs: =[ \t]*([^\r\n]*)" gcc_programs_dir "${gcc_programs_dir}" ) + #set(gcc_programs_dir "${CMAKE_MATCH_1}") + #message(STATUS gcc_programs_dir="${gcc_programs_dir}") + + string(CONCAT gcc_search_dirs_programs_path_1 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_programs_1.txt) + #message(STATUS gcc_search_dirs_programs_path_1=${gcc_search_dirs_programs_path_1}) + execute_process( + COMMAND grep "^programs:" + INPUT_FILE "${gcc_search_dirs_path}" + OUTPUT_FILE "${gcc_search_dirs_programs_path_1}" + ) + + string(CONCAT gcc_search_dirs_programs_path_2 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_programs_2.txt) + #message(STATUS gcc_search_dirs_programs_path_2=${gcc_search_dirs_programs_path_2}) + execute_process( + COMMAND sed -e "s/^programs: =//" -e "s,=/,/,g" + INPUT_FILE "${gcc_search_dirs_programs_path_1}" + OUTPUT_FILE "${gcc_search_dirs_programs_path_2}" + ) + + file(READ ${gcc_search_dirs_programs_path_2} gcc_programs_dir) + + if(NOT ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")) + string(REPLACE ":" ";" gcc_programs_dir "${gcc_programs_dir}") + endif() + + #set(gcc_libraries_dir "${gcc_search_dirs}") + #string(REGEX MATCH "libraries: =[ \t]*([^\r\n]*)" gcc_libraries_dir "${gcc_libraries_dir}" ) + #set(gcc_libraries_dir "${CMAKE_MATCH_1}") + #message(STATUS gcc_libraries_dir="${gcc_libraries_dir}") + + string(CONCAT gcc_search_dirs_libraries_path_1 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_libraries_1.txt) + #message(STATUS gcc_search_dirs_libraries_path_1=${gcc_search_dirs_libraries_path_1}) + execute_process( + COMMAND grep "^libraries:" + INPUT_FILE "${gcc_search_dirs_path}" + OUTPUT_FILE "${gcc_search_dirs_libraries_path_1}" + ) + + string(CONCAT gcc_search_dirs_libraries_path_2 "${CMAKE_BINARY_DIR}" /gcc_search_dirs_libraries_2.txt) + #message(STATUS gcc_search_dirs_libraries_path_2=${gcc_search_dirs_libraries_path_2}) + execute_process( + COMMAND sed -e "s/^libraries: =//" -e "s,=/,/,g" + INPUT_FILE "${gcc_search_dirs_libraries_path_1}" + OUTPUT_FILE "${gcc_search_dirs_libraries_path_2}" + ) + + file(READ ${gcc_search_dirs_libraries_path_2} gcc_libraries_dir) + + if(NOT ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")) + string(REPLACE ":" ";" gcc_libraries_dir "${gcc_libraries_dir}") + endif() + + #list(LENGTH gcc_install_dir gcc_install_dir_len) + #list(LENGTH gcc_programs_dir gcc_programs_dir_len) + #list(LENGTH gcc_libraries_dir gcc_libraries_dir_len) + #message(STATUS gcc_install_dir_len="${gcc_install_dir_len}") + #message(STATUS gcc_install_dir="${gcc_install_dir}") + #message(STATUS gcc_programs_dir_len="${gcc_programs_dir_len}") + #message(STATUS gcc_programs_dir="${gcc_programs_dir}") + #message(STATUS gcc_libraries_dir_len="${gcc_libraries_dir_len}") + #message(STATUS gcc_libraries_dir="${gcc_libraries_dir}") + + get_filename_component(CMAKE_CXX_COMPILER_DIR ${CMAKE_CXX_COMPILER} DIRECTORY) + #message(STATUS CMAKE_CXX_COMPILER_DIR="${CMAKE_CXX_COMPILER_DIR}") + + set(OLD_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES "" ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(OLD_CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES}) + set(CMAKE_FIND_LIBRARY_PREFIXES "" ${CMAKE_FIND_LIBRARY_PREFIXES}) + + find_library(LIBGCC + NAMES "libgcc_s_dw2-1.dll" "libgcc_s_sjlj-1.dll" "libgcc_s_seh-1.dll" + PATHS ${gcc_programs_dir} ${CMAKE_CXX_COMPILER_DIR} + ) + if (LIBGCC) + #message(STATUS LIBGCC="${LIBGCC}") + list(APPEND ADDITIONAL_DLLS ${LIBGCC}) + endif() + unset(LIBGCC) + find_library(LIBSTDCPP + NAMES "libstdc++-6.dll" + PATHS ${gcc_programs_dir} ${CMAKE_CXX_COMPILER_DIR} + ) + if (LIBSTDCPP) + #message(STATUS LIBSTDCPP="${LIBSTDCPP}") + list(APPEND ADDITIONAL_DLLS ${LIBSTDCPP}) + endif() + unset(LIBSTDCPP) + find_library(LIBPTHREAD + NAMES "winpthread-1.dll" "libwinpthread-1.dll" "pthreadGC2.dll" + PATHS ${gcc_libraries_dir} ${CMAKE_CXX_COMPILER_DIR} + ) + if(LIBPTHREAD) + #message(STATUS LIBPTHREAD="${LIBPTHREAD}") + list(APPEND ADDITIONAL_DLLS ${LIBPTHREAD}) + endif() + + set(CMAKE_FIND_LIBRARY_SUFFIXES ${OLD_CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_PREFIXES ${OLD_CMAKE_FIND_LIBRARY_PREFIXES}) + unset(LIBPTHREAD) + unset(gcc_install_dir) + unset(gcc_programs_dir) + unset(gcc_libraries_dir) + unset(OLD_CMAKE_FIND_LIBRARY_SUFFIXES) + unset(OLD_CMAKE_FIND_LIBRARY_PREFIXES) + + #message(STATUS ADDITIONAL_DLLS="${ADDITIONAL_DLLS}") endif() add_custom_command(TARGET SRB2SDL2 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different