2019-04-12 20:59:39 +00:00
## config module
#
# get luserx0 to doc this shit or something, vars in all caps are to be exported as defs if they aren't in build.h already
# handle options for FEAT per platform, so rec isn't built for targets w.o one...
# *TODO* fix Android for build system in emu too, OS_LINUX is hardly fitting: prob works better as PLATFORM_ANDROID_{S,N}DK or something
# *TODO* setup git version like it's done in VS/make and configure header so --version works still
# *TODO* lots of other shit to improve build, add enabling/disabling libs/features, setting 3rd party libs as either built in static, dynamic or shared/system
#
#
set ( ZBUILD Off )
set ( BUILD_LIBS OFF ) ## Scope:Local If set will build libs { dreamcast, osd, ... }
set ( BUILD_LIB_TYPE STATIC ) ## Scope:Local If BUILD_LIBS is set, will use this as type of lib to use { STATIC, SHARED, MODULE (plugin) } *TODO*
set ( BUILD_SHARED_LIBS OFF ) ## Scope:CMAKE If type is not specified in add_library, use SHARED
## Build flags ##
#
set ( DC_PLATFORM_MASK 7 ) # Z: Uh, not a bitset
set ( DC_PLATFORM_DREAMCAST 0 ) # /* Works, for the most part */
set ( DC_PLATFORM_DEV_UNIT 1 ) # /* This is missing hardware */
set ( DC_PLATFORM_NAOMI 2 ) # /* Works, for the most part */
set ( DC_PLATFORM_NAOMI2 3 ) # /* Needs to be done, 2xsh4 + 2xpvr + custom TNL */
set ( DC_PLATFORM_ATOMISWAVE 4 ) # /* Needs to be done, DC-like hardware with possibly more ram */
set ( DC_PLATFORM_HIKARU 5 ) # /* Needs to be done, 2xsh4, 2x aica , custom vpu */
set ( DC_PLATFORM_AURORA 6 ) # /* Needs to be done, Uses newer 300 mhz sh4 + 150 mhz pvr mbx SoC */
set ( OS_WINDOWS 0x10000001 ) # HOST_OS
set ( OS_LINUX 0x10000002 )
set ( OS_DARWIN 0x10000003 )
set ( OS_IOS 0x10000004 ) # todo: iOS != OS_DARWIN
set ( OS_ANDROID 0x10000005 ) # todo: should be SYSTEM_ANDROID but ! OS_LINUX
set ( OS_UWP 0x10000011 )
set ( OS_NSW_HOS 0x80000001 )
set ( OS_PS4_BSD 0x80000002 )
set ( CPU_X86 0x20000001 ) # HOST_CPU
set ( CPU_X64 0x20000004 )
set ( CPU_ARM 0x20000002 )
set ( CPU_A64 0x20000008 )
set ( CPU_MIPS 0x20000003 )
set ( CPU_MIPS64 0x20000009 )
set ( CPU_PPC 0x20000006 )
set ( CPU_PPC64 0x20000007 )
set ( CPU_GENERIC 0x20000005 ) # used for pnacl, emscripten, etc
set ( DYNAREC_NONE 0x40000001 ) # FEAT_SHREC, FEAT_AREC, FEAT_DSPREC
set ( DYNAREC_JIT 0x40000002 )
set ( DYNAREC_CPP 0x40000003 )
set ( COMPILER_VC 0x30000001 ) # BUILD_COMPILER
set ( COMPILER_GCC 0x30000002 )
2019-04-12 22:08:36 +00:00
set ( COMPILER_CLANG 0x30000003 )
set ( COMPILER_INTEL 0x30000004 )
2019-04-12 20:59:39 +00:00
## These default to host, but are used for cross so make sure not to contaminate
#
# CMAKE_SYSTEM ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_VERSION}.
# CMAKE_SYSTEM_NAME CMAKE_HOST_SYSTEM_NAME uname -s Linux, Windows, and Darwin
# CMAKE_SYSTEM_VERSION CMAKE_HOST_SYSTEM_VERSION uname -r
# CMAKE_SYSTEM_PROCESSOR CMAKE_HOST_SYSTEM_PROCESSOR uname -p
#
#
#
# BOOL: CMAKE_HOST_UNIX CMAKE_HOST_WIN32 CMAKE_HOST_APPLE
#
#
# CMAKE_LIBRARY_ARCHITECTURE CMAKE_<LANG>_LIBRARY_ARCHITECTURE <prefix>/lib/<arch>
#
#
## strings are used to append to path/file names, and to filter multiple possibilities down to one
# AMD64/x86_64:x64, i*86:x86, ppc/powerpc[64][b|l]e:ppc[64] etc
#
if ( "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686" ) # todo: check MATCHES "i.86" ?
set ( host_arch "x86" )
set ( HOST_CPU ${ CPU_X86 } )
#
elseif ( ( "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" ) OR
( " $ { C M A K E _ S Y S T E M _ P R O C E S S O R } " S T R E Q U A L " x 8 6 _ 6 4 " ) )
set ( host_arch "x64" )
set ( HOST_CPU ${ CPU_X64 } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" )
set ( host_arch "arm64" )
set ( HOST_CPU ${ CPU_A64 } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" )
set ( host_arch "arm" )
set ( HOST_CPU ${ CPU_ARM } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ppc64" )
set ( host_arch "ppc64" )
set ( HOST_CPU ${ CPU_PPC64 } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ppc" ) # has to be done after ppc64 obv
set ( host_arch "ppc" )
set ( HOST_CPU ${ CPU_PPC } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "mips64" ) # todo: check , r* names?
set ( host_arch "mips64" )
set ( HOST_CPU ${ CPU_MIPS64 } )
#
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "mips" ) # todo: check , r* names?
set ( host_arch "mips" )
set ( HOST_CPU ${ CPU_MIPS } )
#
else ( )
message ( "Warning: Unknown Host System Processor: \" ${ CMAKE_SYSTEM_PROCESSOR } \"")
set ( host_arch "${CMAKE_SYSTEM_PROCESSOR}" )
set ( HOST_CPU ${ CPU_GENERIC } )
endif ( )
string ( TOLOWER ${ CMAKE_SYSTEM_NAME } host_os )
#message(" - testing cmake host_os: \"${host_os}\"")
## HOST_* is not TARGET_* ;; change ndc-e internal naming it's wrong , then change this ;;
if ( "android" STREQUAL "${host_os}" OR ANDROID )
set ( HOST_OS ${ OS_LINUX } ) # *FIXME* we might have to keep as OS_LINUX or add to full cleanup list :|
elseif ( "windowsstore" STREQUAL "${host_os}" )
set ( HOST_OS ${ OS_UWP } )
set ( HOST_CPU ${ CPU_X64 } )
elseif ( CMAKE_HOST_WIN32 )
set ( HOST_OS ${ OS_WINDOWS } )
elseif ( CMAKE_HOST_APPLE )
if ( "${host_arch}" MATCHES "arm" )
set ( HOST_OS ${ OS_IOS } )
set ( TARGET_IOS On )
add_definitions ( -DTARGET_IPHONE -DTARGET_IOS )
else ( )
set ( HOST_OS ${ OS_DARWIN } ) # todo ios check, check compiler/arch?
set ( TARGET_OSX On )
add_definitions ( -DTARGET_OSX )
endif ( )
elseif ( CMAKE_HOST_UNIX ) # GP UNIX MUST BE AFTER OTHER UNIX'ish options such as APPLE , it matches both
set ( HOST_OS ${ OS_LINUX } ) # todo android check, just check android vars?
endif ( )
#option(TARGET_NO_REC BOOL "")
#option(TARGET_NO_AREC BOOL "")
#option(TARGET_NO_JIT BOOL "")
## Dynarec avail on x86,x64,arm and aarch64 in arm.32 compat
#
if ( ( ${ HOST_CPU } EQUAL ${ CPU_X86 } ) OR ( ${ HOST_CPU } EQUAL ${ CPU_X64 } ) OR
( $ { H O S T _ C P U } E Q U A L $ { C P U _ A R M } ) OR ( ${ HOST_CPU } EQUAL ${ CPU_A64 } ) )
#
message ( "Dynarec Features Available" )
set ( FEAT_SHREC ${ DYNAREC_JIT } )
set ( FEAT_AREC ${ DYNAREC_NONE } )
set ( FEAT_DSPREC ${ DYNAREC_NONE } )
#
else ( )
set ( FEAT_SHREC ${ DYNAREC_CPP } )
set ( FEAT_AREC ${ DYNAREC_NONE } )
set ( FEAT_DSPREC ${ DYNAREC_NONE } )
endif ( )
## Handle TARGET_* to FEAT_ *FIXME* stupid use one or the other and propogate : part of build cleanup , TARGET_ will only be for platform specifics and FEAT_ as OPTIONS
#
if ( TARGET_NO_REC )
set ( FEAT_SHREC ${ DYNAREC_NONE } )
set ( FEAT_AREC ${ DYNAREC_NONE } )
set ( FEAT_DSPREC ${ DYNAREC_NONE } )
endif ( )
if ( TARGET_NO_AREC )
set ( FEAT_SHREC ${ DYNAREC_JIT } )
set ( FEAT_AREC ${ DYNAREC_NONE } )
set ( FEAT_DSPREC ${ DYNAREC_NONE } )
endif ( )
if ( TARGET_NO_JIT )
set ( FEAT_SHREC ${ DYNAREC_CPP } )
set ( FEAT_AREC ${ DYNAREC_NONE } )
set ( FEAT_DSPREC ${ DYNAREC_NONE } )
endif ( )
######## Looks like something to delete, but if we're going to handle options here and NOT in libosd/lib* #########
# FindNativeCompilers()
## options BUILD_COMPILER { GCC, Clang, Intel, RealView? }
#set(CMAKE_C_COMPILER clang)
#set(CMAKE_C_COMPILER_TARGET ${triple})
#set(CMAKE_CXX_COMPILER clang++)
#set(CMAKE_CXX_COMPILER_TARGET ${triple})
if ( ${ HOST_OS } EQUAL ${ OS_LINUX } )
# option SUPPORT_X11
# option FEAT_HAS_NIXPROF
# option EMSCripten
endif ( )
if ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" )
#
set ( BUILD_COMPILER ${ COMPILER_VC } )
message ( "MSVC Platform: ${CMAKE_VS_PLATFORM_NAME}" )
message ( "MSVC Toolset: ${CMAKE_VS_PLATFORM_TOOLSET}" )
add_definitions ( /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 )
if ( "${HOST_OS}" STREQUAL "${OS_UWP}" )
set ( _CXX_FLAGS "/ZW " )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /AppContainer" )
endif ( )
#
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" )
set ( BUILD_COMPILER ${ COMPILER_GCC } )
#
elseif ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) # AppleClang ffs
set ( BUILD_COMPILER ${ COMPILER_CLANG } )
#
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" )
set ( BUILD_COMPILER ${ COMPILER_INTEL } )
#
else ( )
message ( "Unknown Compiler: ${CMAKE_CXX_COMPILER_ID}" )
endif ( )
## Setup some common flags
#
if ( ( ${ BUILD_COMPILER } EQUAL ${ COMPILER_VC } ) OR
2019-04-12 22:08:36 +00:00
( $ { B U I L D _ C O M P I L E R } E Q U A L $ { C O M P I L E R _ C L A N G } ) AND ( ${ HOST_OS } STREQUAL ${ OS_WINDOWS } ) )
2019-04-12 20:59:39 +00:00
add_definitions ( /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 )
2019-04-12 22:08:36 +00:00
if ( ${ BUILD_COMPILER } EQUAL ${ COMPILER_CLANG } )
add_definitions ( /DXBYAK_NO_OP_NAMES /DTARGET_NO_OPENMP ) #*FIXME* check openmp on clang-cl
remove_definitions ( /U_HAS_STD_BYTE )
set ( _CXX_FLAGS "/std:c++14" ) # /U_HAS_STD_BYTE not working, have to use c++14 not 17 :|
set ( _C_FLAGS "-Wno-unused-function -Wno-unused-variable" )
endif ( )
2019-04-12 20:59:39 +00:00
elseif ( ( ${ BUILD_COMPILER } EQUAL ${ COMPILER_GCC } ) OR
( $ { B U I L D _ C O M P I L E R } E Q U A L $ { C O M P I L E R _ C L A N G } ) ) # AND NOT ${HOST_OS} EQUAL ${OS_WINDOWS}))
if ( USE_32B OR TARGET_LINUX_X86 )
set ( _C_FLAGS "${_C_FLAGS} -m32" )
endif ( )
if ( ( ${ HOST_CPU } EQUAL ${ CPU_X86 } ) OR ( ${ HOST_CPU } EQUAL ${ CPU_X64 } ) )
set ( _C_FLAGS "${_C_FLAGS} -msse4" )
if ( NOT CMAKE_HOST_APPLE )
set ( _C_FLAGS "${_C_FLAGS} -fopenmp" )
endif ( )
endif ( ) # X86 family
2019-04-12 23:42:14 +00:00
set ( _CXX_FLAGS "${_CXX_FLAGS} -fno-operator-names -fpermissive -std=c++11" ) # -fcxx-exceptions") ## xbyak needs exceptions
2019-04-12 20:59:39 +00:00
endif ( )
set ( _CXX_FLAGS "${_CXX_FLAGS} ${_C_FLAGS}" )
2019-04-12 22:08:36 +00:00
set ( CMAKE_C_FLAGS " ${_C_FLAGS}" ) # ${CMAKE_C_FLAGS} -- these hold default VC flags for non VC Build ?
set ( CMAKE_CXX_FLAGS " ${_CXX_FLAGS}" ) # ${CMAKE_CXX_FLAGS}
2019-04-12 20:59:39 +00:00
#if defined(TARGET_NO_NIXPROF)
#define FEAT_HAS_NIXPROF 0
#endif
#if defined(TARGET_NO_COREIO_HTTP)
#define FEAT_HAS_COREIO_HTTP 0
#endif
#if defined(TARGET_SOFTREND) # need -fopenmp
#define FEAT_HAS_SOFTREND 1
#endif
if ( TARGET_NSW ) # -DCMAKE_TOOLCHAIN_FILE=./cmake/devkitA64.cmake -DTARGET_NSW=ON
set ( HOST_OS ${ OS_NSW_HOS } )
message ( " DEVKITA64: ${DEVKITA64} " )
message ( "HOST_OS ${HOST_OS}" )
add_definitions ( -D__SWITCH__ -DGLES -DMESA_EGL_NO_X11_HEADERS )
add_definitions ( -DTARGET_NO_THREADS -DTARGET_NO_EXCEPTIONS -DTARGET_NO_NIXPROF )
2019-07-07 21:40:13 +00:00
add_definitions ( -DTARGET_NO_COREIO_HTTP -UTARGET_SOFTREND )
2019-04-12 20:59:39 +00:00
add_definitions ( -D_GLIBCXX_USE_C99_MATH_TR1 -D_LDBL_EQ_DBL )
endif ( )
if ( TARGET_PS4 ) # -DCMAKE_TOOLCHAIN_FILE=./cmake/{ps4sdk,clang_scei}.cmake -DTARGET_PS4=ON
set ( HOST_OS ${ OS_PS4_BSD } )
message ( "HOST_OS ${HOST_OS}" )
add_definitions ( -DPS4 -DTARGET_PS4 -DTARGET_BSD -D__ORBIS__ -DGLES -DMESA_EGL_NO_X11_HEADERS ) ## last needed for __unix__ on eglplatform.h
add_definitions ( -DTARGET_NO_THREADS -DTARGET_NO_EXCEPTIONS -DTARGET_NO_NIXPROF )
2019-07-07 21:40:13 +00:00
add_definitions ( -DTARGET_NO_COREIO_HTTP -UTARGET_SOFTREND )
2019-04-12 20:59:39 +00:00
message ( "*******FIXME******** LARGE PAGES !!" )
endif ( )
if ( ZBUILD )
set ( DEBUG_CMAKE ON )
add_definitions ( -D_Z_ ) # Get rid of some warnings and internal dev testing
if ( NOT TARGET_PS4 AND NOT TARGET_NSW AND
N O T T A R G E T _ O S X A N D N O T T A R G E T _ I O S )
set ( USE_QT ON )
endif ( )
endif ( )
# configure options for osd/ui
# osd_default, osd_qt
# ui_default, ui_sdl, ui_qt
# USE_NATIVE , USE_SDL , USE_QT -- these (can) define multiple
option ( USE_QT False "Use Qt5 for UI and support OS Deps." )
#option(BUILD_TESTS "Build tests" OFF) # todo: luserx0 this is your arena, you want tests add em
add_definitions ( -DCMAKE_BUILD )
add_definitions ( -DHOST_OS= ${ HOST_OS } )
add_definitions ( -DHOST_CPU= ${ HOST_CPU } )
add_definitions ( -DFEAT_AREC= ${ FEAT_AREC } )
add_definitions ( -DFEAT_SHREC= ${ FEAT_SHREC } )
add_definitions ( -DFEAT_DSPREC= ${ FEAT_DSPREC } )
add_definitions ( -DBUILD_COMPILER= ${ BUILD_COMPILER } )
add_definitions ( -DDEF_CONSOLE )
set ( RE_CMAKE_CONFIGURED 1 )
#add_definitions(-D=${})