CMake: Support multiple CMAKE_OSX_ARCHITECTURES

This commit is contained in:
Stenzek 2023-11-24 19:14:57 +10:00
parent af86e5d058
commit 7cc52bba23
No known key found for this signature in database
23 changed files with 106 additions and 82 deletions

View File

@ -368,7 +368,11 @@ jobs:
run: |
mkdir build
cd build
../scripts/make-universal-macos-binary.sh ..
export MACOSX_DEPLOYMENT_TARGET=11.0
cmake -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENGL=OFF -DCMAKE_PREFIX_PATH="$HOME/deps" -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -G Ninja ..
cmake --build . --parallel
mv bin/DuckStation.app .
codesign -s - --deep -f -v DuckStation.app
zip -r duckstation-mac-release.zip DuckStation.app/
- name: Upload macOS .app

View File

@ -135,31 +135,44 @@ endif()
# Detect processor type.
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
# Cross-compile on macos.
set(CPU_ARCH "aarch64")
if(APPLE AND NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "")
# Universal binaries.
if("x86_64" IN_LIST CMAKE_OSX_ARCHITECTURES)
set(CPU_ARCH_X64 TRUE)
message("Building x86_64 MacOS binaries.")
endif()
if("arm64" IN_LIST CMAKE_OSX_ARCHITECTURES)
set(CPU_ARCH_ARM64 TRUE)
message("Building ARM64 MacOS binaries.")
endif()
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64" OR
"${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPU_ARCH "x64")
set(CPU_ARCH_X64 TRUE)
message("Building x86_64 binaries.")
else()
# Cross-compiling 32-bit build. 32-bit hosts are not supported.
set(CPU_ARCH "x86")
set(CPU_ARCH_X86 TRUE)
message("Building x86_32 binaries [not supported].")
endif()
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
"${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
set(CPU_ARCH "x86")
set(CPU_ARCH_X86 TRUE)
message("Building x86_32 binaries [not supported].")
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm64")
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Might have an A64 kernel, e.g. Raspbian.
set(CPU_ARCH "aarch64")
set(CPU_ARCH_ARM64 TRUE)
message("Building ARM64 binaries.")
else()
set(CPU_ARCH "aarch32")
set(CPU_ARCH_ARM32 TRUE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -marm -march=armv7-a")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -marm -march=armv7-a")
message("Building ARM32 binaries on ARM64.")
endif()
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a" OR
"${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l")
set(CPU_ARCH "aarch32")
set(CPU_ARCH_ARM32 TRUE)
message("Building ARM32 binaries.")
if(ANDROID)
# Force ARM mode, since apparently ANDROID_ARM_MODE isn't working..
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -marm")
@ -171,6 +184,7 @@ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm" OR "${CMAKE_SYSTEM_PROCESSOR}"
endif()
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "riscv64")
set(CPU_ARCH "riscv64")
message("Building RISC-V 64 binaries.")
# Not done for us. Or we should inline atomics?
link_libraries("-latomic")
@ -208,7 +222,7 @@ find_package(Threads REQUIRED)
# Enable large file support on Linux 32-bit platforms.
# Android is deliberately ommitted here as it didn't support 64-bit ops on files until Android 7/N.
if((LINUX OR FREEBSD) AND (${CPU_ARCH} STREQUAL "x86" OR ${CPU_ARCH} STREQUAL "aarch32"))
if((LINUX OR FREEBSD) AND (CPU_ARCH_X86 OR CPU_ARCH_ARM32))
add_definitions("-D_FILE_OFFSET_BITS=64")
endif()

View File

@ -49,18 +49,18 @@ if(ENABLE_DISCORD_PRESENCE)
disable_compiler_warnings_for_target(discord-rpc)
endif()
if(${CPU_ARCH} STREQUAL "x64")
if(CPU_ARCH_X64)
add_subdirectory(xbyak EXCLUDE_FROM_ALL)
add_subdirectory(zydis EXCLUDE_FROM_ALL)
disable_compiler_warnings_for_target(zydis)
endif()
if(${CPU_ARCH} STREQUAL "aarch32" OR ${CPU_ARCH} STREQUAL "aarch64")
if(CPU_ARCH_ARM32 OR CPU_ARCH_ARM64)
add_subdirectory(vixl EXCLUDE_FROM_ALL)
disable_compiler_warnings_for_target(vixl)
endif()
if(${CPU_ARCH} STREQUAL "riscv64")
if(CPU_ARCH_RISCV64)
add_subdirectory(biscuit EXCLUDE_FROM_ALL)
disable_compiler_warnings_for_target(biscuit)
add_subdirectory(riscv-disas EXCLUDE_FROM_ALL)

View File

@ -33,9 +33,9 @@ target_compile_definitions(soundtouch PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options(soundtouch PRIVATE ${COMPILE_OPTIONS})
target_compile_definitions(soundtouch PUBLIC SOUNDTOUCH_FLOAT_SAMPLES ST_NO_EXCEPTION_HANDLING=1)
if("${CPU_ARCH}" STREQUAL "aarch32" OR "${CPU_ARCH}" STREQUAL "aarch64")
if(CPU_ARCH_ARM32 OR CPU_ARCH_ARM64)
target_compile_definitions(soundtouch PRIVATE SOUNDTOUCH_USE_NEON)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7.*)$")
if(CPU_ARCH_ARM32)
target_compile_options(soundtouch PRIVATE -mfpu=neon)
endif()
endif()

View File

@ -27,7 +27,7 @@ target_compile_definitions(vixl PUBLIC
VIXL_CODE_BUFFER_MALLOC
)
if(${CPU_ARCH} STREQUAL "aarch32")
if(CPU_ARCH_ARM32)
target_sources(vixl PRIVATE
include/vixl/aarch32/assembler-aarch32.h
include/vixl/aarch32/constants-aarch32.h
@ -52,7 +52,7 @@ if(${CPU_ARCH} STREQUAL "aarch32")
)
endif()
if(${CPU_ARCH} STREQUAL "aarch64")
if(CPU_ARCH_ARM64)
target_sources(vixl PRIVATE
include/vixl/aarch64/abi-aarch64.h
include/vixl/aarch64/assembler-aarch64.h

View File

@ -5,7 +5,7 @@ set(SRCS
add_library(xxhash ${SRCS})
if(${CPU_ARCH} STREQUAL "x86" OR ${CPU_ARCH} STREQUAL "x64")
if(CPU_ARCH_X86 OR CPU_ARCH_X64)
# Required if building with -mavx or -march=native, but you shouldn't be building with it.
target_compile_definitions(xxhash PRIVATE "XXH_X86DISPATCH_ALLOW_AVX")
target_sources(xxhash PRIVATE

View File

@ -52,9 +52,7 @@
extern "C" {
#endif
#if !(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64))
# error "Dispatching is currently only supported on x86 and x86_64."
#endif
#if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
/*!
* @def XXH_X86DISPATCH_ALLOW_AVX
@ -764,6 +762,8 @@ XXH3_128bits_update_dispatch(XXH3_state_t* state, const void* input, size_t len)
return XXH_g_dispatch128.update(state, (const xxh_u8*)input, len);
}
#endif // defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
#if defined (__cplusplus)
}
#endif

View File

@ -28,7 +28,7 @@ add_library(zstd
lib/decompress/zstd_decompress.c
)
if(NOT MSVC AND CPU_ARCH STREQUAL "x64")
if(NOT MSVC AND CPU_ARCH_X64)
target_sources(zstd PRIVATE lib/decompress/huf_decompress_amd64.S)
endif()

View File

@ -44,7 +44,7 @@ extern "C" {
/* Enums and types */
/* ============================================================================================== */
#if !(defined(ZYAN_AARCH64) && defined(ZYAN_APPLE))
#if !(defined(ZYAN_APPLE))
# pragma pack(push, 1)
#endif
@ -68,7 +68,7 @@ typedef struct ZydisShortString_
ZyanU8 size;
} ZydisShortString;
#if !(defined(ZYAN_AARCH64) && defined(ZYAN_APPLE))
#if !(defined(ZYAN_APPLE))
# pragma pack(pop)
#endif

View File

@ -1,48 +0,0 @@
#!/bin/sh
set -e
DEPS=$HOME/deps
if [ "$#" -ne 1 ]; then
echo "Syntax: $0 <path to source directory>"
exit 1
fi
# no realpath...
SOURCEDIR="$1"
echo "Build x64..."
mkdir build-x64
cd build-x64
export MACOSX_DEPLOYMENT_TARGET=11.0
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENGL=OFF -DCMAKE_PREFIX_PATH="$DEPS" -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -G Ninja "../$SOURCEDIR"
cmake --build . --parallel
cd ..
echo "Build arm64..."
mkdir build-arm64
cd build-arm64
export MACOSX_DEPLOYMENT_TARGET=11.00
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENGL=OFF -DCMAKE_PREFIX_PATH="$DEPS" -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -G Ninja "../$SOURCEDIR"
cmake --build . --parallel
cd ..
echo "Combine binary..."
unset MACOSX_DEPLOYMENT_TARGET
BINPATH=bin/DuckStation.app/Contents/MacOS/DuckStation
UPDATERPATH=bin/DuckStation.app/Contents/Resources/Updater.app/Contents/MacOS/Updater
lipo -create "build-x64/$BINPATH" "build-arm64/$BINPATH" -o "build-x64/$BINPATH"
lipo -create "build-x64/$UPDATERPATH" "build-arm64/$UPDATERPATH" -o "build-x64/$UPDATERPATH"
# For some reason, the svg image format plugin doesn't get included in combined builds...
if [ -f $HOME/deps/plugins/imageformats/libqsvg.dylib ]; then
cp -v -n $HOME/deps/plugins/imageformats/libqsvg.dylib build-x64/bin/DuckStation.app/Contents/PlugIns/imageformats
fi
echo "Grab app..."
mv build-x64/bin/DuckStation.app .
rm -fr build-x64 build-arm64
echo "Sign binary with self-signed cert..."
codesign -s - --deep -f -v DuckStation.app

View File

@ -133,16 +133,20 @@ target_include_directories(core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
target_link_libraries(core PUBLIC Threads::Threads common util zlib)
target_link_libraries(core PRIVATE stb xxhash imgui rapidjson rcheevos)
if(${CPU_ARCH} STREQUAL "x64")
if(CPU_ARCH_X64)
target_compile_definitions(core PUBLIC "ENABLE_RECOMPILER=1" "ENABLE_NEWREC=1" "ENABLE_MMAP_FASTMEM=1")
target_sources(core PRIVATE ${RECOMPILER_SRCS} ${NEWREC_SOURCES}
cpu_recompiler_code_generator_x64.cpp
cpu_newrec_compiler_x64.cpp
cpu_newrec_compiler_x64.h
)
target_link_libraries(core PRIVATE xbyak zydis)
target_link_libraries(core PRIVATE xbyak)
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
target_link_libraries(core PRIVATE zydis)
endif()
message("Building x64 recompiler")
elseif(${CPU_ARCH} STREQUAL "aarch32")
endif()
if(CPU_ARCH_ARM32)
target_compile_definitions(core PUBLIC "ENABLE_RECOMPILER=1" "ENABLE_NEWREC=1")
target_sources(core PRIVATE ${RECOMPILER_SRCS} ${NEWREC_SOURCES}
cpu_recompiler_code_generator_aarch32.cpp
@ -151,7 +155,8 @@ elseif(${CPU_ARCH} STREQUAL "aarch32")
)
target_link_libraries(core PUBLIC vixl)
message("Building AArch32 recompiler")
elseif(${CPU_ARCH} STREQUAL "aarch64")
endif()
if(CPU_ARCH_ARM64)
target_compile_definitions(core PUBLIC "ENABLE_RECOMPILER=1" "ENABLE_NEWREC=1" "ENABLE_MMAP_FASTMEM=1")
target_sources(core PRIVATE ${RECOMPILER_SRCS} ${NEWREC_SOURCES}
cpu_recompiler_code_generator_aarch64.cpp
@ -160,7 +165,8 @@ elseif(${CPU_ARCH} STREQUAL "aarch64")
)
target_link_libraries(core PUBLIC vixl)
message("Building AArch64 recompiler")
elseif(${CPU_ARCH} STREQUAL "riscv64")
endif()
if(CPU_ARCH_RISCV64)
target_compile_definitions(core PUBLIC "ENABLE_NEWREC=1" "ENABLE_MMAP_FASTMEM=1")
target_sources(core PRIVATE ${NEWREC_SOURCES}
cpu_newrec_compiler_riscv64.cpp
@ -168,8 +174,6 @@ elseif(${CPU_ARCH} STREQUAL "riscv64")
)
target_link_libraries(core PUBLIC biscuit::biscuit riscv-disas)
message("Building RISC-V 64-bit recompiler")
else()
message("Not building recompiler")
endif()
if(ENABLE_DISCORD_PRESENCE)

View File

@ -14,6 +14,9 @@
#include "settings.h"
#include "timing_event.h"
#include <limits>
#ifdef CPU_ARCH_ARM32
Log_SetChannel(CPU::NewRec);
#define PTR(x) vixl::aarch32::MemOperand(RSTATE, (((u8*)(x)) - ((u8*)&g_state)))
@ -2260,3 +2263,5 @@ u32 CPU::NewRec::CompileLoadStoreThunk(void* thunk_code, u32 thunk_space, void*
return static_cast<u32>(armAsm->GetCursorOffset());
}
#endif // CPU_ARCH_ARM32

View File

@ -2,9 +2,12 @@
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
#pragma once
#include "cpu_newrec_compiler.h"
#include <memory>
#ifdef CPU_ARCH_ARM32
#include "vixl/aarch32/assembler-aarch32.h"
#include "vixl/aarch32/operands-aarch32.h"
@ -162,3 +165,5 @@ private:
};
} // namespace CPU::NewRec
#endif // CPU_ARCH_ARM32

View File

@ -14,6 +14,9 @@
#include "settings.h"
#include "timing_event.h"
#include <limits>
#ifdef CPU_ARCH_ARM64
Log_SetChannel(CPU::NewRec);
#define PTR(x) vixl::aarch64::MemOperand(RSTATE, (((u8*)(x)) - ((u8*)&g_state)))
@ -2248,3 +2251,5 @@ u32 CPU::NewRec::CompileLoadStoreThunk(void* thunk_code, u32 thunk_space, void*
return static_cast<u32>(armAsm->GetCursorOffset());
}
#endif // CPU_ARCH_ARM64

View File

@ -5,6 +5,8 @@
#include "cpu_newrec_compiler.h"
#include <memory>
#ifdef CPU_ARCH_ARM64
#include "vixl/aarch64/assembler-aarch64.h"
namespace CPU::NewRec {
@ -163,3 +165,5 @@ private:
};
} // namespace CPU::NewRec
#endif // CPU_ARCH_ARM64

View File

@ -13,6 +13,9 @@
#include "settings.h"
#include "timing_event.h"
#include <limits>
#ifdef CPU_ARCH_RISCV64
Log_SetChannel(CPU::NewRec);
#ifdef ENABLE_HOST_DISASSEMBLY
@ -2480,3 +2483,5 @@ u32 CPU::NewRec::CompileLoadStoreThunk(void* thunk_code, u32 thunk_space, void*
return static_cast<u32>(rvAsm->GetCodeBuffer().GetSizeInBytes());
}
#endif // CPU_ARCH_RISCV64

View File

@ -5,6 +5,8 @@
#include "cpu_newrec_compiler.h"
#include <memory>
#ifdef CPU_ARCH_RISCV64
namespace CPU::NewRec {
class RISCV64Compiler final : public Compiler
@ -168,3 +170,5 @@ private:
};
} // namespace CPU::NewRec
#endif // CPU_ARCH_RISCV64

View File

@ -15,6 +15,9 @@
#include "settings.h"
#include "timing_event.h"
#include <limits>
#ifdef CPU_ARCH_X64
Log_SetChannel(CPU::NewRec);
#define RMEMBASE cg->rbx
@ -2223,3 +2226,5 @@ u32 CPU::NewRec::CompileLoadStoreThunk(void* thunk_code, u32 thunk_space, void*
return static_cast<u32>(cg->getSize());
}
#endif // CPU_ARCH_X64

View File

@ -3,9 +3,10 @@
#pragma once
#include "cpu_newrec_compiler.h"
#include <initializer_list>
#include <memory>
#ifdef CPU_ARCH_X64
namespace CPU::NewRec {
class X64Compiler final : public Compiler
@ -139,3 +140,5 @@ private:
};
} // namespace CPU::NewRec
#endif // CPU_ARCH_X64

View File

@ -12,6 +12,9 @@
#include "cpu_recompiler_thunks.h"
#include "settings.h"
#include "timing_event.h"
#ifdef CPU_ARCH_ARM32
Log_SetChannel(CPU::Recompiler);
#ifdef ENABLE_HOST_DISASSEMBLY
@ -2301,3 +2304,5 @@ void CodeGenerator::EmitLoadGlobalAddress(HostReg host_reg, const void* ptr)
}
} // namespace CPU::Recompiler
#endif // CPU_ARCH_ARM32

View File

@ -11,6 +11,9 @@
#include "cpu_recompiler_thunks.h"
#include "settings.h"
#include "timing_event.h"
#ifdef CPU_ARCH_ARM64
Log_SetChannel(CPU::Recompiler);
#ifdef ENABLE_HOST_DISASSEMBLY
@ -2592,3 +2595,5 @@ void CodeGenerator::EmitLoadGlobalAddress(HostReg host_reg, const void* ptr)
}
} // namespace CPU::Recompiler
#endif // CPU_ARCH_ARM64

View File

@ -13,6 +13,8 @@
#include "common/assert.h"
#include "common/log.h"
#ifdef CPU_ARCH_X64
Log_SetChannel(Recompiler::CodeGenerator);
#ifdef ENABLE_HOST_DISASSEMBLY
@ -3207,3 +3209,5 @@ void CodeGenerator::EmitLoadGlobalAddress(HostReg host_reg, const void* ptr)
m_emit->mov(GetHostReg64(host_reg), reinterpret_cast<size_t>(ptr));
}
} // namespace CPU::Recompiler
#endif // CPU_ARCH_X64

View File

@ -34,7 +34,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>NSHumanReadableCopyright</key>
<string>Licensed under GPL version 3</string>
<string>2019-2023 Connor McLaughlin &lt;stenzek@gmail.com&gt;</string>
<key>LSMinimumSystemVersion</key>
<string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
<key>NSHighResolutionCapable</key>