2009-09-13 18:02:46 -06:00
# main project file. use it from a build sub-folder, see COMPILE for details
2011-03-16 00:35:08 -06:00
2015-09-27 02:05:28 -06:00
# prevent CMake warnings about INTERFACE_LINK_LIBRARIES vs LINK_INTERFACE_LIBRARIES
IF ( CMAKE_VERSION VERSION_GREATER "2.8.12" )
CMAKE_POLICY ( SET CMP0022 OLD )
ENDIF ( )
2012-02-13 09:43:41 -07:00
# Set up build types
if ( CMAKE_CONFIGURATION_TYPES )
2012-02-16 07:07:10 -07:00
SET ( CMAKE_CONFIGURATION_TYPES Release RelWithDebInfo )
SET ( CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "List of supported configuration types" FORCE )
2012-02-13 09:43:41 -07:00
else ( CMAKE_CONFIGURATION_TYPES )
if ( NOT CMAKE_BUILD_TYPE )
SET ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Release RelWithDebInfo." )
endif ( NOT CMAKE_BUILD_TYPE )
endif ( CMAKE_CONFIGURATION_TYPES )
2011-08-26 21:50:14 -06:00
2015-11-26 15:09:53 -07:00
OPTION ( BUILD_DOCS "Choose whether to build the documentation (requires python and Sphinx)." OFF )
2015-09-24 00:04:09 -06:00
2012-03-13 14:16:30 -06:00
## some generic CMake magic
cmake_minimum_required ( VERSION 2.8 FATAL_ERROR )
project ( dfhack )
2015-09-26 08:46:29 -06:00
macro ( CHECK_GCC COMPILER_PATH )
execute_process ( COMMAND ${ COMPILER_PATH } -dumpversion OUTPUT_VARIABLE GCC_VERSION_OUT )
string ( STRIP "${GCC_VERSION_OUT}" GCC_VERSION_OUT )
2015-11-29 07:26:11 -07:00
if ( ${ GCC_VERSION_OUT } VERSION_LESS "4.5" )
message ( SEND_ERROR "${COMPILER_PATH} version ${GCC_VERSION_OUT} cannot be used - use GCC 4.5 or later" )
elseif ( ${ GCC_VERSION_OUT } VERSION_GREATER "4.9.9" )
# GCC 5 changes ABI name mangling to enable C++11 changes.
# This must be disabled to enable linking against DF.
# http://developerblog.redhat.com/2015/02/05/gcc5-and-the-c11-abi/
add_definitions ( -D_GLIBCXX_USE_CXX11_ABI=0 )
2015-09-26 08:46:29 -06:00
endif ( )
endmacro ( )
if ( UNIX )
if ( CMAKE_COMPILER_IS_GNUCC )
CHECK_GCC ( ${ CMAKE_C_COMPILER } )
else ( )
message ( SEND_ERROR "C compiler is not GCC" )
endif ( )
if ( CMAKE_COMPILER_IS_GNUCXX )
CHECK_GCC ( ${ CMAKE_CXX_COMPILER } )
else ( )
message ( SEND_ERROR "C++ compiler is not GCC" )
endif ( )
endif ( )
if ( WIN32 )
2015-10-13 14:25:38 -06:00
if ( ( NOT MSVC ) OR ( NOT MSVC_VERSION STREQUAL 1600 ) )
2015-09-26 08:46:29 -06:00
message ( SEND_ERROR "MSVC 2010 is required" )
endif ( )
endif ( )
2012-04-14 16:27:02 -06:00
if ( MSVC )
2012-04-14 16:20:59 -06:00
# disable C4819 code-page warning
add_definitions ( "/wd4819" )
2012-04-14 16:27:02 -06:00
endif ( )
2012-04-14 16:20:59 -06:00
2012-03-13 07:46:48 -06:00
# set up folder structures for IDE solutions
2012-03-13 13:00:20 -06:00
# MSVC Express won't load solutions that use this. It also doesn't include MFC supported
# Check for MFC!
find_package ( MFC QUIET )
if ( MFC_FOUND OR ( NOT MSVC ) )
2012-03-13 07:46:48 -06:00
OPTION ( CMAKE_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON )
else ( )
OPTION ( CMAKE_USE_FOLDERS "Enable folder grouping of projects in IDEs." OFF )
endif ( )
2012-03-13 14:05:25 -06:00
if ( CMAKE_USE_FOLDERS )
SET_PROPERTY ( GLOBAL PROPERTY USE_FOLDERS ON )
else ( )
SET_PROPERTY ( GLOBAL PROPERTY USE_FOLDERS OFF )
endif ( )
2012-03-13 07:46:48 -06:00
# macro for setting up IDE folders without nasty IF()s everywhere
MACRO ( IDE_FOLDER target folder )
if ( CMAKE_USE_FOLDERS )
SET_PROPERTY ( TARGET ${ target } PROPERTY FOLDER ${ folder } )
endif ( )
ENDMACRO ( )
2011-03-20 10:17:33 -06:00
SET ( CMAKE_MODULE_PATH
$ { d f h a c k _ S O U R C E _ D I R } / C M a k e / M o d u l e s
$ { C M A K E _ M O D U L E _ P A T H }
)
2010-08-16 01:09:33 -06:00
2011-08-14 00:42:21 -06:00
# mixing the build system with the source code is ugly and stupid. enforce the opposite :)
2011-06-19 17:12:07 -06:00
if ( "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}" )
2011-03-17 17:07:40 -06:00
message ( FATAL_ERROR "In-source builds are not allowed." )
2011-03-16 00:35:08 -06:00
endif ( )
2009-09-13 18:02:46 -06:00
2012-03-26 17:37:37 -06:00
# make sure all the necessary submodules have been set up
2015-07-29 12:47:55 -06:00
if ( NOT EXISTS ${ dfhack_SOURCE_DIR } /library/xml/codegen.pl OR NOT EXISTS ${ dfhack_SOURCE_DIR } /depends/clsocket/CMakeLists.txt )
2015-09-26 08:51:02 -06:00
message ( SEND_ERROR "One or more required submodules could not be found! Run 'git submodule update --init' from the root DFHack directory. (See the section 'Getting the Code' in Compile.rst or Compile.html)" )
2012-03-26 17:37:37 -06:00
endif ( )
2011-08-14 00:42:21 -06:00
# set up versioning.
2015-12-01 15:36:44 -07:00
set ( DF_VERSION "0.42.01" )
SET ( DFHACK_RELEASE "r0" )
2011-06-19 17:12:07 -06:00
2013-01-09 09:19:43 -07:00
set ( DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}" )
2011-06-19 17:12:07 -06:00
## where to install things (after the build is done, classic 'make install' or package structure)
# the dfhack libraries will be installed here:
2011-03-18 09:47:55 -06:00
IF ( UNIX )
2011-08-14 00:42:21 -06:00
# put the lib into DF/hack
SET ( DFHACK_LIBRARY_DESTINATION hack )
2012-02-27 19:37:56 -07:00
SET ( DFHACK_EGGY_DESTINATION libs )
2011-08-14 00:42:21 -06:00
ELSE ( )
# windows is crap, therefore we can't do nice things with it. leave the libs on a nasty pile...
SET ( DFHACK_LIBRARY_DESTINATION . )
2012-02-27 19:37:56 -07:00
SET ( DFHACK_EGGY_DESTINATION . )
2011-03-18 09:47:55 -06:00
ENDIF ( )
2011-08-14 00:42:21 -06:00
# external tools will be installed here:
SET ( DFHACK_BINARY_DESTINATION . )
# dfhack data goes here:
SET ( DFHACK_DATA_DESTINATION hack )
# plugin libs go here:
SET ( DFHACK_PLUGIN_DESTINATION hack/plugins )
# dfhack header files go here:
SET ( DFHACK_INCLUDES_DESTINATION hack/include )
2012-03-31 05:40:54 -06:00
# dfhack lua files go here:
SET ( DFHACK_LUA_DESTINATION hack/lua )
2011-08-14 00:42:21 -06:00
# the windows .lib file goes here:
SET ( DFHACK_DEVLIB_DESTINATION hack )
# user documentation goes here:
SET ( DFHACK_USERDOC_DESTINATION hack )
# developer documentation goes here:
SET ( DFHACK_DEVDOC_DESTINATION hack )
2011-05-21 12:32:53 -06:00
2011-06-19 17:12:07 -06:00
## some options for the user/developer to play with
OPTION ( BUILD_LIBRARY "Build the library that goes into DF." ON )
2011-07-11 16:07:59 -06:00
OPTION ( BUILD_PLUGINS "Build the plugins." ON )
2010-08-15 16:45:02 -06:00
2011-11-06 13:16:16 -07:00
IF ( UNIX )
2015-09-26 11:16:05 -06:00
## flags for GCC
# default to hidden symbols
# build 32bit
# ensure compatibility with older CPUs
# enable C++11 features
2011-11-06 13:16:16 -07:00
add_definitions ( -DLINUX_BUILD )
2013-09-30 12:51:29 -06:00
SET ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g -Wall -Wno-unused-variable" )
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -m32 -march=i686 -mtune=generic -std=c++0x" )
SET ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -m32 -march=i686 -mtune=generic" )
2012-08-17 12:40:53 -06:00
ELSEIF ( MSVC )
# for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion
2013-01-18 15:05:41 -07:00
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP" )
2013-01-18 16:21:57 -07:00
SET ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od" )
2011-11-06 13:16:16 -07:00
ENDIF ( )
2012-03-13 07:46:48 -06:00
# use shared libraries for protobuf
ADD_DEFINITIONS ( -DPROTOBUF_USE_DLLS )
2012-03-19 10:12:27 -06:00
ADD_DEFINITIONS ( -DLUA_BUILD_AS_DLL )
2012-03-13 07:46:48 -06:00
2012-05-24 09:31:20 -06:00
if ( APPLE )
2012-11-16 14:33:36 -07:00
add_definitions ( -D_DARWIN )
2015-04-18 09:40:20 -06:00
set ( CMAKE_MACOSX_RPATH 1 )
2012-05-24 09:31:20 -06:00
elseif ( UNIX )
2012-03-14 09:57:29 -06:00
add_definitions ( -D_LINUX )
elseif ( WIN32 )
add_definitions ( -DWIN32 )
endif ( )
2012-03-13 07:46:48 -06:00
#### expose depends ####
2012-03-10 07:31:46 -07:00
# find and make available libz
if ( NOT UNIX )
2012-03-13 07:46:48 -06:00
SET ( ZLIB_ROOT depends/zlib/ )
2012-03-10 07:31:46 -07:00
endif ( )
2012-03-13 07:46:48 -06:00
find_package ( ZLIB REQUIRED )
include_directories ( depends/protobuf )
include_directories ( depends/lua/include )
include_directories ( depends/md5 )
2015-07-29 12:47:55 -06:00
include_directories ( depends/jsoncpp )
2012-03-13 07:46:48 -06:00
include_directories ( depends/tinyxml )
include_directories ( depends/tthread )
2012-03-10 07:31:46 -07:00
include_directories ( ${ ZLIB_INCLUDE_DIRS } )
2012-03-13 10:10:46 -06:00
include_directories ( depends/clsocket/src )
2012-03-13 07:46:48 -06:00
add_subdirectory ( depends )
2012-03-10 07:31:46 -07:00
2015-11-10 15:00:49 -07:00
find_package ( Git REQUIRED )
2015-06-25 09:43:54 -06:00
if ( NOT GIT_FOUND )
2015-11-10 15:00:49 -07:00
message ( SEND_ERROR "could not find git" )
2015-06-25 09:43:54 -06:00
endif ( )
2011-10-29 19:50:29 -06:00
2011-08-14 00:42:21 -06:00
# build the lib itself
2011-06-19 17:12:07 -06:00
IF ( BUILD_LIBRARY )
2011-03-18 09:47:55 -06:00
add_subdirectory ( library )
2015-10-22 19:34:54 -06:00
install ( FILES LICENSE.rst NEWS.rst DESTINATION ${ DFHACK_USERDOC_DESTINATION } )
2011-03-18 09:47:55 -06:00
endif ( )
2010-08-15 16:45:02 -06:00
2015-06-18 06:59:01 -06:00
install ( DIRECTORY dfhack-config/ DESTINATION dfhack-config/default )
2011-08-14 00:42:21 -06:00
#build the plugins
2011-06-19 20:29:38 -06:00
IF ( BUILD_PLUGINS )
add_subdirectory ( plugins )
endif ( )
2011-03-17 17:07:40 -06:00
2015-08-06 19:50:01 -06:00
add_subdirectory ( scripts )
2015-11-10 15:00:49 -07:00
find_package ( Sphinx QUIET )
2015-09-24 00:04:09 -06:00
if ( BUILD_DOCS )
2015-09-26 11:28:06 -06:00
if ( NOT SPHINX_FOUND )
message ( SEND_ERROR "Sphinx not found but BUILD_DOCS enabled" )
endif ( )
2015-09-26 15:52:06 -06:00
file ( GLOB SPHINX_DEPS
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o c s / * . r s t "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o c s / i m a g e s / * . p n g "
2015-10-24 05:19:52 -06:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o c s / s t y l e s / * "
2015-11-05 20:57:09 -07:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c o n f . p y "
2015-10-24 05:19:52 -06:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s c r i p t s / a b o u t . t x t "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s c r i p t s / * / a b o u t . t x t "
)
2015-11-04 17:53:46 -07:00
file ( GLOB_RECURSE SPHINX_SCRIPT_DEPS
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s c r i p t s / * . l u a "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s c r i p t s / * . r b "
2015-09-26 15:52:06 -06:00
)
2015-11-07 16:07:12 -07:00
set ( SPHINX_DEPS ${ SPHINX_DEPS } ${ SPHINX_SCRIPT_DEPS }
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / L I C E N S E . r s t "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / N E W S . r s t "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / C M a k e L i s t s . t x t "
)
2015-09-26 15:52:06 -06:00
set ( SPHINX_OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/docs/html/.buildinfo" )
set_source_files_properties ( ${ SPHINX_OUTPUT } PROPERTIES GENERATED TRUE )
add_custom_command ( OUTPUT ${ SPHINX_OUTPUT }
C O M M A N D $ { S P H I N X _ E X E C U T A B L E }
2015-09-27 02:05:28 -06:00
- a - E - q - b h t m l
2015-09-26 11:28:06 -06:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } "
2015-10-24 05:19:52 -06:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o c s / h t m l "
2015-10-24 17:14:09 -06:00
- w " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o c s / _ s p h i n x - w a r n i n g s . t x t "
2015-11-05 20:57:09 -07:00
- j 2
2015-09-26 15:52:06 -06:00
D E P E N D S $ { S P H I N X _ D E P S }
C O M M E N T " B u i l d i n g H T M L d o c u m e n t a t i o n w i t h S p h i n x "
)
add_custom_target ( dfhack_docs ALL
D E P E N D S $ { S P H I N X _ O U T P U T }
)
# Sphinx doesn't touch this file if it didn't make changes,
# which makes CMake think it didn't complete
add_custom_command ( TARGET dfhack_docs POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E t o u c h $ { S P H I N X _ O U T P U T } )
2015-11-05 17:37:37 -07:00
install ( DIRECTORY ${ dfhack_SOURCE_DIR } /docs/html/
D E S T I N A T I O N $ { D F H A C K _ U S E R D O C _ D E S T I N A T I O N } / d o c s
2015-09-26 15:52:06 -06:00
)
2015-10-24 05:19:52 -06:00
install ( FILES "README.html" DESTINATION "${DFHACK_DATA_DESTINATION}" )
2015-09-24 00:04:09 -06:00
endif ( )
2011-06-19 17:12:07 -06:00
# Packaging with CPack!
2015-11-07 16:07:48 -07:00
SET ( DFHACK_PACKAGE_SUFFIX "" )
2011-06-19 17:12:07 -06:00
IF ( UNIX )
2015-11-07 18:27:48 -07:00
execute_process ( COMMAND ${ CMAKE_CXX_COMPILER } -dumpversion OUTPUT_VARIABLE GCC_VERSION )
string ( STRIP ${ GCC_VERSION } GCC_VERSION )
SET ( DFHACK_PACKAGE_SUFFIX "-gcc-${GCC_VERSION}" )
2012-11-16 14:33:36 -07:00
if ( APPLE )
2015-09-26 11:16:05 -06:00
SET ( CPACK_GENERATOR "ZIP;TBZ2" )
2012-11-16 14:33:36 -07:00
else ( )
2014-08-29 18:55:17 -06:00
SET ( CPACK_GENERATOR "TBZ2" )
2012-11-16 14:33:36 -07:00
endif ( )
2011-08-14 00:42:21 -06:00
ELSEIF ( WIN32 )
2011-06-19 17:12:07 -06:00
SET ( CPACK_GENERATOR "ZIP" )
2011-03-19 16:26:32 -06:00
ENDIF ( )
2011-08-14 17:30:15 -06:00
set ( CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0 )
2015-01-07 14:03:24 -07:00
IF ( APPLE )
set ( DFHACK_PACKAGE_PLATFORM_NAME OSX )
ELSE ( )
set ( DFHACK_PACKAGE_PLATFORM_NAME ${ CMAKE_SYSTEM_NAME } )
ENDIF ( )
2015-11-07 16:07:48 -07:00
set ( CPACK_PACKAGE_FILE_NAME "dfhack-${DFHACK_VERSION}-${DFHACK_PACKAGE_PLATFORM_NAME}${DFHACK_PACKAGE_SUFFIX}" )
2011-06-19 17:12:07 -06:00
INCLUDE ( CPack )
2015-09-24 00:04:09 -06:00
#INCLUDE(FindSphinx.cmake)