cmake_minimum_required(VERSION 3.16) set(TINYUSDZ_TARGET "tinyusdz") # TODO: drop `z` set(TINYUSDZ_TARGET_NS "tinyusdz::tinyusdz") # dll lib. may not be built. set(TINYUSDZ_TARGET_STATIC_NS "tinyusdz::tinyusdz_static") # static lib is always built. set(TINYUSDZ_TARGET_STATIC "tinyusdz_static") # alias to ${TINYUSDZ_TARGET_STATIC_NS} set(BUILD_TARGET_C "c-tinyusd") set(BUILD_TARGET_PY "pytinyusd") #set(BUILD_TARGET_BLENDER_PY "tinyusd_blender") set(TINYUSDZ_TEST_TARGET "test_tinyusdz") set(TINYUSDZ_BENCHMARK_TARGET "benchmark_tinyusdz") project(${TINYUSDZ_TARGET} C CXX) # PROJECT_IS_TOP_LEVEL is available from cmake 3.21 if (CMAKE_VERSION VERSION_LESS 3.21) if ("${CMAKE_PROJECT_NAME}" STREQUAL "${TINYUSDZ_TARGET}") set(PROJECT_IS_TOP_LEVEL ON) endif() endif () if (EMSCRIPTEN) set(TINYUSDZ_DEFAULT_NO_WERROR ON) set(TINYUSDZ_DEFAULT_PRODUCTION_BUILD On) set(TINYUSDZ_DEFAULT_WITH_BUILTIN_IMAGE_LOADER On) set(TINYUSDZ_DEFAULT_BUILD_TESTS Off) set(TINYUSDZ_DEFAULT_EXAMPLES Off) set(TINYUSDZ_DEFAULT_WITH_C_API Off) set(TINYUSDZ_DEFAULT_WITH_PXR_COMPAT_API Off) # TODO: deprecate in next major version set(TINYUSDZ_DEFAULT_WITH_USDA_PARSER Off) set(TINYUSDZ_DEFAULT_WITH_USDC_PARSER Off) elseif(NOT PROJECT_IS_TOP_LEVEL) # assume tinyusdz is added from add_subdirectory() # disable tools, tests and examples build by default. set(TINYUSDZ_DEFAULT_NO_WERROR OFF) set(TINYUSDZ_DEFAULT_PRODUCTION_BUILD Off) set(TINYUSDZ_DEFAULT_WITH_BUILTIN_IMAGE_LOADER On) set(TINYUSDZ_DEFAULT_BUILD_TESTS Off) set(TINYUSDZ_DEFAULT_EXAMPLES Off) set(TINYUSDZ_DEFAULT_WITH_C_API Off) set(TINYUSDZ_DEFAULT_WITH_PXR_COMPAT_API On) # TODO: deprecate in next major version set(TINYUSDZ_DEFAULT_WITH_USDA_PARSER Off) set(TINYUSDZ_DEFAULT_WITH_USDC_PARSER Off) else() set(TINYUSDZ_DEFAULT_NO_WERROR OFF) set(TINYUSDZ_DEFAULT_PRODUCTION_BUILD Off) set(TINYUSDZ_DEFAULT_WITH_BUILTIN_IMAGE_LOADER On) set(TINYUSDZ_DEFAULT_BUILD_TESTS On) set(TINYUSDZ_DEFAULT_BUILD_EXAMPLES On) set(TINYUSDZ_DEFAULT_WITH_C_API Off) set(TINYUSDZ_DEFAULT_WITH_PXR_COMPAT_API On) # TODO: deprecate in next major version set(TINYUSDZ_DEFAULT_WITH_USDA_PARSER Off) set(TINYUSDZ_DEFAULT_WITH_USDC_PARSER Off) # For Visual Studio set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif () # options option(TINYUSDZ_USE_CCACHE "Use ccache for faster recompile." ON) option(TINYUSDZ_BUILD_SHARED_LIBS "Build as dll?" ${BUILD_SHARED_LIBS}) option(TINYUSDZ_ENABLE_THREAD "Build with C++11 std::thread support?(threading support is not implemented yet)" OFF) option(TINYUSDZ_MSAN "Build with MSAN support(for developer only)" OFF) option(TINYUSDZ_WITH_C_API "Enable C API." ${TINYUSDZ_DEFAULT_WITH_C_API}) option(TINYUSDZ_BUILD_TESTS "Build tests" ${TINYUSDZ_DEFAULT_BUILD_TESTS}) option(TINYUSDZ_BUILD_BENCHMARKS "Build some bechmark tests(e.g. internal C++ data structures)" OFF) option(TINYUSDZ_BUILD_EXAMPLES "Build examples(but not all examples in `examples` folder are being built)" ${TINYUSDZ_DEFAULT_BUILD_EXAMPLES}) option(TINYUSDZ_WITH_BUILTIN_IMAGE_LOADER "Build with built-in image loader(stb_image and fpng). When disabled, app need to provide image loader callback to load images." ${TINYUSDZ_DEFAULT_WITH_BUILTIN_IMAGE_LOADER}) option(TINYUSDZ_WITH_TYDRA "Build with Tydra module(Handly USD scene converter for the renderer, DCC, etc)." ON) if(MSVC) # it looks it is hard to disable C++ exception for MSVC, so enable exception by default set(TINYUSDZ_CXX_EXCEPTIONS_DEFAULT On) else() set(TINYUSDZ_CXX_EXCEPTIONS_DEFAULT Off) endif() # Enable /MP flags(multi processor build) for Visual Studio # Based on VTK's Cmake # No need to set this if you use Ninja Generator if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") # default on. # disable MP or reduce cores if you have less memory set(TINYUSDZ_CXX_MP_FLAG ON CACHE BOOL "Build with /MP flag enabled") set(TINYUSDZ_PROCESSOR_COUNT "$ENV{NUMBER_OF_PROCESSORS}") set(TINYUSDZ_CXX_MP_NUM_PROCESSORS ${TINYUSDZ_PROCESSOR_COUNT} CACHE STRING "The maximum number of processes for the /MP flag") message(STATUS "Use procesors : " ${TINYUSDZ_PROCESSOR_COUNT}) # /MP flag is set as target_compile_options, so do not add /MP to global CMAKE_CXX_FLAGS variable. #if (CMAKE_CXX_MP_FLAG) # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${CMAKE_CXX_MP_NUM_PROCESSORS}") # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP${CMAKE_CXX_MP_NUM_PROCESSORS}") #endif () endif() option(TINYUSDZ_CXX_EXCEPTIONS "Enable/Disable C++ exceptions(default: Off for posix, on for MSVC)" ${TINYUSDZ_CXX_EXCEPTIONS_DEFAULT}) option(TINYUSDZ_WITH_USDMTLX "Build with MaterialX support" ON) option(TINYUSDZ_WITH_JSON "Build with JSON serialization support" OFF) option(TINYUSDZ_WITH_USD_TO_GLTF "Build with USD to glTF example" ON) option(TINYUSDZ_WITH_USDOBJ "Build with usdObj support(import wavefront .obj)" ON) option(TINYUSDZ_WITH_USDFBX "Build with usdFbx support(import FBX .fbx)" OFF) option(TINYUSDZ_WITH_USDVOX "Build with usdVox support(import MagicaVoxel .vox)" ON) option( TINYUSDZ_WITH_OPENSUBDIV "Build with OpenSubdiv(osdCPU. if required, set `osd_DIR` to specify the path to your own OpenSubdiv)" OFF) # Use embedded version of OpenSubdiv code by default set(osd_DIR ${PROJECT_SOURCE_DIR}/src/osd) option(TINYUSDZ_WITH_AUDIO "Build with Audio support(MP3 and WAV)" ON) option(TINYUSDZ_WITH_ALAC_AUDIO "Build with ALAC(as M4A) Audio support" OFF) option(TINYUSDZ_WITH_PYTHON "Build with Python binding through pybind11" OFF) if (TINYUSDZ_WITH_PYTHON) # force enable Tydra C API + DLL build set(TINYUSDZ_WITH_TYDRA ON CACHE INTERNAL "" FORCE) set(TINYUSDZ_WITH_C_API ON CACHE INTERNAL "" FORCE) set(TINYUSDZ_BUILD_SHARED_LIBS ON CACHE INTERNAL "" FORCE) endif() option( TINYUSDZ_PREFER_LOCAL_PYTHON_INSTALLATION "Prefer locally-installed Python interpreter than system or conda/brew installed Python. Please specify your Python interpreter with `Python3_EXECUTABLE` cmake option" OFF) option(TINYUSDZ_WITH_PXR_COMPAT_API "Build with pxr compatible API" ${TINYUSDZ_DEFAULT_WITH_PXR_COMPAT_API}) # C API requires Tydra if (NOT TINYUSDZ_WITH_TYDRA AND TINYUSDZ_WITH_C_API) message(WARNING "C API requires Tydra enabled, so disable C API build. Please do not set TINYUSDZ_WITH_TYDRA Off if you need C API library") set(TINYUSDZ_WITH_C_API Off CACHE INTERNAL "" FORCE) endif () # deprecated. to be removed #option( # TINYUSDZ_WITH_BLENDER_ADDON # "Build with Python module for Blender(`TINYUSDZ_WITH_PYTHON` is force set to ON" # OFF) option(TINYUSDZ_USE_SYSTEM_ZLIB "Use system's zlib instead of miniz for TinyEXR/TIFF" OFF) option( TINYUSDZ_PRODUCTION_BUILD "Build for production release(e.g. disables debug print, do not include full filepath in error messages)" OFF) option( TINYUSDZ_DEBUG_PRINT "Enable debug print(For debugging). Disabled when `TINYUSDZ_PRODUCTION_BUILD` is On" OFF) # -- modules -- option(TINYUSDZ_WITH_MODULE_USDA_READER "Build with USDA reader feature" ON) option(TINYUSDZ_WITH_MODULE_USDA_WRITER "Build with USDA writer feature" ON) # USDC(Crate binary) reader is mandatory in most situation, so this option is primarily for developer build. option(TINYUSDZ_WITH_MODULE_USDC_READER "Build with USDC reader feature" ON) option(TINYUSDZ_WITH_MODULE_USDC_WRITER "Build with USDC writer feature" ON) # ------------- # -- STB -- # # In default TinyUSDZ embeds stb_image and stb_image_write to load/save JPG/PNG/BMP images. # (When TINYUSDZ_WITH_BUILTIN_IMAGE_LOADER is set On) # # Set ON if you use stb_image implementation outside of TinyUSDZ library to avoid multiple symbol def error. option(TINYUSDZ_NO_STB_IMAGE_IMPLEMENTATION "Do not define STB_IMAGE_IMPLEMENTATION" OFF) # Set ON if you use stb_image_write implementation outside of TinyUSDZ library in your app to avoid multiple symbol def error. option(TINYUSDZ_NO_STB_IMAGE_WRITE_IMPLEMENTATION "Do not define STB_IMAGE_WRITGE_IMPLEMENTATION" OFF) # ---------- # -- Wuffs -- # # Use wuffs to decode jpeg/png/bmp instead of using stb_image. # (wuffs is well(I guess) fuzz tested image decoder, so has better security than stb_image) # option(TINYUSDZ_USE_WUFFS_IMAGE_LOADER "Use wuffs to load jpg/png/bmp images" OFF) # Set ON if you use wuffs implementation outside of TinyUSDZ library in your app to avoid multiple symbol def error. option(TINYUSDZ_NO_WUFFS_IMPLEMENTATION "Do not define WUFFS_IMPLEMENTATION" OFF) # ----------- # # -- TIFF -- option(TINYUSDZ_WITH_TIFF "Build with TIFF texture(includes 32bit floating point TIFF) support" OFF) # ---------- # -- EXR -- option(TINYUSDZ_WITH_EXR "Build with EXR HDR texture support" ON) # --------- # -- ColorIO -- option(TINYUSDZ_WITH_COLORIO "Build with Color IO Baked LUT support(through tinycolorio)" ON) # --------- # -- optional tool -- # TODO: deperecate. Use tusdcat option(TINYUSDZ_WITH_TOOL_USDA_PARSER "Build with USDA parser program" Off) option(TINYUSDZ_WITH_TOOL_USDC_PARSER "Build with USDC parser program" Off) # -------------- # -- For developers -- option(TINYUSDZ_COMPILE_TIME_TRACE "Add -ftime-trace to profile compilation time(clang only)" OFF) option(TINYUSDZ_CUSTOM_COMPILE_FLAGS "Use hard-coded custom compile flags(described in CMakeLists.txt). For Developer only)" OFF) # --- # cmake modules list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/sanitizers) find_package(Sanitizers) # Address sanitizer (-DSANITIZE_ADDRESS=ON) # [cifuzz] option(TINYUSDZ_TEST_CIFUZZ "Run cifuzz test" OFF) if (TINYUSDZ_TEST_CIFUZZ) find_package(cifuzz NO_SYSTEM_ENVIRONMENT_PATH) enable_fuzz_testing() endif() if (TINYUSDZ_ENABLE_THREAD) find_package(Threads REQUIRED) # prefer adding "-pthread" compile flag set(THREADS_PREFER_PTHREAD_FLAG ON) endif() if(TINYUSDZ_WITH_EXR OR TINYUSDZ_WITH_TIFF) if(TINYUSDZ_USE_SYSTEM_ZLIB) find_package(ZLIB REQUIRED) endif() endif() # Currently TinyUSDZ does not claim CXX version when TinyUSDZ is added as add_subdirectory() # of toplevel(root) project. # TODO: Property inherit CXX compiler settings from toplevel(root) project. if (PROJECT_IS_TOP_LEVEL) message(STATUS "TinyUSDZ is being built as toplevel project so set CXX standard here.") if(TINYUSDZ_WITH_PYTHON) #set(CMAKE_CXX_STANDARD 17) # nanobind requires C++17 # for pybind11 set(CMAKE_CXX_STANDARD 14) else() if (TINYUSDZ_MSAN) # Require strict C++17 or later for MSAN build set(CMAKE_CXX_STANDARD 17) else() # Require strict C++14 mode(e.g. `-std=c++14`) set(CMAKE_CXX_STANDARD 14) endif() endif() set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) endif() # [ccache] if(TINYUSDZ_USE_CCACHE) if(MSVC) # No ccache support else() find_program(CCACHE_EXE ccache) if(CCACHE_EXE) message(STATUS "Use ccache : " ${CCACHE_EXE}) # CMAKE_C_COMPILER_LAUNCHER = available from cmake 3.4+) if(CMAKE_C_COMPILER_LAUNCHER) set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_C_COMPILER_LAUNCHER}" "${CCACHE_EXE}") else() set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXE}") endif() if(CMAKE_CXX_COMPILER_LAUNCHER) set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CXX_COMPILER_LAUNCHER}" "${CCACHE_EXE}") else() set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXE}") endif() endif(CCACHE_EXE) endif() endif() if(TINYUSDZ_WITH_PYTHON) # For the time beging, we stick with pybind11, since PyPI manylinux2014(probably mostly used architectrue as of 2022/Aug) does not support C++17. # We may switch to nanobind at some point(probably around 2024?) # We build monolithic python module, so build libtinyusdz as a static library # with PIC enabled. # NOTE: TinyUSDZ now builds static lib with PIC enabled by default, so commented out here. # set(CMAKE_POSITION_INDEPENDENT_CODE On) #[nanobind] #set(NB_SHARED # OFF # CACHE INTERNAL "") #set(NB_STATIC # ON # CACHE INTERNAL "") # workaround: find_package() does not work well inside of nanobind(`Python3::Module` target won't defined), so call it here. # and use `FindPython3`, not `FindPython` if(TINYUSDZ_PREFER_LOCAL_PYTHON_INSTALLATION) #message(STATUS "Local Python") set(Python3_FIND_FRAMEWORK NEVER) # Do not search framework python set(Python3_FIND_STRATEGY LOCATION) set(Python3_FIND_REGISTRY NEVER) # Windows only else() set(Python_FIND_FRAMEWORK LAST )# Prefer Brew/Conda to Apple framework python endif() find_package( Python3 COMPONENTS Interpreter Development.Module REQUIRED) #message(STATUS "Python include dirs: " ${Python_INCLUDE_DIRS}) message(STATUS "Python include dirs: " ${Python3_INCLUDE_DIRS}) #add_subdirectory(${PROJECT_SOURCE_DIR}/src/external/nanobind nanobind_build) add_subdirectory(${PROJECT_SOURCE_DIR}/src/external/pybind11) endif() set(TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/asset-resolution.cc ${PROJECT_SOURCE_DIR}/src/tinyusdz.cc ${PROJECT_SOURCE_DIR}/src/xform.cc ${PROJECT_SOURCE_DIR}/src/performance.cc ${PROJECT_SOURCE_DIR}/src/ascii-parser.cc ${PROJECT_SOURCE_DIR}/src/ascii-parser-basetype.cc ${PROJECT_SOURCE_DIR}/src/ascii-parser-timesamples.cc ${PROJECT_SOURCE_DIR}/src/ascii-parser-timesamples-array.cc ${PROJECT_SOURCE_DIR}/src/audio-loader.cc ${PROJECT_SOURCE_DIR}/src/base122.cc ${PROJECT_SOURCE_DIR}/src/usda-reader.cc ${PROJECT_SOURCE_DIR}/src/usdc-reader.cc ${PROJECT_SOURCE_DIR}/src/usda-writer.cc ${PROJECT_SOURCE_DIR}/src/usdc-writer.cc ${PROJECT_SOURCE_DIR}/src/composition.cc ${PROJECT_SOURCE_DIR}/src/crate-reader.cc ${PROJECT_SOURCE_DIR}/src/crate-format.cc ${PROJECT_SOURCE_DIR}/src/crate-writer.cc ${PROJECT_SOURCE_DIR}/src/crate-pprint.cc ${PROJECT_SOURCE_DIR}/src/path-util.cc ${PROJECT_SOURCE_DIR}/src/prim-reconstruct.cc ${PROJECT_SOURCE_DIR}/src/prim-composition.cc ${PROJECT_SOURCE_DIR}/src/prim-types.cc ${PROJECT_SOURCE_DIR}/src/primvar.cc ${PROJECT_SOURCE_DIR}/src/str-util.cc ${PROJECT_SOURCE_DIR}/src/value-pprint.cc ${PROJECT_SOURCE_DIR}/src/value-types.cc ${PROJECT_SOURCE_DIR}/src/tiny-format.cc ${PROJECT_SOURCE_DIR}/src/io-util.cc ${PROJECT_SOURCE_DIR}/src/image-loader.cc ${PROJECT_SOURCE_DIR}/src/image-writer.cc ${PROJECT_SOURCE_DIR}/src/image-util.cc ${PROJECT_SOURCE_DIR}/src/linear-algebra.cc ${PROJECT_SOURCE_DIR}/src/usdGeom.cc ${PROJECT_SOURCE_DIR}/src/usdSkel.cc ${PROJECT_SOURCE_DIR}/src/usdShade.cc ${PROJECT_SOURCE_DIR}/src/usdLux.cc # usdMtlX has less dependency(pugixml), so add it to core component ${PROJECT_SOURCE_DIR}/src/usdMtlx.cc ${PROJECT_SOURCE_DIR}/src/usdObj.cc ${PROJECT_SOURCE_DIR}/src/image-loader.cc ${PROJECT_SOURCE_DIR}/src/pprinter.cc ${PROJECT_SOURCE_DIR}/src/stage.cc ${PROJECT_SOURCE_DIR}/src/stage.hh ) if (TINYUSDZ_WITH_TYDRA) list(APPEND TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/tydra/facial.cc ${PROJECT_SOURCE_DIR}/src/tydra/facial.hh ${PROJECT_SOURCE_DIR}/src/tydra/prim-apply.cc ${PROJECT_SOURCE_DIR}/src/tydra/prim-apply.hh ${PROJECT_SOURCE_DIR}/src/tydra/scene-access.cc ${PROJECT_SOURCE_DIR}/src/tydra/scene-access.hh ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval.hh ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval.cc ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval-typed.cc ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval-typed-animatable.cc ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval-typed-fallback.cc ${PROJECT_SOURCE_DIR}/src/tydra/attribute-eval-typed-animatable-fallback.cc ${PROJECT_SOURCE_DIR}/src/tydra/obj-export.cc ${PROJECT_SOURCE_DIR}/src/tydra/usd-export.cc ${PROJECT_SOURCE_DIR}/src/tydra/shader-network.cc ${PROJECT_SOURCE_DIR}/src/tydra/shader-network.hh ${PROJECT_SOURCE_DIR}/src/tydra/render-data.cc ${PROJECT_SOURCE_DIR}/src/tydra/render-data.hh ${PROJECT_SOURCE_DIR}/src/tydra/texture-util.cc ${PROJECT_SOURCE_DIR}/src/tydra/texture-util.hh ) endif (TINYUSDZ_WITH_TYDRA) if(TINYUSDZ_WITH_PXR_COMPAT_API) list(APPEND TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/pxr-compat.cc) endif() set(TINYUSDZ_C_API_SOURCES ${PROJECT_SOURCE_DIR}/src/c-tinyusd.cc) set(TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/integerCoding.cpp ${PROJECT_SOURCE_DIR}/src/lz4-compression.cc ${PROJECT_SOURCE_DIR}/src/lz4/lz4.c #${PROJECT_SOURCE_DIR}/src/external/pystring.cpp ) if (TINYUSDZ_WITH_BUILTIN_IMAGE_LOADER) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/fpng.cpp) # Disable SSE for a while, since -mpclmul required to use SSE feature of fpng. set_source_files_properties(${PROJECT_SOURCE_DIR}/src/external/fpng.cpp PROPERTIES COMPILE_DEFINITIONS "FPNG_NO_SSE=1") endif() if(TINYUSDZ_WITH_USDMTLX) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/pugixml.cpp) endif() if(TINYUSDZ_WITH_JSON) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/yyjson.c) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/json-to-usd.cc) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/usd-to-json.cc) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/json-writer.cc) endif() if(TINYUSDZ_WITH_USDFBX) list(APPEND TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/usdFbx.cc ) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/OpenFBX/src/ofbx.cpp) endif() if(TINYUSDZ_WITH_USDOBJ) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/tiny_obj_loader.cc) endif() if(TINYUSDZ_WITH_USDVOX) list(APPEND TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/usdVox.cc) endif() set(TINYUSDZ_PYTHON_BINDING_SOURCES ${PROJECT_SOURCE_DIR}/src/python-bindings.cc) #set(TINYUSDZ_BLENDER_PYTHON_BINDING_SOURCES # ${PROJECT_SOURCE_DIR}/src/blender/bindings.cc) if(TINYUSDZ_WITH_TIFF) if(TINYUSDZ_USE_SYSTEM_ZLIB) set_source_files_properties( ${PROJECT_SOURCE_DIR}/src/external/tiny_dng_loader.cc PROPERTIES COMPILE_DEFINITIONS "TINY_DNG_LOADER_USE_SYSTEM_ZLIB=1") else() set_source_files_properties( ${PROJECT_SOURCE_DIR}/src/external/tiny_dng_loader.cc PROPERTIES INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/src/external) endif() list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/tinyexr.cc) endif(TINYUSDZ_WITH_TIFF) if(TINYUSDZ_WITH_EXR) if(TINYUSDZ_USE_SYSTEM_ZLIB) set_source_files_properties( ${PROJECT_SOURCE_DIR}/src/external/tinyexr.cc PROPERTIES COMPILE_DEFINITIONS "TINYEXR_USE_MINIZ=0") else() set_source_files_properties( ${PROJECT_SOURCE_DIR}/src/external/tinyexr.cc PROPERTIES INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/src/external) endif() list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/tinyexr.cc) endif(TINYUSDZ_WITH_EXR) if(TINYUSDZ_WITH_TIFF OR TINYUSDZ_WITH_EXR) if(NOT TINYUSDZ_USE_SYSTEM_ZLIB) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/miniz.c) # TODO: Set this only for clang, gcc set_source_files_properties( ${PROJECT_SOURCE_DIR}/src/external/miniz.c PROPERTIES COMPILE_DEFINITIONS "_LARGEFILE64_SOURCE=1") endif() endif() if(TINYUSDZ_WITH_ALAC_AUDIO) list(APPEND TINYUSDZ_DEP_SOURCES ${PROJECT_SOURCE_DIR}/src/external/alac/codec/EndianPortable.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/ALACBitUtilities.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/ALACDecoder.cpp ${PROJECT_SOURCE_DIR}/src/external/alac/codec/ALACEncoder.cpp ${PROJECT_SOURCE_DIR}/src/external/alac/codec/ag_dec.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/ag_enc.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/dp_dec.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/dp_enc.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/matrix_dec.c ${PROJECT_SOURCE_DIR}/src/external/alac/codec/matrix_enc.c ) endif(TINYUSDZ_WITH_ALAC_AUDIO) if(TINYUSDZ_WITH_OPENSUBDIV) # https://stackoverflow.com/questions/41700463/push-pop-a-cmake-variable function(ADD_OSD_LIB) #set(NO_TUTORIALS # ON # CACHE INTERNAL "" FORCE) #set(NO_EXAMPLES # ON # CACHE INTERNAL "" FORCE) #set(NO_REGRESSION # ON # CACHE INTERNAL "" FORCE) #set(NO_DOC # ON # CACHE INTERNAL "" FORCE) #set(NO_OMP # ON # CACHE INTERNAL "" FORCE) #set(NO_TBB # ON # CACHE INTERNAL "" FORCE) #set(NO_CUDA # ON # CACHE INTERNAL "" FORCE) #set(NO_OPENCL # ON # CACHE INTERNAL "" FORCE) #set(NO_OPENGL # ON # CACHE INTERNAL "" FORCE) #set(NO_TESTS # ON # CACHE INTERNAL "" FORCE) #set(NO_GLTESTS # ON # CACHE INTERNAL "" FORCE) #set(NO_GLFW # ON # CACHE INTERNAL "" FORCE) #set(NO_PTEX # ON # CACHE INTERNAL "" FORCE) # CMakeLists of OSD package is problematic, so provide our own one. list( APPEND OSD_FAR_SOURCES ${osd_DIR}/opensubdiv/far/bilinearPatchBuilder.cpp ${osd_DIR}/opensubdiv/far/catmarkPatchBuilder.cpp ${osd_DIR}/opensubdiv/far/error.cpp ${osd_DIR}/opensubdiv/far/loopPatchBuilder.cpp ${osd_DIR}/opensubdiv/far/patchBasis.cpp ${osd_DIR}/opensubdiv/far/patchBuilder.cpp ${osd_DIR}/opensubdiv/far/patchDescriptor.cpp ${osd_DIR}/opensubdiv/far/patchMap.cpp ${osd_DIR}/opensubdiv/far/patchTable.cpp ${osd_DIR}/opensubdiv/far/patchTableFactory.cpp ${osd_DIR}/opensubdiv/far/ptexIndices.cpp ${osd_DIR}/opensubdiv/far/stencilTable.cpp ${osd_DIR}/opensubdiv/far/stencilTableFactory.cpp ${osd_DIR}/opensubdiv/far/stencilBuilder.cpp ${osd_DIR}/opensubdiv/far/topologyDescriptor.cpp ${osd_DIR}/opensubdiv/far/topologyRefiner.cpp ${osd_DIR}/opensubdiv/far/topologyRefinerFactory.cpp) # CPU only list( APPEND OSD_OSD_SOURCES ${osd_DIR}/opensubdiv/osd/cpuEvaluator.cpp ${osd_DIR}/opensubdiv/osd/cpuKernel.cpp ${osd_DIR}/opensubdiv/osd/cpuPatchTable.cpp ${osd_DIR}/opensubdiv/osd/cpuVertexBuffer.cpp) list(APPEND OSD_SDC_SOURCES ${osd_DIR}/opensubdiv/sdc/typeTraits.cpp ${osd_DIR}/opensubdiv/sdc/crease.cpp) list( APPEND OSD_VTR_SOURCES ${osd_DIR}/opensubdiv/vtr/fvarLevel.cpp ${osd_DIR}/opensubdiv/vtr/fvarRefinement.cpp ${osd_DIR}/opensubdiv/vtr/level.cpp ${osd_DIR}/opensubdiv/vtr/quadRefinement.cpp ${osd_DIR}/opensubdiv/vtr/refinement.cpp ${osd_DIR}/opensubdiv/vtr/sparseSelector.cpp ${osd_DIR}/opensubdiv/vtr/triRefinement.cpp) #add_library(osd_cpu_static ${OSD_FAR_SOURCES} ${OSD_SDC_SOURCES} ${OSD_VTR_SOURCES} ${OSD_OSD_SOURCES}) #target_include_directories(osd_cpu_static PRIVATE ${osd_DIR}) #if (TINYUSDZ_BUILD_SHARED_LIBS) # add_library(osd_cpu_shared SHARED ${OSD_FAR_SOURCES} ${OSD_SDC_SOURCES} ${OSD_VTR_SOURCES} ${OSD_OSD_SOURCES}) # target_include_directories(osd_cpu_shared PRIVATE ${osd_DIR}) #endif() #if (MSVC) # if (TINYUSDZ_CXX_MP_FLAG) # target_compile_options(osd_cpu_static PRIVATE /MP${CMAKE_CXX_MP_NUM_PROCESSORS}) # if (TINYUSDZ_BUILD_SHARED_LIBS) # target_compile_options(osd_cpu_shared PRIVATE /MP${CMAKE_CXX_MP_NUM_PROCESSORS}) # endif() # endif() #endif() # Build as Object Library(non archival collections) add_library(osd_cpu ${OSD_FAR_SOURCES} ${OSD_SDC_SOURCES} ${OSD_VTR_SOURCES} ${OSD_OSD_SOURCES}) target_include_directories(osd_cpu PRIVATE ${osd_DIR}) set_target_properties(osd_cpu PROPERTIES POSITION_INDEPENDENT_CODE ON) # primarily for Visual Studio Solution Explorer. set_target_properties(osd_cpu PROPERTIES FOLDER "osd") #set(TINYUSDZ_OSD_SOURCES ${OSD_FAR_SOURCES} ${OSD_SDC_SOURCES} ${OSD_VTR_SOURCES} ${OSD_OSD_SOURCES}) endfunction() add_osd_lib() #list(APPEND TINYUSDZ_EXT_LIBRARIES $) list(APPEND TINYUSDZ_SOURCES ${PROJECT_SOURCE_DIR}/src/subdiv.cc) endif(TINYUSDZ_WITH_OPENSUBDIV) if(TINYUSDZ_WITH_TIFF OR TINYUSDZ_WITH_EXR) if(TINYUSDZ_USE_SYSTEM_ZLIB) list(APPEND TINYUSDZ_EXT_LIBRARIES ZLIB::ZLIB) endif() endif() # Increase warning level for clang. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(TUSDZ_COMPILE_FLAGS "-Weverything -Wno-poison-system-directories -Wno-padded -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-documentation -Wno-unused-member-function" ) option(TINYUSDZ_NO_WERROR "Don't set -Werror when building the tinyusdz library" ${TINYUSDZ_DEFAULT_NO_WERROR}) if (NOT TINYUSDZ_NO_WERROR) set(TUSDZ_COMPILE_FLAGS "${TUSDZ_COMPILE_FLAGS} -Werror") endif() # clang17 seems enable -Wunsafe-buffer-usage when `-Weverything` is defined, # resulting compilation error for some raw array access without bound check. # https://reviews.llvm.org/D138940 # https://github.com/llvm/llvm-project/issues/64646 # we need to suppress it as a work around. if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 16) set(TUSDZ_COMPILE_FLAGS "${TUSDZ_COMPILE_FLAGS} -Wno-unsafe-buffer-usage") endif() # this is actually a work around of false-positive behavior of clang in Androind NDK 27. if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 17) set(TUSDZ_COMPILE_FLAGS "${TUSDZ_COMPILE_FLAGS} -Wno-switch-default") endif() if(TINYUSDZ_COMPILE_TIME_TRACE) set(TUSDZ_COMPILE_FLAGS "${TUSDZ_COMPILE_FLAGS} -ftime-trace ") endif() set_source_files_properties(${TINYUSDZ_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_COMPILE_FLAGS}) if (TINYUSDZ_WITH_C_API) set_source_files_properties(${TINYUSDZ_C_API_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_COMPILE_FLAGS}) endif() # Increase warning level for gcc. elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(TUSDZ_COMPILE_FLAGS "-Wall " ) option(TINYUSDZ_NO_WERROR "Don't set -Werror when building the tinyusdz library" ${TINYUSDZ_DEFAULT_NO_WERROR}) if (NOT TINYUSDZ_NO_WERROR) set(TUSDZ_COMPILE_FLAGS "${TUSDZ_COMPILE_FLAGS} -Werror") endif() set_source_files_properties(${TINYUSDZ_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_COMPILE_FLAGS}) if (TINYUSDZ_WITH_C_API) set_source_files_properties(${TINYUSDZ_C_API_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_COMPILE_FLAGS}) endif() endif() if(TINYUSDZ_CUSTOM_COMPILE_FLAGS) # # Overwrite existing TUSDZ_COMPILE_FLAGS # #if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(TUSDZ_CUSTOM_COMPILE_FLAGS "-fstack-usage ") set_source_files_properties(${TINYUSDZ_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_CUSTOM_COMPILE_FLAGS}) if (TINYUSDZ_WITH_C_API) set_source_files_properties(${TINYUSDZ_C_API_SOURCES} PROPERTIES COMPILE_FLAGS ${TUSDZ_CUSTOM_COMPILE_FLAGS}) endif() #endif() endif() # # -- target # # # Disabled Object library for a while, since it has some issue on MSVC target. ## To save compile time, use Object library(non-archival collections) for SHARED and Static lib. ## NOTE: Static lib is always being built with PIC enabled. ## ## #add_library(tinyusdz_object OBJECT ${TINYUSDZ_SOURCES} ${TINYUSDZ_DEP_SOURCES} ${TINYUSDZ_EXT_SOURCES}) #set_target_properties(tinyusdz_object PROPERTIES FOLDER "tinyusdz") #set_target_properties(tinyusdz_object PROPERTIES POSITION_INDEPENDENT_CODE ON) # TinyUSDZ should compile well without /bigobj flag. # Uncommend if you encounter the following errror: fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj #if(MSVC) # target_compile_options(tinyusdz_object PRIVATE /bigobj) #elif(WIN32) # if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") # # guess mingw-gcc # target_compile_options(tinyusdz_object PRIVATE "-Wa, -mbig-obj") # endif() #endif() #if (MSVC) # if (TINYUSDZ_CXX_MP_FLAG) # target_compile_options(tinyusdz_object PRIVATE /MP${CMAKE_CXX_MP_NUM_PROCESSORS}) # endif() #endif() # #if(TINYUSDZ_DEBUG_PRINT) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_DEBUG_PRINT") #endif() # #if(TINYUSDZ_PRODUCTION_BUILD) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_PRODUCTION_BUILD") #endif() # ## default = enable module, so invert definition #if(NOT TINYUSDZ_WITH_MODULE_USDA_READER) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_DISABLE_MODULE_USDA_READER") #endif() # #if(NOT TINYUSDZ_WITH_MODULE_USDA_WRITER) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_DISABLE_MODULE_USDA_WRITER") #endif() # #if(NOT TINYUSDZ_WITH_MODULE_USDC_READER) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_DISABLE_MODULE_USDC_READER") #endif() # #if(NOT TINYUSDZ_WITH_MODULE_USDC_WRITER) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_DISABLE_MODULE_USDC_WRITER") #endif() # #if(NOT TINYUSDZ_WITH_BUILTIN_IMAGE_LOADER) # target_compile_definitions(tinyusdz_object PRIVATE "TINYUSDZ_NO_BUILTIN_IMAGE_LOADER") #endif() # #if(TINYUSDZ_NO_STB_IMAGE_IMPLEMENTATION) # target_compile_definitions(tinyusdz_object PRIVATE "TINYUSDZ_NO_STB_IMAGE_IMPLEMENTATION") #endif() # #if(TINYUSDZ_NO_STB_IMAGE_WRITE_IMPLEMENTATION) # target_compile_definitions(tinyusdz_object PRIVATE "TINYUSDZ_NO_STB_IMAGE_WRITE_IMPLEMENTATION") #endif() # #target_include_directories(tinyusdz_object # PRIVATE ${PROJECT_SOURCE_DIR}/src) #if(TINYUSDZ_WITH_JSON) ##target_include_directories( ## ${TINYUSDZ_LIB_TARGET} PRIVATE ${PROJECT_SOURCE_DIR}/src/external/jsonhpp/) # target_include_directories( # ${TINYUSDZ_LIB_TARGET} # PRIVATE ${PROJECT_SOURCE_DIR}/src/external/jsonhpp/) #endif() #if(TINYUSDZ_WITH_USDMTLX) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_USE_USDMTLX") #endif() # #if(TINYUSDZ_WITH_USDFBX) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_USE_USDFBX") #endif() # #if(TINYUSDZ_WITH_USDOBJ) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_USE_USDOBJ") #endif() # #if(TINYUSDZ_WITH_USDVOX) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_USE_USDVOX") #endif() #target_link_libraries(tinyusdz_object ${TINYUSDZ_EXT_LIBRARIES} # ${CMAKE_DL_LIBS}) # #if (TINYUSDZ_ENABLE_THREAD) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_ENABLE_THREAD") # target_link_libraries(tinyusdz_object Threads::Threads) #endif() # # #if(IOS) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_BUILD_IOS") #endif() # #if(TINYUSDZ_WITH_TIFF) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_WITH_TIFF") #endif(TINYUSDZ_WITH_TIFF) # #if(TINYUSDZ_WITH_EXR) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_WITH_EXR") #endif(TINYUSDZ_WITH_EXR) # #if(TINYUSDZ_WITH_COLORIO) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_WITH_COLORIO") #endif(TINYUSDZ_WITH_COLORIO) # #if(TINYUSDZ_WITH_AUDIO) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_WITH_AUDIO") #endif(TINYUSDZ_WITH_AUDIO) # #if(TINYUSDZ_WITH_ALAC_AUDIO) # target_compile_definitions(tinuusdz_object # PRIVATE "TINYUSDZ_WITH_ALAC_AUDIO") #endif(TINYUSDZ_WITH_ALAC_AUDIO) # #if(TINYUSDZ_WITH_OPENSUBDIV) # target_include_directories(tinyusdz_object PRIVATE ${osd_DIR}) # target_compile_definitions(tinyusdz_object # PRIVATE "TINYUSDZ_WITH_OPENSUBDIV") #endif(TINYUSDZ_WITH_OPENSUBDIV) # #if(NOT TINYUSDZ_CXX_EXCEPTIONS) # if(MSVC) # target_compile_options(tinyusdz_object PUBLIC /EHs-c-) # else() # target_compile_options(tinyusdz_object PUBLIC -fno-exceptions) # endif() #endif() # # TODO: USE set_target_properties(... PROPERTIES OUTPUT_NAME outname)? #add_library(${TINYUSDZ_TARGET_STATIC} STATIC $) #add_sanitizers(${TINYUSDZ_TARGET_STATIC}) add_library(${TINYUSDZ_TARGET_STATIC} STATIC ${TINYUSDZ_SOURCES} ${TINYUSDZ_DEP_SOURCES} ${TINYUSDZ_EXT_SOURCES}) set_target_properties(${TINYUSDZ_TARGET_STATIC} PROPERTIES POSITION_INDEPENDENT_CODE ON) add_sanitizers(${TINYUSDZ_TARGET_STATIC}) #set_target_properties(tinyusdz_object PROPERTIES FOLDER "tinyusdz") # Target with namespace add_library(${TINYUSDZ_TARGET_STATIC_NS} ALIAS ${TINYUSDZ_TARGET_STATIC}) if(TINYUSDZ_BUILD_SHARED_LIBS) #add_library( # ${TINYUSDZ_TARGET} SHARED $) add_library( ${TINYUSDZ_TARGET} SHARED ${TINYUSDZ_SOURCES} ${TINYUSDZ_DEP_SOURCES} ${TINYUSDZ_EXT_SOURCES}) add_sanitizers(${TINYUSDZ_TARGET}) # for dllexport target_compile_definitions(${TINYUSDZ_TARGET} PRIVATE "TINYUSDZ_COMPILE_LIBRARY") target_compile_definitions(${TINYUSDZ_TARGET} PRIVATE "TINYUSDZ_SHARED_LIBRARY") set(TINYUSDZ_LIBS ${TINYUSDZ_TARGET_STATIC} ${TINYUSDZ_TARGET}) else() # static only set(TINYUSDZ_LIBS ${TINYUSDZ_TARGET_STATIC}) endif() if(WIN32 AND TINYUSDZ_WITH_PXR_COMPAT_API) if(TINYUSDZ_BUILD_SHARED_LIBS) target_compile_definitions(${TINYUSDZ_TARGET} PRIVATE "PXR_DYNAMIC") target_compile_definitions(${TINYUSDZ_TARGET} PRIVATE "USD_EXPORTS") endif() endif() # # CMake's Object libary have some issue on MSVC build, so build STATIC and SHARED lib indepdendently. # # # -- common target props # foreach(TINYUSDZ_LIB_TARGET ${TINYUSDZ_LIBS}) # Although TinyUSDZ should compile well without /bigobj flag, # corrent TinyYSDZ need to use bigobj format otherwise we'll get: fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj if(MSVC) target_compile_options(${TINYUSDZ_LIB_TARGET} PRIVATE /bigobj) elseif(WIN32) if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") # guess mingw-gcc target_compile_options(${TINYUSDZ_LIB_TARGET} PRIVATE "-Wa, -mbig-obj") endif() endif() if (MSVC) if (TINYUSDZ_CXX_MP_FLAG) target_compile_options(${TINYUSDZ_LIB_TARGET} PRIVATE /MP${CMAKE_CXX_MP_NUM_PROCESSORS}) endif() endif() if(TINYUSDZ_DEBUG_PRINT) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_DEBUG_PRINT") endif() if(TINYUSDZ_PRODUCTION_BUILD) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_PRODUCTION_BUILD") endif() # default = enable module, so invert definition if(NOT TINYUSDZ_WITH_MODULE_USDA_READER) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_DISABLE_MODULE_USDA_READER") endif() if(NOT TINYUSDZ_WITH_MODULE_USDA_WRITER) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_DISABLE_MODULE_USDA_WRITER") endif() if(NOT TINYUSDZ_WITH_MODULE_USDC_READER) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_DISABLE_MODULE_USDC_READER") endif() if(NOT TINYUSDZ_WITH_MODULE_USDC_WRITER) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_DISABLE_MODULE_USDC_WRITER") endif() if(TINYUSDZ_NO_STB_IMAGE_IMPLEMENTATION) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_NO_STB_IMAGE_IMPLEMENTATION") endif() if(TINYUSDZ_NO_STB_IMAGE_WRITE_IMPLEMENTATION) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_NO_STB_IMAGE_WRITE_IMPLEMENTATION") endif() target_include_directories(${TINYUSDZ_LIB_TARGET} PRIVATE ${PROJECT_SOURCE_DIR}/src) #if(TINYUSDZ_WITH_JSON) ##target_include_directories( ## ${TINYUSDZ_LIB_TARGET} PRIVATE ${PROJECT_SOURCE_DIR}/src/external/jsonhpp/) # target_include_directories( # ${TINYUSDZ_LIB_TARGET} # PRIVATE ${PROJECT_SOURCE_DIR}/src/external/jsonhpp/) #endif() if(TINYUSDZ_WITH_USDMTLX) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_USE_USDMTLX") endif() if(TINYUSDZ_WITH_USDFBX) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_USE_USDFBX") endif() if(TINYUSDZ_WITH_USDOBJ) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_USE_USDOBJ") endif() if(TINYUSDZ_WITH_USDVOX) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_USE_USDVOX") endif() target_link_libraries(${TINYUSDZ_LIB_TARGET} ${TINYUSDZ_EXT_LIBRARIES} ${CMAKE_DL_LIBS}) if (TINYUSDZ_ENABLE_THREAD) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_ENABLE_THREAD") target_link_libraries(${TINYUSDZ_LIB_TARGET} Threads::Threads) endif() if(IOS) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_BUILD_IOS") endif() if(TINYUSDZ_WITH_TIFF) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_TIFF") endif(TINYUSDZ_WITH_TIFF) if(TINYUSDZ_WITH_EXR) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_EXR") endif(TINYUSDZ_WITH_EXR) if(TINYUSDZ_WITH_COLORIO) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_COLORIO") endif(TINYUSDZ_WITH_COLORIO) if(TINYUSDZ_WITH_AUDIO) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_AUDIO") endif(TINYUSDZ_WITH_AUDIO) if(TINYUSDZ_WITH_ALAC_AUDIO) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_ALAC_AUDIO") endif(TINYUSDZ_WITH_ALAC_AUDIO) if(TINYUSDZ_WITH_OPENSUBDIV) target_include_directories(${TINYUSDZ_LIB_TARGET} PRIVATE ${osd_DIR}) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_OPENSUBDIV") endif(TINYUSDZ_WITH_OPENSUBDIV) if(TINYUSDZ_WITH_TYDRA) target_compile_definitions(${TINYUSDZ_LIB_TARGET} PRIVATE "TINYUSDZ_WITH_TYDRA") endif(TINYUSDZ_WITH_TYDRA) if(NOT TINYUSDZ_CXX_EXCEPTIONS) if(MSVC) target_compile_options(${TINYUSDZ_LIB_TARGET} PRIVATE /EHs-c-) else() target_compile_options(${TINYUSDZ_LIB_TARGET} PRIVATE -fno-exceptions) endif() endif() endforeach() if(TINYUSDZ_WITH_C_API) if(TINYUSDZ_BUILD_SHARED_LIBS) add_library(${BUILD_TARGET_C} SHARED ${TINYUSDZ_C_API_SOURCES}) # Link with static(object) version of libtinyusdz to make dll monolitic # TODO: Build TINYUSDZ_TARGET_STATIC as Object? target_link_libraries(${BUILD_TARGET_C} PRIVATE ${TINYUSDZ_TARGET_STATIC}) target_compile_definitions(${BUILD_TARGET_C} PRIVATE "TINYUSDZ_COMPILE_LIBRARY") target_compile_definitions(${BUILD_TARGET_C} PRIVATE "TINYUSDZ_SHARED_LIBRARY") target_include_directories( ${BUILD_TARGET_C} PRIVATE ${PROJECT_SOURCE_DIR}/src) endif() add_library(${BUILD_TARGET_C}_static STATIC ${TINYUSDZ_C_API_SOURCES}) target_link_libraries(${BUILD_TARGET_C}_static PRIVATE ${TINYUSDZ_TARGET_STATIC}) target_include_directories( ${BUILD_TARGET_C}_static PRIVATE ${PROJECT_SOURCE_DIR}/src) endif() if(TINYUSDZ_WITH_PYTHON) # TODO: Fully Remove pybind11-based python binding ## For the time beging, we stick with pybind11, since PyPI manylinux2014(probably mostly used architectrue as of 2022/Aug) does not support C++17. ## We may switch to nanobind at some point(probably around 2024?) ## build monolithic .dll ##nanobind_add_module(${BUILD_TARGET_PY} ${TINYUSDZ_PYTHON_BINDING_SOURCES}) #pybind11_add_module(${BUILD_TARGET_PY} ${TINYUSDZ_PYTHON_BINDING_SOURCES}) #add_sanitizers(${BUILD_TARGET_PY}) #target_include_directories( # ${BUILD_TARGET_PY} PRIVATE ${PROJECT_SOURCE_DIR}/src) #target_link_libraries(${BUILD_TARGET_PY} PRIVATE ${TINYUSDZ_TARGET_STATIC}) ## Use 'c' prefix ## TODO: Use `cpp` prefix? #set_target_properties(${BUILD_TARGET_PY} PROPERTIES OUTPUT_NAME "ctinyusdz") ## copy python binding .so file to python/ ## For developer ## NOTE: `POST_BUILD` command is not triggered when building python module using ## `python setup.py build` #add_custom_command( # TARGET ${BUILD_TARGET_PY} # POST_BUILD # COMMAND "${CMAKE_COMMAND}" -E copy "$" # "${CMAKE_SOURCE_DIR}/python/tinyusdz/$" # COMMENT "copying python module file to python/tinyusdz" # VERBATIM) ## For pypi packaging #install(TARGETS ${BUILD_TARGET_PY} LIBRARY DESTINATION tinyusdz) # copy C tinyusd .so file to python/tinyusdz/ # For developer # NOTE: `POST_BUILD` command is not triggered when building python module using # `python setup.py build` add_custom_command( TARGET ${BUILD_TARGET_C} POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_SOURCE_DIR}/python/tinyusdz/$" COMMENT "Copying libc-tinyusd.so/c-tinyusd.dll file to /python/tinyusdz" VERBATIM) # TODO: Run ctypesgen? # # target for setup.py # TODO: Use custom target and supply `cmake_install_target` in setup.py? # https://scikit-build.readthedocs.io/en/latest/usage.html#scikit-build-options # install(TARGETS ${BUILD_TARGET_C} LIBRARY DESTINATION tinyusdz) endif() # TODO: deprecate in next major version if(TINYUSDZ_WITH_TOOL_USDA_PARSER AND TINYUSDZ_WITH_MODULE_USDA_READER) add_executable( usda_parser ${CMAKE_CURRENT_SOURCE_DIR}/examples/usda_parser/parser-main.cc) add_sanitizers(usda_parser) if(TINYUSDZ_PRODUCTION_BUILD) target_compile_definitions(usda_parser PRIVATE "TINYUSDZ_PRODUCTION_BUILD") endif() target_include_directories(usda_parser PRIVATE ${PROJECT_SOURCE_DIR}/src/) target_link_libraries(usda_parser PRIVATE ${TINYUSDZ_TARGET_STATIC}) endif() # TODO: deprecate in next major version if(TINYUSDZ_WITH_TOOL_USDC_PARSER AND TINYUSDZ_WITH_MODULE_USDC_READER) add_executable( usdc_parser ${CMAKE_CURRENT_SOURCE_DIR}/examples/usdc_parser/usdc-parser-main.cc) add_sanitizers(usdc_parser) if(TINYUSDZ_PRODUCTION_BUILD) target_compile_definitions(usdc_parser PRIVATE "TINYUSDZ_PRODUCTION_BUILD") endif() target_include_directories(usdc_parser PRIVATE ${PROJECT_SOURCE_DIR}/src/) target_link_libraries(usdc_parser PRIVATE ${TINYUSDZ_TARGET_STATIC}) endif() #if(TINYUSDZ_WITH_BLENDER_ADDON) # pybind11_add_module(${BUILD_TARGET_BLENDER_PY} # ${TINYUSDZ_BLENDER_PYTHON_BINDING_SOURCES}) # add_sanitizers(${BUILD_TARGET_BLENDER_PY}) # # # For Python.h header files. Assume Blender 2.93 LTS(Python 3.9) # target_include_directories( # ${BUILD_TARGET_BLENDER_PY} # PRIVATE ${PROJECT_SOURCE_DIR}/src/blender/python3.9/Include) # #endif() if(TINYUSDZ_BUILD_EXAMPLES) add_subdirectory(examples/tusdcat) if (TINYUSDZ_WITH_TYDRA) add_subdirectory(examples/tydra_api) add_subdirectory(examples/tydra_to_renderscene) endif () add_subdirectory(examples/api_tutorial) add_subdirectory(examples/file_format) add_subdirectory(examples/asset_resolution) add_subdirectory(examples/progressive_composition) #if (TINYUSDZ_WITH_JSON) # add_subdirectory(examples/usd_to_json) #endif() #if (TINYUSDZ_WITH_USD_TO_GLTF) # add_subdirectory(examples/usd_to_gltf) #endif() if(TINYUSDZ_WITH_MODULE_USDA_WRITER) add_subdirectory(examples/save_usda) endif() if(TINYUSDZ_WITH_C_API) add_subdirectory(examples/c_api_example) endif() endif(TINYUSDZ_BUILD_EXAMPLES) if(TINYUSDZ_BUILD_BENCHMARKS) # # Standalone benchmark exe. # set(TINYUSDZ_BENCH_SOURCES ${PROJECT_SOURCE_DIR}/benchmarks/benchmark-main.cc) add_executable(${TINYUSDZ_BENCHMARK_TARGET} ${TINYUSDZ_BENCH_SOURCES}) add_sanitizers(${TINYUSDZ_BENCHMARK_TARGET}) target_include_directories( ${TINYUSDZ_BENCHMARK_TARGET} PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/bencharks) target_link_libraries(${TINYUSDZ_BENCHMARK_TARGET} PRIVATE ${TINYUSDZ_TARGET_STATIC}) if(TINYUSDZ_WITH_OPENSUBDIV) target_compile_definitions(${TINYUSDZ_BENCHMARK_TARGET} PRIVATE "TINYUSDZ_USE_OPENSUBDIV") endif(TINYUSDZ_WITH_OPENSUBDIV) endif(TINYUSDZ_BUILD_BENCHMARKS) # [VisualStudio] if(WIN32) # Set ${TINYUSDZ_TARGET_STATIC} as a startup project for VS IDE set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${TINYUSDZ_TARGET_STATIC}) # For easier debugging in VS IDE(cmake 3.8.0 or later required) Set working # directory to ${TINYUSDZ_TARGET_STATIC} git repo root. if(CMAKE_VERSION VERSION_GREATER 3.8.0) set_target_properties( ${TINYUSDZ_TARGET_STATIC} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") endif() endif() if(TINYUSDZ_BUILD_TESTS) enable_testing() # # Standalone tester # set(TINYUSDZ_TEST_SOURCES ${PROJECT_SOURCE_DIR}/tests/test-main.cc) add_executable(${TINYUSDZ_TEST_TARGET} ${TINYUSDZ_TEST_SOURCES}) add_sanitizers(${TINYUSDZ_TEST_TARGET}) target_include_directories( ${TINYUSDZ_TEST_TARGET} PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/tests) target_link_libraries(${TINYUSDZ_TEST_TARGET} PRIVATE ${TINYUSDZ_TARGET_STATIC}) if(TINYUSDZ_WITH_OPENSUBDIV) target_compile_definitions(${TINYUSDZ_TEST_TARGET} PRIVATE "TINYUSDZ_USE_OPENSUBDIV") endif(TINYUSDZ_WITH_OPENSUBDIV) # # unit tester # add_subdirectory(${PROJECT_SOURCE_DIR}/tests/unit) # # Compression tester # add_subdirectory(${PROJECT_SOURCE_DIR}/tests/decompress-int) # # TODO: Add feature to specify Python interpreter at ctest run # # # USDA parser tester # if(TINYUSDZ_WITH_MODULE_USDA_READER) add_test( NAME usda-parser-unit-test COMMAND python3 ${PROJECT_SOURCE_DIR}/tests/usda/unit-runner.py --app "$" --basedir "${PROJECT_SOURCE_DIR}/tests/usda" ) endif() # # USDA parser tester # if(TINYUSDZ_WITH_MODULE_USDC_READER) add_test( NAME usdc-parser-unit-test COMMAND python3 ${PROJECT_SOURCE_DIR}/tests/usdc/unit-runner.py --app "$" --basedir "${PROJECT_SOURCE_DIR}/tests/usdc" ) endif() endif(TINYUSDZ_BUILD_TESTS) # [VisualStudio] if(WIN32) # Set ${TINYUSDZ_TARGET_STATIC} as a startup project for VS IDE set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${TINYUSDZ_TARGET_STATIC}) # For easier debugging in VS IDE(cmake 3.8.0 or later required) Set working # directory to ${TINYUSDZ_TARGET_STATIC} git repo root. if(CMAKE_VERSION VERSION_GREATER 3.8.0) set_target_properties( ${TINYUSDZ_TARGET_STATIC} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") endif() endif()