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 'intern/cycles/cmake/macros.cmake')
-rw-r--r--intern/cycles/cmake/macros.cmake60
1 files changed, 58 insertions, 2 deletions
diff --git a/intern/cycles/cmake/macros.cmake b/intern/cycles/cmake/macros.cmake
index 0efd8bb7ea8..13328a8b6bf 100644
--- a/intern/cycles/cmake/macros.cmake
+++ b/intern/cycles/cmake/macros.cmake
@@ -8,8 +8,64 @@ endfunction()
macro(cycles_add_library target library_deps)
add_library(${target} ${ARGN})
- if(NOT ("${library_deps}" STREQUAL ""))
- target_link_libraries(${target} "${library_deps}")
+
+ # 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"
+ #
+ # TODO(sergey): This is the same as Blender's side CMake. Find a way to avoid duplication
+ # somehow in a way which allows to have Cycles standalone.
+ if(NOT "${library_deps}" STREQUAL "")
+ 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(${target} optimized ${library})
+ elseif("${next_library_mode}" STREQUAL "debug")
+ target_link_libraries(${target} debug ${library})
+ else()
+ target_link_libraries(${target} ${library})
+ endif()
+ set(next_library_mode "")
+ endif()
+ endforeach()
endif()
+
cycles_set_solution_folder(${target})
endmacro()