1 # ***** BEGIN GPL LICENSE BLOCK *****
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # The Original Code is Copyright (C) 2006, Blender Foundation
18 # All rights reserved.
20 # The Original Code is: all of this file.
22 # Contributor(s): Jacques Beaurain.
24 # ***** END GPL LICENSE BLOCK *****
26 macro(list_insert_after
27 list_id item_check item_add
30 list(FIND "${list_id}" "${item_check}" _index)
31 if("${_index}" MATCHES "-1")
32 message(FATAL_ERROR "'${list_id}' doesn't contain '${item_check}'")
34 math(EXPR _index "${_index} + 1")
35 list(INSERT ${list_id} "${_index}" ${item_add})
39 macro(list_insert_before
40 list_id item_check item_add
43 list(FIND "${list_id}" "${item_check}" _index)
44 if("${_index}" MATCHES "-1")
45 message(FATAL_ERROR "'${list_id}' doesn't contain '${item_check}'")
47 list(INSERT ${list_id} "${_index}" ${item_add})
51 function(list_assert_duplicates
55 # message(STATUS "list data: ${list_id}")
57 list(LENGTH list_id _len_before)
58 list(REMOVE_DUPLICATES list_id)
59 list(LENGTH list_id _len_after)
60 # message(STATUS "list size ${_len_before} -> ${_len_after}")
61 if(NOT _len_before EQUAL _len_after)
62 message(FATAL_ERROR "duplicate found in list which should not contain duplicates: ${list_id}")
69 # foo_bar.spam --> foo_barMySuffix.spam
71 file_name_new file_name file_suffix
74 get_filename_component(_file_name_PATH ${file_name} PATH)
75 get_filename_component(_file_name_NAME_WE ${file_name} NAME_WE)
76 get_filename_component(_file_name_EXT ${file_name} EXT)
77 set(${file_name_new} "${_file_name_PATH}/${_file_name_NAME_WE}${file_suffix}${_file_name_EXT}")
79 unset(_file_name_PATH)
80 unset(_file_name_NAME_WE)
84 # useful for adding debug suffix to library lists:
85 # /somepath/foo.lib --> /somepath/foo_d.lib
86 macro(file_list_suffix
87 fp_list_new fp_list fn_suffix
90 # incase of empty list
96 foreach(_fp ${fp_list})
97 file_suffix(_fp_suffixed "${_fp}" "${fn_suffix}")
98 list(APPEND "${fp_list_new}" "${_fp_suffixed}")
106 if(UNIX AND NOT APPLE)
107 macro(find_package_static)
108 set(_cmake_find_library_suffixes_back ${CMAKE_FIND_LIBRARY_SUFFIXES})
109 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
110 find_package(${ARGV})
111 set(CMAKE_FIND_LIBRARY_SUFFIXES ${_cmake_find_library_suffixes_back})
112 unset(_cmake_find_library_suffixes_back)
115 macro(find_library_static)
116 set(_cmake_find_library_suffixes_back ${CMAKE_FIND_LIBRARY_SUFFIXES})
117 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
118 find_library(${ARGV})
119 set(CMAKE_FIND_LIBRARY_SUFFIXES ${_cmake_find_library_suffixes_back})
120 unset(_cmake_find_library_suffixes_back)
124 function(target_link_libraries_optimized
129 foreach(_LIB ${LIBS})
130 target_link_libraries(${TARGET} optimized "${_LIB}")
134 function(target_link_libraries_debug
139 foreach(_LIB ${LIBS})
140 target_link_libraries(${TARGET} debug "${_LIB}")
144 # Nicer makefiles with -I/1/foo/ instead of -I/1/2/3/../../foo/
145 # use it instead of include_directories()
146 function(blender_include_dirs
151 foreach(_INC ${ARGV})
152 get_filename_component(_ABS_INC ${_INC} ABSOLUTE)
153 list(APPEND _ALL_INCS ${_ABS_INC})
154 # for checking for invalid includes, disable for regular use
155 ##if(NOT EXISTS "${_ABS_INC}/")
156 ## message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
159 include_directories(${_ALL_INCS})
162 function(blender_include_dirs_sys
167 foreach(_INC ${ARGV})
168 get_filename_component(_ABS_INC ${_INC} ABSOLUTE)
169 list(APPEND _ALL_INCS ${_ABS_INC})
170 ##if(NOT EXISTS "${_ABS_INC}/")
171 ## message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
174 include_directories(SYSTEM ${_ALL_INCS})
177 function(blender_source_group
181 # Group by location on disk
182 source_group("Source Files" FILES CMakeLists.txt)
184 foreach(_SRC ${sources})
185 get_filename_component(_SRC_EXT ${_SRC} EXT)
186 if((${_SRC_EXT} MATCHES ".h") OR
187 (${_SRC_EXT} MATCHES ".hpp") OR
188 (${_SRC_EXT} MATCHES ".hh"))
190 set(GROUP_ID "Header Files")
192 set(GROUP_ID "Source Files")
194 source_group("${GROUP_ID}" FILES ${_SRC})
199 # Support per-target CMake flags
200 # Read from: CMAKE_C_FLAGS_**** (made upper case) when set.
202 # 'name' should alway match the target name,
203 # use this macro before add_library or add_executable.
205 # Optionally takes an arg passed to set(), eg PARENT_SCOPE.
206 macro(add_cc_flags_custom_test
210 string(TOUPPER ${name} _name_upper)
211 if(DEFINED CMAKE_C_FLAGS_${_name_upper})
212 message(STATUS "Using custom CFLAGS: CMAKE_C_FLAGS_${_name_upper} in \"${CMAKE_CURRENT_SOURCE_DIR}\"")
213 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${_name_upper}}" ${ARGV1})
215 if(DEFINED CMAKE_CXX_FLAGS_${_name_upper})
216 message(STATUS "Using custom CXXFLAGS: CMAKE_CXX_FLAGS_${_name_upper} in \"${CMAKE_CURRENT_SOURCE_DIR}\"")
217 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${_name_upper}}" ${ARGV1})
224 # only MSVC uses SOURCE_GROUP
225 function(blender_add_lib__impl
232 # message(STATUS "Configuring library ${name}")
234 # include_directories(${includes})
235 # include_directories(SYSTEM ${includes_sys})
236 blender_include_dirs("${includes}")
237 blender_include_dirs_sys("${includes_sys}")
239 add_library(${name} ${sources})
241 # works fine without having the includes
242 # listed is helpful for IDE's (QtCreator/MSVC)
243 blender_source_group("${sources}")
245 list_assert_duplicates("${sources}")
246 list_assert_duplicates("${includes}")
247 # Not for system includes because they can resolve to the same path
248 # list_assert_duplicates("${includes_sys}")
253 function(blender_add_lib_nolist
260 add_cc_flags_custom_test(${name} PARENT_SCOPE)
262 blender_add_lib__impl(${name} "${sources}" "${includes}" "${includes_sys}")
265 function(blender_add_lib
272 add_cc_flags_custom_test(${name} PARENT_SCOPE)
274 blender_add_lib__impl(${name} "${sources}" "${includes}" "${includes_sys}")
276 set_property(GLOBAL APPEND PROPERTY BLENDER_LINK_LIBS ${name})
280 function(SETUP_LIBDIRS)
282 # NOTE: For all new libraries, use absolute library paths.
283 # This should eventually be phased out.
286 link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH})
288 if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
289 link_directories(${PYTHON_LIBPATH})
291 if(WITH_SDL AND NOT WITH_SDL_DYNLOAD)
292 link_directories(${SDL_LIBPATH})
294 if(WITH_CODEC_FFMPEG)
295 link_directories(${FFMPEG_LIBPATH})
297 if(WITH_IMAGE_OPENEXR)
298 link_directories(${OPENEXR_LIBPATH})
301 link_directories(${TIFF_LIBPATH})
304 link_directories(${BOOST_LIBPATH})
307 link_directories(${OPENIMAGEIO_LIBPATH})
310 link_directories(${OPENCOLORIO_LIBPATH})
313 link_directories(${OPENVDB_LIBPATH})
316 link_directories(${OPENAL_LIBPATH})
318 if(WITH_JACK AND NOT WITH_JACK_DYNLOAD)
319 link_directories(${JACK_LIBPATH})
321 if(WITH_CODEC_SNDFILE)
322 link_directories(${SNDFILE_LIBPATH})
325 link_directories(${FFTW3_LIBPATH})
328 link_directories(${OPENCOLLADA_LIBPATH})
330 # link_directories(${PCRE_LIBPATH})
331 # link_directories(${EXPAT_LIBPATH})
334 link_directories(${LLVM_LIBPATH})
338 link_directories(${ALEMBIC_LIBPATH})
339 link_directories(${HDF5_LIBPATH})
342 if(WIN32 AND NOT UNIX)
343 link_directories(${PTHREADS_LIBPATH})
348 function(setup_liblinks
352 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE)
353 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE)
355 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE)
356 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE)
358 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS}" PARENT_SCOPE)
359 set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE)
361 target_link_libraries(
367 # since we are using the local libs for python when compiling msvc projects, we need to add _d when compiling debug versions
368 if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
369 target_link_libraries(${target} ${PYTHON_LINKFLAGS})
371 if(WIN32 AND NOT UNIX)
372 file_list_suffix(PYTHON_LIBRARIES_DEBUG "${PYTHON_LIBRARIES}" "_d")
373 target_link_libraries_debug(${target} "${PYTHON_LIBRARIES_DEBUG}")
374 target_link_libraries_optimized(${target} "${PYTHON_LIBRARIES}")
375 unset(PYTHON_LIBRARIES_DEBUG)
377 target_link_libraries(${target} ${PYTHON_LIBRARIES})
381 if(WITH_LZO AND WITH_SYSTEM_LZO)
382 target_link_libraries(${target} ${LZO_LIBRARIES})
385 target_link_libraries(${target} ${BLENDER_GLEW_LIBRARIES})
387 if(WITH_BULLET AND WITH_SYSTEM_BULLET)
388 target_link_libraries(${target} ${BULLET_LIBRARIES})
390 if(WITH_AUDASPACE AND WITH_SYSTEM_AUDASPACE)
391 target_link_libraries(${target} ${AUDASPACE_C_LIBRARIES} ${AUDASPACE_PY_LIBRARIES})
394 target_link_libraries(${target} ${OPENAL_LIBRARY})
397 target_link_libraries(${target} ${FFTW3_LIBRARIES})
399 if(WITH_JACK AND NOT WITH_JACK_DYNLOAD)
400 target_link_libraries(${target} ${JACK_LIBRARIES})
402 if(WITH_CODEC_SNDFILE)
403 target_link_libraries(${target} ${SNDFILE_LIBRARIES})
405 if(WITH_SDL AND NOT WITH_SDL_DYNLOAD)
406 target_link_libraries(${target} ${SDL_LIBRARY})
409 target_link_libraries(${target} ${TIFF_LIBRARY})
412 target_link_libraries(${target} ${OPENIMAGEIO_LIBRARIES})
415 target_link_libraries(${target} ${OPENCOLORIO_LIBRARIES})
417 if(WITH_OPENSUBDIV OR WITH_CYCLES_OPENSUBDIV)
418 target_link_libraries(${target} ${OPENSUBDIV_LIBRARIES})
421 target_link_libraries(${target} ${OPENVDB_LIBRARIES} ${TBB_LIBRARIES})
424 target_link_libraries(${target} ${OSL_LIBRARIES})
427 target_link_libraries(${target} ${BOOST_LIBRARIES})
428 if(Boost_USE_STATIC_LIBS AND Boost_USE_ICU)
429 target_link_libraries(${target} ${ICU_LIBRARIES})
432 target_link_libraries(${target} ${JPEG_LIBRARIES})
434 target_link_libraries(${target} ${ALEMBIC_LIBRARIES} ${HDF5_LIBRARIES})
436 if(WITH_IMAGE_OPENEXR)
437 target_link_libraries(${target} ${OPENEXR_LIBRARIES})
439 if(WITH_IMAGE_OPENJPEG AND WITH_SYSTEM_OPENJPEG)
440 target_link_libraries(${target} ${OPENJPEG_LIBRARIES})
442 if(WITH_CODEC_FFMPEG)
443 target_link_libraries(${target} ${FFMPEG_LIBRARIES})
446 if(WIN32 AND NOT UNIX)
447 file_list_suffix(OPENCOLLADA_LIBRARIES_DEBUG "${OPENCOLLADA_LIBRARIES}" "_d")
448 target_link_libraries_debug(${target} "${OPENCOLLADA_LIBRARIES_DEBUG}")
449 target_link_libraries_optimized(${target} "${OPENCOLLADA_LIBRARIES}")
450 unset(OPENCOLLADA_LIBRARIES_DEBUG)
452 file_list_suffix(PCRE_LIBRARIES_DEBUG "${PCRE_LIBRARIES}" "_d")
453 target_link_libraries_debug(${target} "${PCRE_LIBRARIES_DEBUG}")
454 target_link_libraries_optimized(${target} "${PCRE_LIBRARIES}")
455 unset(PCRE_LIBRARIES_DEBUG)
458 file_list_suffix(EXPAT_LIB_DEBUG "${EXPAT_LIB}" "_d")
459 target_link_libraries_debug(${target} "${EXPAT_LIB_DEBUG}")
460 target_link_libraries_optimized(${target} "${EXPAT_LIB}")
461 unset(EXPAT_LIB_DEBUG)
464 target_link_libraries(
466 ${OPENCOLLADA_LIBRARIES}
473 if(WITH_MEM_JEMALLOC)
474 target_link_libraries(${target} ${JEMALLOC_LIBRARIES})
476 if(WITH_MOD_CLOTH_ELTOPO)
477 target_link_libraries(${target} ${LAPACK_LIBRARIES})
480 target_link_libraries(${target} ${LLVM_LIBRARY})
482 if(WIN32 AND NOT UNIX)
483 target_link_libraries(${target} ${PTHREADS_LIBRARIES})
485 if(UNIX AND NOT APPLE)
486 if(WITH_OPENMP_STATIC)
487 target_link_libraries(${target} ${OpenMP_LIBRARIES})
490 target_link_libraries(${target} ${NDOF_LIBRARIES})
494 target_link_libraries(${target} ${GLOG_LIBRARIES})
496 if(WITH_SYSTEM_GFLAGS)
497 target_link_libraries(${target} ${GFLAGS_LIBRARIES})
500 # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
501 if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
502 target_link_libraries(${target} "extern_clew")
503 if(WITH_CUDA_DYNLOAD)
504 target_link_libraries(${target} "extern_cuew")
506 target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
510 target_link_libraries(
515 #system libraries with no dependencies such as platform link libs or opengl should go last
516 target_link_libraries(${target}
517 ${BLENDER_GL_LIBRARIES})
519 #target_link_libraries(${target} ${PLATFORM_LINKLIBS} ${CMAKE_DL_LIBS})
520 target_link_libraries(${target} ${PLATFORM_LINKLIBS})
524 function(SETUP_BLENDER_SORTED_LIBS)
526 get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
528 list(APPEND BLENDER_LINK_LIBS
534 list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
538 list(APPEND BLENDER_LINK_LIBS
547 list(APPEND BLENDER_LINK_LIBS cycles_kernel_osl)
552 set(BLENDER_SORTED_LIBS
556 bf_editor_space_action
557 bf_editor_space_buttons
558 bf_editor_space_console
560 bf_editor_space_graph
561 bf_editor_space_image
563 bf_editor_space_logic
566 bf_editor_space_outliner
567 bf_editor_space_script
568 bf_editor_space_sequencer
571 bf_editor_space_userpref
572 bf_editor_space_view3d
588 bf_editor_sculpt_paint
624 bf_intern_guardedalloc
635 extern_recastnavigation
643 ge_logic_loopbacknetwork
661 bf_intern_opencolorio
671 if(NOT WITH_SYSTEM_GLOG)
672 list(APPEND BLENDER_SORTED_LIBS extern_glog)
675 if(NOT WITH_SYSTEM_GFLAGS)
676 list(APPEND BLENDER_SORTED_LIBS extern_gflags)
680 # added for opencl compositor
681 list_insert_before(BLENDER_SORTED_LIBS "bf_blenkernel" "bf_compositor")
682 list_insert_after(BLENDER_SORTED_LIBS "bf_compositor" "bf_intern_opencl")
686 list(APPEND BLENDER_SORTED_LIBS extern_ceres)
689 if(WITH_MOD_CLOTH_ELTOPO)
690 list(APPEND BLENDER_SORTED_LIBS extern_eltopo)
693 if(NOT WITH_SYSTEM_LZO)
694 list(APPEND BLENDER_SORTED_LIBS extern_minilzo)
697 if(NOT WITH_SYSTEM_GLEW)
698 list(APPEND BLENDER_SORTED_LIBS ${BLENDER_GLEW_LIBRARIES})
702 list(APPEND BLENDER_SORTED_LIBS extern_binreloc)
705 if(WITH_CXX_GUARDEDALLOC)
706 list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
710 list_insert_after(BLENDER_SORTED_LIBS "bf_intern_elbeem" "bf_intern_iksolver")
714 list(APPEND BLENDER_SORTED_LIBS bf_intern_itasc)
718 list(APPEND BLENDER_SORTED_LIBS extern_carve)
722 list(APPEND BLENDER_SORTED_LIBS extern_xdnd)
726 list_insert_after(BLENDER_SORTED_LIBS "cycles_kernel" "cycles_kernel_osl")
729 if(WITH_INTERNATIONAL)
730 list(APPEND BLENDER_SORTED_LIBS bf_intern_locale)
734 list_insert_after(BLENDER_SORTED_LIBS "bf_blenkernel" "bf_intern_rigidbody")
737 if(WITH_BULLET AND NOT WITH_SYSTEM_BULLET)
738 list_insert_after(BLENDER_SORTED_LIBS "ge_logic_ngnetwork" "extern_bullet")
741 if(WITH_GAMEENGINE_DECKLINK)
742 list(APPEND BLENDER_SORTED_LIBS bf_intern_decklink)
746 list(APPEND BLENDER_SORTED_LIBS bf_intern_gpudirect)
749 if(WITH_OPENSUBDIV OR WITH_CYCLES_OPENSUBDIV)
750 list(APPEND BLENDER_SORTED_LIBS bf_intern_opensubdiv)
754 list(APPEND BLENDER_SORTED_LIBS bf_intern_openvdb)
757 foreach(SORTLIB ${BLENDER_SORTED_LIBS})
758 set(REMLIB ${SORTLIB})
759 foreach(SEARCHLIB ${BLENDER_LINK_LIBS})
760 if(${SEARCHLIB} STREQUAL ${SORTLIB})
765 # message(STATUS "Removing library ${REMLIB} from blender linking because: not configured")
766 list(APPEND REM_MSG ${REMLIB})
767 list(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
772 message(STATUS "Blender Skipping: (${REM_MSG})")
776 set(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} PARENT_SCOPE)
778 # for top-level tests
779 set_property(GLOBAL PROPERTY BLENDER_SORTED_LIBS_PROP ${BLENDER_SORTED_LIBS})
782 macro(TEST_SSE_SUPPORT
786 include(CheckCSourceRuns)
788 # message(STATUS "Detecting SSE support")
789 if(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
790 set(${_sse_flags} "-msse")
791 set(${_sse2_flags} "-msse2")
793 # x86_64 has this auto enabled
794 if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
795 set(${_sse_flags} "")
796 set(${_sse2_flags} "")
798 set(${_sse_flags} "/arch:SSE")
799 set(${_sse2_flags} "/arch:SSE2")
801 elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
802 set(${_sse_flags} "") # icc defaults to -msse
803 set(${_sse2_flags} "-msse2")
805 message(WARNING "SSE flags for this compiler: '${CMAKE_C_COMPILER_ID}' not known")
810 set(CMAKE_REQUIRED_FLAGS "${${_sse_flags}} ${${_sse2_flags}}")
812 if(NOT DEFINED SUPPORT_SSE_BUILD)
814 check_c_source_runs("
815 #include <xmmintrin.h>
816 int main(void) { __m128 v = _mm_setzero_ps(); return 0; }"
819 if(SUPPORT_SSE_BUILD)
820 message(STATUS "SSE Support: detected.")
822 message(STATUS "SSE Support: missing.")
826 if(NOT DEFINED SUPPORT_SSE2_BUILD)
828 check_c_source_runs("
829 #include <emmintrin.h>
830 int main(void) { __m128d v = _mm_setzero_pd(); return 0; }"
833 if(SUPPORT_SSE2_BUILD)
834 message(STATUS "SSE2 Support: detected.")
836 message(STATUS "SSE2 Support: missing.")
840 unset(CMAKE_REQUIRED_FLAGS)
843 # Only print message if running CMake first time
844 macro(message_first_run)
850 macro(TEST_UNORDERED_MAP_SUPPORT)
851 # - Detect unordered_map availability
852 # Test if a valid implementation of unordered_map exists
853 # and define the include path
854 # This module defines
855 # HAVE_UNORDERED_MAP, whether unordered_map implementation was found
857 # HAVE_STD_UNORDERED_MAP_HEADER, <unordered_map.h> was found
858 # HAVE_UNORDERED_MAP_IN_STD_NAMESPACE, unordered_map is in namespace std
859 # HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE, unordered_map is in namespace std::tr1
861 # UNORDERED_MAP_INCLUDE_PREFIX, include path prefix for unordered_map, if found
862 # UNORDERED_MAP_NAMESPACE, namespace for unordered_map, if found
864 include(CheckIncludeFileCXX)
866 # Workaround for newer GCC (6.x+) where C++11 was enabled by default, which lead us
867 # to a situation when there is <unordered_map> include but which can't be used uless
869 if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "6.0") AND (NOT WITH_CXX11))
870 set(HAVE_STD_UNORDERED_MAP_HEADER False)
872 CHECK_INCLUDE_FILE_CXX("unordered_map" HAVE_STD_UNORDERED_MAP_HEADER)
874 if(HAVE_STD_UNORDERED_MAP_HEADER)
875 # Even so we've found unordered_map header file it doesn't
876 # mean unordered_map and unordered_set will be declared in
879 # Namely, MSVC 2008 have unordered_map header which declares
880 # unordered_map class in std::tr1 namespace. In order to support
881 # this, we do extra check to see which exactly namespace is
884 include(CheckCXXSourceCompiles)
885 CHECK_CXX_SOURCE_COMPILES("#include <unordered_map>
887 std::unordered_map<int, int> map;
890 HAVE_UNORDERED_MAP_IN_STD_NAMESPACE)
891 if(HAVE_UNORDERED_MAP_IN_STD_NAMESPACE)
892 message_first_run(STATUS "Found unordered_map/set in std namespace.")
894 set(HAVE_UNORDERED_MAP "TRUE")
895 set(UNORDERED_MAP_INCLUDE_PREFIX "")
896 set(UNORDERED_MAP_NAMESPACE "std")
898 CHECK_CXX_SOURCE_COMPILES("#include <unordered_map>
900 std::tr1::unordered_map<int, int> map;
903 HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
904 if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
905 message_first_run(STATUS "Found unordered_map/set in std::tr1 namespace.")
907 set(HAVE_UNORDERED_MAP "TRUE")
908 set(UNORDERED_MAP_INCLUDE_PREFIX "")
909 set(UNORDERED_MAP_NAMESPACE "std::tr1")
911 message_first_run(STATUS "Found <unordered_map> but cannot find either std::unordered_map "
912 "or std::tr1::unordered_map.")
916 CHECK_INCLUDE_FILE_CXX("tr1/unordered_map" HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
917 if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
918 message_first_run(STATUS "Found unordered_map/set in std::tr1 namespace.")
920 set(HAVE_UNORDERED_MAP "TRUE")
921 set(UNORDERED_MAP_INCLUDE_PREFIX "tr1")
922 set(UNORDERED_MAP_NAMESPACE "std::tr1")
924 message_first_run(STATUS "Unable to find <unordered_map> or <tr1/unordered_map>. ")
929 macro(TEST_SHARED_PTR_SUPPORT)
930 # This check are coming from Ceres library.
932 # Find shared pointer header and namespace.
934 # This module defines the following variables:
936 # SHARED_PTR_FOUND: TRUE if shared_ptr found.
937 # SHARED_PTR_TR1_MEMORY_HEADER: True if <tr1/memory> header is to be used
938 # for the shared_ptr object, otherwise use <memory>.
939 # SHARED_PTR_TR1_NAMESPACE: TRUE if shared_ptr is defined in std::tr1 namespace,
940 # otherwise it's assumed to be defined in std namespace.
942 include(CheckIncludeFileCXX)
943 include(CheckCXXSourceCompiles)
944 set(SHARED_PTR_FOUND FALSE)
945 # Workaround for newer GCC (6.x+) where C++11 was enabled by default, which lead us
946 # to a situation when there is <unordered_map> include but which can't be used uless
948 if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "6.0") AND (NOT WITH_CXX11))
949 set(HAVE_STD_MEMORY_HEADER False)
951 CHECK_INCLUDE_FILE_CXX(memory HAVE_STD_MEMORY_HEADER)
953 if(HAVE_STD_MEMORY_HEADER)
954 # Finding the memory header doesn't mean that shared_ptr is in std
957 # In particular, MSVC 2008 has shared_ptr declared in std::tr1. In
958 # order to support this, we do an extra check to see which namespace
960 CHECK_CXX_SOURCE_COMPILES("#include <memory>
962 std::shared_ptr<int> int_ptr;
965 HAVE_SHARED_PTR_IN_STD_NAMESPACE)
967 if(HAVE_SHARED_PTR_IN_STD_NAMESPACE)
968 message_first_run("-- Found shared_ptr in std namespace using <memory> header.")
969 set(SHARED_PTR_FOUND TRUE)
971 CHECK_CXX_SOURCE_COMPILES("#include <memory>
973 std::tr1::shared_ptr<int> int_ptr;
976 HAVE_SHARED_PTR_IN_TR1_NAMESPACE)
977 if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE)
978 message_first_run("-- Found shared_ptr in std::tr1 namespace using <memory> header.")
979 set(SHARED_PTR_TR1_NAMESPACE TRUE)
980 set(SHARED_PTR_FOUND TRUE)
985 if(NOT SHARED_PTR_FOUND)
986 # Further, gcc defines shared_ptr in std::tr1 namespace and
987 # <tr1/memory> is to be included for this. And what makes things
988 # even more tricky is that gcc does have <memory> header, so
989 # all the checks above wouldn't find shared_ptr.
990 CHECK_INCLUDE_FILE_CXX("tr1/memory" HAVE_TR1_MEMORY_HEADER)
991 if(HAVE_TR1_MEMORY_HEADER)
992 CHECK_CXX_SOURCE_COMPILES("#include <tr1/memory>
994 std::tr1::shared_ptr<int> int_ptr;
997 HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER)
998 if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER)
999 message_first_run("-- Found shared_ptr in std::tr1 namespace using <tr1/memory> header.")
1000 set(SHARED_PTR_TR1_MEMORY_HEADER TRUE)
1001 set(SHARED_PTR_TR1_NAMESPACE TRUE)
1002 set(SHARED_PTR_FOUND TRUE)
1008 # when we have warnings as errors applied globally this
1009 # needs to be removed for some external libs which we dont maintain.
1012 macro(remove_cc_flag
1015 foreach(flag ${ARGV})
1016 string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1017 string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
1018 string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
1019 string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
1020 string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
1022 string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1023 string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
1024 string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
1025 string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
1026 string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
1035 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
1036 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
1039 macro(remove_strict_flags)
1041 if(CMAKE_COMPILER_IS_GNUCC)
1043 "-Wstrict-prototypes"
1044 "-Wmissing-prototypes"
1045 "-Wmissing-declarations"
1046 "-Wmissing-format-attribute"
1047 "-Wunused-local-typedefs"
1049 "-Wunused-parameter"
1054 "-Wdouble-promotion"
1055 "-Wold-style-definition"
1060 # negate flags implied by '-Wall'
1061 add_cc_flag("${CC_REMOVE_STRICT_FLAGS}")
1064 if(CMAKE_C_COMPILER_ID MATCHES "Clang")
1066 "-Wunused-parameter"
1072 # negate flags implied by '-Wall'
1073 add_cc_flag("${CC_REMOVE_STRICT_FLAGS}")
1082 macro(remove_extra_strict_flags)
1083 if(CMAKE_COMPILER_IS_GNUCC)
1085 "-Wunused-parameter"
1089 if(CMAKE_C_COMPILER_ID MATCHES "Clang")
1091 "-Wunused-parameter"
1100 # note, we can only append flags on a single file so we need to negate the options.
1101 # at the moment we cant shut up ffmpeg deprecations, so use this, but will
1102 # probably add more removals here.
1103 macro(remove_strict_flags_file
1106 foreach(_SOURCE ${ARGV})
1108 if(CMAKE_COMPILER_IS_GNUCC OR
1109 (CMAKE_C_COMPILER_ID MATCHES "Clang"))
1111 set_source_files_properties(${_SOURCE}
1113 COMPILE_FLAGS "${CC_REMOVE_STRICT_FLAGS}"
1127 # External libs may need 'signed char' to be default.
1128 macro(remove_cc_flag_unsigned_char)
1129 if(CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang|Intel)$")
1130 remove_cc_flag("-funsigned-char")
1132 remove_cc_flag("/J")
1135 "Compiler '${CMAKE_C_COMPILER_ID}' failed to disable 'unsigned char' flag."
1136 "Build files need updating."
1141 function(ADD_CHECK_C_COMPILER_FLAG
1147 include(CheckCCompilerFlag)
1149 CHECK_C_COMPILER_FLAG("${_FLAG}" "${_CACHE_VAR}")
1151 # message(STATUS "Using CFLAG: ${_FLAG}")
1152 set(${_CFLAGS} "${${_CFLAGS}} ${_FLAG}" PARENT_SCOPE)
1154 message(STATUS "Unsupported CFLAG: ${_FLAG}")
1158 function(ADD_CHECK_CXX_COMPILER_FLAG
1164 include(CheckCXXCompilerFlag)
1166 CHECK_CXX_COMPILER_FLAG("${_FLAG}" "${_CACHE_VAR}")
1168 # message(STATUS "Using CXXFLAG: ${_FLAG}")
1169 set(${_CXXFLAGS} "${${_CXXFLAGS}} ${_FLAG}" PARENT_SCOPE)
1171 message(STATUS "Unsupported CXXFLAG: ${_FLAG}")
1175 function(get_blender_version)
1176 # extracts header vars and defines them in the parent scope:
1178 # - BLENDER_VERSION (major.minor)
1179 # - BLENDER_VERSION_MAJOR
1180 # - BLENDER_VERSION_MINOR
1181 # - BLENDER_SUBVERSION (used for internal versioning mainly)
1182 # - BLENDER_VERSION_CHAR (a, b, c, ...or empty string)
1183 # - BLENDER_VERSION_CYCLE (alpha, beta, rc, release)
1185 # So cmake depends on BKE_blender.h, beware of inf-loops!
1186 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/source/blender/blenkernel/BKE_blender_version.h
1187 ${CMAKE_BINARY_DIR}/source/blender/blenkernel/BKE_blender_version.h.done)
1189 file(STRINGS ${CMAKE_SOURCE_DIR}/source/blender/blenkernel/BKE_blender_version.h _contents REGEX "^#define[ \t]+BLENDER_.*$")
1191 string(REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION[ \t]+([0-9]+).*" "\\1" _out_version "${_contents}")
1192 string(REGEX REPLACE ".*#define[ \t]+BLENDER_SUBVERSION[ \t]+([0-9]+).*" "\\1" _out_subversion "${_contents}")
1193 string(REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION_CHAR[ \t]+([a-z]+).*" "\\1" _out_version_char "${_contents}")
1194 string(REGEX REPLACE ".*#define[ \t]+BLENDER_VERSION_CYCLE[ \t]+([a-z]+).*" "\\1" _out_version_cycle "${_contents}")
1196 if(NOT ${_out_version} MATCHES "[0-9]+")
1197 message(FATAL_ERROR "Version parsing failed for BLENDER_VERSION")
1200 if(NOT ${_out_subversion} MATCHES "[0-9]+")
1201 message(FATAL_ERROR "Version parsing failed for BLENDER_SUBVERSION")
1204 # clumsy regex, only single char are ok but it could be unset
1206 string(LENGTH "${_out_version_char}" _out_version_char_len)
1207 if(NOT _out_version_char_len EQUAL 1)
1208 set(_out_version_char "")
1209 elseif(NOT ${_out_version_char} MATCHES "[a-z]+")
1210 message(FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CHAR")
1213 if(NOT ${_out_version_cycle} MATCHES "[a-z]+")
1214 message(FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CYCLE")
1217 math(EXPR _out_version_major "${_out_version} / 100")
1218 math(EXPR _out_version_minor "${_out_version} % 100")
1220 # for packaging, alpha to numbers
1221 string(COMPARE EQUAL "${_out_version_char}" "" _out_version_char_empty)
1222 if(${_out_version_char_empty})
1223 set(_out_version_char_index "0")
1225 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)
1226 list(FIND _char_ls ${_out_version_char} _out_version_char_index)
1227 math(EXPR _out_version_char_index "${_out_version_char_index} + 1")
1231 set(BLENDER_VERSION "${_out_version_major}.${_out_version_minor}" PARENT_SCOPE)
1232 set(BLENDER_VERSION_MAJOR "${_out_version_major}" PARENT_SCOPE)
1233 set(BLENDER_VERSION_MINOR "${_out_version_minor}" PARENT_SCOPE)
1234 set(BLENDER_SUBVERSION "${_out_subversion}" PARENT_SCOPE)
1235 set(BLENDER_VERSION_CHAR "${_out_version_char}" PARENT_SCOPE)
1236 set(BLENDER_VERSION_CHAR_INDEX "${_out_version_char_index}" PARENT_SCOPE)
1237 set(BLENDER_VERSION_CYCLE "${_out_version_cycle}" PARENT_SCOPE)
1242 # hacks to override initial project settings
1243 # these macros must be called directly before/after project(Blender)
1244 macro(blender_project_hack_pre)
1245 # ------------------
1246 # GCC -O3 HACK START
1247 # needed because O3 can cause problems but
1248 # allow the builder to set O3 manually after.
1249 if(DEFINED CMAKE_C_FLAGS_RELEASE)
1250 set(_reset_standard_cflags_rel OFF)
1252 set(_reset_standard_cflags_rel ON)
1254 if(DEFINED CMAKE_CXX_FLAGS_RELEASE)
1255 set(_reset_standard_cxxflags_rel OFF)
1257 set(_reset_standard_cxxflags_rel ON)
1262 macro(blender_project_hack_post)
1265 if(_reset_standard_cflags_rel)
1266 string(REGEX REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
1267 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE)
1268 mark_as_advanced(CMAKE_C_FLAGS_RELEASE)
1271 if(_reset_standard_cxxflags_rel)
1272 string(REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
1273 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "" FORCE)
1274 mark_as_advanced(CMAKE_CXX_FLAGS_RELEASE)
1277 unset(_reset_standard_cflags_rel)
1278 unset(_reset_standard_cxxflags_rel)
1280 # ------------------------------------------------------------------
1281 # workaround for omission in cmake 2.8.4's GNU.cmake, fixed in 2.8.5
1282 if(CMAKE_COMPILER_IS_GNUCC)
1284 set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
1290 # pair of macros to allow libraries to be specify files to install, but to
1291 # only install them at the end so the directories don't get cleared with
1292 # the files in them. used by cycles to install addon.
1293 function(delayed_install
1299 if(IS_ABSOLUTE ${f})
1300 set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${f})
1302 set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${base}/${f})
1304 set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_DESTINATIONS ${destination})
1308 # note this is a function instead of a macro so that ${BUILD_TYPE} in targetdir
1309 # does not get expanded in calling but is preserved
1310 function(delayed_do_install
1313 get_property(files GLOBAL PROPERTY DELAYED_INSTALL_FILES)
1314 get_property(destinations GLOBAL PROPERTY DELAYED_INSTALL_DESTINATIONS)
1317 list(LENGTH files n)
1318 math(EXPR n "${n}-1")
1320 foreach(i RANGE ${n})
1321 list(GET files ${i} f)
1322 list(GET destinations ${i} d)
1323 install(FILES ${f} DESTINATION ${targetdir}/${d})
1334 list(APPEND ${list_to_add} ${file_to})
1335 set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
1337 get_filename_component(_file_to_path ${file_to} PATH)
1341 COMMAND ${CMAKE_COMMAND} -E make_directory ${_file_to_path}
1342 COMMAND "$<TARGET_FILE:datatoc>" ${file_from} ${file_to}
1343 DEPENDS ${file_from} datatoc)
1345 set_source_files_properties(${file_to} PROPERTIES GENERATED TRUE)
1349 # same as above but generates the var name and output automatic.
1350 function(data_to_c_simple
1356 get_filename_component(_file_from ${CMAKE_CURRENT_SOURCE_DIR}/${file_from} REALPATH)
1357 get_filename_component(_file_to ${CMAKE_CURRENT_BINARY_DIR}/${file_from}.c REALPATH)
1359 list(APPEND ${list_to_add} ${_file_to})
1360 set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
1362 get_filename_component(_file_to_path ${_file_to} PATH)
1366 COMMAND ${CMAKE_COMMAND} -E make_directory ${_file_to_path}
1367 COMMAND "$<TARGET_FILE:datatoc>" ${_file_from} ${_file_to}
1368 DEPENDS ${_file_from} datatoc)
1370 set_source_files_properties(${_file_to} PROPERTIES GENERATED TRUE)
1373 # macro for converting pixmap directory to a png and then a c file
1374 function(data_to_c_simple_icons
1380 # path_from -> _file_from -> _file_to
1381 # foo/*.dat -> foo.png -> foo.png.c
1383 get_filename_component(_path_from_abs ${path_from} ABSOLUTE)
1385 get_filename_component(_file_from ${CMAKE_CURRENT_BINARY_DIR}/${path_from}.png REALPATH)
1386 get_filename_component(_file_to ${CMAKE_CURRENT_BINARY_DIR}/${path_from}.png.c REALPATH)
1388 list(APPEND ${list_to_add} ${_file_to})
1389 set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
1391 get_filename_component(_file_to_path ${_file_to} PATH)
1393 # ideally we wouldn't glob, but storing all names for all pixmaps is a bit heavy
1394 file(GLOB _icon_files "${path_from}/*.dat")
1397 OUTPUT ${_file_from} ${_file_to}
1398 COMMAND ${CMAKE_COMMAND} -E make_directory ${_file_to_path}
1399 #COMMAND python3 ${CMAKE_SOURCE_DIR}/source/blender/datatoc/datatoc_icon.py ${_path_from_abs} ${_file_from}
1400 COMMAND "$<TARGET_FILE:datatoc_icon>" ${_path_from_abs} ${_file_from}
1401 COMMAND "$<TARGET_FILE:datatoc>" ${_file_from} ${_file_to}
1406 # could be an arg but for now we only create icons depending on UI_icons.h
1407 ${CMAKE_SOURCE_DIR}/source/blender/editors/include/UI_icons.h
1410 set_source_files_properties(${_file_from} ${_file_to} PROPERTIES GENERATED TRUE)
1413 # XXX Not used for now...
1422 get_filename_component(_file_from ${CMAKE_CURRENT_SOURCE_DIR}/${file_from} REALPATH)
1423 get_filename_component(_file_to ${CMAKE_CURRENT_SOURCE_DIR}/${file_to} REALPATH)
1425 list(APPEND ${list_to_add} ${_file_to})
1426 set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
1428 find_program(INKSCAPE_EXE inkscape)
1429 mark_as_advanced(INKSCAPE_EXE)
1433 # in OS X app bundle, the binary is a shim that doesn't take any
1434 # command line arguments, replace it with the actual binary
1435 string(REPLACE "MacOS/Inkscape" "Resources/bin/inkscape" INKSCAPE_REAL_EXE ${INKSCAPE_EXE})
1436 if(EXISTS "${INKSCAPE_REAL_EXE}")
1437 set(INKSCAPE_EXE ${INKSCAPE_REAL_EXE})
1443 COMMAND ${INKSCAPE_EXE} ${_file_from} --export-dpi=${dpi} --without-gui --export-png=${_file_to}
1444 DEPENDS ${_file_from} ${INKSCAPE_EXE}
1447 message(WARNING "Inkscape not found, could not re-generate ${_file_to} from ${_file_from}!")
1451 function(msgfmt_simple
1457 get_filename_component(_file_from_we ${file_from} NAME_WE)
1459 get_filename_component(_file_from ${file_from} REALPATH)
1460 get_filename_component(_file_to ${CMAKE_CURRENT_BINARY_DIR}/${_file_from_we}.mo REALPATH)
1462 list(APPEND ${list_to_add} ${_file_to})
1463 set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
1465 get_filename_component(_file_to_path ${_file_to} PATH)
1469 COMMAND ${CMAKE_COMMAND} -E make_directory ${_file_to_path}
1470 COMMAND "$<TARGET_FILE:msgfmt>" ${_file_from} ${_file_to}
1471 DEPENDS msgfmt ${_file_from})
1473 set_source_files_properties(${_file_to} PROPERTIES GENERATED TRUE)
1476 function(find_python_package
1480 string(TOUPPER ${package} _upper_package)
1483 if((NOT ${PYTHON_${_upper_package}_PATH} STREQUAL "") AND
1484 (NOT ${PYTHON_${_upper_package}_PATH} MATCHES NOTFOUND))
1485 # if(NOT EXISTS "${PYTHON_${_upper_package}_PATH}/${package}")
1486 # message(WARNING "PYTHON_${_upper_package}_PATH is invalid, ${package} not found in '${PYTHON_${_upper_package}_PATH}' "
1487 # "WITH_PYTHON_INSTALL_${_upper_package} option will be ignored when installing python")
1488 # set(WITH_PYTHON_INSTALL${_upper_package} OFF)
1490 # not set, so initialize
1492 string(REPLACE "." ";" _PY_VER_SPLIT "${PYTHON_VERSION}")
1493 list(GET _PY_VER_SPLIT 0 _PY_VER_MAJOR)
1496 unset(PYTHON_${_upper_package}_PATH CACHE)
1497 find_path(PYTHON_${_upper_package}_PATH
1501 "${PYTHON_LIBPATH}/python${PYTHON_VERSION}/"
1502 "${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/"
1509 if(NOT EXISTS "${PYTHON_${_upper_package}_PATH}")
1511 "Python package '${package}' path could not be found in:\n"
1512 "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/site-packages/${package}', "
1513 "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/site-packages/${package}', "
1514 "'${PYTHON_LIBPATH}/python${PYTHON_VERSION}/dist-packages/${package}', "
1515 "'${PYTHON_LIBPATH}/python${_PY_VER_MAJOR}/dist-packages/${package}', "
1517 "The 'WITH_PYTHON_INSTALL_${_upper_package}' option will be ignored when installing Python.\n"
1518 "The build will be usable, only add-ons that depend on this package won't be functional."
1520 set(WITH_PYTHON_INSTALL_${_upper_package} OFF PARENT_SCOPE)
1522 message(STATUS "${package} found at '${PYTHON_${_upper_package}_PATH}'")
1527 # like Python's 'print(dir())'
1528 function(print_all_vars)
1529 get_cmake_property(_vars VARIABLES)
1530 foreach(_var ${_vars})
1531 message("${_var}=${${_var}}")
1535 macro(openmp_delayload
1540 if(MSVC_VERSION EQUAL 1800)
1541 set(OPENMP_DLL_NAME "vcomp120")
1543 set(OPENMP_DLL_NAME "vcomp140")
1545 SET_TARGET_PROPERTIES(${projectname} PROPERTIES LINK_FLAGS_RELEASE "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
1546 SET_TARGET_PROPERTIES(${projectname} PROPERTIES LINK_FLAGS_DEBUG "/DELAYLOAD:${OPENMP_DLL_NAME}d.dll delayimp.lib")
1547 SET_TARGET_PROPERTIES(${projectname} PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
1548 SET_TARGET_PROPERTIES(${projectname} PROPERTIES LINK_FLAGS_MINSIZEREL "/DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
1553 MACRO(WINDOWS_SIGN_TARGET target)
1554 if(WITH_WINDOWS_CODESIGN)
1556 error("Codesigning is enabled, but signtool is not found")
1558 if(WINDOWS_CODESIGN_PFX_PASSWORD)
1559 set(CODESIGNPASSWORD /p ${WINDOWS_CODESIGN_PFX_PASSWORD})
1561 if($ENV{PFXPASSWORD})
1562 set(CODESIGNPASSWORD /p $ENV{PFXPASSWORD})
1564 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.")
1567 add_custom_command(TARGET ${target}
1569 COMMAND ${SIGNTOOL_EXE} sign /f ${WINDOWS_CODESIGN_PFX} ${CODESIGNPASSWORD} $<TARGET_FILE:${target}>