diff --git a/CMake/DolphinSymlinkOrCopy.cmake b/CMake/DolphinSymlinkOrCopy.cmake new file mode 100644 index 0000000000..dd712cb266 --- /dev/null +++ b/CMake/DolphinSymlinkOrCopy.cmake @@ -0,0 +1,20 @@ +if(NOT DEFINED target OR NOT DEFINED link) + message(FATAL_ERROR "`target` and `link` must be defined") +endif() + +file(CREATE_LINK "${target}" "${link}" RESULT result SYMBOLIC) +if(result EQUAL 0) + return() +endif() + +if(WIN32) + set(hint "On Windows, enable Developer Mode to allow symlinks (https://learn.microsoft.com/windows/advanced-settings/developer-mode).") +endif() +message(WARNING "Symlink failed (${result}). Falling back to copying. ${hint}") + +file(REMOVE_RECURSE "${link}") +if(IS_DIRECTORY "${target}") + file(COPY "${target}/." DESTINATION "${link}") +else() + file(COPY_FILE "${target}" "${link}" ONLY_IF_DIFFERENT) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index d3c597cf76..44f82ecb46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,12 +146,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") endif() endif() -if(UNIX) - # Builds a relocatable binary on Linux. - # The Sys folder will need to be copied to the Binaries folder. - option(LINUX_LOCAL_DEV "Enable relocatable binary" OFF) -endif() - list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake ) @@ -391,12 +385,6 @@ if(ENABLE_LTO) endif() endif() -if(UNIX) - if(LINUX_LOCAL_DEV) - add_definitions(-DLINUX_LOCAL_DEV) - endif() -endif() - # BSDs put packages in /usr/local instead of /usr, so we need to # force CMake to look in those directories by default, too. # All commands and submodule commands also need to see these diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt index bce0302e82..c58727ee03 100644 --- a/Source/Core/DolphinQt/CMakeLists.txt +++ b/Source/Core/DolphinQt/CMakeLists.txt @@ -495,7 +495,51 @@ if (MSVC) target_compile_options(dolphin-emu PRIVATE "/GR") endif() -if(WIN32) +if (NOT APPLE AND NOT ANDROID) + # Symlink Sys + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} + -Dtarget="${CMAKE_SOURCE_DIR}/Data/Sys" + -Dlink="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Sys" + -P="${CMAKE_SOURCE_DIR}/CMake/DolphinSymlinkOrCopy.cmake" + ) + + # Symlink COPYING + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} + -Dtarget="${CMAKE_SOURCE_DIR}/COPYING" + -Dlink="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/COPYING" + -P="${CMAKE_SOURCE_DIR}/CMake/DolphinSymlinkOrCopy.cmake" + ) + + # Symlink Licenses dir + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} + -Dtarget="${CMAKE_SOURCE_DIR}/LICENSES" + -Dlink="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Licenses" + -P="${CMAKE_SOURCE_DIR}/CMake/DolphinSymlinkOrCopy.cmake" + ) +endif() +if (WIN32) + # Symlink qt.conf + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} + -Dtarget="${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" + -Dlink="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf" + -P="${CMAKE_SOURCE_DIR}/CMake/DolphinSymlinkOrCopy.cmake" + ) + + if (ENABLE_AUTOUPDATE) + # Symlink build_info.txt + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} + -Dtarget="${CMAKE_BINARY_DIR}/build_info.txt" + -Dlink="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/build_info.txt" + -P="${CMAKE_SOURCE_DIR}/CMake/DolphinSymlinkOrCopy.cmake" + ) + endif() + + target_sources(dolphin-emu PRIVATE DolphinQt.manifest DolphinQt.rc) set_target_properties(dolphin-emu PROPERTIES @@ -503,35 +547,6 @@ if(WIN32) OUTPUT_NAME Dolphin WIN32_EXECUTABLE TRUE ) - - # Copy Sys dir - add_custom_command(TARGET dolphin-emu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Sys" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/Data/Sys" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Sys" - ) - - # Copy COPYING - add_custom_command(TARGET dolphin-emu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/COPYING" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/COPYING" - ) - - # Copy Licenses dir - add_custom_command(TARGET dolphin-emu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/LICENSES" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Licenses" - ) - - # Copy qt.conf - add_custom_command(TARGET dolphin-emu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf" - ) - - if (ENABLE_AUTOUPDATE) - # Copy build_info.txt - add_custom_command(TARGET dolphin-emu POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_BINARY_DIR}/build_info.txt" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/build_info.txt" - ) - endif() - # Delegate to Qt's official deployment binary on Windows to copy over the necessary Qt-specific libraries, etc. get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION) get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)