Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'build_files/cmake/macros.cmake')
-rw-r--r--build_files/cmake/macros.cmake242
1 files changed, 57 insertions, 185 deletions
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 23ed5b6cbfb..2d13476f09a 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -251,8 +251,59 @@ function(blender_add_lib__impl
add_library(${name} ${sources})
+ # On Windows certain libraries have two sets of binaries: one for debug builds and one for
+ # release builds. The root of this requirement goes into ABI, I believe, but that's outside
+ # of a scope of this comment.
+ #
+ # CMake have a native way of dealing with this, which is specifying what build type the
+ # libraries are provided for:
+ #
+ # target_link_libraries(tagret optimized|debug|general <libraries>)
+ #
+ # The build type is to be provided as a separate argument to the function.
+ #
+ # CMake's variables for libraries will contain build type in such cases. For example:
+ #
+ # set(FOO_LIBRARIES optimized libfoo.lib debug libfoo_d.lib)
+ #
+ # Complications starts with a single argument for library_deps: all the elements are being
+ # put to a list: "${FOO_LIBRARIES}" will become "optimized;libfoo.lib;debug;libfoo_d.lib".
+ # This makes it impossible to pass it as-is to target_link_libraries sine it will treat
+ # this argument as a list of libraries to be linked against, causing missing libraries
+ # for optimized.lib.
+ #
+ # What this code does it traverses library_deps and extracts information about whether
+ # library is to provided as general, debug or optimized. This is a little state machine which
+ # keeps track of whiuch build type library is to provided for:
+ #
+ # - If "debug" or "optimized" word is found, the next element in the list is expected to be
+ # a library which will be passed to target_link_libraries() under corresponding build type.
+ #
+ # - If there is no "debug" or "optimized" used library is specified for all build types.
+ #
+ # NOTE: If separated libraries for debug and release ar eneeded every library is the list are
+ # to be prefixed explicitly.
+ #
+ # Use: "optimized libfoo optimized libbar debug libfoo_d debug libbar_d"
+ # NOT: "optimized libfoo libbar debug libfoo_d libbar_d"
if(NOT "${library_deps}" STREQUAL "")
- target_link_libraries(${name} INTERFACE "${library_deps}")
+ set(next_library_mode "")
+ foreach(library ${library_deps})
+ string(TOLOWER "${library}" library_lower)
+ if(("${library_lower}" STREQUAL "optimized") OR
+ ("${library_lower}" STREQUAL "debug"))
+ set(next_library_mode "${library_lower}")
+ else()
+ if("${next_library_mode}" STREQUAL "optimized")
+ target_link_libraries(${name} optimized ${library})
+ elseif("${next_library_mode}" STREQUAL "debug")
+ target_link_libraries(${name} debug ${library})
+ else()
+ target_link_libraries(${name} ${library})
+ endif()
+ set(next_library_mode "")
+ endif()
+ endforeach()
endif()
# works fine without having the includes
@@ -404,6 +455,11 @@ function(setup_liblinks
target
)
+ # NOTE: This might look like it affects global scope, accumulating linker flags on every call
+ # to setup_liblinks, but this isn't how CMake works. These flags will only affect current
+ # directory from where the function is called.
+ # This means that setup_liblinks() called for ffmpeg_test will not affect blender, and each
+ # of thsoe targets will have single set of linker flags.
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_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${PLATFORM_LINKFLAGS_RELEASE}" PARENT_SCOPE)
@@ -416,201 +472,17 @@ function(setup_liblinks
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} ${PLATFORM_LINKFLAGS_DEBUG}" PARENT_SCOPE)
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} ${PLATFORM_LINKFLAGS_RELEASE}" PARENT_SCOPE)
- # Work around undefined reference errors when disabling certain libraries.
- # Finding the right order for all combinations of options is too hard, so
- # we use --start-group and --end-group so the linker does not discard symbols
- # too early. This appears to have no significant performance impact.
- if(UNIX AND NOT APPLE)
- target_link_libraries(
- ${target}
- -Wl,--start-group
- )
- endif()
-
# 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(
- ${target}
- ${PNG_LIBRARIES}
- ${FREETYPE_LIBRARY}
- )
-
-
- if(WITH_PYTHON)
- target_link_libraries(${target} ${PYTHON_LINKFLAGS})
- target_link_libraries(${target} ${PYTHON_LIBRARIES})
- 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} ${BLOSC_LIBRARIES})
- endif()
- if(WITH_USD)
- # Source: https://github.com/PixarAnimationStudios/USD/blob/master/BUILDING.md#linking-whole-archives
- if(WIN32)
- target_link_libraries(${target} ${USD_LIBRARIES})
- set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS_DEBUG " /WHOLEARCHIVE:${USD_DEBUG_LIB}")
- set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " /WHOLEARCHIVE:${USD_RELEASE_LIB}")
- set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO " /WHOLEARCHIVE:${USD_RELEASE_LIB}")
- set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL " /WHOLEARCHIVE:${USD_RELEASE_LIB}")
- elseif(CMAKE_COMPILER_IS_GNUCXX)
- target_link_libraries(${target} -Wl,--whole-archive ${USD_LIBRARIES} -Wl,--no-whole-archive)
- elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
- target_link_libraries(${target} -Wl,-force_load ${USD_LIBRARIES})
- else()
- message(FATAL_ERROR "Unknown how to link USD with your compiler ${CMAKE_CXX_COMPILER_ID}")
- endif()
- endif()
- if(WITH_OPENIMAGEIO)
- target_link_libraries(${target} ${OPENIMAGEIO_LIBRARIES})
- endif()
- if(WITH_OPENIMAGEDENOISE)
- target_link_libraries(${target} ${OPENIMAGEDENOISE_LIBRARIES})
- endif()
- if(WITH_TBB)
- target_link_libraries(${target} ${TBB_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(
- ${target}
- ${OPENCOLLADA_LIBRARIES}
- ${PCRE_LIBRARIES}
- ${XML2_LIBRARIES}
- ${EXPAT_LIB}
- )
- endif()
- 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(
- ${target}
- ${ZLIB_LIBRARIES}
- )
-
- # System libraries with no dependencies such as platform link libs or opengl should go last.
- target_link_libraries(${target}
- ${BLENDER_GL_LIBRARIES})
# target_link_libraries(${target} ${PLATFORM_LINKLIBS} ${CMAKE_DL_LIBS})
target_link_libraries(${target} ${PLATFORM_LINKLIBS})
-
- # See comments above regarding --start-group.
- if(UNIX AND NOT APPLE)
- target_link_libraries(
- ${target}
- -Wl,--end-group
- )
- endif()
endfunction()
macro(TEST_SSE_SUPPORT