[Bf-blender-cvs] [95a688ffd33] temp-sybren-usd-patch-02: USD: Revamped building & bundling process

Sybren A. Stüvel noreply at git.blender.org
Thu Nov 28 17:56:37 CET 2019


Commit: 95a688ffd3327cb23e50de79415c4f01175dc416
Author: Sybren A. Stüvel
Date:   Thu Nov 28 14:29:07 2019 +0100
Branches: temp-sybren-usd-patch-02
https://developer.blender.org/rB95a688ffd3327cb23e50de79415c4f01175dc416

USD: Revamped building & bundling process

- USD is now built as monolithic library, instead of 25 smaller
  libraries. We were linking all of them as 'whole archive' anyway, so
  this doesn't affect the final file size. It does, however, make life
  easier with respect to linking order, and handling upstream changes.
- The JSON files required by USD are installed into bin/usd; they are
  required on every platform.
- USD is patched so that it finds the aforementioned JSON files in a path
  relative to the running executable. When left unpatched, the only way
  to influence the search path for those files is to set an environment
  variable BEFORE Blender starts (USD uses static initialisers, so by
  the time the USD exporter runs, it has already unsuccessfully tried
  loading the JSON files, and won't re-investigate that environment
  variable ever again).
- USD is patched to have a `PXR_BUILD_USD_TOOLS` CMake option to disable
  building the tools in its `bin` directory. This is sent as a pull
  request at https://github.com/PixarAnimationStudios/USD/pull/1048

===================================================================

M	build_files/build_environment/cmake/harvest.cmake
M	build_files/build_environment/cmake/usd.cmake
M	build_files/build_environment/patches/usd.diff
M	build_files/cmake/Modules/FindUSD.cmake
M	build_files/cmake/macros.cmake
M	build_files/cmake/platform/platform_apple.cmake
M	build_files/cmake/platform/platform_win32.cmake
M	source/blender/usd/CMakeLists.txt
M	source/creator/CMakeLists.txt

===================================================================

diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake
index 0df8fe39443..94e28eda6b2 100644
--- a/build_files/build_environment/cmake/harvest.cmake
+++ b/build_files/build_environment/cmake/harvest.cmake
@@ -198,11 +198,13 @@ harvest(xvidcore/lib ffmpeg/lib "*.a")
 harvest(embree/include embree/include "*.h")
 harvest(embree/lib embree/lib "*.a")
 harvest(usd/include usd/include "*.h")
-harvest(usd/lib usd/lib "*")
+harvest(usd/lib/usd usd/lib/usd "*")
 harvest(usd/plugin usd/plugin "*")
-harvest(usd/pxrConfig.cmake usd/pxrConfig.cmake)
-harvest(usd/cmake/pxrTargets.cmake usd/cmake/pxrTargets.cmake)
-harvest(usd/cmake/pxrTargets-release.cmake usd/cmake/pxrTargets.cmake)
+# Because 'make install' doesn't install the monolithic static library.
+# See https://groups.google.com/d/msg/usd-interest/JgbM0RD8KnY/uHLghBA3BAAJ
+install(
+  FILES ${BUILD_DIR}/usd/src/external_usd-build/pxr/libusd_m.a
+  DESTINATION ${HARVEST_TARGET}/usd/lib/)
 
 if(UNIX AND NOT APPLE)
   harvest(libglu/lib mesa/lib "*.so*")
diff --git a/build_files/build_environment/cmake/usd.cmake b/build_files/build_environment/cmake/usd.cmake
index 29893f3ce9c..c4b1d3f73b1 100644
--- a/build_files/build_environment/cmake/usd.cmake
+++ b/build_files/build_environment/cmake/usd.cmake
@@ -30,6 +30,8 @@ set(USD_EXTRA_ARGS
   -DPXR_BUILD_TESTS=OFF
   -DBUILD_SHARED_LIBS=OFF
   -DPYTHON_EXECUTABLE=${PYTHON_BINARY}
+  -DPXR_BUILD_MONOLITHIC=ON
+  -DPXR_BUILD_USD_TOOLS=OFF
   -DCMAKE_DEBUG_POSTFIX=_d
 )
 
@@ -48,20 +50,3 @@ add_dependencies(
   external_tbb
   external_boost
 )
-
-if(WIN32)
-  if(BUILD_MODE STREQUAL Release)
-    ExternalProject_Add_Step(external_usd after_install
-      COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/usd/ ${HARVEST_TARGET}/usd
-      DEPENDEES install
-    )
-  endif()
-  if(BUILD_MODE STREQUAL Debug)
-    ExternalProject_Add_Step(external_usd after_install
-      COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/usd/lib ${HARVEST_TARGET}/usd/lib
-      DEPENDEES install
-    )
-  endif()
-
-endif()
-
diff --git a/build_files/build_environment/patches/usd.diff b/build_files/build_environment/patches/usd.diff
index 69e6f335ea5..d5a4d286e5e 100644
--- a/build_files/build_environment/patches/usd.diff
+++ b/build_files/build_environment/patches/usd.diff
@@ -1,7 +1,20 @@
-diff -Naur usd.orig/cmake/defaults/Packages.cmake external_usd/cmake/defaults/Packages.cmake
---- usd.orig/cmake/defaults/Packages.cmake	2019-06-17 16:56:45 -0600
-+++ external_usd/cmake/defaults/Packages.cmake	2019-07-19 14:58:06 -0600
-@@ -64,7 +64,7 @@
+diff --git a/cmake/defaults/Options.cmake b/cmake/defaults/Options.cmake
+index bcda89885..3cb541885 100644
+--- a/cmake/defaults/Options.cmake
++++ b/cmake/defaults/Options.cmake
+@@ -25,6 +25,7 @@ option(PXR_STRICT_BUILD_MODE "Turn on additional warnings. Enforce all warnings
+ option(PXR_VALIDATE_GENERATED_CODE "Validate script generated code" OFF)
+ option(PXR_HEADLESS_TEST_MODE "Disallow GUI based tests, useful for running under headless CI systems." OFF)
+ option(PXR_BUILD_TESTS "Build tests" ON)
++option(PXR_BUILD_USD_TOOLS "Build commandline tools" ON)
+ option(PXR_BUILD_IMAGING "Build imaging components" ON)
+ option(PXR_BUILD_EMBREE_PLUGIN "Build embree imaging plugin" OFF)
+ option(PXR_BUILD_OPENIMAGEIO_PLUGIN "Build OpenImageIO plugin" OFF)
+diff --git a/cmake/defaults/Packages.cmake b/cmake/defaults/Packages.cmake
+index 9be215b36..0ce6e6fd5 100644
+--- a/cmake/defaults/Packages.cmake
++++ b/cmake/defaults/Packages.cmake
+@@ -64,7 +64,7 @@ else()
  endif()
  
  # --TBB
@@ -10,9 +23,37 @@ diff -Naur usd.orig/cmake/defaults/Packages.cmake external_usd/cmake/defaults/Pa
  add_definitions(${TBB_DEFINITIONS})
  
  # --math
-diff -Naur usd.orig/pxr/usd/CMakeLists.txt external_usd/pxr/usd/CMakeLists.txt
---- usd.orig/pxr/usd/CMakeLists.txt	2019-06-17 16:56:45 -0600
-+++ external_usd/pxr/usd/CMakeLists.txt	2019-07-19 15:08:15 -0600
+diff --git a/pxr/base/lib/plug/initConfig.cpp b/pxr/base/lib/plug/initConfig.cpp
+index 91d01cadc..8b29aa493 100644
+--- a/pxr/base/lib/plug/initConfig.cpp
++++ b/pxr/base/lib/plug/initConfig.cpp
+@@ -33,6 +33,7 @@
+ #include "pxr/base/arch/symbols.h"
+ 
+ #include <boost/preprocessor/stringize.hpp>
++#include <boost/dll/runtime_symbol_info.hpp>
+ 
+ PXR_NAMESPACE_OPEN_SCOPE
+ 
+@@ -83,6 +84,14 @@ ARCH_CONSTRUCTOR(Plug_InitConfig, 2, void)
+ 
+     sharedLibPath = TfGetPathName(sharedLibPath);
+ 
++    // Executable location, which is relevant when using static linking.
++    boost::filesystem::path executablePath = boost::dll::program_location();
++    if (!executablePath.empty()) {
++        // The path MUST end in a slash, or symlinks will not be treated as directory.
++        boost::filesystem::path pluginPath = executablePath.parent_path() / "usd/";
++        result.push_back(pluginPath.string());
++    }
++
+     // Environment locations.
+     _AppendPathList(&result, TfGetenv(pathEnvVarName), sharedLibPath);
+ 
+diff --git a/pxr/usd/CMakeLists.txt b/pxr/usd/CMakeLists.txt
+index c894cca37..df087a418 100644
+--- a/pxr/usd/CMakeLists.txt
++++ b/pxr/usd/CMakeLists.txt
 @@ -1,6 +1,5 @@
  set(DIRS
      lib
@@ -20,3 +61,12 @@ diff -Naur usd.orig/pxr/usd/CMakeLists.txt external_usd/pxr/usd/CMakeLists.txt
      plugin
  )
  
+@@ -8,3 +7,8 @@ foreach(d ${DIRS})
+     add_subdirectory(${d})
+ endforeach()
+ 
++if (PXR_BUILD_USD_TOOLS)
++    add_subdirectory(bin)
++else()
++    message(STATUS "Skipping commandline tools because PXR_BUILD_USD_TOOLS=OFF")
++endif()
diff --git a/build_files/cmake/Modules/FindUSD.cmake b/build_files/cmake/Modules/FindUSD.cmake
index ec1a9e4a551..1fd931f7688 100644
--- a/build_files/cmake/Modules/FindUSD.cmake
+++ b/build_files/cmake/Modules/FindUSD.cmake
@@ -32,13 +32,6 @@ SET(_usd_SEARCH_DIRS
   /opt/usd
 )
 
-FIND_PATH(USD_ROOT_DIR
-  NAMES
-    pxrConfig.cmake
-  HINTS
-    ${_usd_SEARCH_DIRS}
-)
-
 FIND_PATH(USD_INCLUDE_DIR
   NAMES
     pxr/usd/usd/api.h
@@ -46,40 +39,37 @@ FIND_PATH(USD_INCLUDE_DIR
     ${_usd_SEARCH_DIRS}
   PATH_SUFFIXES
     include
+  DOC "Universal Scene Description (USD) header files"
 )
 
-FIND_LIBRARY(_usd_LIBRARY
+FIND_LIBRARY(USD_LIBRARY
   NAMES
-  usd
+    usd_m
   HINTS
     ${_usd_SEARCH_DIRS}
   PATH_SUFFIXES
     lib64 lib lib/static
+  DOC "Universal Scene Description (USD) monolithic library"
 )
 
+if (${USD_LIBRARY} STREQUAL "USD_LIBRARY-NOTFOUND")
+  message(FATAL_ERROR "USD library not found")
+endif()
+
 # handle the QUIETLY and REQUIRED arguments and set USD_FOUND to TRUE if
 # all listed variables are TRUE
 INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(USD DEFAULT_MSG USD_ROOT_DIR _usd_LIBRARY USD_INCLUDE_DIR)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(USD DEFAULT_MSG USD_LIBRARY USD_INCLUDE_DIR)
 
 IF(USD_FOUND)
-  get_filename_component(USD_LIBRARY_DIR ${_usd_LIBRARY} DIRECTORY)
-
-  SET(USD_LIBRARIES)
-  # List copied from pxrTargets.cmake, which is created when building USD.
-  foreach(_usd_lib arch tf gf js trace work plug vt ar kind sdf ndr sdr pcp usd usdGeom usdVol usdLux usdShade usdRender usdHydra usdRi usdSkel usdUI usdUtils)
-    list(APPEND USD_LIBRARIES "${USD_LIBRARY_DIR}/lib${_usd_lib}.a")
-  endforeach()
-  list(REVERSE USD_LIBRARIES)
-
+  get_filename_component(USD_LIBRARY_DIR ${USD_LIBRARY} DIRECTORY)
   SET(USD_INCLUDE_DIRS ${USD_INCLUDE_DIR})
+  set(USD_LIBRARIES ${USD_LIBRARY})
 ENDIF(USD_FOUND)
 
 MARK_AS_ADVANCED(
   USD_INCLUDE_DIR
   USD_LIBRARY_DIR
-  USD_ROOT_DIR
 )
 
-UNSET(_usd_LIBRARY)
 UNSET(_usd_SEARCH_DIRS)
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 3944a8b3c56..101f71261b4 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -466,6 +466,19 @@ function(setup_liblinks
   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)
+      # whole-archive linking is handled in platform_win32.cmake.
+      target_link_libraries(${target} ${USD_LIBRARIES})
+    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()
@@ -1220,10 +1233,10 @@ macro(openmp_delayload
         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")
+        set_property(TARGET ${projectname} APPEND_STRING  PROPERTY LINK_FLAGS_RELEASE " /DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
+        set_property(TARGET ${projectname} APPEND_STRING  PROPERTY LINK_FLAGS_DEBUG " /DELAYLOAD:${OPENMP_DLL_NAME}d.dll delayimp.lib")
+        set_property(TARGET ${projectname} APPEND_STRING  PROPERTY LINK_FLAGS_RELWITHDEBINFO " /DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
+        set_property(TARGET ${projectname} APPEND_STRING  PROPERTY LINK_FLAGS_MINSIZEREL " /DELAYLOAD:${OPENMP_DLL_NAME}.dll delayimp.lib")
       endif()
     endif()
 endmacro()
diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake
index 578ad143d59..d99d7ec3c0c 100644
--- a/build_files/cmake/platform/platform_apple.cmake
+++ b/build_files/cmake/platform/platform_apple.cmake
@@ -56,6 +56,11 @@ if(WITH_ALEMBIC)
   set(ALEMBIC_FOUND ON)
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list