2009-05-01 21:17:01 +00:00
if ( EXISTS ${ CMAKE_SOURCE_DIR } / ${ CMAKE_PROJECT_NAME } .cmake )
include ( ${ CMAKE_SOURCE_DIR } / ${ CMAKE_PROJECT_NAME } .cmake )
endif ( )
# prevent build in source directory
2018-05-23 13:28:25 +02:00
if ( "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}" )
message ( SEND_ERROR "Building in the source directory is not supported." )
message ( FATAL_ERROR "Please remove the created \" CMakeCache.txt\ " file, the \" CMakeFiles\ " directory and create a build directory and call \" ${ CMAKE_COMMAND } <path to the sources>\ "." )
endif ( "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}" )
2009-05-01 21:17:01 +00:00
# allow only Debug and Release builds
2016-07-06 08:31:54 +02:00
set ( CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" )
2009-05-01 21:17:01 +00:00
mark_as_advanced ( CMAKE_CONFIGURATION_TYPES )
# set Debus as default build target
if ( NOT CMAKE_BUILD_TYPE )
set ( CMAKE_BUILD_TYPE Debug CACHE STRING
" C h o o s e t h e t y p e o f b u i l d , o p t i o n s a r e : D e b u g , R e l e a s e . "
F O R C E )
endif ( )
# create our output directroy
if ( NOT EXISTS ${ CMAKE_BINARY_DIR } /Build )
file ( MAKE_DIRECTORY ${ CMAKE_BINARY_DIR } /Build )
endif ( )
# read version from file
macro ( acg_get_version )
2009-06-23 15:53:32 +00:00
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION" )
file ( READ "${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION" _file )
else ( )
file ( READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" _file )
endif ( )
string (
R E G E X R E P L A C E
" ^ . * I D = ( [ ^ \ n ] * ) . * $ " " \ \ 1 "
_ i d $ { _ f i l e }
)
2009-05-01 21:17:01 +00:00
string (
R E G E X R E P L A C E
" ^ . * V E R S I O N = ( [ ^ \ n ] * ) . * $ " " \ \ 1 "
_ v e r s i o n $ { _ f i l e }
)
string (
R E G E X R E P L A C E
" ^ . * M A J O R = ( [ ^ \ n ] * ) . * $ " " \ \ 1 "
_ m a j o r $ { _ f i l e }
)
string (
R E G E X R E P L A C E
" ^ . * M I N O R = ( [ ^ \ n ] * ) . * $ " " \ \ 1 "
_ m i n o r $ { _ f i l e }
)
string (
R E G E X R E P L A C E
" ^ . * P A T C H = ( [ ^ \ n ] * ) . * $ " " \ \ 1 "
_ p a t c h $ { _ f i l e }
)
2009-06-23 15:53:32 +00:00
set ( ${ _id } _VERSION ${ _version } )
set ( ${ _id } _VERSION_MAJOR ${ _major } )
set ( ${ _id } _VERSION_MINOR ${ _minor } )
set ( ${ _id } _VERSION_PATCH ${ _patch } )
2009-05-01 21:17:01 +00:00
endmacro ( )
# set directory structures for the different platforms
2016-05-09 11:15:25 +02:00
if ( CMAKE_HOST_SYSTEM_NAME MATCHES Windows )
2009-05-01 21:17:01 +00:00
set ( ACG_PROJECT_DATADIR "." )
2009-06-04 14:41:31 +00:00
set ( ACG_PROJECT_LIBDIR "lib" )
set ( ACG_PROJECT_BINDIR "." )
2009-05-01 21:17:01 +00:00
set ( ACG_PROJECT_PLUGINDIR "Plugins" )
2009-06-04 14:41:31 +00:00
if ( NOT EXISTS ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_LIBDIR } )
file ( MAKE_DIRECTORY ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_LIBDIR } )
2009-05-01 21:17:01 +00:00
endif ( )
2011-08-31 12:06:29 +00:00
elseif ( APPLE )
set ( ACG_PROJECT_DATADIR "share/${CMAKE_PROJECT_NAME}" )
2014-08-27 10:09:29 +00:00
set ( ACG_PROJECT_LIBDIR "lib${LIB_SUFFIX}" )
2011-08-31 12:06:29 +00:00
set ( CMAKE_LIBRARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}" )
2014-08-27 10:09:29 +00:00
set ( ACG_PROJECT_PLUGINDIR "${ACG_PROJECT_LIBDIR}/plugins" )
2011-08-31 12:06:29 +00:00
set ( ACG_PROJECT_BINDIR "bin" )
2009-05-01 21:17:01 +00:00
else ( )
set ( ACG_PROJECT_DATADIR "share/${CMAKE_PROJECT_NAME}" )
2014-08-27 10:09:29 +00:00
set ( ACG_PROJECT_LIBDIR "lib${LIB_SUFFIX}" )
set ( ACG_PROJECT_PLUGINDIR "${ACG_PROJECT_LIBDIR}/plugins" )
2009-05-01 21:17:01 +00:00
set ( ACG_PROJECT_BINDIR "bin" )
endif ( )
2010-05-06 09:59:35 +00:00
if ( NOT APPLE )
# check 64 bit
if ( CMAKE_SIZEOF_VOID_P MATCHES 4 )
set ( HAVE_64_BIT 0 )
else ( CMAKE_SIZEOF_VOID_P MATCHES 4 )
set ( HAVE_64_BIT 1 )
endif ( CMAKE_SIZEOF_VOID_P MATCHES 4 )
endif ( NOT APPLE )
2009-05-01 21:17:01 +00:00
# allow a project to modify the directories
if ( COMMAND acg_modify_project_dirs )
acg_modify_project_dirs ( )
endif ( )
2009-06-23 15:53:32 +00:00
if ( NOT EXISTS ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_DATADIR } )
file ( MAKE_DIRECTORY ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_DATADIR } )
endif ( )
2009-05-01 21:17:01 +00:00
# sets default build properties
macro ( acg_set_target_props target )
if ( WIN32 )
set_target_properties (
$ { t a r g e t } P R O P E R T I E S
B U I L D _ W I T H _ I N S T A L L _ R P A T H 1
S K I P _ B U I L D _ R P A T H 0
)
elseif ( APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE )
2014-08-27 12:39:29 +00:00
if ( NOT ( CMAKE_MAJOR_VERSION LESS 3 ) )
# save rpath
set_target_properties (
$ { t a r g e t } P R O P E R T I E S
I N S T A L L _ R P A T H " @ e x e c u t a b l e _ p a t h / . . / $ { A C G _ P R O J E C T _ L I B D I R } "
M A C O S X _ R P A T H 1
#BUILD_WITH_INSTALL_RPATH 1
S K I P _ B U I L D _ R P A T H 0
)
else ( )
# save rpath via install name dir
set_target_properties (
$ { t a r g e t } P R O P E R T I E S
I N S T A L L _ N A M E _ D I R " @ e x e c u t a b l e _ p a t h / . . / $ { A C G _ P R O J E C T _ L I B D I R } "
#BUILD_WITH_INSTALL_RPATH 1
S K I P _ B U I L D _ R P A T H 0
)
2018-05-23 13:28:25 +02:00
endif ( NOT ( CMAKE_MAJOR_VERSION LESS 3 ) )
2009-05-01 21:17:01 +00:00
elseif ( NOT APPLE )
2010-05-06 09:59:35 +00:00
2009-05-01 21:17:01 +00:00
set_target_properties (
$ { t a r g e t } P R O P E R T I E S
2014-08-27 10:09:29 +00:00
I N S T A L L _ R P A T H " $ O R I G I N / . . / $ { A C G _ P R O J E C T _ L I B D I R } "
2009-05-01 21:17:01 +00:00
B U I L D _ W I T H _ I N S T A L L _ R P A T H 1
S K I P _ B U I L D _ R P A T H 0
R U N T I M E _ O U T P U T _ D I R E C T O R Y " $ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ B I N D I R } "
L I B R A R Y _ O U T P U T _ D I R E C T O R Y " $ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ L I B D I R } "
)
endif ( )
endmacro ( )
include ( AddFileDependencies )
include ( ACGCompiler )
# define INCLUDE_TEMPLATES for everything we build
add_definitions ( -DINCLUDE_TEMPLATES )
# unsets the given variable
macro ( acg_unset var )
set ( ${ var } "" CACHE INTERNAL "" )
endmacro ( )
# sets the given variable
macro ( acg_set var value )
set ( ${ var } ${ value } CACHE INTERNAL "" )
endmacro ( )
# test for OpenMP
macro ( acg_openmp )
if ( NOT OPENMP_NOTFOUND )
2018-05-23 13:28:25 +02:00
find_package ( OpenMP )
if ( OPENMP_FOUND )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" )
add_definitions ( -DUSE_OPENMP )
2009-05-01 21:17:01 +00:00
else ( )
set ( OPENMP_NOTFOUND 1 )
2018-05-23 13:28:25 +02:00
endif ( )
2009-05-01 21:17:01 +00:00
endif ( )
endmacro ( )
# test for FTGL
macro ( acg_ftgl )
find_package ( Freetype )
if ( FREETYPE_FOUND )
find_package ( FTGL )
if ( FTGL_FOUND )
add_definitions ( -DUSE_FTGL )
include_directories ( ${ FTGL_INCLUDE_DIR } ${ FREETYPE_INCLUDE_DIR_freetype2 } )
set ( FTGL_LIBS ${ FREETYPE_LIBRARIES } ${ FTGL_LIBRARIES } )
endif ( )
endif ( )
endmacro ( )
# append all files with extension "ext" in the "dirs" directories to "ret"
2010-07-08 16:20:44 +00:00
# excludes all files starting with a '.' (dot)
2009-05-01 21:17:01 +00:00
macro ( acg_append_files ret ext )
foreach ( _dir ${ ARGN } )
file ( GLOB _files "${_dir}/${ext}" )
2010-07-08 16:20:44 +00:00
foreach ( _file ${ _files } )
get_filename_component ( _filename ${ _file } NAME )
if ( _filename MATCHES "^[.]" )
list ( REMOVE_ITEM _files ${ _file } )
endif ( )
endforeach ( )
2009-05-01 21:17:01 +00:00
list ( APPEND ${ ret } ${ _files } )
endforeach ( )
endmacro ( )
# append all files with extension "ext" in the "dirs" directories and its subdirectories to "ret"
2010-07-08 16:20:44 +00:00
# excludes all files starting with a '.' (dot)
2009-05-01 21:17:01 +00:00
macro ( acg_append_files_recursive ret ext )
foreach ( _dir ${ ARGN } )
file ( GLOB_RECURSE _files "${_dir}/${ext}" )
2010-07-08 16:20:44 +00:00
foreach ( _file ${ _files } )
get_filename_component ( _filename ${ _file } NAME )
if ( _filename MATCHES "^[.]" )
list ( REMOVE_ITEM _files ${ _file } )
endif ( )
endforeach ( )
2009-05-01 21:17:01 +00:00
list ( APPEND ${ ret } ${ _files } )
endforeach ( )
endmacro ( )
2010-07-08 16:20:44 +00:00
2009-05-01 21:17:01 +00:00
# drop all "*T.cc" files from list
macro ( acg_drop_templates list )
foreach ( _file ${ ${list } } )
if ( _file MATCHES "T.cc$" )
list ( REMOVE_ITEM ${ list } ${ _file } )
endif ( )
endforeach ( )
endmacro ( )
# get all files in directory, but ignore svn
macro ( acg_get_files_in_dir ret dir )
file ( GLOB_RECURSE __files RELATIVE "${dir}" "${dir}/*" )
foreach ( _file ${ __files } )
2018-05-23 13:28:25 +02:00
if ( ( NOT _file MATCHES ".*svn.*" ) AND ( NOT _file MATCHES ".DS_Store" ) )
2009-05-01 21:17:01 +00:00
list ( APPEND ${ ret } "${_file}" )
endif ( )
endforeach ( )
endmacro ( )
# copy the whole directory without svn files
function ( acg_copy_after_build target src dst )
acg_unset ( _files )
acg_get_files_in_dir ( _files ${ src } )
foreach ( _file ${ _files } )
add_custom_command ( TARGET ${ target } POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y _ i f _ d i f f e r e n t " $ { s r c } / $ { _ f i l e } " " $ { d s t } / $ { _ f i l e } "
)
endforeach ( )
endfunction ( )
# install the whole directory without svn files
function ( acg_install_dir src dst )
acg_unset ( _files )
acg_get_files_in_dir ( _files ${ src } )
foreach ( _file ${ _files } )
get_filename_component ( _file_PATH ${ _file } PATH )
install ( FILES "${src}/${_file}"
D E S T I N A T I O N " $ { d s t } / $ { _ f i l e _ P A T H } "
)
endforeach ( )
endfunction ( )
# extended version of add_executable that also copies output to out Build directory
function ( acg_add_executable _target )
add_executable ( ${ _target } ${ ARGN } )
# set common target properties defined in common.cmake
acg_set_target_props ( ${ _target } )
2018-05-23 13:28:25 +02:00
2013-12-06 14:04:32 +00:00
if ( WIN32 OR ( APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE ) )
2009-05-01 21:17:01 +00:00
add_custom_command ( TARGET ${ _target } POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
2013-12-06 14:04:32 +00:00
$ < T A R G E T _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ B I N D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } > )
endif ( WIN32 OR ( APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE ) )
2009-06-22 07:07:19 +00:00
if ( NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE )
2009-05-01 21:17:01 +00:00
install ( TARGETS ${ _target } DESTINATION ${ ACG_PROJECT_BINDIR } )
endif ( )
endfunction ( )
# extended version of add_library that also copies output to out Build directory
2009-06-22 07:07:19 +00:00
function ( acg_add_library _target _libtype )
if ( ${ _libtype } STREQUAL SHAREDANDSTATIC )
set ( _type SHARED )
2016-05-30 14:00:43 +02:00
if ( NOT WIN32 OR MINGW )
2009-06-22 07:07:19 +00:00
set ( _and_static 1 )
else ( )
set ( _and_static 0 )
endif ( )
else ( )
set ( _type ${ _libtype } )
set ( _and_static 0 )
endif ( )
2009-06-23 07:12:50 +00:00
add_library ( ${ _target } ${ _type } ${ ARGN } )
2009-05-01 21:17:01 +00:00
# set common target properties defined in common.cmake
acg_set_target_props ( ${ _target } )
2009-06-22 07:07:19 +00:00
if ( _and_static )
add_library ( ${ _target } Static STATIC ${ ARGN } )
# set common target properties defined in common.cmake
acg_set_target_props ( ${ _target } Static )
2014-08-27 10:23:44 +00:00
set_target_properties ( ${ _target } Static PROPERTIES OUTPUT_NAME ${ _target } )
2009-06-22 07:07:19 +00:00
if ( NOT APPLE )
set_target_properties ( ${ _target } Static PROPERTIES
2009-06-23 07:12:50 +00:00
L I B R A R Y _ O U T P U T _ D I R E C T O R Y " $ { C M A K E _ L I B R A R Y _ O U T P U T _ D I R E C T O R Y } "
)
2009-06-22 07:07:19 +00:00
endif ( )
endif ( )
2016-05-30 14:00:43 +02:00
if ( ( WIN32 AND MSVC ) OR ( APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE ) )
2009-05-01 21:17:01 +00:00
if ( ${ _type } STREQUAL SHARED )
add_custom_command ( TARGET ${ _target } POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
2013-12-06 14:04:32 +00:00
$ < T A R G E T _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ L I B D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } > )
2018-05-23 13:28:25 +02:00
add_custom_command ( TARGET ${ _target } POST_BUILD
2009-05-01 21:17:01 +00:00
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
2013-12-06 14:04:32 +00:00
$ < T A R G E T _ L I N K E R _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ L I B D I R } / $ < T A R G E T _ L I N K E R _ F I L E _ N A M E : $ { _ t a r g e t } > )
2009-05-01 21:17:01 +00:00
elseif ( ${ _type } STREQUAL MODULE )
if ( NOT EXISTS ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_PLUGINDIR } )
file ( MAKE_DIRECTORY ${ CMAKE_BINARY_DIR } /Build/ ${ ACG_PROJECT_PLUGINDIR } )
endif ( )
2009-06-04 13:43:35 +00:00
add_custom_command ( TARGET ${ _target } POST_BUILD
2009-05-01 21:17:01 +00:00
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
2013-12-06 14:04:32 +00:00
$ < T A R G E T _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ P L U G I N D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } > )
2009-06-22 07:07:19 +00:00
elseif ( ${ _type } STREQUAL STATIC )
2018-05-23 13:28:25 +02:00
add_custom_command ( TARGET ${ _target } POST_BUILD
2009-06-22 07:07:19 +00:00
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
2013-12-06 14:04:32 +00:00
$ < T A R G E T _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ L I B D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } > )
2018-05-23 13:28:25 +02:00
endif ( )
# make an extra copy for windows into the binary directory
2013-12-06 14:04:32 +00:00
if ( ${ _type } STREQUAL SHARED AND WIN32 )
add_custom_command ( TARGET ${ _target } POST_BUILD
2009-06-22 07:07:19 +00:00
C O M M A N D $ { C M A K E _ C O M M A N D } - E
2013-12-06 14:04:32 +00:00
c o p y _ i f _ d i f f e r e n t
$ < T A R G E T _ F I L E : $ { _ t a r g e t } >
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ B I N D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } > )
2018-05-23 13:28:25 +02:00
endif ( )
2013-12-06 14:04:32 +00:00
2016-05-30 14:00:43 +02:00
endif ( ( WIN32 AND MSVC ) OR ( APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE ) )
2013-12-06 14:04:32 +00:00
if ( _and_static )
2013-12-06 14:38:54 +00:00
add_custom_command ( TARGET ${ _target } Static POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E
c o p y _ i f _ d i f f e r e n t
$ < T A R G E T _ F I L E : $ { _ t a r g e t } S t a t i c >
2014-08-27 10:23:44 +00:00
$ { C M A K E _ B I N A R Y _ D I R } / B u i l d / $ { A C G _ P R O J E C T _ L I B D I R } / $ < T A R G E T _ F I L E _ N A M E : $ { _ t a r g e t } S t a t i c > )
2009-06-22 07:07:19 +00:00
2009-05-01 21:17:01 +00:00
endif ( )
2011-01-28 10:28:43 +00:00
# Block installation of libraries by setting ACG_NO_LIBRARY_INSTALL
if ( NOT ACG_NO_LIBRARY_INSTALL )
if ( NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE )
if ( ${ _type } STREQUAL SHARED OR ${ _type } STREQUAL STATIC )
install ( TARGETS ${ _target }
R U N T I M E D E S T I N A T I O N $ { A C G _ P R O J E C T _ B I N D I R }
L I B R A R Y D E S T I N A T I O N $ { A C G _ P R O J E C T _ L I B D I R }
A R C H I V E D E S T I N A T I O N $ { A C G _ P R O J E C T _ L I B D I R } )
if ( _and_static )
2014-08-27 10:23:44 +00:00
install ( TARGETS ${ _target } Static
D E S T I N A T I O N $ { A C G _ P R O J E C T _ L I B D I R } )
2011-01-28 10:28:43 +00:00
endif ( )
elseif ( ${ _type } STREQUAL MODULE )
install ( TARGETS ${ _target } DESTINATION ${ ACG_PROJECT_PLUGINDIR } )
2009-06-24 09:49:14 +00:00
endif ( )
2009-05-01 21:17:01 +00:00
endif ( )
2011-01-28 10:28:43 +00:00
endif ( )
2010-05-06 09:59:35 +00:00
endfunction ( )