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
2012-03-13 14:16:30 -06:00
## some generic CMake magic
2018-03-08 11:26:10 -07:00
cmake_minimum_required ( VERSION 2.8.12 FATAL_ERROR )
2020-09-18 23:17:25 -06:00
cmake_policy ( SET CMP0048 NEW )
2012-03-13 14:16:30 -06:00
project ( dfhack )
2019-07-16 17:33:33 -06:00
if ( "${CMAKE_GENERATOR}" STREQUAL Ninja )
2019-07-16 20:19:11 -06:00
if ( "${CMAKE_VERSION}" VERSION_LESS 3.9 )
message ( WARNING "You are using an old version of CMake (${CMAKE_VERSION}) with Ninja. This may result in ninja errors - see docs/Compile.rst for more details. Upgrading your CMake version is recommended." )
endif ( )
2019-07-16 17:33:33 -06:00
endif ( )
2020-04-19 10:16:48 -06:00
if ( NOT( "${CMAKE_VERSION}" VERSION_LESS 3.12 ) )
# make ZLIB_ROOT work in CMake >= 3.12
# https://cmake.org/cmake/help/git-stage/policy/CMP0074.html
cmake_policy ( SET CMP0074 NEW )
endif ( )
2019-07-16 20:19:11 -06:00
# Set up build types
if ( CMAKE_CONFIGURATION_TYPES )
set ( CMAKE_CONFIGURATION_TYPES "Release;RelWithDebInfo" CACHE STRING "List of supported configuration types" FORCE )
else ( CMAKE_CONFIGURATION_TYPES )
set ( DFHACK_TYPE_HELP "Choose the type of build, options are: Release and RelWithDebInfo" )
# Prevent cmake C module attempts to overwrite our help string
if ( NOT CMAKE_BUILD_TYPE )
set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "${DFHACK_TYPE_HELP}" )
else ( NOT CMAKE_BUILD_TYPE )
set ( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "${DFHACK_TYPE_HELP}" )
endif ( NOT CMAKE_BUILD_TYPE )
set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Release;RelWithDebInfo" )
endif ( CMAKE_CONFIGURATION_TYPES )
option ( BUILD_DOCS "Choose whether to build the documentation (requires python and Sphinx)." OFF )
option ( REMOVE_SYMBOLS_FROM_DF_STUBS "Remove debug symbols from DF stubs. (Reduces libdfhack size to about half but removes a few useful symbols)" ON )
macro ( CHECK_GCC compiler_path )
execute_process ( COMMAND ${ compiler_path } -dumpversion OUTPUT_VARIABLE GCC_VERSION_OUT )
string ( STRIP "${GCC_VERSION_OUT}" GCC_VERSION_OUT )
if ( ${ GCC_VERSION_OUT } VERSION_LESS "4.8" )
message ( SEND_ERROR "${compiler_path} version ${GCC_VERSION_OUT} cannot be used - use GCC 4.8 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 )
endif ( )
2015-09-26 08:46:29 -06:00
endmacro ( )
if ( UNIX )
2019-07-16 20:19:11 -06:00
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 ( )
2015-09-26 08:46:29 -06:00
endif ( )
if ( WIN32 )
2019-07-16 20:19:11 -06:00
if ( ( NOT MSVC ) OR ( MSVC_VERSION LESS 1900 ) OR ( MSVC_VERSION GREATER 1919 ) )
message ( SEND_ERROR "MSVC 2015 or 2017 is required" )
endif ( )
2015-09-26 08:46:29 -06:00
endif ( )
2018-06-13 14:09:38 -06:00
# Ask for C++11 standard from compilers
2018-06-10 15:15:57 -06:00
set ( CMAKE_CXX_STANDARD 11 )
2018-06-10 13:55:38 -06:00
# Require the standard support from compilers.
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
# Use only standard c++ to keep code portable
set ( CMAKE_CXX_EXTENSIONS OFF )
2012-04-14 16:27:02 -06:00
if ( MSVC )
2019-07-16 20:19:11 -06:00
# disable C4819 code-page warning
add_definitions ( "/wd4819" )
# disable use of POSIX name warnings
add_definitions ( "/D_CRT_NONSTDC_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS" )
# supress C4503 - VC++ dislikes if a name is too long. If you get
# weird and mysterious linking errors, you can disable this, but you'll have to
# deal with a LOT of compiler noise over it
# see https://msdn.microsoft.com/en-us/library/074af4b6.aspx
add_definitions ( "/wd4503" )
# suppress C4267 - VC++ complains whenever we implicitly convert an integer to
# a smaller type, and most of the time this is just conversion from 64 to 32 bits
# for things like vector sizes, which are never that big anyway.
add_definitions ( "/wd4267" )
2020-04-28 17:18:28 -06:00
# MSVC panics if an object file contains more than 65,279 sections. this
# happens quite frequently with code that uses templates, such as vectors.
add_definitions ( "/bigobj" )
2012-04-14 16:27:02 -06:00
endif ( )
2012-04-14 16:20:59 -06:00
2016-07-31 18:01:47 -06:00
# Automatically detect architecture based on Visual Studio generator
2019-07-16 20:19:11 -06:00
if ( MSVC AND NOT DEFINED DFHACK_BUILD_ARCH )
if ( ${ CMAKE_GENERATOR } MATCHES "Win64" )
set ( DFHACK_BUILD_ARCH "64" )
else ( )
set ( DFHACK_BUILD_ARCH "32" )
endif ( )
else ( )
set ( DFHACK_BUILD_ARCH "64" CACHE STRING "Architecture to build ('32' or '64')" )
endif ( )
if ( "${DFHACK_BUILD_ARCH}" STREQUAL "32" )
set ( DFHACK_BUILD_32 1 )
set ( DFHACK_BUILD_64 0 )
set ( DFHACK_SETARCH "i386" )
elseif ( "${DFHACK_BUILD_ARCH}" STREQUAL "64" )
set ( DFHACK_BUILD_32 0 )
set ( DFHACK_BUILD_64 1 )
set ( DFHACK_SETARCH "x86_64" )
add_definitions ( -DDFHACK64 )
else ( )
message ( SEND_ERROR "Invalid build architecture (should be 32/64): ${DFHACK_BUILD_ARCH}" )
endif ( )
if ( CMAKE_CROSSCOMPILING )
set ( DFHACK_NATIVE_BUILD_DIR "DFHACK_NATIVE_BUILD_DIR-NOTFOUND" CACHE FILEPATH "Path to a native build directory" )
include ( "${DFHACK_NATIVE_BUILD_DIR}/ImportExecutables.cmake" )
endif ( )
2016-01-08 19:08:26 -07:00
2017-04-30 15:36:42 -06:00
find_package ( Perl REQUIRED )
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 ) )
2019-07-16 20:19:11 -06:00
option ( CMAKE_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON )
2012-03-13 07:46:48 -06:00
else ( )
2019-07-16 20:19:11 -06:00
option ( CMAKE_USE_FOLDERS "Enable folder grouping of projects in IDEs." OFF )
2012-03-13 07:46:48 -06:00
endif ( )
2012-03-13 14:05:25 -06:00
if ( CMAKE_USE_FOLDERS )
2019-07-16 20:19:11 -06:00
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
2012-03-13 14:05:25 -06:00
else ( )
2019-07-16 20:19:11 -06:00
set_property ( GLOBAL PROPERTY USE_FOLDERS OFF )
2012-03-13 14:05:25 -06:00
endif ( )
2019-07-16 20:19:11 -06:00
# macro for setting up IDE folders without nasty if()s everywhere
macro ( IDE_FOLDER target folder )
2012-03-13 07:46:48 -06:00
if ( CMAKE_USE_FOLDERS )
2019-07-16 20:19:11 -06:00
set_property ( TARGET ${ target } PROPERTY FOLDER ${ folder } )
2012-03-13 07:46:48 -06:00
endif ( )
2019-07-16 20:19:11 -06:00
endmacro ( )
2012-03-13 07:46:48 -06:00
2019-07-16 20:19:11 -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 }
2011-03-20 10:17:33 -06:00
)
2010-08-16 01:09:33 -06:00
2016-01-26 18:37:27 -07:00
# generates compile_commands.json, used for autocompletion by some editors
2019-07-16 20:19:11 -06:00
set ( CMAKE_EXPORT_COMPILE_COMMANDS ON )
2016-01-26 18:37:27 -07:00
2018-06-13 09:36:57 -06:00
include ( CheckCXXSourceCompiles )
2019-07-16 20:19:11 -06:00
check_cxx_source_compiles ( "
2018-06-13 09:36:57 -06:00
#include <cstdlib>
#include <cuchar>
i n t main ( void ) {
c h a r 3 2 _ t i n = 0 ;
c h a r o u t [ M B _ C U R _ M A X ] ;
s t d : : m b s t a t e _ t s t a t e { } ;
s t d : : c32rtomb ( out, in, &state ) ;
r e t u r n 0 ;
} " H A V E _ C U C H A R 2 )
if ( HAVE_CUCHAR2 )
add_definitions ( "-DHAVE_CUCHAR" )
2018-06-12 11:25:40 -06:00
endif ( )
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}" )
2019-07-16 20:19:11 -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
2021-03-09 22:21:46 -07:00
if ( NOT EXISTS ${ dfhack_SOURCE_DIR } /library/xml/codegen.pl
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / s c r i p t s / C M a k e L i s t s . t x t
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / d e p e n d s / c l s o c k e t / C M a k e L i s t s . t x t
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / d e p e n d s / l i b e x p a t / e x p a t / C M a k e L i s t s . t x t
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / d e p e n d s / l i b z i p / C M a k e L i s t s . t x t
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / d e p e n d s / x l s x i o / C M a k e L i s t s . t x t
O R N O T E X I S T S $ { d f h a c k _ S O U R C E _ D I R } / d e p e n d s / l u a c o v / s r c
)
2016-01-18 08:55:21 -07: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 docs/Compile.rst)" )
2012-03-26 17:37:37 -06:00
endif ( )
2011-08-14 00:42:21 -06:00
# set up versioning.
2021-01-31 10:10:00 -07:00
set ( DF_VERSION "0.47.05" )
2021-03-06 11:30:16 -07:00
set ( DFHACK_RELEASE "r1" )
set ( DFHACK_PRERELEASE FALSE )
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
2018-03-10 14:18:15 -07:00
set ( DFHACK_ABI_VERSION 1 )
2018-07-11 09:47:55 -06:00
set ( DFHACK_BUILD_ID "" CACHE STRING "Build ID (should be specified on command line)" )
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:
2019-07-16 20:19:11 -06:00
if ( UNIX )
2011-08-14 00:42:21 -06:00
# put the lib into DF/hack
2019-07-16 20:19:11 -06:00
set ( DFHACK_LIBRARY_DESTINATION hack )
set ( DFHACK_EGGY_DESTINATION libs )
else ( )
2011-08-14 00:42:21 -06:00
# windows is crap, therefore we can't do nice things with it. leave the libs on a nasty pile...
2019-07-16 20:19:11 -06:00
set ( DFHACK_LIBRARY_DESTINATION . )
set ( DFHACK_EGGY_DESTINATION . )
endif ( )
2011-08-14 00:42:21 -06:00
# external tools will be installed here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_BINARY_DESTINATION . )
2011-08-14 00:42:21 -06:00
# dfhack data goes here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_DATA_DESTINATION hack )
2011-08-14 00:42:21 -06:00
# plugin libs go here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_PLUGIN_DESTINATION hack/plugins )
2011-08-14 00:42:21 -06:00
# dfhack header files go here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_INCLUDES_DESTINATION hack/include )
2012-03-31 05:40:54 -06:00
# dfhack lua files go here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_LUA_DESTINATION hack/lua )
2011-08-14 00:42:21 -06:00
# the windows .lib file goes here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_DEVLIB_DESTINATION hack )
2011-08-14 00:42:21 -06:00
# user documentation goes here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_USERDOC_DESTINATION hack )
2011-08-14 00:42:21 -06:00
# developer documentation goes here:
2019-07-16 20:19:11 -06:00
set ( DFHACK_DEVDOC_DESTINATION hack )
# some options for the user/developer to play with
option ( BUILD_LIBRARY "Build the library that goes into DF." ON )
option ( BUILD_PLUGINS "Build the plugins." ON )
set ( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
if ( UNIX )
## flags for GCC
# default to hidden symbols
# build 32bit
# ensure compatibility with older CPUs
# enable C++11 features
add_definitions ( -DLINUX_BUILD )
add_definitions ( -D_GLIBCXX_USE_C99 )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g -Wall -Wno-unused-variable" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -mtune=generic" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -mtune=generic" )
if ( DFHACK_BUILD_64 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -mno-avx" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -mno-avx" )
else ( )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -march=i686" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686" )
endif ( )
string ( REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
elseif ( MSVC )
# for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od" )
string ( REPLACE "/O2" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
string ( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
endif ( )
2011-11-06 13:16:16 -07:00
2012-03-13 07:46:48 -06:00
# use shared libraries for protobuf
2019-07-16 20:19:11 -06:00
add_definitions ( -DPROTOBUF_USE_DLLS )
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 ( )
2016-07-27 19:43:38 -06:00
#### download depends ####
2012-03-13 07:46:48 -06:00
2016-08-08 14:49:22 -06:00
include ( CMake/DownloadFile.cmake )
2016-07-27 19:08:24 -06:00
if ( WIN32 )
2019-07-16 20:19:11 -06:00
# Download zlib on Windows
set ( ZLIB_DOWNLOAD_DIR ${ CMAKE_SOURCE_DIR } /depends/zlib/lib/win ${ DFHACK_BUILD_ARCH } )
if ( ${ DFHACK_BUILD_ARCH } STREQUAL "64" )
download_file ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-zlib.lib"
$ { Z L I B _ D O W N L O A D _ D I R } / z l i b . l i b
" a 3 b 2 f c 6 b 6 8 e f a f a 8 9 b 0 8 8 2 e 3 5 4 f c 8 4 1 8 " )
else ( )
download_file ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-zlib.lib"
$ { Z L I B _ D O W N L O A D _ D I R } / z l i b . l i b
" f 4 e b a a 2 1 d 9 d e 2 8 5 6 6 e 8 8 b 1 e d f c d f f 9 0 1 " )
endif ( )
2016-07-27 19:08:24 -06:00
2019-07-16 20:19:11 -06:00
# Move zlib to the build folder so possible 32 and 64-bit builds
# in the same source tree don't conflict
file ( COPY ${ CMAKE_SOURCE_DIR } /depends/zlib
D E S T I N A T I O N $ { C M A K E _ B I N A R Y _ D I R } / d e p e n d s / )
file ( COPY ${ ZLIB_DOWNLOAD_DIR } /zlib.lib
D E S T I N A T I O N $ { C M A K E _ B I N A R Y _ D I R } / d e p e n d s / z l i b / l i b / )
# Do the same for SDLreal.dll
# (DFHack doesn't require this at build time, so no need to move it to the build folder)
set ( SDLREAL_DOWNLOAD_DIR ${ CMAKE_SOURCE_DIR } /package/windows/win ${ DFHACK_BUILD_ARCH } )
if ( ${ DFHACK_BUILD_ARCH } STREQUAL "64" )
download_file ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-SDL.dll"
$ { S D L R E A L _ D O W N L O A D _ D I R } / S D L r e a l . d l l
" 1 a e 2 4 2 c 4 b 9 4 c b 0 3 7 5 6 a 1 2 8 8 1 2 2 a 6 6 f a f " )
2018-04-04 17:45:44 -06:00
else ( )
2019-07-16 20:19:11 -06:00
download_file ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-SDL.dll"
$ { S D L R E A L _ D O W N L O A D _ D I R } / S D L r e a l . d l l
" 5 a 0 9 6 0 4 d a c a 6 b 2 b 5 c e 0 4 9 d 7 9 a f 9 3 5 d 6 a " )
2018-04-04 17:45:44 -06:00
endif ( )
2019-07-16 20:19:11 -06:00
endif ( )
2018-04-04 17:45:44 -06:00
2019-07-16 20:19:11 -06:00
if ( APPLE )
# libstdc++ (GCC 4.8.5 for OS X 10.6)
# fixes crash-on-unwind bug in DF's libstdc++
set ( LIBSTDCXX_DOWNLOAD_DIR ${ CMAKE_SOURCE_DIR } /package/darwin/osx ${ DFHACK_BUILD_ARCH } )
2018-04-04 17:45:44 -06:00
2019-07-16 20:19:11 -06:00
if ( ${ GCC_VERSION_OUT } VERSION_LESS "4.9" )
set ( LIBSTDCXX_GCC_VER "48" )
2018-04-04 17:45:44 -06:00
else ( )
2019-07-16 20:19:11 -06:00
set ( LIBSTDCXX_GCC_VER "7" )
set ( LIBSTDCXX_DOWNLOAD_DIR "${LIBSTDCXX_DOWNLOAD_DIR}-gcc7" )
endif ( )
if ( ${ DFHACK_BUILD_ARCH } STREQUAL "64" )
if ( ${ LIBSTDCXX_GCC_VER } STREQUAL "48" )
download_file_unzip ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/osx64-gcc48-libstdcxx.6.dylib.gz"
" g z "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b . g z
" c f 2 6 e d 5 8 8 b e 8 e 8 3 c 8 e 3 a 4 9 9 1 9 7 9 3 b 4 1 6 "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b
" 1 6 d c 6 d b d 4 e c d e 7 f 9 b 9 5 b b 6 d c 9 1 f 0 7 4 0 4 " )
else ( )
# GCC 7
download_file_unzip ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/osx64-gcc7-libstdcxx.6.dylib.gz"
" g z "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b . g z
" 8 1 3 1 4 b 7 8 4 6 f 9 e 8 8 0 6 4 0 9 b e f 2 1 6 0 c 7 6 e 6 "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b
" 9 3 b 6 c f 4 b 0 1 e 9 a 9 0 8 4 a 5 0 8 f d 6 a 4 a 8 8 9 9 2 " )
endif ( )
else ( ) # 32-bit
if ( ${ LIBSTDCXX_GCC_VER } STREQUAL "48" )
download_file_unzip ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/osx32-gcc48-libstdcxx.6.dylib.gz"
" g z "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b . g z
" 4 0 f 3 d 8 3 8 7 1 b 1 1 4 f 0 2 7 9 2 4 0 6 2 6 3 1 1 6 2 1 b "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b
" c 3 f 5 6 7 8 b 8 2 0 4 9 1 7 e 0 3 8 7 0 8 3 4 9 0 2 c 3 e 8 b " )
else ( )
# GCC 7
download_file_unzip ( "https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/osx32-gcc7-libstdcxx.6.dylib.gz"
" g z "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b . g z
" d b d 2 1 3 1 7 1 f 6 6 e d b 9 0 d 2 0 4 d 5 2 5 f 1 0 c 9 6 9 "
$ { L I B S T D C X X _ D O W N L O A D _ D I R } / l i b s t d c + + . 6 . d y l i b
" b 1 4 c 8 5 7 e 7 e 4 8 5 a 0 9 7 c 7 0 a 9 c c d 3 1 3 2 d a 7 " )
endif ( )
2018-04-04 17:45:44 -06:00
endif ( )
2018-04-04 18:01:27 -06:00
2019-07-20 13:15:39 -06:00
if ( NOT EXTERNAL_LIBSTDCXX )
install ( PROGRAMS ${ LIBSTDCXX_DOWNLOAD_DIR } /libstdc++.6.dylib
D E S T I N A T I O N . / h a c k / )
endif ( )
2016-07-27 19:43:38 -06:00
endif ( )
#### expose depends ####
2016-09-15 08:24:57 -06:00
if ( UNIX )
# Rescan for pthread and zlib if the build arch changed
if ( NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}" )
unset ( ZLIB_LIBRARY CACHE )
unset ( CMAKE_HAVE_PTHREAD_H CACHE )
endif ( )
endif ( )
2016-07-27 19:43:38 -06:00
2012-03-10 07:31:46 -07:00
# find and make available libz
2016-07-27 19:08:24 -06:00
if ( NOT UNIX ) # Windows
# zlib is in here so 32-bit and 64-bit builds in the same source tree are possible
2016-08-09 17:10:38 -06:00
set ( ZLIB_ROOT ${ CMAKE_BINARY_DIR } /depends/zlib/ )
2016-01-17 21:04:08 -07:00
else ( )
2016-08-09 17:10:38 -06:00
if ( NOT APPLE AND DFHACK_BUILD_32 )
# 32-bit Linux
set ( ZLIB_ROOT /usr/lib/i386-linux-gnu )
endif ( )
2012-03-10 07:31:46 -07:00
endif ( )
2016-07-27 19:08:24 -06:00
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 )
2016-06-26 17:48:55 -06:00
# Support linking against external tinyxml
# If we find an external tinyxml, set the DFHACK_TINYXML variable to "tinyxml"
# Otherwise, set it to "dfhack-tinyxml"
option ( EXTERNAL_TINYXML "Choose to link against external TinyXML" OFF )
if ( EXTERNAL_TINYXML )
find_package ( TinyXML REQUIRED )
if ( NOT TinyXML_FOUND )
message ( SEND_ERROR "Could not find an external TinyXML, consider setting EXTERNAL_TINYXML to OFF." )
endif ( )
2019-07-16 20:19:11 -06:00
set ( DFHACK_TINYXML "tinyxml" )
2016-06-26 17:48:55 -06:00
else ( )
include_directories ( depends/tinyxml )
2019-07-16 20:19:11 -06:00
set ( DFHACK_TINYXML "dfhack-tinyxml" )
2016-06-26 17:48:55 -06:00
endif ( )
2021-02-24 17:23:15 -07:00
include_directories ( depends/lodepng )
2012-03-13 07:46:48 -06:00
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 )
2020-09-17 22:33:41 -06:00
include_directories ( depends/xlsxio/include )
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
2019-07-16 20:19:11 -06:00
if ( BUILD_LIBRARY )
add_subdirectory ( library )
2021-03-06 10:43:31 -07:00
install ( FILES LICENSE.rst DESTINATION ${ DFHACK_USERDOC_DESTINATION } )
install ( FILES docs/changelog-placeholder.txt DESTINATION ${ DFHACK_USERDOC_DESTINATION } RENAME changelog.txt )
2011-03-18 09:47:55 -06:00
endif ( )
2010-08-15 16:45:02 -06:00
2017-08-21 17:34:46 -06:00
file ( WRITE "${CMAKE_BINARY_DIR}/dfhack_setarch.txt" ${ DFHACK_SETARCH } )
install ( FILES "${CMAKE_BINARY_DIR}/dfhack_setarch.txt" DESTINATION "${DFHACK_DATA_DESTINATION}" )
2015-06-18 06:59:01 -06:00
install ( DIRECTORY dfhack-config/ DESTINATION dfhack-config/default )
2019-07-16 20:19:11 -06:00
# build the plugins
if ( BUILD_PLUGINS )
add_subdirectory ( plugins )
2011-06-19 20:29:38 -06:00
endif ( )
2011-03-17 17:07:40 -06:00
2020-07-18 09:54:24 -06:00
add_subdirectory ( data )
2016-06-29 17:38:15 -06:00
add_subdirectory ( scripts )
2015-11-10 15:00:49 -07:00
find_package ( Sphinx QUIET )
2019-07-16 20:19:11 -06:00
if ( BUILD_DOCS )
if ( NOT SPHINX_FOUND )
message ( SEND_ERROR "Sphinx not found but BUILD_DOCS enabled" )
endif ( )
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 "
2020-10-07 15:01:22 -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 / g u i d e s / * . r s t "
2019-07-16 20:19:11 -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 / c h a n g e l o g . t x 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 / g e n _ c h a n g e l o g . p y "
" $ { 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 "
" $ { 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 / * "
" $ { 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 "
" $ { 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 "
)
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 "
)
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 } / C M a k e L i s t s . t x t "
)
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 }
- a - E - q - b h t m l
" $ { 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 _ C U R R E N T _ S O U R C E _ D I R } / d o c s / h t m l "
- 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 "
- j 2
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 } )
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 )
install ( FILES docs/_auto/news.rst docs/_auto/news-dev.rst DESTINATION ${ DFHACK_USERDOC_DESTINATION } )
install ( FILES "README.html" DESTINATION "${DFHACK_DATA_DESTINATION}" )
2015-09-24 00:04:09 -06:00
endif ( )
2020-03-21 00:38:44 -06:00
option ( BUILD_TESTS "Include tests (currently just installs Lua tests into the scripts folder)" OFF )
if ( BUILD_TESTS )
install ( DIRECTORY ${ dfhack_SOURCE_DIR } /test
D E S T I N A T I O N $ { D F H A C K _ D A T A _ D E S T I N A T I O N } / s c r i p t s )
endif ( )
2011-06-19 17:12:07 -06:00
# Packaging with CPack!
2019-07-16 20:19:11 -06:00
set ( DFHACK_PACKAGE_SUFFIX "" )
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 )
2019-07-16 20:19:11 -06:00
set ( DFHACK_PACKAGE_SUFFIX "-gcc-${GCC_VERSION}" )
set ( CPACK_GENERATOR "TBZ2" )
elseif ( WIN32 )
set ( CPACK_GENERATOR "ZIP" )
endif ( )
2011-08-14 17:30:15 -06:00
set ( CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0 )
2019-07-16 20:19:11 -06:00
if ( APPLE )
2015-01-07 14:03:24 -07:00
set ( DFHACK_PACKAGE_PLATFORM_NAME OSX )
2019-07-16 20:19:11 -06:00
else ( )
2015-01-07 14:03:24 -07:00
set ( DFHACK_PACKAGE_PLATFORM_NAME ${ CMAKE_SYSTEM_NAME } )
2019-07-16 20:19:11 -06:00
endif ( )
2018-07-11 09:47:55 -06:00
# set on command line
if ( DFHACK_BUILD_ID STREQUAL "" )
2019-07-16 20:19:11 -06:00
set ( DFHACK_BUILD_ID_PACKAGE "" )
2018-07-11 09:47:55 -06:00
else ( )
2019-07-16 20:19:11 -06:00
set ( DFHACK_BUILD_ID_PACKAGE "${DFHACK_BUILD_ID}-" )
2018-07-11 09:47:55 -06:00
endif ( )
2020-03-21 00:42:12 -06:00
set ( CPACK_PACKAGE_FILE_NAME "dfhack-${DFHACK_VERSION}-${DFHACK_BUILD_ID_PACKAGE}${DFHACK_PACKAGE_PLATFORM_NAME}-${DFHACK_BUILD_ARCH}bit${DFHACK_PACKAGE_SUFFIX}" )
2019-07-16 20:19:11 -06:00
include ( CPack )
option ( DFHACK_INCLUDE_CORE "Download and include Dwarf Fortress core files in DFHack. Useful for local testing, but should not be used in releases." OFF )
if ( DFHACK_INCLUDE_CORE )
string ( REPLACE "." "_" DF_CORE_FILENAME "${DF_VERSION}" )
string ( REGEX REPLACE "^0_" "df_" DF_CORE_FILENAME "${DF_CORE_FILENAME}" )
if ( UNIX )
if ( APPLE )
string ( APPEND DF_CORE_FILENAME "_osx" )
else ( )
string ( APPEND DF_CORE_FILENAME "_linux" )
endif ( )
if ( DFHACK_BUILD_32 )
string ( APPEND DF_CORE_FILENAME "32" )
endif ( )
string ( APPEND DF_CORE_FILENAME ".tar.bz2" )
else ( )
string ( APPEND DF_CORE_FILENAME "_win" )
if ( DFHACK_BUILD_32 )
string ( APPEND DF_CORE_FILENAME "32" )
endif ( )
string ( APPEND DF_CORE_FILENAME ".zip" )
endif ( )
set ( DF_CORE_URL "http://bay12games.com/dwarves/${DF_CORE_FILENAME}" )
if ( NOT EXISTS "${CMAKE_BINARY_DIR}/${DF_CORE_FILENAME}" )
file ( DOWNLOAD "${DF_CORE_URL}" "${CMAKE_BINARY_DIR}/${DF_CORE_FILENAME}" SHOW_PROGRESS )
endif ( )
file ( REMOVE_RECURSE "${CMAKE_BINARY_DIR}/df-core" )
file ( MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/df-core" )
if ( UNIX )
2018-07-20 12:29:18 -06:00
execute_process ( COMMAND ${ CMAKE_COMMAND } -E tar xjf "../${DF_CORE_FILENAME}" --strip-components=1
2019-07-16 20:19:11 -06:00
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ B I N A R Y _ D I R } / d f - c o r e " )
else ( )
2018-07-20 12:29:18 -06:00
execute_process ( COMMAND ${ CMAKE_COMMAND } -E tar xf "../${DF_CORE_FILENAME}" --format=zip
2019-07-16 20:19:11 -06:00
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ B I N A R Y _ D I R } / d f - c o r e " )
file ( REMOVE "${CMAKE_BINARY_DIR}/df-core/SDL.dll" )
endif ( )
install ( DIRECTORY "${CMAKE_BINARY_DIR}/df-core/"
D E S T I N A T I O N . )
endif ( )
2016-09-15 08:24:57 -06:00
# Store old build arch
2019-07-16 20:19:11 -06:00
set ( DFHACK_BUILD_ARCH_PREV "${DFHACK_BUILD_ARCH}" CACHE STRING "Previous build architecture" FORCE )
2020-02-08 19:17:53 -07:00
option ( BUILD_SIZECHECK "Build the sizecheck library, for research" OFF )
if ( BUILD_SIZECHECK )
add_subdirectory ( depends/sizecheck )
add_dependencies ( dfhack sizecheck )
endif ( )