2014-08-23 21:22:05 -04:00
# CMake 2.8.11 required for Qt5 settings to be applied automatically on
# dependent libraries.
cmake_minimum_required ( VERSION 2.8.11 )
2013-08-29 23:35:09 -04:00
2015-08-28 15:55:22 -04:00
include ( CheckSymbolExists )
function ( detect_architecture symbol arch )
if ( NOT DEFINED ARCHITECTURE )
set ( CMAKE_REQUIRED_QUIET 1 )
check_symbol_exists ( "${symbol}" "" ARCHITECTURE_ ${ arch } )
unset ( CMAKE_REQUIRED_QUIET )
# The output variable needs to be unique across invocations otherwise
# CMake's crazy scope rules will keep it defined
if ( ARCHITECTURE_ ${ arch } )
set ( ARCHITECTURE "${arch}" PARENT_SCOPE )
set ( ARCHITECTURE_ ${ arch } 1 PARENT_SCOPE )
add_definitions ( -DARCHITECTURE_ ${ arch } =1 )
endif ( )
endif ( )
endfunction ( )
2013-09-26 17:34:48 -04:00
project ( citra )
2013-08-29 23:35:09 -04:00
2015-05-31 07:24:23 -04:00
if ( NOT EXISTS ${ CMAKE_CURRENT_SOURCE_DIR } /.git/hooks/pre-commit )
message ( STATUS "Copying pre-commit hook" )
file ( COPY hooks/pre-commit
2015-07-13 19:58:18 -04:00
D E S T I N A T I O N $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / . g i t / h o o k s )
2015-05-31 07:24:23 -04:00
endif ( )
2015-08-28 15:55:22 -04:00
if ( MSVC )
detect_architecture ( "_M_AMD64" x86_64 )
detect_architecture ( "_M_IX86" x86 )
detect_architecture ( "_M_ARM" ARM )
else ( )
detect_architecture ( "__x86_64__" x86_64 )
detect_architecture ( "__i386__" x86 )
detect_architecture ( "__arm__" ARM )
endif ( )
if ( NOT DEFINED ARCHITECTURE )
set ( ARCHITECTURE "GENERIC" )
set ( ARCHITECTURE_GENERIC 1 )
add_definitions ( -DARCHITECTURE_GENERIC=1 )
2015-08-14 22:29:08 -04:00
endif ( )
2015-08-28 15:55:22 -04:00
message ( STATUS "Target architecture: ${ARCHITECTURE}" )
2015-08-14 22:29:08 -04:00
2014-08-23 21:22:05 -04:00
if ( NOT MSVC )
2015-08-14 22:29:08 -04:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-attributes -pthread" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread" )
if ( ARCHITECTURE_x86_64 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1" )
endif ( )
2014-08-23 21:22:05 -04:00
else ( )
2015-05-06 21:59:59 -04:00
# Silence "deprecation" warnings
add_definitions ( /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE )
# Avoid windows.h junk
add_definitions ( /DNOMINMAX )
2014-12-01 18:48:27 -05:00
# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
2015-07-09 15:07:37 -04:00
set ( CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE )
2014-12-21 02:18:12 -05:00
# Tweak optimization settings
# As far as I can tell, there's no way to override the CMake defaults while leaving user
# changes intact, so we'll just clobber everything and say sorry.
2015-01-13 14:47:32 -05:00
message ( STATUS "Cache compiler flags ignored, please edit CMakeLists.txt to change the flags." )
2015-07-09 15:07:37 -04:00
# /W3 - Level 3 warnings
2015-03-26 06:00:49 -04:00
# /MP - Multi-threaded compilation
2014-12-21 02:18:12 -05:00
# /Zi - Output debugging information
# /Zo - enahnced debug info for optimized builds
2015-07-09 15:07:37 -04:00
set ( CMAKE_C_FLAGS "/W3 /MP /Zi /Zo" CACHE STRING "" FORCE )
# /GR- - Disable RTTI
# /EHsc - C++-only exception handling semantics
set ( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} /GR- /EHsc" CACHE STRING "" FORCE )
2015-02-25 16:58:47 -05:00
# /MDd - Multi-threaded Debug Runtime DLL
2015-07-09 15:07:37 -04:00
set ( CMAKE_C_FLAGS_DEBUG "/Od /MDd" CACHE STRING "" FORCE )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "" FORCE )
# /O2 - Optimization level 2
# /GS- - No stack buffer overflow checks
2015-02-25 16:58:47 -05:00
# /MD - Multi-threaded runtime DLL
2015-07-09 15:07:37 -04:00
set ( CMAKE_C_FLAGS_RELEASE "/O2 /GS- /MD" CACHE STRING "" FORCE )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE )
2015-05-25 14:34:09 -04:00
2015-07-09 15:07:37 -04:00
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE )
2015-07-28 13:32:29 -04:00
set ( CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE )
2014-08-23 21:22:05 -04:00
endif ( )
2015-01-10 15:42:24 -05:00
2013-08-29 23:35:09 -04:00
add_definitions ( -DSINGLETHREADED )
2015-01-10 15:42:24 -05:00
# CMake seems to only define _DEBUG on Windows
set_property ( DIRECTORY APPEND PROPERTY
C O M P I L E _ D E F I N I T I O N S $ < $ < C O N F I G : D e b u g > : _ D E B U G > $ < $ < N O T : $ < C O N F I G : D e b u g > > : N D E B U G > )
2013-08-29 23:35:09 -04:00
2014-12-21 02:22:00 -05:00
find_package ( PNG QUIET )
2014-08-16 08:06:40 -04:00
if ( PNG_FOUND )
add_definitions ( -DHAVE_PNG )
2014-12-21 02:22:00 -05:00
else ( )
message ( STATUS "libpng not found. Some debugging features have been disabled." )
endif ( )
2014-08-16 08:06:40 -04:00
2014-12-27 23:46:29 -05:00
find_package ( Boost 1.57.0 )
2014-12-07 16:22:04 -05:00
if ( Boost_FOUND )
include_directories ( ${ Boost_INCLUDE_DIRS } )
else ( )
2014-12-27 23:46:29 -05:00
message ( STATUS "Boost 1.57.0 or newer not found, falling back to externals" )
2014-12-07 16:22:04 -05:00
include_directories ( externals/boost )
endif ( )
2014-08-23 21:22:05 -04:00
# Include bundled CMake modules
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/cmake-modules" )
2014-04-28 22:40:39 -04:00
find_package ( OpenGL REQUIRED )
2014-08-23 21:22:05 -04:00
include_directories ( ${ OPENGL_INCLUDE_DIR } )
option ( ENABLE_GLFW "Enable the GLFW frontend" ON )
if ( ENABLE_GLFW )
if ( WIN32 )
# Detect toolchain and platform
if ( MSVC )
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set ( TMP_ARCH "x64" )
2015-01-13 14:47:45 -05:00
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
2014-08-23 21:22:05 -04:00
set ( TMP_ARCH "Win32" )
2015-01-13 14:47:45 -05:00
else ( )
set ( TMP_ARCH "UNKNOWN" )
message ( SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use. (Try checking CMakeOutput.log to find out why.)" )
2014-08-23 21:22:05 -04:00
endif ( )
if ( MSVC11 ) # Visual C++ 2012
set ( TMP_TOOLSET "v110" )
elseif ( MSVC12 ) # Visual C++ 2013
set ( TMP_TOOLSET "v120" )
else ( )
set ( TMP_TOOLSET "UNSUPPORTED" )
message ( SEND_ERROR "We don't supply GLFW binaries for your version of MSVC, you might have to provide them yourself." )
endif ( )
set ( TMP_TOOLSET "msvc_${TMP_TOOLSET}-${TMP_ARCH}" )
else ( )
# Assume mingw
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set ( TMP_ARCH "x86_64" )
2015-01-13 14:47:45 -05:00
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
2014-08-23 21:22:05 -04:00
set ( TMP_ARCH "i686" )
2015-01-13 14:47:45 -05:00
else ( )
set ( TMP_ARCH "UNKNOWN" )
message ( SEND_ERROR "Couldn't detect your compiler's architecture, you'll have to manually specify the GLFW library to use." )
2014-08-23 21:22:05 -04:00
endif ( )
set ( TMP_TOOLSET "mingw-${TMP_ARCH}" )
endif ( )
2015-05-24 23:42:21 -04:00
set ( GLFW_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/glfw-3.1.1.bin" )
2014-08-23 21:22:05 -04:00
set ( GLFW_INCLUDE_DIRS "${GLFW_PREFIX}/include" CACHE PATH "Path to GLFW3 headers" )
set ( GLFW_LIBRARY_DIRS "${GLFW_PREFIX}/lib-${TMP_TOOLSET}" CACHE PATH "Path to GLFW3 libraries" )
# Clean up after ourselves
unset ( TMP_TOOLSET )
unset ( TMP_ARCH )
set ( GLFW_LIBRARIES glfw3 )
else ( )
find_package ( PkgConfig REQUIRED )
pkg_search_module ( GLFW REQUIRED glfw3 )
endif ( )
include_directories ( ${ GLFW_INCLUDE_DIRS } )
link_directories ( ${ GLFW_LIBRARY_DIRS } )
endif ( )
2013-08-29 23:35:09 -04:00
2014-04-28 22:40:39 -04:00
IF ( APPLE )
2014-12-24 04:40:26 -05:00
FIND_LIBRARY ( COCOA_LIBRARY Cocoa ) # Umbrella framework for everything GUI-related
FIND_LIBRARY ( IOKIT_LIBRARY IOKit ) # GLFW dependency
FIND_LIBRARY ( COREVIDEO_LIBRARY CoreVideo ) # GLFW dependency
set ( PLATFORM_LIBRARIES iconv ${ COCOA_LIBRARY } ${ IOKIT_LIBRARY } ${ COREVIDEO_LIBRARY } )
2015-05-25 14:34:09 -04:00
2014-08-23 21:22:05 -04:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++" )
2015-01-08 23:20:51 -05:00
ELSEIF ( MINGW )
# GCC does not support codecvt, so use iconv instead
2015-08-16 02:41:40 -04:00
# PSAPI is the Process Status API
set ( PLATFORM_LIBRARIES winmm ws2_32 psapi iconv )
2015-01-08 23:20:51 -05:00
# WSAPoll functionality doesn't exist before WinNT 6.x (Vista and up)
add_definitions ( -D_WIN32_WINNT=0x0600 )
2014-12-24 04:34:25 -05:00
ELSEIF ( WIN32 )
2015-01-10 12:32:28 -05:00
set ( PLATFORM_LIBRARIES winmm ws2_32 )
2014-12-24 04:34:25 -05:00
ELSE ( )
set ( PLATFORM_LIBRARIES rt )
2014-04-28 22:40:39 -04:00
ENDIF ( APPLE )
2014-08-23 21:22:05 -04:00
option ( ENABLE_QT "Enable the Qt frontend" ON )
option ( CITRA_FORCE_QT4 "Use Qt4 even if Qt5 is available." OFF )
if ( ENABLE_QT )
# Set CMAKE_PREFIX_PATH if QTDIR is defined in the environment This allows CMake to
# automatically find the Qt packages on Windows
if ( DEFINED ENV{QTDIR} )
list ( APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}" )
endif ( )
2014-04-30 19:56:25 -04:00
2014-08-23 21:22:05 -04:00
if ( NOT CITRA_FORCE_QT4 )
find_package ( Qt5 COMPONENTS Widgets OpenGL )
set ( CITRA_QT_LIBS Qt5::Widgets Qt5::OpenGL )
2014-08-19 07:34:00 -04:00
endif ( )
2014-08-23 21:22:05 -04:00
if ( CITRA_FORCE_QT4 OR NOT Qt5_FOUND )
# Try to fallback to Qt4
find_package ( Qt4 REQUIRED COMPONENTS QtGui QtOpenGL )
set ( CITRA_QT_LIBS Qt4::QtGui Qt4::QtOpenGL )
2013-08-29 23:35:09 -04:00
endif ( )
endif ( )
2014-08-23 21:22:05 -04:00
# This function should be passed a list of all files in a target. It will automatically generate
# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the
# one in the filesystem.
function ( create_directory_groups )
# Place any files that aren't in the source list in a separate group so that they don't get in
# the way.
source_group ( "Other Files" REGULAR_EXPRESSION "." )
foreach ( file_name ${ ARGV } )
get_filename_component ( dir_name "${file_name}" PATH )
# Group names use '\' as a separator even though the entire rest of CMake uses '/'...
string ( REPLACE "/" "\\" group_name "${dir_name}" )
source_group ( "${group_name}" FILES "${file_name}" )
endforeach ( )
endfunction ( )
2014-04-23 21:43:57 -04:00
# generate git revision information
include ( GetGitRevisionDescription )
get_git_head_revision ( GIT_REF_SPEC GIT_REV )
git_describe ( GIT_DESC --always --long --dirty )
2014-04-23 22:13:00 -04:00
git_branch_name ( GIT_BRANCH )
2013-08-29 23:35:09 -04:00
2014-09-12 20:06:13 -04:00
set ( INI_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/inih" )
include_directories ( ${ INI_PREFIX } )
add_subdirectory ( ${ INI_PREFIX } )
2015-08-30 02:37:42 -04:00
add_subdirectory ( externals/glad )
2015-08-17 17:25:21 -04:00
include_directories ( externals/microprofile )
2014-11-27 13:09:37 -05:00
include_directories ( externals/nihstro/include )
2015-06-22 20:59:00 -04:00
if ( MSVC )
add_subdirectory ( externals/getopt )
endif ( )
2013-08-29 23:35:09 -04:00
# process subdirectories
2014-08-23 21:22:05 -04:00
if ( ENABLE_QT )
2014-08-19 07:34:00 -04:00
include_directories ( externals/qhexedit )
2013-08-29 23:35:09 -04:00
add_subdirectory ( externals/qhexedit )
endif ( )
add_subdirectory ( src )
2015-04-22 07:34:42 -04:00
# Install freedesktop.org metadata files, following those specifications:
# http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
# http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
if ( ${ CMAKE_SYSTEM_NAME } MATCHES "Linux|FreeBSD|OpenBSD|NetBSD" )
install ( FILES "${CMAKE_SOURCE_DIR}/dist/citra.desktop"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ P R E F I X } / s h a r e / a p p l i c a t i o n s " )
install ( FILES "${CMAKE_SOURCE_DIR}/dist/citra.svg"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ P R E F I X } / s h a r e / p i x m a p s " )
install ( FILES "${CMAKE_SOURCE_DIR}/dist/citra.xml"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ P R E F I X } / s h a r e / m i m e / p a c k a g e s " )
endif ( )