2012-05-27 13:22:43 +00:00
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# The Original Code is Copyright (C) 2006, Blender Foundation
# All rights reserved.
# ***** END GPL LICENSE BLOCK *****
2011-06-19 06:57:56 +00:00
2012-07-16 08:26:42 +00:00
macro ( list_insert_after
2019-04-17 04:35:54 +00:00
l i s t _ i d i t e m _ c h e c k i t e m _ a d d
)
set ( _index )
list ( FIND "${list_id}" "${item_check}" _index )
if ( "${_index}" MATCHES "-1" )
message ( FATAL_ERROR "'${list_id}' doesn't contain '${item_check}'" )
endif ( )
math ( EXPR _index "${_index} + 1" )
list ( INSERT ${ list_id } "${_index}" ${ item_add } )
unset ( _index )
2012-07-16 08:26:42 +00:00
endmacro ( )
macro ( list_insert_before
2019-04-17 04:35:54 +00:00
l i s t _ i d i t e m _ c h e c k i t e m _ a d d
)
set ( _index )
list ( FIND "${list_id}" "${item_check}" _index )
if ( "${_index}" MATCHES "-1" )
message ( FATAL_ERROR "'${list_id}' doesn't contain '${item_check}'" )
endif ( )
list ( INSERT ${ list_id } "${_index}" ${ item_add } )
unset ( _index )
2012-07-16 08:26:42 +00:00
endmacro ( )
2015-06-30 12:44:27 +00:00
function ( list_assert_duplicates
2019-04-17 04:35:54 +00:00
l i s t _ i d
)
# message(STATUS "list data: ${list_id}")
list ( LENGTH list_id _len_before )
list ( REMOVE_DUPLICATES list_id )
list ( LENGTH list_id _len_after )
# message(STATUS "list size ${_len_before} -> ${_len_after}")
if ( NOT _len_before EQUAL _len_after )
message ( FATAL_ERROR "duplicate found in list which should not contain duplicates: ${list_id}" )
endif ( )
unset ( _len_before )
unset ( _len_after )
2013-10-25 06:21:38 +00:00
endfunction ( )
2011-06-19 06:57:56 +00:00
# foo_bar.spam --> foo_barMySuffix.spam
macro ( file_suffix
2019-04-17 04:35:54 +00:00
f i l e _ n a m e _ n e w f i l e _ n a m e f i l e _ s u f f i x
)
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
get_filename_component ( _file_name_PATH ${ file_name } PATH )
get_filename_component ( _file_name_NAME_WE ${ file_name } NAME_WE )
get_filename_component ( _file_name_EXT ${ file_name } EXT )
set ( ${ file_name_new } "${_file_name_PATH}/${_file_name_NAME_WE}${file_suffix}${_file_name_EXT}" )
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
unset ( _file_name_PATH )
unset ( _file_name_NAME_WE )
unset ( _file_name_EXT )
2011-06-19 06:57:56 +00:00
endmacro ( )
2011-10-23 17:52:20 +00:00
# useful for adding debug suffix to library lists:
2011-06-19 06:57:56 +00:00
# /somepath/foo.lib --> /somepath/foo_d.lib
macro ( file_list_suffix
2019-04-17 04:35:54 +00:00
f p _ l i s t _ n e w f p _ l i s t f n _ s u f f i x
)
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
# incase of empty list
set ( _fp )
set ( _fp_suffixed )
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
set ( fp_list_new )
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
foreach ( _fp ${ fp_list } )
file_suffix ( _fp_suffixed "${_fp}" "${fn_suffix}" )
list ( APPEND "${fp_list_new}" "${_fp_suffixed}" )
endforeach ( )
2011-06-19 06:57:56 +00:00
2019-04-17 04:35:54 +00:00
unset ( _fp )
unset ( _fp_suffixed )
2011-06-19 06:57:56 +00:00
endmacro ( )
2015-12-02 13:09:06 +00:00
if ( UNIX AND NOT APPLE )
2019-04-17 04:35:54 +00:00
macro ( find_package_static )
set ( _cmake_find_library_suffixes_back ${ CMAKE_FIND_LIBRARY_SUFFIXES } )
set ( CMAKE_FIND_LIBRARY_SUFFIXES .a ${ CMAKE_FIND_LIBRARY_SUFFIXES } )
find_package ( ${ ARGV } )
set ( CMAKE_FIND_LIBRARY_SUFFIXES ${ _cmake_find_library_suffixes_back } )
unset ( _cmake_find_library_suffixes_back )
endmacro ( )
macro ( find_library_static )
set ( _cmake_find_library_suffixes_back ${ CMAKE_FIND_LIBRARY_SUFFIXES } )
set ( CMAKE_FIND_LIBRARY_SUFFIXES .a ${ CMAKE_FIND_LIBRARY_SUFFIXES } )
find_library ( ${ ARGV } )
set ( CMAKE_FIND_LIBRARY_SUFFIXES ${ _cmake_find_library_suffixes_back } )
unset ( _cmake_find_library_suffixes_back )
endmacro ( )
2015-12-02 13:09:06 +00:00
endif ( )
2011-06-26 17:18:37 +00:00
2015-06-16 23:16:17 +00:00
function ( target_link_libraries_optimized
2019-04-17 04:35:54 +00:00
T A R G E T
L I B S
)
2015-06-16 23:16:17 +00:00
2019-04-17 04:35:54 +00:00
foreach ( _LIB ${ LIBS } )
target_link_libraries ( ${ TARGET } optimized "${_LIB}" )
endforeach ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
function ( target_link_libraries_debug
2019-04-17 04:35:54 +00:00
T A R G E T
L I B S
)
2011-06-26 17:18:37 +00:00
2019-04-17 04:35:54 +00:00
foreach ( _LIB ${ LIBS } )
target_link_libraries ( ${ TARGET } debug "${_LIB}" )
endforeach ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-12-22 22:15:20 +00:00
# Nicer makefiles with -I/1/foo/ instead of -I/1/2/3/../../foo/
# use it instead of include_directories()
2015-06-16 23:16:17 +00:00
function ( blender_include_dirs
2019-04-17 04:35:54 +00:00
i n c l u d e s
)
set ( _ALL_INCS "" )
foreach ( _INC ${ ARGV } )
get_filename_component ( _ABS_INC ${ _INC } ABSOLUTE )
list ( APPEND _ALL_INCS ${ _ABS_INC } )
# for checking for invalid includes, disable for regular use
##if(NOT EXISTS "${_ABS_INC}/")
## message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
##endif()
endforeach ( )
include_directories ( ${ _ALL_INCS } )
2015-06-16 23:16:17 +00:00
endfunction ( )
function ( blender_include_dirs_sys
2019-04-17 04:35:54 +00:00
i n c l u d e s
)
set ( _ALL_INCS "" )
foreach ( _INC ${ ARGV } )
get_filename_component ( _ABS_INC ${ _INC } ABSOLUTE )
list ( APPEND _ALL_INCS ${ _ABS_INC } )
##if(NOT EXISTS "${_ABS_INC}/")
## message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
##endif()
endforeach ( )
include_directories ( SYSTEM ${ _ALL_INCS } )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-11-05 04:18:53 +00:00
2015-06-16 23:16:17 +00:00
function ( blender_source_group
2019-04-17 04:35:54 +00:00
s o u r c e s
)
# Group by location on disk
source_group ( "Source Files" FILES CMakeLists.txt )
foreach ( _SRC ${ sources } )
get_filename_component ( _SRC_EXT ${ _SRC } EXT )
if ( ( ${ _SRC_EXT } MATCHES ".h" ) OR
( $ { _ S R C _ E X T } M A T C H E S " . h p p " ) O R
( $ { _ S R C _ E X T } M A T C H E S " . h h " ) )
set ( GROUP_ID "Header Files" )
else ( )
set ( GROUP_ID "Source Files" )
endif ( )
source_group ( "${GROUP_ID}" FILES ${ _SRC } )
endforeach ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-11-05 04:18:53 +00:00
2011-05-28 04:53:17 +00:00
2016-07-14 09:11:33 +00:00
# Support per-target CMake flags
# Read from: CMAKE_C_FLAGS_**** (made upper case) when set.
#
2018-09-19 15:48:11 +00:00
# 'name' should always match the target name,
2016-07-14 09:11:33 +00:00
# use this macro before add_library or add_executable.
#
# Optionally takes an arg passed to set(), eg PARENT_SCOPE.
macro ( add_cc_flags_custom_test
2019-04-17 04:35:54 +00:00
n a m e
)
string ( TOUPPER ${ name } _name_upper )
if ( DEFINED CMAKE_C_FLAGS_ ${ _name_upper } )
message ( STATUS "Using custom CFLAGS: CMAKE_C_FLAGS_${_name_upper} in \" ${ CMAKE_CURRENT_SOURCE_DIR } \"")
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${_name_upper}}" ${ ARGV1 } )
endif ( )
if ( DEFINED CMAKE_CXX_FLAGS_ ${ _name_upper } )
message ( STATUS "Using custom CXXFLAGS: CMAKE_CXX_FLAGS_${_name_upper} in \" ${ CMAKE_CURRENT_SOURCE_DIR } \"")
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${_name_upper}}" ${ ARGV1 } )
endif ( )
unset ( _name_upper )
2016-07-14 09:11:33 +00:00
endmacro ( )
2011-05-28 04:53:17 +00:00
# only MSVC uses SOURCE_GROUP
2016-07-14 09:11:33 +00:00
function ( blender_add_lib__impl
2019-04-17 04:35:54 +00:00
n a m e
s o u r c e s
i n c l u d e s
i n c l u d e s _ s y s
l i b r a r y _ d e p s
)
# message(STATUS "Configuring library ${name}")
# include_directories(${includes})
# include_directories(SYSTEM ${includes_sys})
blender_include_dirs ( "${includes}" )
blender_include_dirs_sys ( "${includes_sys}" )
add_library ( ${ name } ${ sources } )
if ( NOT "${library_deps}" STREQUAL "" )
target_link_libraries ( ${ name } "${library_deps}" )
endif ( )
# works fine without having the includes
# listed is helpful for IDE's (QtCreator/MSVC)
blender_source_group ( "${sources}" )
#if enabled, set the FOLDER property for visual studio projects
if ( WINDOWS_USE_VISUAL_STUDIO_FOLDERS )
get_filename_component ( FolderDir ${ CMAKE_CURRENT_SOURCE_DIR } DIRECTORY )
string ( REPLACE ${ CMAKE_SOURCE_DIR } "" FolderDir ${ FolderDir } )
set_target_properties ( ${ name } PROPERTIES FOLDER ${ FolderDir } )
endif ( )
list_assert_duplicates ( "${sources}" )
list_assert_duplicates ( "${includes}" )
# Not for system includes because they can resolve to the same path
# list_assert_duplicates("${includes_sys}")
2013-10-25 06:21:38 +00:00
2015-06-16 23:16:17 +00:00
endfunction ( )
2011-05-28 04:53:17 +00:00
2010-11-05 04:18:53 +00:00
2016-07-14 09:11:33 +00:00
function ( blender_add_lib_nolist
2019-04-17 04:35:54 +00:00
n a m e
s o u r c e s
i n c l u d e s
i n c l u d e s _ s y s
l i b r a r y _ d e p s
)
2016-07-14 09:11:33 +00:00
2019-04-17 04:35:54 +00:00
add_cc_flags_custom_test ( ${ name } PARENT_SCOPE )
2016-07-14 09:11:33 +00:00
2019-04-17 04:35:54 +00:00
blender_add_lib__impl ( ${ name } "${sources}" "${includes}" "${includes_sys}" "${library_deps}" )
2016-07-14 09:11:33 +00:00
endfunction ( )
2015-06-16 23:16:17 +00:00
function ( blender_add_lib
2019-04-17 04:35:54 +00:00
n a m e
s o u r c e s
i n c l u d e s
i n c l u d e s _ s y s
l i b r a r y _ d e p s
)
2006-11-17 02:27:12 +00:00
2019-04-17 04:35:54 +00:00
add_cc_flags_custom_test ( ${ name } PARENT_SCOPE )
2016-07-14 09:11:33 +00:00
2019-04-17 04:35:54 +00:00
blender_add_lib__impl ( ${ name } "${sources}" "${includes}" "${includes_sys}" "${library_deps}" )
2006-11-17 02:27:12 +00:00
2019-04-17 04:35:54 +00:00
set_property ( GLOBAL APPEND PROPERTY BLENDER_LINK_LIBS ${ name } )
2015-06-16 23:16:17 +00:00
endfunction ( )
2006-11-17 02:27:12 +00:00
2015-06-16 23:16:17 +00:00
function ( SETUP_LIBDIRS )
2011-05-28 04:53:17 +00:00
2019-04-17 04:35:54 +00:00
# NOTE: For all new libraries, use absolute library paths.
# This should eventually be phased out.
if ( NOT MSVC )
link_directories ( ${ JPEG_LIBPATH } ${ PNG_LIBPATH } ${ ZLIB_LIBPATH } ${ FREETYPE_LIBPATH } )
if ( WITH_PYTHON ) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
link_directories ( ${ PYTHON_LIBPATH } )
endif ( )
if ( WITH_SDL AND NOT WITH_SDL_DYNLOAD )
link_directories ( ${ SDL_LIBPATH } )
endif ( )
if ( WITH_CODEC_FFMPEG )
link_directories ( ${ FFMPEG_LIBPATH } )
endif ( )
if ( WITH_IMAGE_OPENEXR )
link_directories ( ${ OPENEXR_LIBPATH } )
endif ( )
if ( WITH_IMAGE_TIFF )
link_directories ( ${ TIFF_LIBPATH } )
endif ( )
if ( WITH_BOOST )
link_directories ( ${ BOOST_LIBPATH } )
endif ( )
if ( WITH_OPENIMAGEIO )
link_directories ( ${ OPENIMAGEIO_LIBPATH } )
endif ( )
if ( WITH_OPENCOLORIO )
link_directories ( ${ OPENCOLORIO_LIBPATH } )
endif ( )
if ( WITH_OPENVDB )
link_directories ( ${ OPENVDB_LIBPATH } )
endif ( )
if ( WITH_OPENAL )
link_directories ( ${ OPENAL_LIBPATH } )
endif ( )
if ( WITH_JACK AND NOT WITH_JACK_DYNLOAD )
link_directories ( ${ JACK_LIBPATH } )
endif ( )
if ( WITH_CODEC_SNDFILE )
link_directories ( ${ LIBSNDFILE_LIBPATH } )
endif ( )
if ( WITH_FFTW3 )
link_directories ( ${ FFTW3_LIBPATH } )
endif ( )
if ( WITH_OPENCOLLADA )
link_directories ( ${ OPENCOLLADA_LIBPATH } )
## Never set
# link_directories(${PCRE_LIBPATH})
# link_directories(${EXPAT_LIBPATH})
endif ( )
if ( WITH_LLVM )
link_directories ( ${ LLVM_LIBPATH } )
endif ( )
if ( WITH_ALEMBIC )
link_directories ( ${ ALEMBIC_LIBPATH } )
link_directories ( ${ HDF5_LIBPATH } )
endif ( )
if ( WIN32 AND NOT UNIX )
link_directories ( ${ PTHREADS_LIBPATH } )
endif ( )
endif ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-12-08 08:43:06 +00:00
2018-05-31 17:50:30 +00:00
macro ( setup_platform_linker_flags )
2019-04-17 04:35:54 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" )
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" )
2018-05-31 17:50:30 +00:00
endmacro ( )
2015-06-16 23:16:17 +00:00
function ( setup_liblinks
2019-04-17 04:35:54 +00:00
t a r g e t
)
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE )
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE )
set ( CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE )
set ( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE )
set ( CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE )
# jemalloc must be early in the list, to be before pthread (see T57998)
if ( WITH_MEM_JEMALLOC )
target_link_libraries ( ${ target } ${ JEMALLOC_LIBRARIES } )
endif ( )
target_link_libraries (
$ { t a r g e t }
$ { P N G _ L I B R A R I E S }
$ { F R E E T Y P E _ L I B R A R Y }
)
# since we are using the local libs for python when compiling msvc projects, we need to add _d when compiling debug versions
if ( WITH_PYTHON ) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
target_link_libraries ( ${ target } ${ PYTHON_LINKFLAGS } )
if ( WIN32 AND NOT UNIX )
file_list_suffix ( PYTHON_LIBRARIES_DEBUG "${PYTHON_LIBRARIES}" "_d" )
target_link_libraries_debug ( ${ target } "${PYTHON_LIBRARIES_DEBUG}" )
target_link_libraries_optimized ( ${ target } "${PYTHON_LIBRARIES}" )
unset ( PYTHON_LIBRARIES_DEBUG )
else ( )
target_link_libraries ( ${ target } ${ PYTHON_LIBRARIES } )
endif ( )
endif ( )
if ( WITH_LZO AND WITH_SYSTEM_LZO )
target_link_libraries ( ${ target } ${ LZO_LIBRARIES } )
endif ( )
if ( WITH_SYSTEM_GLEW )
target_link_libraries ( ${ target } ${ BLENDER_GLEW_LIBRARIES } )
endif ( )
if ( WITH_BULLET AND WITH_SYSTEM_BULLET )
target_link_libraries ( ${ target } ${ BULLET_LIBRARIES } )
endif ( )
if ( WITH_AUDASPACE AND WITH_SYSTEM_AUDASPACE )
target_link_libraries ( ${ target } ${ AUDASPACE_C_LIBRARIES } ${ AUDASPACE_PY_LIBRARIES } )
endif ( )
if ( WITH_OPENAL )
target_link_libraries ( ${ target } ${ OPENAL_LIBRARY } )
endif ( )
if ( WITH_FFTW3 )
target_link_libraries ( ${ target } ${ FFTW3_LIBRARIES } )
endif ( )
if ( WITH_JACK AND NOT WITH_JACK_DYNLOAD )
target_link_libraries ( ${ target } ${ JACK_LIBRARIES } )
endif ( )
if ( WITH_CODEC_SNDFILE )
target_link_libraries ( ${ target } ${ LIBSNDFILE_LIBRARIES } )
endif ( )
if ( WITH_SDL AND NOT WITH_SDL_DYNLOAD )
target_link_libraries ( ${ target } ${ SDL_LIBRARY } )
endif ( )
if ( WITH_CYCLES_OSL )
target_link_libraries ( ${ target } ${ OSL_LIBRARIES } )
endif ( )
if ( WITH_OPENVDB )
target_link_libraries ( ${ target } ${ OPENVDB_LIBRARIES } ${ TBB_LIBRARIES } ${ BLOSC_LIBRARIES } )
endif ( )
if ( WITH_OPENIMAGEIO )
target_link_libraries ( ${ target } ${ OPENIMAGEIO_LIBRARIES } )
endif ( )
if ( WITH_OPENCOLORIO )
target_link_libraries ( ${ target } ${ OPENCOLORIO_LIBRARIES } )
endif ( )
if ( WITH_OPENSUBDIV )
target_link_libraries ( ${ target } ${ OPENSUBDIV_LIBRARIES } )
endif ( )
if ( WITH_CYCLES_EMBREE )
target_link_libraries ( ${ target } ${ EMBREE_LIBRARIES } )
endif ( )
if ( WITH_BOOST )
target_link_libraries ( ${ target } ${ BOOST_LIBRARIES } )
if ( Boost_USE_STATIC_LIBS AND Boost_USE_ICU )
target_link_libraries ( ${ target } ${ ICU_LIBRARIES } )
endif ( )
endif ( )
target_link_libraries ( ${ target } ${ JPEG_LIBRARIES } )
if ( WITH_ALEMBIC )
target_link_libraries ( ${ target } ${ ALEMBIC_LIBRARIES } ${ HDF5_LIBRARIES } )
endif ( )
if ( WITH_IMAGE_TIFF )
target_link_libraries ( ${ target } ${ TIFF_LIBRARY } )
endif ( )
if ( WITH_IMAGE_OPENEXR )
target_link_libraries ( ${ target } ${ OPENEXR_LIBRARIES } )
endif ( )
if ( WITH_IMAGE_OPENJPEG )
target_link_libraries ( ${ target } ${ OPENJPEG_LIBRARIES } )
endif ( )
if ( WITH_CODEC_FFMPEG )
target_link_libraries ( ${ target } ${ FFMPEG_LIBRARIES } )
endif ( )
if ( WITH_OPENCOLLADA )
if ( WIN32 AND NOT UNIX )
file_list_suffix ( OPENCOLLADA_LIBRARIES_DEBUG "${OPENCOLLADA_LIBRARIES}" "_d" )
target_link_libraries_debug ( ${ target } "${OPENCOLLADA_LIBRARIES_DEBUG}" )
target_link_libraries_optimized ( ${ target } "${OPENCOLLADA_LIBRARIES}" )
unset ( OPENCOLLADA_LIBRARIES_DEBUG )
file_list_suffix ( PCRE_LIBRARIES_DEBUG "${PCRE_LIBRARIES}" "_d" )
target_link_libraries_debug ( ${ target } "${PCRE_LIBRARIES_DEBUG}" )
target_link_libraries_optimized ( ${ target } "${PCRE_LIBRARIES}" )
unset ( PCRE_LIBRARIES_DEBUG )
if ( EXPAT_LIB )
file_list_suffix ( EXPAT_LIB_DEBUG "${EXPAT_LIB}" "_d" )
target_link_libraries_debug ( ${ target } "${EXPAT_LIB_DEBUG}" )
target_link_libraries_optimized ( ${ target } "${EXPAT_LIB}" )
unset ( EXPAT_LIB_DEBUG )
endif ( )
else ( )
target_link_libraries (
$ { t a r g e t }
$ { O P E N C O L L A D A _ L I B R A R I E S }
$ { P C R E _ L I B R A R I E S }
$ { X M L 2 _ L I B R A R I E S }
$ { E X P A T _ L I B }
)
endif ( )
endif ( )
if ( WITH_MOD_CLOTH_ELTOPO )
target_link_libraries ( ${ target } ${ LAPACK_LIBRARIES } )
endif ( )
if ( WITH_LLVM )
target_link_libraries ( ${ target } ${ LLVM_LIBRARY } )
endif ( )
if ( WIN32 AND NOT UNIX )
target_link_libraries ( ${ target } ${ PTHREADS_LIBRARIES } )
endif ( )
if ( UNIX AND NOT APPLE )
if ( WITH_OPENMP_STATIC )
target_link_libraries ( ${ target } ${ OpenMP_LIBRARIES } )
endif ( )
if ( WITH_INPUT_NDOF )
target_link_libraries ( ${ target } ${ NDOF_LIBRARIES } )
endif ( )
endif ( )
if ( WITH_SYSTEM_GLOG )
target_link_libraries ( ${ target } ${ GLOG_LIBRARIES } )
endif ( )
if ( WITH_SYSTEM_GFLAGS )
target_link_libraries ( ${ target } ${ GFLAGS_LIBRARIES } )
endif ( )
# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES depends on them..
if ( WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV )
target_link_libraries ( ${ target } "extern_clew" )
if ( WITH_CUDA_DYNLOAD )
target_link_libraries ( ${ target } "extern_cuew" )
else ( )
target_link_libraries ( ${ target } ${ CUDA_CUDA_LIBRARY } )
endif ( )
endif ( )
target_link_libraries (
$ { t a r g e t }
$ { Z L I B _ L I B R A R I E S }
)
#system libraries with no dependencies such as platform link libs or opengl should go last
target_link_libraries ( ${ target }
$ { B L E N D E R _ G L _ L I B R A R I E S } )
#target_link_libraries(${target} ${PLATFORM_LINKLIBS} ${CMAKE_DL_LIBS})
target_link_libraries ( ${ target } ${ PLATFORM_LINKLIBS } )
2015-06-16 23:16:17 +00:00
endfunction ( )
2011-10-01 18:29:40 +00:00
macro ( TEST_SSE_SUPPORT
2019-04-17 04:35:54 +00:00
_ s s e _ f l a g s
_ s s e 2 _ f l a g s )
include ( CheckCSourceRuns )
# message(STATUS "Detecting SSE support")
if ( CMAKE_COMPILER_IS_GNUCC OR ( CMAKE_C_COMPILER_ID MATCHES "Clang" ) )
set ( ${ _sse_flags } "-msse" )
set ( ${ _sse2_flags } "-msse2" )
elseif ( MSVC )
# x86_64 has this auto enabled
if ( "${CMAKE_SIZEOF_VOID_P}" EQUAL "8" )
set ( ${ _sse_flags } "" )
set ( ${ _sse2_flags } "" )
else ( )
set ( ${ _sse_flags } "/arch:SSE" )
set ( ${ _sse2_flags } "/arch:SSE2" )
endif ( )
elseif ( CMAKE_C_COMPILER_ID MATCHES "Intel" )
set ( ${ _sse_flags } "" ) # icc defaults to -msse
set ( ${ _sse2_flags } "" ) # icc defaults to -msse2
else ( )
message ( WARNING "SSE flags for this compiler: '${CMAKE_C_COMPILER_ID}' not known" )
set ( ${ _sse_flags } )
set ( ${ _sse2_flags } )
endif ( )
set ( CMAKE_REQUIRED_FLAGS "${${_sse_flags}} ${${_sse2_flags}}" )
if ( NOT DEFINED SUPPORT_SSE_BUILD )
# result cached
check_c_source_runs ( "
#include <xmmintrin.h>
i n t main ( void ) { _ _ m 1 2 8 v = _mm_setzero_ps ( ) ; r e t u r n 0 ; } "
S U P P O R T _ S S E _ B U I L D )
if ( SUPPORT_SSE_BUILD )
message ( STATUS "SSE Support: detected." )
else ( )
message ( STATUS "SSE Support: missing." )
endif ( )
endif ( )
if ( NOT DEFINED SUPPORT_SSE2_BUILD )
# result cached
check_c_source_runs ( "
#include <emmintrin.h>
i n t main ( void ) { _ _ m 1 2 8 d v = _mm_setzero_pd ( ) ; r e t u r n 0 ; } "
S U P P O R T _ S S E 2 _ B U I L D )
if ( SUPPORT_SSE2_BUILD )
message ( STATUS "SSE2 Support: detected." )
else ( )
message ( STATUS "SSE2 Support: missing." )
endif ( )
endif ( )
unset ( CMAKE_REQUIRED_FLAGS )
2010-12-08 08:43:06 +00:00
endmacro ( )
2010-07-04 18:40:59 +00:00
2016-01-14 07:57:58 +00:00
# Only print message if running CMake first time
macro ( message_first_run )
2019-04-17 04:35:54 +00:00
if ( FIRST_RUN )
message ( ${ ARGV } )
endif ( )
2016-01-14 07:57:58 +00:00
endmacro ( )
2010-10-24 03:57:07 +00:00
# when we have warnings as errors applied globally this
# needs to be removed for some external libs which we dont maintain.
# utility macro
2011-10-27 07:26:41 +00:00
macro ( remove_cc_flag
2019-04-17 04:35:54 +00:00
_ f l a g )
foreach ( flag ${ ARGV } )
string ( REGEX REPLACE ${ flag } "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}" )
string ( REGEX REPLACE ${ flag } "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
endforeach ( )
unset ( flag )
2010-12-08 08:43:06 +00:00
endmacro ( )
2018-06-22 12:29:13 +00:00
macro ( add_c_flag
2019-04-17 04:35:54 +00:00
f l a g )
2011-10-27 07:26:41 +00:00
2019-04-17 04:35:54 +00:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" )
2011-10-27 07:26:41 +00:00
endmacro ( )
2018-06-22 12:07:55 +00:00
macro ( add_cxx_flag
2019-04-17 04:35:54 +00:00
f l a g )
2018-06-22 12:07:55 +00:00
2019-04-17 04:35:54 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" )
2018-06-22 12:07:55 +00:00
endmacro ( )
2010-12-08 08:43:06 +00:00
macro ( remove_strict_flags )
2019-04-17 04:35:54 +00:00
if ( CMAKE_COMPILER_IS_GNUCC )
remove_cc_flag (
" - W s t r i c t - p r o t o t y p e s "
" - W m i s s i n g - p r o t o t y p e s "
" - W m i s s i n g - d e c l a r a t i o n s "
" - W m i s s i n g - f o r m a t - a t t r i b u t e "
" - W u n u s e d - l o c a l - t y p e d e f s "
" - W u n u s e d - m a c r o s "
" - W u n u s e d - p a r a m e t e r "
" - W w r i t e - s t r i n g s "
" - W r e d u n d a n t - d e c l s "
" - W u n d e f "
" - W s h a d o w "
" - W d o u b l e - p r o m o t i o n "
" - W o l d - s t y l e - d e f i n i t i o n "
" - W e r r o r = [ ^ ] + "
" - W e r r o r "
)
# negate flags implied by '-Wall'
add_c_flag ( "${C_REMOVE_STRICT_FLAGS}" )
add_cxx_flag ( "${CXX_REMOVE_STRICT_FLAGS}" )
endif ( )
if ( CMAKE_C_COMPILER_ID MATCHES "Clang" )
remove_cc_flag (
" - W u n u s e d - p a r a m e t e r "
" - W u n u s e d - v a r i a b l e "
" - W e r r o r = [ ^ ] + "
" - W e r r o r "
)
# negate flags implied by '-Wall'
add_c_flag ( "${C_REMOVE_STRICT_FLAGS}" )
add_cxx_flag ( "${CXX_REMOVE_STRICT_FLAGS}" )
endif ( )
if ( MSVC )
# TODO
endif ( )
2010-10-24 03:57:07 +00:00
2010-12-08 08:43:06 +00:00
endmacro ( )
2010-10-24 03:57:07 +00:00
2015-03-27 10:55:58 +00:00
macro ( remove_extra_strict_flags )
2019-04-17 04:35:54 +00:00
if ( CMAKE_COMPILER_IS_GNUCC )
remove_cc_flag (
" - W u n u s e d - p a r a m e t e r "
)
endif ( )
if ( CMAKE_C_COMPILER_ID MATCHES "Clang" )
remove_cc_flag (
" - W u n u s e d - p a r a m e t e r "
)
endif ( )
if ( MSVC )
# TODO
endif ( )
2015-03-27 10:55:58 +00:00
endmacro ( )
2011-10-23 17:52:20 +00:00
# note, we can only append flags on a single file so we need to negate the options.
# at the moment we cant shut up ffmpeg deprecations, so use this, but will
# probably add more removals here.
2018-06-22 12:40:00 +00:00
macro ( remove_strict_c_flags_file
2019-04-17 04:35:54 +00:00
f i l e n a m e s )
foreach ( _SOURCE ${ ARGV } )
if ( CMAKE_COMPILER_IS_GNUCC OR
( C M A K E _ C _ C O M P I L E R _ I D M A T C H E S " C l a n g " ) )
set_source_files_properties ( ${ _SOURCE }
P R O P E R T I E S
C O M P I L E _ F L A G S " $ { C _ R E M O V E _ S T R I C T _ F L A G S } "
)
endif ( )
if ( MSVC )
# TODO
endif ( )
endforeach ( )
unset ( _SOURCE )
2018-06-22 12:40:00 +00:00
endmacro ( )
2011-10-23 17:52:20 +00:00
2018-06-22 12:40:00 +00:00
macro ( remove_strict_cxx_flags_file
2019-04-17 04:35:54 +00:00
f i l e n a m e s )
remove_strict_c_flags_file ( ${ filenames } ${ ARHV } )
foreach ( _SOURCE ${ ARGV } )
if ( CMAKE_COMPILER_IS_GNUCC OR
( C M A K E _ C X X _ C O M P I L E R _ I D M A T C H E S " C l a n g " ) )
set_source_files_properties ( ${ _SOURCE }
P R O P E R T I E S
C O M P I L E _ F L A G S " $ { C X X _ R E M O V E _ S T R I C T _ F L A G S } "
)
endif ( )
if ( MSVC )
# TODO
endif ( )
endforeach ( )
unset ( _SOURCE )
2011-10-23 17:52:20 +00:00
endmacro ( )
2016-05-18 21:36:32 +00:00
# External libs may need 'signed char' to be default.
macro ( remove_cc_flag_unsigned_char )
2019-04-17 04:35:54 +00:00
if ( CMAKE_COMPILER_IS_GNUCC OR
( C M A K E _ C _ C O M P I L E R _ I D M A T C H E S " C l a n g " ) O R
( C M A K E _ C _ C O M P I L E R _ I D M A T C H E S " I n t e l " ) )
remove_cc_flag ( "-funsigned-char" )
elseif ( MSVC )
remove_cc_flag ( "/J" )
else ( )
message ( WARNING
" C o m p i l e r ' $ { C M A K E _ C _ C O M P I L E R _ I D } ' f a i l e d t o d i s a b l e ' u n s i g n e d c h a r ' f l a g . "
" B u i l d f i l e s n e e d u p d a t i n g . "
)
endif ( )
2016-05-18 21:36:32 +00:00
endmacro ( )
2011-10-23 17:52:20 +00:00
2015-06-16 23:16:17 +00:00
function ( ADD_CHECK_C_COMPILER_FLAG
2019-04-17 04:35:54 +00:00
_ C F L A G S
_ C A C H E _ V A R
_ F L A G
)
include ( CheckCCompilerFlag )
CHECK_C_COMPILER_FLAG ( "${_FLAG}" "${_CACHE_VAR}" )
if ( ${ _CACHE_VAR } )
# message(STATUS "Using CFLAG: ${_FLAG}")
set ( ${ _CFLAGS } "${${_CFLAGS}} ${_FLAG}" PARENT_SCOPE )
else ( )
message ( STATUS "Unsupported CFLAG: ${_FLAG}" )
endif ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-12-16 09:55:35 +00:00
2015-06-16 23:16:17 +00:00
function ( ADD_CHECK_CXX_COMPILER_FLAG
2019-04-17 04:35:54 +00:00
_ C X X F L A G S
_ C A C H E _ V A R
_ F L A G
)
include ( CheckCXXCompilerFlag )
CHECK_CXX_COMPILER_FLAG ( "${_FLAG}" "${_CACHE_VAR}" )
if ( ${ _CACHE_VAR } )
# message(STATUS "Using CXXFLAG: ${_FLAG}")
set ( ${ _CXXFLAGS } "${${_CXXFLAGS}} ${_FLAG}" PARENT_SCOPE )
else ( )
message ( STATUS "Unsupported CXXFLAG: ${_FLAG}" )
endif ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2010-08-02 16:23:58 +00:00
2014-11-16 11:57:42 +00:00
function ( get_blender_version )
2019-04-17 04:35:54 +00:00
# extracts header vars and defines them in the parent scope:
#
# - BLENDER_VERSION (major.minor)
# - BLENDER_VERSION_MAJOR
# - BLENDER_VERSION_MINOR
# - BLENDER_SUBVERSION (used for internal versioning mainly)
# - BLENDER_VERSION_CHAR (a, b, c, ...or empty string)
# - BLENDER_VERSION_CYCLE (alpha, beta, rc, release)
# So cmake depends on BKE_blender.h, beware of inf-loops!
CONFIGURE_FILE ( ${ CMAKE_SOURCE_DIR } /source/blender/blenkernel/BKE_blender_version.h
$ { C M A K E _ B I N A R Y _ D I R } / s o u r c e / b l e n d e r / b l e n k e r n e l / B K E _ b l e n d e r _ v e r s i o n . h . d o n e )
file ( STRINGS ${ CMAKE_SOURCE_DIR } /source/blender/blenkernel/BKE_blender_version.h _contents REGEX "^#define[ \t]+BLENDER_.*$" )
string ( REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION[ \t]+([0-9]+).*" "\\1" _out_version "${_contents}" )
string ( REGEX REPLACE ".*#define[ \t]+BLENDER_SUBVERSION[ \t]+([0-9]+).*" "\\1" _out_subversion "${_contents}" )
string ( REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION_CHAR[ \t]+([a-z]+).*" "\\1" _out_version_char "${_contents}" )
string ( REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION_CYCLE[ \t]+([a-z]+).*" "\\1" _out_version_cycle "${_contents}" )
if ( NOT ${ _out_version } MATCHES "[0-9]+" )
message ( FATAL_ERROR "Version parsing failed for BLENDER_VERSION" )
endif ( )
if ( NOT ${ _out_subversion } MATCHES "[0-9]+" )
message ( FATAL_ERROR "Version parsing failed for BLENDER_SUBVERSION" )
endif ( )
# clumsy regex, only single char are ok but it could be unset
string ( LENGTH "${_out_version_char}" _out_version_char_len )
if ( NOT _out_version_char_len EQUAL 1 )
set ( _out_version_char "" )
elseif ( NOT ${ _out_version_char } MATCHES "[a-z]+" )
message ( FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CHAR" )
endif ( )
if ( NOT ${ _out_version_cycle } MATCHES "[a-z]+" )
message ( FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CYCLE" )
endif ( )
math ( EXPR _out_version_major "${_out_version} / 100" )
math ( EXPR _out_version_minor "${_out_version} % 100" )
# for packaging, alpha to numbers
string ( COMPARE EQUAL "${_out_version_char}" "" _out_version_char_empty )
if ( ${ _out_version_char_empty } )
set ( _out_version_char_index "0" )
else ( )
set ( _char_ls a b c d e f g h i j k l m n o p q r s t u v w x y z )
list ( FIND _char_ls ${ _out_version_char } _out_version_char_index )
math ( EXPR _out_version_char_index "${_out_version_char_index} + 1" )
endif ( )
# output vars
set ( BLENDER_VERSION "${_out_version_major}.${_out_version_minor}" PARENT_SCOPE )
set ( BLENDER_VERSION_MAJOR "${_out_version_major}" PARENT_SCOPE )
set ( BLENDER_VERSION_MINOR "${_out_version_minor}" PARENT_SCOPE )
set ( BLENDER_SUBVERSION "${_out_subversion}" PARENT_SCOPE )
set ( BLENDER_VERSION_CHAR "${_out_version_char}" PARENT_SCOPE )
set ( BLENDER_VERSION_CHAR_INDEX "${_out_version_char_index}" PARENT_SCOPE )
set ( BLENDER_VERSION_CYCLE "${_out_version_cycle}" PARENT_SCOPE )
2015-02-25 07:15:54 +00:00
2014-11-16 11:57:42 +00:00
endfunction ( )
2011-05-23 14:56:14 +00:00
# hacks to override initial project settings
2011-09-30 15:51:58 +00:00
# these macros must be called directly before/after project(Blender)
2011-05-23 14:56:14 +00:00
macro ( blender_project_hack_pre )
2019-04-17 04:35:54 +00:00
# ------------------
# GCC -O3 HACK START
# needed because O3 can cause problems but
# allow the builder to set O3 manually after.
if ( DEFINED CMAKE_C_FLAGS_RELEASE )
set ( _reset_standard_cflags_rel OFF )
else ( )
set ( _reset_standard_cflags_rel ON )
endif ( )
if ( DEFINED CMAKE_CXX_FLAGS_RELEASE )
set ( _reset_standard_cxxflags_rel OFF )
else ( )
set ( _reset_standard_cxxflags_rel ON )
endif ( )
2011-05-23 14:56:14 +00:00
endmacro ( )
macro ( blender_project_hack_post )
2019-04-17 04:35:54 +00:00
# ----------------
# GCC -O3 HACK END
if ( _reset_standard_cflags_rel )
string ( REGEX REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" )
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE )
mark_as_advanced ( CMAKE_C_FLAGS_RELEASE )
endif ( )
if ( _reset_standard_cxxflags_rel )
string ( REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "" FORCE )
mark_as_advanced ( CMAKE_CXX_FLAGS_RELEASE )
endif ( )
unset ( _reset_standard_cflags_rel )
unset ( _reset_standard_cxxflags_rel )
# ------------------------------------------------------------------
# workaround for omission in cmake 2.8.4's GNU.cmake, fixed in 2.8.5
if ( CMAKE_COMPILER_IS_GNUCC )
if ( NOT DARWIN )
set ( CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem " )
endif ( )
endif ( )
2011-06-11 06:00:28 +00:00
2011-05-23 14:56:14 +00:00
endmacro ( )
2011-11-07 15:53:40 +00:00
# pair of macros to allow libraries to be specify files to install, but to
# only install them at the end so the directories don't get cleared with
# the files in them. used by cycles to install addon.
2015-06-16 23:16:17 +00:00
function ( delayed_install
2019-04-17 04:35:54 +00:00
b a s e
f i l e s
d e s t i n a t i o n )
foreach ( f ${ files } )
if ( IS_ABSOLUTE ${ f } )
set_property ( GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${ f } )
else ( )
set_property ( GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${ base } / ${ f } )
endif ( )
set_property ( GLOBAL APPEND PROPERTY DELAYED_INSTALL_DESTINATIONS ${ destination } )
endforeach ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2011-11-07 15:53:40 +00:00
# note this is a function instead of a macro so that ${BUILD_TYPE} in targetdir
# does not get expanded in calling but is preserved
function ( delayed_do_install
2019-04-17 04:35:54 +00:00
t a r g e t d i r )
get_property ( files GLOBAL PROPERTY DELAYED_INSTALL_FILES )
get_property ( destinations GLOBAL PROPERTY DELAYED_INSTALL_DESTINATIONS )
if ( files )
list ( LENGTH files n )
math ( EXPR n "${n}-1" )
foreach ( i RANGE ${ n } )
list ( GET files ${ i } f )
list ( GET destinations ${ i } d )
if ( NOT IS_ABSOLUTE ${ d } )
install ( FILES ${ f } DESTINATION ${ targetdir } / ${ d } )
else ( )
install ( FILES ${ f } DESTINATION ${ d } )
endif ( )
endforeach ( )
endif ( )
2011-11-07 15:53:40 +00:00
endfunction ( )
2012-08-08 16:03:42 +00:00
2015-06-16 23:16:17 +00:00
function ( data_to_c
2019-04-17 04:35:54 +00:00
f i l e _ f r o m f i l e _ t o
l i s t _ t o _ a d d
)
2012-08-08 16:03:42 +00:00
2019-04-17 04:35:54 +00:00
list ( APPEND ${ list_to_add } ${ file_to } )
set ( ${ list_to_add } ${ ${list_to_add } } PARENT_SCOPE )
2012-08-08 16:03:42 +00:00
2019-04-17 04:35:54 +00:00
get_filename_component ( _file_to_path ${ file_to } PATH )
2012-08-11 16:25:31 +00:00
2019-04-17 04:35:54 +00:00
add_custom_command (
O U T P U T $ { f i l e _ t o }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { _ f i l e _ t o _ p a t h }
C O M M A N D " $ < T A R G E T _ F I L E : d a t a t o c > " $ { f i l e _ f r o m } $ { f i l e _ t o }
D E P E N D S $ { f i l e _ f r o m } d a t a t o c )
2013-09-20 06:35:28 +00:00
2019-04-17 04:35:54 +00:00
set_source_files_properties ( ${ file_to } PROPERTIES GENERATED TRUE )
2015-06-16 23:16:17 +00:00
endfunction ( )
2012-08-08 16:03:42 +00:00
2012-08-11 18:47:09 +00:00
2012-08-11 13:32:19 +00:00
# same as above but generates the var name and output automatic.
2015-06-16 23:16:17 +00:00
function ( data_to_c_simple
2019-04-17 04:35:54 +00:00
f i l e _ f r o m
l i s t _ t o _ a d d
)
2012-08-11 13:32:19 +00:00
2019-04-17 04:35:54 +00:00
# remove ../'s
get_filename_component ( _file_from ${ CMAKE_CURRENT_SOURCE_DIR } / ${ file_from } REALPATH )
get_filename_component ( _file_to ${ CMAKE_CURRENT_BINARY_DIR } / ${ file_from } .c REALPATH )
2012-08-11 13:32:19 +00:00
2019-04-17 04:35:54 +00:00
list ( APPEND ${ list_to_add } ${ _file_to } )
source_group ( Generated FILES ${ _file_to } )
list ( APPEND ${ list_to_add } ${ file_from } )
set ( ${ list_to_add } ${ ${list_to_add } } PARENT_SCOPE )
2012-08-11 13:32:19 +00:00
2019-04-17 04:35:54 +00:00
get_filename_component ( _file_to_path ${ _file_to } PATH )
2012-08-11 16:25:31 +00:00
2019-04-17 04:35:54 +00:00
add_custom_command (
O U T P U T $ { _ f i l e _ t o }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { _ f i l e _ t o _ p a t h }
C O M M A N D " $ < T A R G E T _ F I L E : d a t a t o c > " $ { _ f i l e _ f r o m } $ { _ f i l e _ t o }
D E P E N D S $ { _ f i l e _ f r o m } d a t a t o c )
2012-08-11 13:32:19 +00:00
2019-04-17 04:35:54 +00:00
set_source_files_properties ( ${ _file_to } PROPERTIES GENERATED TRUE )
2015-06-16 23:16:17 +00:00
endfunction ( )
2013-08-22 13:51:00 +00:00
2014-01-13 12:47:33 +00:00
# macro for converting pixmap directory to a png and then a c file
2015-06-16 23:16:17 +00:00
function ( data_to_c_simple_icons
2019-04-17 04:35:54 +00:00
p a t h _ f r o m i c o n _ p r e f i x i c o n _ n a m e s
l i s t _ t o _ a d d
)
# Conversion steps
# path_from -> _file_from -> _file_to
# foo/*.dat -> foo.png -> foo.png.c
get_filename_component ( _path_from_abs ${ path_from } ABSOLUTE )
# remove ../'s
get_filename_component ( _file_from ${ CMAKE_CURRENT_BINARY_DIR } / ${ path_from } .png REALPATH )
get_filename_component ( _file_to ${ CMAKE_CURRENT_BINARY_DIR } / ${ path_from } .png.c REALPATH )
list ( APPEND ${ list_to_add } ${ _file_to } )
set ( ${ list_to_add } ${ ${list_to_add } } PARENT_SCOPE )
get_filename_component ( _file_to_path ${ _file_to } PATH )
# Construct a list of absolute paths from input
set ( _icon_files )
foreach ( _var ${ icon_names } )
list ( APPEND _icon_files "${_path_from_abs}/${icon_prefix}${_var}.dat" )
endforeach ( )
add_custom_command (
O U T P U T $ { _ f i l e _ f r o m } $ { _ f i l e _ t o }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { _ f i l e _ t o _ p a t h }
#COMMAND python3 ${CMAKE_SOURCE_DIR}/source/blender/datatoc/datatoc_icon.py ${_path_from_abs} ${_file_from}
C O M M A N D " $ < T A R G E T _ F I L E : d a t a t o c _ i c o n > " $ { _ p a t h _ f r o m _ a b s } $ { _ f i l e _ f r o m }
C O M M A N D " $ < T A R G E T _ F I L E : d a t a t o c > " $ { _ f i l e _ f r o m } $ { _ f i l e _ t o }
D E P E N D S
$ { _ i c o n _ f i l e s }
d a t a t o c _ i c o n
d a t a t o c
# could be an arg but for now we only create icons depending on UI_icons.h
$ { C M A K E _ S O U R C E _ D I R } / s o u r c e / b l e n d e r / e d i t o r s / i n c l u d e / U I _ i c o n s . h
)
set_source_files_properties ( ${ _file_from } ${ _file_to } PROPERTIES GENERATED TRUE )
2015-06-16 23:16:17 +00:00
endfunction ( )
2014-01-13 12:47:33 +00:00
2013-08-26 12:16:23 +00:00
# XXX Not used for now...
2015-06-16 23:16:17 +00:00
function ( svg_to_png
2019-04-17 04:35:54 +00:00
f i l e _ f r o m
f i l e _ t o
d p i
l i s t _ t o _ a d d
)
# remove ../'s
get_filename_component ( _file_from ${ CMAKE_CURRENT_SOURCE_DIR } / ${ file_from } REALPATH )
get_filename_component ( _file_to ${ CMAKE_CURRENT_SOURCE_DIR } / ${ file_to } REALPATH )
list ( APPEND ${ list_to_add } ${ _file_to } )
set ( ${ list_to_add } ${ ${list_to_add } } PARENT_SCOPE )
find_program ( INKSCAPE_EXE inkscape )
mark_as_advanced ( INKSCAPE_EXE )
if ( INKSCAPE_EXE )
if ( APPLE )
# in OS X app bundle, the binary is a shim that doesn't take any
# command line arguments, replace it with the actual binary
string ( REPLACE "MacOS/Inkscape" "Resources/bin/inkscape" INKSCAPE_REAL_EXE ${ INKSCAPE_EXE } )
if ( EXISTS "${INKSCAPE_REAL_EXE}" )
set ( INKSCAPE_EXE ${ INKSCAPE_REAL_EXE } )
endif ( )
endif ( )
add_custom_command (
O U T P U T $ { _ f i l e _ t o }
C O M M A N D $ { I N K S C A P E _ E X E } $ { _ f i l e _ f r o m } - - e x p o r t - d p i = $ { d p i } - - w i t h o u t - g u i - - e x p o r t - p n g = $ { _ f i l e _ t o }
D E P E N D S $ { _ f i l e _ f r o m } $ { I N K S C A P E _ E X E }
)
else ( )
message ( WARNING "Inkscape not found, could not re-generate ${_file_to} from ${_file_from}!" )
endif ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2013-08-22 13:51:00 +00:00
2015-06-16 23:16:17 +00:00
function ( msgfmt_simple
2019-04-17 04:35:54 +00:00
f i l e _ f r o m
l i s t _ t o _ a d d
)
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
# remove ../'s
get_filename_component ( _file_from_we ${ file_from } NAME_WE )
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
get_filename_component ( _file_from ${ file_from } REALPATH )
get_filename_component ( _file_to ${ CMAKE_CURRENT_BINARY_DIR } / ${ _file_from_we } .mo REALPATH )
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
list ( APPEND ${ list_to_add } ${ _file_to } )
set ( ${ list_to_add } ${ ${list_to_add } } PARENT_SCOPE )
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
get_filename_component ( _file_to_path ${ _file_to } PATH )
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
add_custom_command (
O U T P U T $ { _ f i l e _ t o }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { _ f i l e _ t o _ p a t h }
C O M M A N D " $ < T A R G E T _ F I L E : m s g f m t > " $ { _ f i l e _ f r o m } $ { _ f i l e _ t o }
D E P E N D S m s g f m t $ { _ f i l e _ f r o m } )
2013-11-08 20:44:48 +00:00
2019-04-17 04:35:54 +00:00
set_source_files_properties ( ${ _file_to } PROPERTIES GENERATED TRUE )
2015-06-16 23:16:17 +00:00
endfunction ( )
2013-11-08 20:44:48 +00:00
2015-06-16 23:16:17 +00:00
function ( find_python_package
2019-04-17 04:35:54 +00:00
p a c k a g e
)
string ( TOUPPER ${ package } _upper_package )
# set but invalid
if ( ( NOT ${ PYTHON_${_upper_package } _PATH} STREQUAL "" ) AND
( N O T $ { P Y T H O N _ $ { _ u p p e r _ p a c k a g e } _ P A T H } M A T C H E S N O T F O U N D ) )
# if(NOT EXISTS "${PYTHON_${_upper_package}_PATH}/${package}")
# message(WARNING "PYTHON_${_upper_package}_PATH is invalid, ${package} not found in '${PYTHON_${_upper_package}_PATH}' "
# "WITH_PYTHON_INSTALL_${_upper_package} option will be ignored when installing python")
# set(WITH_PYTHON_INSTALL${_upper_package} OFF)
# endif()
# not set, so initialize
else ( )
string ( REPLACE "." ";" _PY_VER_SPLIT "${PYTHON_VERSION}" )
list ( GET _PY_VER_SPLIT 0 _PY_VER_MAJOR )
# re-cache
unset ( PYTHON_ ${ _upper_package } _PATH CACHE )
find_path ( PYTHON_ ${ _upper_package } _PATH
N A M E S
$ { p a c k a g e }
H I N T S
" $ { P Y T H O N _ L I B P A T H } / "
" $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { P Y T H O N _ V E R S I O N } / "
" $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { _ P Y _ V E R _ M A J O R } / "
P A T H _ S U F F I X E S
s i t e - p a c k a g e s
d i s t - p a c k a g e s
v e n d o r - p a c k a g e s
N O _ D E F A U L T _ P A T H
)
if ( NOT EXISTS "${PYTHON_${_upper_package}_PATH}" )
message ( WARNING
" P y t h o n p a c k a g e ' $ { p a c k a g e } ' p a t h c o u l d n o t b e f o u n d i n : \ n "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { P Y T H O N _ V E R S I O N } / s i t e - p a c k a g e s / $ { p a c k a g e } ' , "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { _ P Y _ V E R _ M A J O R } / s i t e - p a c k a g e s / $ { p a c k a g e } ' , "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { P Y T H O N _ V E R S I O N } / d i s t - p a c k a g e s / $ { p a c k a g e } ' , "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { _ P Y _ V E R _ M A J O R } / d i s t - p a c k a g e s / $ { p a c k a g e } ' , "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { P Y T H O N _ V E R S I O N } / v e n d o r - p a c k a g e s / $ { p a c k a g e } ' , "
" ' $ { P Y T H O N _ L I B P A T H } / p y t h o n $ { _ P Y _ V E R _ M A J O R } / v e n d o r - p a c k a g e s / $ { p a c k a g e } ' , "
" \ n "
" T h e ' W I T H _ P Y T H O N _ I N S T A L L _ $ { _ u p p e r _ p a c k a g e } ' o p t i o n w i l l b e i g n o r e d w h e n i n s t a l l i n g P y t h o n . \ n "
" T h e b u i l d w i l l b e u s a b l e , o n l y a d d - o n s t h a t d e p e n d o n t h i s p a c k a g e w o n ' t b e f u n c t i o n a l . "
)
set ( WITH_PYTHON_INSTALL_ ${ _upper_package } OFF PARENT_SCOPE )
else ( )
message ( STATUS "${package} found at '${PYTHON_${_upper_package}_PATH}'" )
endif ( )
endif ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2014-11-16 11:57:42 +00:00
# like Python's 'print(dir())'
2015-06-16 23:16:17 +00:00
function ( print_all_vars )
2019-04-17 04:35:54 +00:00
get_cmake_property ( _vars VARIABLES )
foreach ( _var ${ _vars } )
message ( "${_var}=${${_var}}" )
endforeach ( )
2015-06-16 23:16:17 +00:00
endfunction ( )
2016-07-18 13:16:45 +00:00
macro ( openmp_delayload
2019-04-17 04:35:54 +00:00
p r o j e c t n a m e
)
if ( MSVC )
if ( WITH_OPENMP )
if ( MSVC_VERSION EQUAL 1800 )
set ( OPENMP_DLL_NAME "vcomp120" )
else ( )
set ( OPENMP_DLL_NAME "vcomp140" )
endif ( )
SET_TARGET_PROPERTIES ( ${ projectname } PROPERTIES LINK_FLAGS_RELEASE "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib" )
SET_TARGET_PROPERTIES ( ${ projectname } PROPERTIES LINK_FLAGS_DEBUG "/DELAYLOAD:${OPENMP_DLL_NAME}d.dll delayimp.lib" )
SET_TARGET_PROPERTIES ( ${ projectname } PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib" )
SET_TARGET_PROPERTIES ( ${ projectname } PROPERTIES LINK_FLAGS_MINSIZEREL "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib" )
endif ( )
endif ( )
2016-07-18 13:16:45 +00:00
endmacro ( )
2016-08-31 12:26:05 +00:00
2018-01-23 06:25:09 +00:00
macro ( WINDOWS_SIGN_TARGET target )
2019-04-17 04:35:54 +00:00
if ( WITH_WINDOWS_CODESIGN )
if ( !SIGNTOOL_EXE )
error ( "Codesigning is enabled, but signtool is not found" )
else ( )
if ( WINDOWS_CODESIGN_PFX_PASSWORD )
set ( CODESIGNPASSWORD /p ${ WINDOWS_CODESIGN_PFX_PASSWORD } )
else ( )
if ( $ENV{ PFXPASSWORD } )
set ( CODESIGNPASSWORD /p $ENV{ PFXPASSWORD } )
else ( )
message ( FATAL_ERROR "WITH_WINDOWS_CODESIGN is on but WINDOWS_CODESIGN_PFX_PASSWORD not set, and environment variable PFXPASSWORD not found, unable to sign code." )
endif ( )
endif ( )
add_custom_command ( TARGET ${ target }
P O S T _ B U I L D
C O M M A N D $ { S I G N T O O L _ E X E } s i g n / f $ { W I N D O W S _ C O D E S I G N _ P F X } $ { C O D E S I G N P A S S W O R D } $ < T A R G E T _ F I L E : $ { t a r g e t } >
V E R B A T I M
)
endif ( )
endif ( )
2018-01-23 06:25:09 +00:00
endmacro ( )