diff --git a/3rdparty/zstd/CMakeLists.txt b/3rdparty/zstd/CMakeLists.txt index b866f1d2b6..05d9198c03 100644 --- a/3rdparty/zstd/CMakeLists.txt +++ b/3rdparty/zstd/CMakeLists.txt @@ -28,7 +28,7 @@ add_library(pcsx2-zstd zstd/lib/decompress/zstd_decompress.c ) -if(NOT MSVC AND ${PCSX2_TARGET_ARCHITECTURES} MATCHES "x86_64") +if(_M_X86 AND (NOT MSVC OR USE_CLANG_CL)) target_sources(pcsx2-zstd PRIVATE zstd/lib/decompress/huf_decompress_amd64.S) endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index af92cc90b2..b7e20868dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ # Setting it to a range tells it that it supports the features on the newer # versions as well, avoiding setting policies. -cmake_minimum_required(VERSION 3.16...3.24) +cmake_minimum_required(VERSION 3.16...3.25) -#Enabling this cmake policy gets rid of warnings regarding LTO. +# Enabling this cmake policy gets rid of warnings regarding LTO. cmake_policy(SET CMP0069 NEW) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) @@ -11,7 +11,7 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) endif() # Project Name -project(Pcsx2) +project(Pcsx2 C CXX) # Variable to check that people use the good file set(TOP_CMAKE_WAS_SOURCED TRUE) @@ -30,14 +30,11 @@ endif() include(Pcsx2Utils) check_no_parenthesis_in_path() -detectOperatingSystem() -check_compiler_version("7.0" "7.0") +detect_operating_system() +detect_compiler() #------------------------------------------------------------------------------- # Include specific module -# GNUInstallDirs must be done before BuildParameters -include(GNUInstallDirs) -# BuildParameters Must be done before SearchForStuff include(BuildParameters) include(SearchForStuff) diff --git a/CMakePresets.json b/CMakePresets.json index e98ec1fc0f..b6a6267427 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -6,13 +6,6 @@ "patch": 0 }, "configurePresets": [ - { - "name": "gcc-base", - "displayName": "GCC Base", - "description": "Base preset for GCC. Only for inheriting from.", - "hidden": true, - "binaryDir": "${sourceDir}/build" - }, { "name": "clang-base", "displayName": "Base", @@ -32,69 +25,9 @@ "name": "ninja-multi", "displayName": "Ninja Multi Config", "description": "Generate multiple ninja build files.", - "inherits": "gcc-base", + "inherits": "clang-base", "generator": "Ninja Multi-Config" }, - { - "name": "gcc-debug", - "displayName": "GCC Debug", - "description": "GCC Debug build with make.", - "inherits": "gcc-base", - "generator": "Unix Makefiles", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, - { - "name": "gcc-devel", - "displayName": "GCC Devel", - "description": "GCC Developer build using make.", - "inherits": "gcc-base", - "generator": "Unix Makefiles", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Devel" - } - }, - { - "name": "gcc-release", - "displayName": "GCC Release", - "description": "GCC Release build using make.", - "inherits": "gcc-base", - "generator": "Unix Makefiles", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" - } - }, - { - "name": "gcc-debug-ninja", - "displayName": "GCC Debug Ninja", - "description": "Debug build using ninja.", - "inherits": "gcc-base", - "generator": "Ninja", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, - { - "name": "gcc-devel-ninja", - "displayName": "GCC Devel Ninja", - "description": "GCC Developer build using ninja.", - "inherits": "gcc-base", - "generator": "Ninja", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Devel" - } - }, - { - "name": "gcc-release-ninja", - "displayName": "GCC Release Ninja", - "description": "GCC Release build using ninja.", - "inherits": "gcc-base", - "generator": "Ninja", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" - } - }, { "name": "clang-debug", "displayName": "Clang Debug", diff --git a/cmake/BuildParameters.cmake b/cmake/BuildParameters.cmake index 49382cc59e..94d3baae10 100644 --- a/cmake/BuildParameters.cmake +++ b/cmake/BuildParameters.cmake @@ -38,21 +38,6 @@ endif() #------------------------------------------------------------------------------- option(USE_ASAN "Enable address sanitizer") -if(MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(USE_CLANG_CL TRUE) - message(STATUS "Building with Clang-CL.") -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - set(USE_CLANG TRUE) - message(STATUS "Building with Clang/LLVM.") -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(USE_GCC TRUE) - message(STATUS "Building with GNU GCC") -elseif(MSVC) - message(STATUS "Building with MSVC") -else() - message(FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}") -endif() - #------------------------------------------------------------------------------- # if no build type is set, use Devel as default # Note without the CMAKE_BUILD_TYPE options the value is still defined to "" @@ -81,52 +66,38 @@ mark_as_advanced(CMAKE_C_FLAGS_DEVEL CMAKE_CXX_FLAGS_DEVEL CMAKE_LINKER_FLAGS_DE #------------------------------------------------------------------------------- # Select the architecture #------------------------------------------------------------------------------- -option(DISABLE_ADVANCE_SIMD "Disable advance use of SIMD (SSE2+ & AVX)" OFF) +if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "amd64" OR + "${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64") + # Multi-ISA only exists on x86. + option(DISABLE_ADVANCE_SIMD "Disable advance use of SIMD (SSE2+ & AVX)" OFF) -# Print if we are cross compiling. -if(CMAKE_CROSSCOMPILING) - message(STATUS "Cross compilation is enabled.") -else() - message(STATUS "Cross compilation is disabled.") -endif() - -# Architecture bitness detection -include(TargetArch) -target_architecture(PCSX2_TARGET_ARCHITECTURES) -if(${PCSX2_TARGET_ARCHITECTURES} MATCHES "x86_64") - message(STATUS "Compiling a ${PCSX2_TARGET_ARCHITECTURES} build on a ${CMAKE_HOST_SYSTEM_PROCESSOR} host.") - - # x86_64 requires -fPIC - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - - if(NOT DEFINED ARCH_FLAG AND NOT MSVC) - if (DISABLE_ADVANCE_SIMD) - set(ARCH_FLAG "-msse -msse2 -msse4.1 -mfxsr") - else() - #set(ARCH_FLAG "-march=native -fabi-version=6") - set(ARCH_FLAG "-march=native") - endif() - elseif(NOT DEFINED ARCH_FLAG AND USE_CLANG_CL) - set(ARCH_FLAG "-msse4.1") - endif() list(APPEND PCSX2_DEFS _M_X86=1) - set(_M_X86 1) + set(_M_X86 TRUE) + if(DISABLE_ADVANCE_SIMD) + message(STATUS "Building for x86-64 (Multi-ISA).") + else() + message(STATUS "Building for x86-64.") + endif() - # SSE4.1 is not set by MSVC, it uses _M_SSE instead. if(MSVC) + # SSE4.1 is not set by MSVC, it uses _M_SSE instead. list(APPEND PCSX2_DEFS __SSE4_1__=1) + + if(USE_CLANG_CL) + # clang-cl => need to explicitly enable SSE4.1. + add_compile_options("-msse4.1") + endif() + else() + # Multi-ISA => SSE4, otherwise native. + if (DISABLE_ADVANCE_SIMD) + add_compile_options("-msse" "-msse2" "-msse4.1" "-mfxsr") + else() + add_compile_options("-march=native") + endif() endif() else() - message(FATAL_ERROR "Unsupported architecture: ${PCSX2_TARGET_ARCHITECTURES}") + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}") endif() -string(REPLACE " " ";" ARCH_FLAG_LIST "${ARCH_FLAG}") -add_compile_options("${ARCH_FLAG_LIST}") - -#------------------------------------------------------------------------------- -# Set some default compiler flags -#------------------------------------------------------------------------------- -option(USE_PGO_GENERATE "Enable PGO optimization (generate profile)") -option(USE_PGO_OPTIMIZE "Enable PGO optimization (use profile)") # Require C++20. set(CMAKE_CXX_STANDARD 20) @@ -183,7 +154,7 @@ endif() # Enable debug information in release builds for Linux. # Makes the backtrace actually meaningful. -if(UNIX AND NOT APPLE) +if(LINUX) add_compile_options($<$:-g1>) endif() diff --git a/cmake/FindLibc.cmake b/cmake/FindLibc.cmake deleted file mode 100644 index d081fa326f..0000000000 --- a/cmake/FindLibc.cmake +++ /dev/null @@ -1,32 +0,0 @@ -# Once done, this will define -# -# LIBC_FOUND - system has libc -# LIBC_LIBRARIES - link these to use libc - -if(LIBC_LIBRARIES) - set(LIBC_FIND_QUIETLY TRUE) -endif(LIBC_LIBRARIES) - -find_library(libm NAMES m) - -# OSX doesn't have rt. On Linux timer and aio dependency. -if(APPLE) - find_library(libdl NAMES dl) - set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) -elseif(Linux) - find_library(libdl NAMES dl) - find_library(librt NAMES rt) - set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) -else() - # FreeBSD doesn't have libdl - find_library(librt NAMES rt) - set(LIBC_LIBRARIES ${librt} ${libm}) -endif() - -# handle the QUIETLY and REQUIRED arguments and set LIBC_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libc DEFAULT_MSG LIBC_LIBRARIES) - -mark_as_advanced(LIBC_LIBRARIES) - diff --git a/cmake/Pcsx2Utils.cmake b/cmake/Pcsx2Utils.cmake index 1e32097a9c..b1ba16a36e 100644 --- a/cmake/Pcsx2Utils.cmake +++ b/cmake/Pcsx2Utils.cmake @@ -1,38 +1,36 @@ -#------------------------------------------------------------------------------- -# detectOperatingSystem -#------------------------------------------------------------------------------- -# This function detects on which OS cmake is run and set a flag to control the -# build process. Supported OS: Linux, MacOSX, Windows -# -# On linux, it also set a flag for specific distribution (ie Fedora) -#------------------------------------------------------------------------------- -function(detectOperatingSystem) +function(detect_operating_system) + # LINUX wasn't added until CMake 3.25. + if (CMAKE_VERSION VERSION_LESS 3.25.0 AND CMAKE_SYSTEM_NAME MATCHES "Linux") + set(LINUX TRUE PARENT_SCOPE) + endif() + if(WIN32) - set(Windows TRUE PARENT_SCOPE) - elseif(UNIX AND APPLE) - if(IOS) - message(WARNING "iOS isn't supported, the build will most likely fail") - endif() - set(MacOSX TRUE PARENT_SCOPE) - elseif(UNIX) - if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(Linux TRUE PARENT_SCOPE) - if (EXISTS /etc/os-release) - # Read the file without CR character - file(STRINGS /etc/os-release OS_RELEASE) - if("${OS_RELEASE}" MATCHES "^.*ID=fedora.*$") - set(Fedora TRUE PARENT_SCOPE) - message(STATUS "Build Fedora specific") - elseif("${OS_RELEASE}" MATCHES "^.*ID=.*suse.*$") - set(openSUSE TRUE PARENT_SCOPE) - message(STATUS "Build openSUSE specific") - endif() - endif() - elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") - set(kFreeBSD TRUE PARENT_SCOPE) - elseif(CMAKE_SYSTEM_NAME STREQUAL "GNU") - set(GNU TRUE PARENT_SCOPE) - endif() + message(STATUS "Building for Windows.") + elseif(APPLE AND NOT IOS) + message(STATUS "Building for MacOS.") + elseif(LINUX) + message(STATUS "Building for Linux.") + elseif(BSD) + message(STATUS "Building for *BSD.") + else() + message(FATAL_ERROR "Unsupported platform.") + endif() +endfunction() + +function(detect_compiler) + if(MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(USE_CLANG_CL TRUE PARENT_SCOPE) + message(STATUS "Building with Clang-CL.") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set(USE_CLANG TRUE PARENT_SCOPE) + message(STATUS "Building with Clang/LLVM.") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(USE_GCC TRUE PARENT_SCOPE) + message(STATUS "Building with GNU GCC. THIS IS NOT A SUPPORTED CONFIGURATION.") + elseif(MSVC) + message(STATUS "Building with MSVC.") + else() + message(FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}") endif() endfunction() @@ -119,24 +117,6 @@ function(write_svnrev_h) endif() endfunction() -function(check_compiler_version version_warn version_err) - if(CMAKE_COMPILER_IS_GNUCXX) - execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) - string(STRIP "${GCC_VERSION}" GCC_VERSION) - if(GCC_VERSION VERSION_LESS ${version_err}) - message(FATAL_ERROR "PCSX2 doesn't support your old GCC ${GCC_VERSION}! Please upgrade it! - - The minimum supported version is ${version_err} but ${version_warn} is warmly recommended") - else() - if(GCC_VERSION VERSION_LESS ${version_warn}) - message(WARNING "PCSX2 will stop supporting GCC ${GCC_VERSION} in the near future. Please upgrade to at least GCC ${version_warn}.") - endif() - endif() - - set(GCC_VERSION "${GCC_VERSION}" PARENT_SCOPE) - endif() -endfunction() - function(check_no_parenthesis_in_path) if ("${CMAKE_BINARY_DIR}" MATCHES "[()]" OR "${CMAKE_SOURCE_DIR}" MATCHES "[()]") message(FATAL_ERROR "Your path contains some parenthesis. Unfortunately Cmake doesn't support them correctly.\nPlease rename your directory to avoid '(' and ')' characters\n") @@ -163,25 +143,6 @@ function(alias_library new old) add_library(${new} ALIAS _alias_${library_no_namespace}) endfunction() -# Helper macro to generate resources on linux (based on glib) -macro(add_custom_glib_res out xml prefix) - set(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res") - set(RESOURCE_FILES "${ARGN}") - # Note: trying to combine --generate-source and --generate-header doesn't work. - # It outputs whichever one comes last into the file named by the first - add_custom_command( - OUTPUT ${out}.h - COMMAND glib-compile-resources --sourcedir "${RESOURCE_DIR}" --generate-header - --c-name ${prefix} "${RESOURCE_DIR}/${xml}" --target=${out}.h - DEPENDS res/${xml} ${RESOURCE_FILES}) - - add_custom_command( - OUTPUT ${out}.cpp - COMMAND glib-compile-resources --sourcedir "${RESOURCE_DIR}" --generate-source - --c-name ${prefix} "${RESOURCE_DIR}/${xml}" --target=${out}.cpp - DEPENDS res/${xml} ${RESOURCE_FILES}) -endmacro() - function(source_groups_from_vcxproj_filters file) file(READ "${file}" filecontent) get_filename_component(parent "${file}" DIRECTORY) diff --git a/cmake/SearchForStuff.cmake b/cmake/SearchForStuff.cmake index f81fe46ffb..a8d98fdf67 100644 --- a/cmake/SearchForStuff.cmake +++ b/cmake/SearchForStuff.cmake @@ -48,9 +48,6 @@ else() find_package(ZLIB REQUIRED) - ## Use pcsx2 package to find module - include(FindLibc) - ## Use CheckLib package to find module include(CheckLib) @@ -59,7 +56,7 @@ else() check_lib(EGL EGL EGL/egl.h) endif() - if(Linux) + if(LINUX) check_lib(AIO aio libaio.h) # There are two udev pkg config files - udev.pc (wrong), libudev.pc (correct) # When cross compiling, pkg-config will be skipped so we have to look for @@ -95,7 +92,7 @@ endif(WIN32) find_package(Threads REQUIRED) # Also need SDL2. -find_package(SDL2 2.28.4 REQUIRED) +find_package(SDL2 2.28.5 REQUIRED) set(ACTUALLY_ENABLE_TESTS ${ENABLE_TESTS}) if(ENABLE_TESTS) @@ -105,19 +102,6 @@ if(ENABLE_TESTS) endif() endif() -if(GCC_VERSION VERSION_GREATER_EQUAL "9.0" AND GCC_VERSION VERSION_LESS "9.2") - message(WARNING " - It looks like you are compiling with 9.0.x or 9.1.x. Using these versions is not recommended, - as there is a bug known to cause the compiler to segfault while compiling. See patch - https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=275ab714637a64672c6630cfd744af2c70957d5a - Even with that patch, compiling with LTO may still segfault. Use at your own risk! - This text being in a compile log in an open issue may cause it to be closed.") -endif() - -# Prevent fmt from being built with exceptions, or being thrown at call sites. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFMT_EXCEPTIONS=0") - -add_subdirectory(3rdparty/fmt/fmt EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/rapidyaml/rapidyaml EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/lzma EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/libchdr EXCLUDE_FROM_ALL) @@ -169,6 +153,10 @@ endif() # Demangler for the debugger add_subdirectory(3rdparty/demangler EXCLUDE_FROM_ALL) +# Prevent fmt from being built with exceptions, or being thrown at call sites. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFMT_EXCEPTIONS=0") +add_subdirectory(3rdparty/fmt/fmt EXCLUDE_FROM_ALL) + # Deliberately at the end. We don't want to set the flag on third-party projects. if(MSVC) # Don't warn about "deprecated" POSIX functions. diff --git a/cmake/TargetArch.cmake b/cmake/TargetArch.cmake deleted file mode 100644 index 442bc81c34..0000000000 --- a/cmake/TargetArch.cmake +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright (c) 2014 PCSX2 Dev Team -# Copyright (c) 2012 Petroules Corporation. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake -# -# Based on the Qt 5 processor detection code, so should be very accurate -# https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h -# Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64) - -# Regarding POWER/PowerPC, just as is noted in the Qt source, -# "There are many more known variants/revisions that we do not handle/detect." - -set(archdetect_c_code " -#if defined(__arm__) || defined(__TARGET_ARCH_ARM) - #if defined(__ARM_ARCH_7__) \\ - || defined(__ARM_ARCH_7A__) \\ - || defined(__ARM_ARCH_7R__) \\ - || defined(__ARM_ARCH_7M__) \\ - || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) - #error cmake_ARCH armv7 - #elif defined(__ARM_ARCH_6__) \\ - || defined(__ARM_ARCH_6J__) \\ - || defined(__ARM_ARCH_6T2__) \\ - || defined(__ARM_ARCH_6Z__) \\ - || defined(__ARM_ARCH_6K__) \\ - || defined(__ARM_ARCH_6ZK__) \\ - || defined(__ARM_ARCH_6M__) \\ - || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) - #error cmake_ARCH armv6 - #elif defined(__ARM_ARCH_5TEJ__) \\ - || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) - #error cmake_ARCH armv5 - #else - #error cmake_ARCH arm - #endif -#elif defined(__i386) || defined(__i386__) || defined(_M_IX86) - #error cmake_ARCH i386 -#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) - #error cmake_ARCH x86_64 -#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) - #error cmake_ARCH ia64 -#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ - || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ - || defined(_M_MPPC) || defined(_M_PPC) - #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) - #error cmake_ARCH ppc64 - #else - #error cmake_ARCH ppc - #endif -#endif - -#error cmake_ARCH unknown -") - -# Set ppc_support to TRUE before including this file or ppc and ppc64 -# will be treated as invalid architectures since they are no longer supported by Apple - -function(target_architecture output_var) - if(APPLE AND CMAKE_OSX_ARCHITECTURES) - # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set - # First let's normalize the order of the values - - # Note that it's not possible to compile PowerPC applications if you are using - # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we - # disable it by default - # See this page for more information: - # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4 - - # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime. - # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. - - LIST(LENGTH CMAKE_OSX_ARCHITECTURES osx_arch_num) - if(NOT (osx_arch_num EQUAL 1)) - message(FATAL_ERROR "Currently ${CMAKE_PROJECT_NAME} does not support multiple architectures in CMAKE_OSX_ARCHITECTURES") - endif() - - foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) - if("${osx_arch}" STREQUAL "ppc" AND ppc_support) - set(osx_arch_ppc TRUE) - elseif("${osx_arch}" STREQUAL "i386") - set(osx_arch_i386 TRUE) - elseif("${osx_arch}" STREQUAL "x86_64") - set(osx_arch_x86_64 TRUE) - elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support) - set(osx_arch_ppc64 TRUE) - else() - message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") - endif() - endforeach() - - # Now add all the architectures in our normalized order - if(osx_arch_ppc) - list(APPEND ARCH ppc) - endif() - - if(osx_arch_i386) - list(APPEND ARCH i386) - endif() - - if(osx_arch_x86_64) - list(APPEND ARCH x86_64) - endif() - - if(osx_arch_ppc64) - list(APPEND ARCH ppc64) - endif() - - LIST(LENGTH ARCH osx_arch_num) - if(osx_arch_num LESS 1) - message(FATAL_ERROR "Invalid CMAKE_OSX_ARCHITECTURES: ${CMAKE_OSX_ARCHITECTURES}") - endif() - else() - file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}") - - enable_language(C) - - # Detect the architecture in a rather creative way... - # This compiles a small C program which is a series of ifdefs that selects a - # particular #error preprocessor directive whose message string contains the - # target architecture. The program will always fail to compile (both because - # file is not a valid C program, and obviously because of the presence of the - # #error preprocessor directives... but by exploiting the preprocessor in this - # way, we can detect the correct target architecture even when cross-compiling, - # since the program itself never needs to be run (only the compiler/preprocessor) - try_run( - run_result_unused - compile_result_unused - "${CMAKE_BINARY_DIR}" - "${CMAKE_BINARY_DIR}/arch.c" - COMPILE_OUTPUT_VARIABLE ARCH - CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} - ) - - # Parse the architecture name from the compiler output - string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") - - # Get rid of the value marker leaving just the architecture name - string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") - - # If we are compiling with an unknown architecture this variable should - # already be set to "unknown" but in the case that it's empty (i.e. due - # to a typo in the code), then set it to unknown - if (NOT ARCH) - set(ARCH unknown) - endif() - endif() - - set(${output_var} "${ARCH}" PARENT_SCOPE) -endfunction() diff --git a/pcsx2/CMakeLists.txt b/pcsx2/CMakeLists.txt index 0ce7660b9e..2145838814 100644 --- a/pcsx2/CMakeLists.txt +++ b/pcsx2/CMakeLists.txt @@ -36,17 +36,6 @@ else() ) endif() -if(GCC_VERSION VERSION_EQUAL "8.0" OR GCC_VERSION VERSION_GREATER "8.0") - # gs is pretty bad at this - target_compile_options(PCSX2_FLAGS INTERFACE -Wno-packed-not-aligned -Wno-class-memaccess) -endif() - -if ("${PGO}" STREQUAL "generate") - target_compile_options(PCSX2_FLAGS INTERFACE -fprofile-generate) -elseif("${PGO}" STREQUAL "use") - target_compile_options(PCSX2_FLAGS INTERFACE -fprofile-use) -endif() - if(USE_LINKED_FFMPEG) target_compile_definitions(PCSX2_FLAGS INTERFACE USE_LINKED_FFMPEG) target_link_libraries(PCSX2_FLAGS INTERFACE FFMPEG::avcodec FFMPEG::avformat FFMPEG::avutil FFMPEG::swscale FFMPEG::swresample) @@ -697,7 +686,7 @@ if(WIN32) GS/Renderers/DX12/GSDevice12.h GS/Renderers/DX12/GSTexture12.h ) -elseif(Linux) +elseif(LINUX) list(APPEND pcsx2USBSources USB/usb-eyetoy/cam-linux.cpp ) @@ -1077,8 +1066,7 @@ target_sources(PCSX2 PRIVATE ) # platform sources -# Linux -if(Linux) +if(LINUX) target_sources(PCSX2 PRIVATE ${pcsx2LinuxSources} ${pcsx2LinuxHeaders} @@ -1090,8 +1078,7 @@ if(Linux) ) endif() -# Windows -if(Windows) +if(WIN32) target_sources(PCSX2 PRIVATE ${pcsx2WindowsSources} ) @@ -1100,8 +1087,7 @@ endif() target_sources(PCSX2 PRIVATE ${pcsx2USBSources} ${pcsx2USBHeaders}) target_link_libraries(PCSX2_FLAGS INTERFACE jpgd) -# MacOSX/BSD -if(UNIX AND NOT Linux) +if(APPLE OR BSD) if(APPLE) target_sources(PCSX2 PRIVATE ${pcsx2OSXSources})