diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d4fa1202..6f9ced89d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,136 @@ cmake_minimum_required(VERSION 3.20) project(rpcsx) +if(CMAKE_CROSSCOMPILING) + if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + message(STATUS "!!! Cross compilation for Windows !!!") + add_link_options(-fuse-ld=lld -static-libgcc -static-libstdc++) + else() + message(FATAL "Cross compilation for Windows is supported with Clang compiler only") + endif() +endif() + + +if (CMAKE_CROSSCOMPILING) + function(rpcsx_setup_crosscompiling) + add_custom_command( + OUTPUT "${RPCSX_NATIVE_ROOT_DIR}/CMakeCache.txt" + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" + -B ${RPCSX_NATIVE_ROOT_DIR} + -DCMAKE_MAKE_PROGRAM="${CMAKE_MAKE_PROGRAM}" + -DCMAKE_C_COMPILER_LAUNCHER="${CMAKE_C_COMPILER_LAUNCHER}" + -DCMAKE_CXX_COMPILER_LAUNCHER="${CMAKE_CXX_COMPILER_LAUNCHER}" + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY="${RPCSX_NATIVE_ROOT_DIR}/bin" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT "Configuring native project..." + USES_TERMINAL + ) + + unset(CMAKE_EXECUTABLE_SUFFIX) + + include(Platform/${CMAKE_HOST_SYSTEM_NAME} OPTIONAL RESULT_VARIABLE platformIncluded) + if (platformIncluded) + set(RPCSX_HOST_EXECUTABLE_SUFFIX ${CMAKE_EXECUTABLE_SUFFIX} PARENT_SCOPE) + endif() + endfunction() + + set(RPCSX_NATIVE_ROOT_DIR ${CMAKE_BINARY_DIR}/native) + rpcsx_setup_crosscompiling() + add_custom_target(RPCSX_CONFIGURE_NATIVE DEPENDS "${RPCSX_NATIVE_ROOT_DIR}/CMakeCache.txt") +endif() + +function(import_native_executable_target target) + set(options) + set(one_value_keywords EXECUTABLE) + set(multi_value_keywords) + + cmake_parse_arguments( + arg + "${options}" + "${one_value_keywords}" + "${multi_value_keywords}" + ${ARGN} + ) + + if (CMAKE_CROSSCOMPILING) + if (NOT DEFINED arg_EXECUTABLE) + set(arg_EXECUTABLE ${target}) + endif() + set(binary_path "${RPCSX_NATIVE_ROOT_DIR}/bin/${arg_EXECUTABLE}${RPCSX_HOST_EXECUTABLE_SUFFIX}") + set(${target}_BINARY_PATH "${binary_path}" PARENT_SCOPE) + + if (NOT TARGET ${target}_NATIVE) + if (CMAKE_GENERATOR MATCHES "Make") + set(build_command "$(MAKE)" "-C" "${RPCSX_NATIVE_ROOT_DIR}" "${target}") + else() + set(build_command ${CMAKE_COMMAND} --build ${bin_dir} --target ${target} --parallel) + endif() + + add_custom_command(OUTPUT "${binary_path}" + COMMAND ${build_command} + DEPENDS RPCSX_CONFIGURE_NATIVE + WORKING_DIRECTORY "${RPCSX_NATIVE_ROOT_DIR}" + COMMENT "Building native ${target}..." + USES_TERMINAL + ) + + add_custom_target(${target}_NATIVE DEPENDS ${binary_path}) + endif() + else() + set(${target}_BINARY_PATH "$" PARENT_SCOPE) + + if (NOT TARGET ${target}_NATIVE) + add_custom_target(${target}_NATIVE) + endif() + endif() +endfunction() + +function(add_precompiled_vulkan_spirv target) + import_native_executable_target(glslang-standalone EXECUTABLE glslang) + + add_library(${target} INTERFACE) + set(SPIRV_GEN_ROOT_DIR "spirv-gen/include/") + set(SPIRV_GEN_DIR "${SPIRV_GEN_ROOT_DIR}/shaders") + + cmake_path(ABSOLUTE_PATH SPIRV_GEN_ROOT_DIR BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} NORMALIZE OUTPUT_VARIABLE outputrootdir) + cmake_path(ABSOLUTE_PATH SPIRV_GEN_DIR BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} NORMALIZE OUTPUT_VARIABLE outputdir) + file(MAKE_DIRECTORY ${outputrootdir}) + file(MAKE_DIRECTORY ${outputdir}) + target_include_directories(${target} INTERFACE ${outputrootdir}) + + foreach(input IN LISTS ARGN) + cmake_path(GET input FILENAME inputname) + cmake_path(REPLACE_EXTENSION inputname LAST_ONLY .h OUTPUT_VARIABLE outputname) + cmake_path(APPEND outputdir ${outputname} OUTPUT_VARIABLE outputpath) + cmake_path(REMOVE_EXTENSION inputname LAST_ONLY OUTPUT_VARIABLE varname) + + string(REPLACE "." "_" varname ${varname}) + string(PREPEND varname "spirv_") + + add_custom_command( + OUTPUT ${outputpath} + COMMAND ${glslang-standalone_BINARY_PATH} -V --target-env vulkan1.2 --vn "${varname}" -o "${outputpath}" "${CMAKE_CURRENT_SOURCE_DIR}/${input}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${input}" glslang-standalone_NATIVE + COMMENT "Generating ${outputname}..." + ) + + set(subtarget ".${target}-subtarget-${outputname}") + add_custom_target(${subtarget} DEPENDS ${outputpath}) + add_dependencies(${target} ${subtarget}) + endforeach() +endfunction() + +function(target_base_address target address) + set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE off) + + if(CMAKE_CXX_COMPILER_LINKER_ID MATCHES "^(LLD|MOLD)$") + target_link_options(${target} PUBLIC "LINKER:--image-base=${address}") + else() + target_link_options(${target} PUBLIC "LINKER:-Ttext-segment,${address}") + endif() +endfunction() + + option(WITH_RPCSX "Enable RPCSX" ON) option(WITH_RPCS3 "Enable RPCS3" OFF) option(WITH_RPCS3_QT_UI "Enable RPCS3 UI" OFF) @@ -138,52 +268,7 @@ target_compile_definitions(rx PRIVATE if (WITH_RPCSX) find_package(nlohmann_json CONFIG) - - function(add_precompiled_vulkan_spirv target) - add_library(${target} INTERFACE) - set(SPIRV_GEN_ROOT_DIR "spirv-gen/include/") - set(SPIRV_GEN_DIR "${SPIRV_GEN_ROOT_DIR}/shaders") - - cmake_path(ABSOLUTE_PATH SPIRV_GEN_ROOT_DIR BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} NORMALIZE OUTPUT_VARIABLE outputrootdir) - cmake_path(ABSOLUTE_PATH SPIRV_GEN_DIR BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} NORMALIZE OUTPUT_VARIABLE outputdir) - file(MAKE_DIRECTORY ${outputrootdir}) - file(MAKE_DIRECTORY ${outputdir}) - target_include_directories(${target} INTERFACE ${outputrootdir}) - - foreach(input IN LISTS ARGN) - cmake_path(GET input FILENAME inputname) - cmake_path(REPLACE_EXTENSION inputname LAST_ONLY .h OUTPUT_VARIABLE outputname) - cmake_path(APPEND outputdir ${outputname} OUTPUT_VARIABLE outputpath) - cmake_path(REMOVE_EXTENSION inputname LAST_ONLY OUTPUT_VARIABLE varname) - - string(REPLACE "." "_" varname ${varname}) - string(PREPEND varname "spirv_") - - add_custom_command( - OUTPUT ${outputpath} - COMMAND $ -V --target-env vulkan1.2 --vn "${varname}" -o "${outputpath}" "${CMAKE_CURRENT_SOURCE_DIR}/${input}" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${input}" glslang::glslang-standalone - COMMENT "Generating ${outputname}..." - ) - - set(subtarget ".${target}-subtarget-${outputname}") - add_custom_target(${subtarget} DEPENDS ${outputpath}) - add_dependencies(${target} ${subtarget}) - endforeach() - endfunction() - - function(target_base_address target address) - set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE off) - - if(CMAKE_CXX_COMPILER_LINKER_ID MATCHES "^(LLD|MOLD)$") - target_link_options(${target} PUBLIC "LINKER:--image-base=${address}") - else() - target_link_options(${target} PUBLIC "LINKER:-Ttext-segment,${address}") - endif() - endfunction() - add_subdirectory(tools) - add_subdirectory(orbis-kernel) endif() diff --git a/rpcsx/gpu/lib/gcn-shader/CMakeLists.txt b/rpcsx/gpu/lib/gcn-shader/CMakeLists.txt index 9fd9e65ef..606664be3 100644 --- a/rpcsx/gpu/lib/gcn-shader/CMakeLists.txt +++ b/rpcsx/gpu/lib/gcn-shader/CMakeLists.txt @@ -1,9 +1,11 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/dialect/) +import_native_executable_target(spv-gen) + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/dialect/spv.hpp - COMMAND $ ${CMAKE_CURRENT_BINARY_DIR}/include/dialect/spv.hpp - DEPENDS spv-gen + COMMAND ${spv-gen_BINARY_PATH} ${CMAKE_CURRENT_BINARY_DIR}/include/dialect/spv.hpp + DEPENDS spv-gen_NATIVE WORKING_DIRECTORY $/spirv/unified1 COMMENT "Generating ${CMAKE_CURRENT_BINARY_DIR}/include/dialect/spv.hpp..." ) diff --git a/rpcsx/gpu/lib/gcn-shader/shaders/CMakeLists.txt b/rpcsx/gpu/lib/gcn-shader/shaders/CMakeLists.txt index eaba8c3e2..07a4383af 100644 --- a/rpcsx/gpu/lib/gcn-shader/shaders/CMakeLists.txt +++ b/rpcsx/gpu/lib/gcn-shader/shaders/CMakeLists.txt @@ -5,10 +5,12 @@ set(OUTPUT_FILE ${OUTPUT_DIRECTORY}/${OUTPUT_FILENAME}) set(INPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/rdna.glsl) file(MAKE_DIRECTORY ${OUTPUT_DIRECTORY}) +import_native_executable_target(shader-tool) + add_custom_command( OUTPUT ${OUTPUT_FILE} - COMMAND $ --output-type spirv-header --output-var-name g_rdna_semantic_spirv -i ${INPUT_FILE} -o ${OUTPUT_FILE} - DEPENDS shader-tool ${INPUT_FILE} + COMMAND ${shader-tool_BINARY_PATH} --output-type spirv-header --output-var-name g_rdna_semantic_spirv -i ${INPUT_FILE} -o ${OUTPUT_FILE} + DEPENDS shader-tool_NATIVE ${INPUT_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating ${OUTPUT_FILE}..." )