123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- if(DRACO_CMAKE_DRACO_OPTIONS_CMAKE_)
- return()
- endif() # DRACO_CMAKE_DRACO_OPTIONS_CMAKE_
- set(DRACO_CMAKE_DRACO_OPTIONS_CMAKE_)
- set(draco_features_file_name "${draco_build}/draco/draco_features.h")
- set(draco_features_list)
- # Simple wrapper for CMake's builtin option command that tracks draco's build
- # options in the list variable $draco_options.
- macro(draco_option)
- unset(option_NAME)
- unset(option_HELPSTRING)
- unset(option_VALUE)
- unset(optional_args)
- unset(multi_value_args)
- set(single_value_args NAME HELPSTRING VALUE)
- cmake_parse_arguments(option "${optional_args}" "${single_value_args}"
- "${multi_value_args}" ${ARGN})
- if(NOT (option_NAME AND option_HELPSTRING AND DEFINED option_VALUE))
- message(FATAL_ERROR "draco_option: NAME HELPSTRING and VALUE required.")
- endif()
- option(${option_NAME} ${option_HELPSTRING} ${option_VALUE})
- if(DRACO_VERBOSE GREATER 2)
- message("--------- draco_option ---------\n" "option_NAME=${option_NAME}\n"
- "option_HELPSTRING=${option_HELPSTRING}\n"
- "option_VALUE=${option_VALUE}\n"
- "------------------------------------------\n")
- endif()
- list(APPEND draco_options ${option_NAME})
- list(REMOVE_DUPLICATES draco_options)
- endmacro()
- # Dumps the $draco_options list via CMake message command.
- macro(draco_dump_options)
- foreach(option_name ${draco_options})
- message("${option_name}: ${${option_name}}")
- endforeach()
- endmacro()
- # Set default options.
- macro(draco_set_default_options)
- draco_option(NAME DRACO_FAST HELPSTRING "Try to build faster libs." VALUE OFF)
- draco_option(NAME DRACO_JS_GLUE HELPSTRING
- "Enable JS Glue and JS targets when using Emscripten." VALUE ON)
- draco_option(NAME DRACO_IE_COMPATIBLE HELPSTRING
- "Enable support for older IE builds when using Emscripten." VALUE
- OFF)
- draco_option(NAME DRACO_MESH_COMPRESSION HELPSTRING "Enable mesh compression."
- VALUE ON)
- draco_option(NAME DRACO_POINT_CLOUD_COMPRESSION HELPSTRING
- "Enable point cloud compression." VALUE ON)
- draco_option(NAME DRACO_PREDICTIVE_EDGEBREAKER HELPSTRING
- "Enable predictive edgebreaker." VALUE ON)
- draco_option(NAME DRACO_STANDARD_EDGEBREAKER HELPSTRING
- "Enable stand edgebreaker." VALUE ON)
- draco_option(NAME DRACO_BACKWARDS_COMPATIBILITY HELPSTRING
- "Enable backwards compatibility." VALUE ON)
- draco_option(NAME DRACO_DECODER_ATTRIBUTE_DEDUPLICATION HELPSTRING
- "Enable attribute deduping." VALUE OFF)
- draco_option(NAME DRACO_TESTS HELPSTRING "Enables tests." VALUE OFF)
- draco_option(NAME DRACO_WASM HELPSTRING "Enables WASM support." VALUE OFF)
- draco_option(NAME DRACO_UNITY_PLUGIN HELPSTRING
- "Build plugin library for Unity." VALUE OFF)
- draco_option(NAME DRACO_ANIMATION_ENCODING HELPSTRING "Enable animation."
- VALUE OFF)
- draco_option(NAME DRACO_GLTF HELPSTRING "Support GLTF." VALUE OFF)
- draco_option(NAME DRACO_MAYA_PLUGIN HELPSTRING
- "Build plugin library for Maya." VALUE OFF)
- draco_check_deprecated_options()
- endmacro()
- # Warns when a deprecated option is used and sets the option that replaced it.
- macro(draco_handle_deprecated_option)
- unset(option_OLDNAME)
- unset(option_NEWNAME)
- unset(optional_args)
- unset(multi_value_args)
- set(single_value_args OLDNAME NEWNAME)
- cmake_parse_arguments(option "${optional_args}" "${single_value_args}"
- "${multi_value_args}" ${ARGN})
- if("${${option_OLDNAME}}")
- message(WARNING "${option_OLDNAME} is deprecated. Use ${option_NEWNAME}.")
- set(${option_NEWNAME} ${${option_OLDNAME}})
- endif()
- endmacro()
- # Checks for use of deprecated options.
- macro(draco_check_deprecated_options)
- draco_handle_deprecated_option(OLDNAME ENABLE_EXTRA_SPEED NEWNAME DRACO_FAST)
- draco_handle_deprecated_option(OLDNAME ENABLE_JS_GLUE NEWNAME DRACO_JS_GLUE)
- draco_handle_deprecated_option(OLDNAME ENABLE_MESH_COMPRESSION NEWNAME
- DRACO_MESH_COMPRESSION)
- draco_handle_deprecated_option(OLDNAME ENABLE_POINT_CLOUD_COMPRESSION NEWNAME
- DRACO_POINT_CLOUD_COMPRESSION)
- draco_handle_deprecated_option(OLDNAME ENABLE_PREDICTIVE_EDGEBREAKER NEWNAME
- DRACO_PREDICTIVE_EDGEBREAKER)
- draco_handle_deprecated_option(OLDNAME ENABLE_STANDARD_EDGEBREAKER NEWNAME
- DRACO_STANDARD_EDGEBREAKER)
- draco_handle_deprecated_option(OLDNAME ENABLE_BACKWARDS_COMPATIBILITY NEWNAME
- DRACO_BACKWARDS_COMPATIBILITY)
- draco_handle_deprecated_option(OLDNAME ENABLE_DECODER_ATTRIBUTE_DEDUPLICATION
- NEWNAME DRACO_DECODER_ATTRIBUTE_DEDUPLICATION)
- draco_handle_deprecated_option(OLDNAME ENABLE_TESTS NEWNAME DRACO_TESTS)
- draco_handle_deprecated_option(OLDNAME ENABLE_WASM NEWNAME DRACO_WASM)
- draco_handle_deprecated_option(OLDNAME BUILD_UNITY_PLUGIN NEWNAME
- DRACO_UNITY_PLUGIN)
- draco_handle_deprecated_option(OLDNAME BUILD_ANIMATION_ENCODING NEWNAME
- DRACO_ANIMATION_ENCODING)
- draco_handle_deprecated_option(OLDNAME BUILD_FOR_GLTF NEWNAME DRACO_GLTF)
- draco_handle_deprecated_option(OLDNAME BUILD_MAYA_PLUGIN NEWNAME
- DRACO_MAYA_PLUGIN)
- draco_handle_deprecated_option(OLDNAME BUILD_USD_PLUGIN NEWNAME
- BUILD_SHARED_LIBS)
- endmacro()
- # Macro for setting Draco features based on user configuration. Features enabled
- # by this macro are Draco global.
- macro(draco_set_optional_features)
- if(DRACO_GLTF)
- # Override settings when building for GLTF.
- draco_enable_feature(FEATURE "DRACO_MESH_COMPRESSION_SUPPORTED")
- draco_enable_feature(FEATURE "DRACO_NORMAL_ENCODING_SUPPORTED")
- draco_enable_feature(FEATURE "DRACO_STANDARD_EDGEBREAKER_SUPPORTED")
- else()
- if(DRACO_POINT_CLOUD_COMPRESSION)
- draco_enable_feature(FEATURE "DRACO_POINT_CLOUD_COMPRESSION_SUPPORTED")
- endif()
- if(DRACO_MESH_COMPRESSION)
- draco_enable_feature(FEATURE "DRACO_MESH_COMPRESSION_SUPPORTED")
- draco_enable_feature(FEATURE "DRACO_NORMAL_ENCODING_SUPPORTED")
- if(DRACO_STANDARD_EDGEBREAKER)
- draco_enable_feature(FEATURE "DRACO_STANDARD_EDGEBREAKER_SUPPORTED")
- endif()
- if(DRACO_PREDICTIVE_EDGEBREAKER)
- draco_enable_feature(FEATURE "DRACO_PREDICTIVE_EDGEBREAKER_SUPPORTED")
- endif()
- endif()
- if(DRACO_BACKWARDS_COMPATIBILITY)
- draco_enable_feature(FEATURE "DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED")
- endif()
- if(NOT EMSCRIPTEN)
- # For now, enable deduplication for both encoder and decoder.
- # TODO(ostava): Support for disabling attribute deduplication for the C++
- # decoder is planned in future releases.
- draco_enable_feature(FEATURE
- DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED)
- draco_enable_feature(FEATURE
- DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED)
- endif()
- endif()
- if(DRACO_UNITY_PLUGIN)
- draco_enable_feature(FEATURE "DRACO_UNITY_PLUGIN")
- set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- endif()
- if(DRACO_MAYA_PLUGIN)
- draco_enable_feature(FEATURE "DRACO_MAYA_PLUGIN")
- set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- endif()
- endmacro()
- # Macro that handles tracking of Draco preprocessor symbols for the purpose of
- # producing draco_features.h.
- #
- # ~~~
- # draco_enable_feature(FEATURE <feature_name> [TARGETS <target_name>])
- # ~~~
- #
- # FEATURE is required. It should be a Draco preprocessor symbol. TARGETS is
- # optional. It can be one or more draco targets.
- #
- # When the TARGETS argument is not present the preproc symbol is added to
- # draco_features.h. When it is draco_features.h is unchanged, and
- # target_compile_options() is called for each target specified.
- macro(draco_enable_feature)
- set(def_flags)
- set(def_single_arg_opts FEATURE)
- set(def_multi_arg_opts TARGETS)
- cmake_parse_arguments(DEF "${def_flags}" "${def_single_arg_opts}"
- "${def_multi_arg_opts}" ${ARGN})
- if("${DEF_FEATURE}" STREQUAL "")
- message(FATAL_ERROR "Empty FEATURE passed to draco_enable_feature().")
- endif()
- # Do nothing/return early if $DEF_FEATURE is already in the list.
- list(FIND draco_features_list ${DEF_FEATURE} df_index)
- if(NOT df_index EQUAL -1)
- return()
- endif()
- list(LENGTH DEF_TARGETS df_targets_list_length)
- if(${df_targets_list_length} EQUAL 0)
- list(APPEND draco_features_list ${DEF_FEATURE})
- else()
- foreach(target ${DEF_TARGETS})
- target_compile_definitions(${target} PRIVATE ${DEF_FEATURE})
- endforeach()
- endif()
- endmacro()
- # Function for generating draco_features.h.
- function(draco_generate_features_h)
- file(WRITE "${draco_features_file_name}.new"
- "// GENERATED FILE -- DO NOT EDIT\n\n" "#ifndef DRACO_FEATURES_H_\n"
- "#define DRACO_FEATURES_H_\n\n")
- foreach(feature ${draco_features_list})
- file(APPEND "${draco_features_file_name}.new" "#define ${feature}\n")
- endforeach()
- file(APPEND "${draco_features_file_name}.new"
- "\n#endif // DRACO_FEATURES_H_")
- # Will replace ${draco_features_file_name} only if the file content has
- # changed. This prevents forced Draco rebuilds after CMake runs.
- configure_file("${draco_features_file_name}.new"
- "${draco_features_file_name}")
- file(REMOVE "${draco_features_file_name}.new")
- endfunction()
- # Sets default options for the build and processes user controlled options to
- # compute enabled features.
- macro(draco_setup_options)
- draco_set_default_options()
- draco_set_optional_features()
- endmacro()
|