2014-08-23 18:22:05 -07: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 20:35:09 -07:00
2013-09-26 14:34:48 -07:00
project ( citra )
2013-08-29 20:35:09 -07:00
2014-08-23 18:22:05 -07:00
if ( NOT MSVC )
2014-12-26 15:19:18 -08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-attributes -pthread" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread" )
2014-08-23 18:22:05 -07:00
else ( )
2015-05-06 18:59:59 -07: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 15:48:27 -08: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-03-26 03:00:49 -07:00
set ( CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo CACHE STRING "" FORCE )
2014-12-20 23:18:12 -08: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 11:47:32 -08:00
message ( STATUS "Cache compiler flags ignored, please edit CMakeLists.txt to change the flags." )
2015-03-26 03:00:49 -07:00
# /O2 - Optimization level 2
2014-12-20 23:18:12 -08:00
# /Oy- - Don't omit frame pointer
# /GR- - Disable RTTI
# /GS- - No stack buffer overflow checks
# /EHsc - C++-only exception handling semantics
2015-03-26 03:00:49 -07:00
set ( optimization_flags "/O2 /Oy- /GR- /GS- /EHsc" )
# /MP - Multi-threaded compilation
2014-12-20 23:18:12 -08:00
# /Zi - Output debugging information
# /Zo - enahnced debug info for optimized builds
2015-02-25 13:58:47 -08:00
# /MDd - Multi-threaded Debug Runtime DLL
2015-02-26 19:24:22 -08:00
set ( CMAKE_C_FLAGS_DEBUG "/MP /MDd /Zi" CACHE STRING "" FORCE )
set ( CMAKE_CXX_FLAGS_DEBUG "/MP /MDd /Zi" CACHE STRING "" FORCE )
2015-02-25 13:58:47 -08:00
# /MD - Multi-threaded runtime DLL
2015-03-26 03:00:49 -07:00
set ( CMAKE_C_FLAGS_RELEASE "${optimization_flags} /MP /MD" CACHE STRING "" FORCE )
set ( CMAKE_CXX_FLAGS_RELEASE "${optimization_flags} /MP /MD" CACHE STRING "" FORCE )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE )
2015-02-25 13:58:47 -08:00
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE )
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG" CACHE STRING "" FORCE )
2014-08-23 18:22:05 -07:00
endif ( )
2015-01-10 12:42:24 -08:00
2013-08-29 20:35:09 -07:00
add_definitions ( -DSINGLETHREADED )
2015-01-10 12:42:24 -08: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 20:35:09 -07:00
2014-12-20 23:22:00 -08:00
find_package ( PNG QUIET )
2014-08-16 05:06:40 -07:00
if ( PNG_FOUND )
add_definitions ( -DHAVE_PNG )
2014-12-20 23:22:00 -08:00
else ( )
message ( STATUS "libpng not found. Some debugging features have been disabled." )
endif ( )
2014-08-16 05:06:40 -07:00
2014-12-27 20:46:29 -08:00
find_package ( Boost 1.57.0 )
2014-12-07 13:22:04 -08:00
if ( Boost_FOUND )
include_directories ( ${ Boost_INCLUDE_DIRS } )
else ( )
2014-12-27 20:46:29 -08:00
message ( STATUS "Boost 1.57.0 or newer not found, falling back to externals" )
2014-12-07 13:22:04 -08:00
include_directories ( externals/boost )
endif ( )
2014-08-23 18:22:05 -07:00
# Include bundled CMake modules
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/cmake-modules" )
2014-04-28 19:40:39 -07:00
find_package ( OpenGL REQUIRED )
2014-08-23 18:22:05 -07: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 11:47:45 -08:00
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
2014-08-23 18:22:05 -07:00
set ( TMP_ARCH "Win32" )
2015-01-13 11:47:45 -08: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 18:22:05 -07: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 11:47:45 -08:00
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
2014-08-23 18:22:05 -07:00
set ( TMP_ARCH "i686" )
2015-01-13 11:47:45 -08: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 18:22:05 -07:00
endif ( )
set ( TMP_TOOLSET "mingw-${TMP_ARCH}" )
endif ( )
set ( GLFW_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/glfw-3.0.4.bin" )
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 20:35:09 -07:00
2014-04-28 19:40:39 -07:00
IF ( APPLE )
2014-12-24 01:40:26 -08: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 } )
2014-12-24 01:34:25 -08:00
2014-08-23 18:22:05 -07:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++" )
2015-01-08 20:20:51 -08:00
ELSEIF ( MINGW )
# GCC does not support codecvt, so use iconv instead
set ( PLATFORM_LIBRARIES winmm ws2_32 iconv )
# WSAPoll functionality doesn't exist before WinNT 6.x (Vista and up)
add_definitions ( -D_WIN32_WINNT=0x0600 )
2014-12-24 01:34:25 -08:00
ELSEIF ( WIN32 )
2015-01-10 09:32:28 -08:00
set ( PLATFORM_LIBRARIES winmm ws2_32 )
2014-12-24 01:34:25 -08:00
ELSE ( )
set ( PLATFORM_LIBRARIES rt )
2014-04-28 19:40:39 -07:00
ENDIF ( APPLE )
2014-08-23 18:22:05 -07: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 16:56:25 -07:00
2014-08-23 18:22:05 -07:00
if ( NOT CITRA_FORCE_QT4 )
find_package ( Qt5 COMPONENTS Widgets OpenGL )
set ( CITRA_QT_LIBS Qt5::Widgets Qt5::OpenGL )
2014-08-19 04:34:00 -07:00
endif ( )
2014-08-23 18:22:05 -07: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 20:35:09 -07:00
endif ( )
endif ( )
2014-08-23 18:22:05 -07: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 18:43:57 -07: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 19:13:00 -07:00
git_branch_name ( GIT_BRANCH )
2013-08-29 20:35:09 -07:00
2014-09-12 17:06:13 -07:00
set ( INI_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/inih" )
include_directories ( ${ INI_PREFIX } )
add_subdirectory ( ${ INI_PREFIX } )
2014-11-27 10:09:37 -08:00
include_directories ( externals/nihstro/include )
2013-08-29 20:35:09 -07:00
# process subdirectories
2014-08-23 18:22:05 -07:00
if ( ENABLE_QT )
2014-08-19 04:34:00 -07:00
include_directories ( externals/qhexedit )
2013-08-29 20:35:09 -07:00
add_subdirectory ( externals/qhexedit )
endif ( )
add_subdirectory ( src )
2015-04-22 04:34:42 -07: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 ( )