macro(set_option_category name) set(MEGASEARCH_OPTION_CATEGORY ${name}) list(APPEND "MEGASEARCH_OPTION_CATEGORIES" ${name}) endmacro() macro(define_option name description default) option(${name} ${description} ${default}) list(APPEND "MEGASEARCH_${MEGASEARCH_OPTION_CATEGORY}_OPTION_NAMES" ${name}) set("${name}_OPTION_DESCRIPTION" ${description}) set("${name}_OPTION_DEFAULT" ${default}) set("${name}_OPTION_TYPE" "bool") endmacro() function(list_join lst glue out) if("${${lst}}" STREQUAL "") set(${out} "" PARENT_SCOPE) return() endif() list(GET ${lst} 0 joined) list(REMOVE_AT ${lst} 0) foreach(item ${${lst}}) set(joined "${joined}${glue}${item}") endforeach() set(${out} ${joined} PARENT_SCOPE) endfunction() macro(define_option_string name description default) set(${name} ${default} CACHE STRING ${description}) list(APPEND "MEGASEARCH_${MEGASEARCH_OPTION_CATEGORY}_OPTION_NAMES" ${name}) set("${name}_OPTION_DESCRIPTION" ${description}) set("${name}_OPTION_DEFAULT" "\"${default}\"") set("${name}_OPTION_TYPE" "string") set("${name}_OPTION_ENUM" ${ARGN}) list_join("${name}_OPTION_ENUM" "|" "${name}_OPTION_ENUM") if(NOT ("${${name}_OPTION_ENUM}" STREQUAL "")) set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) endif() endmacro() #---------------------------------------------------------------------- set_option_category("Thirdparty") set(MEGASEARCH_DEPENDENCY_SOURCE_DEFAULT "AUTO") define_option_string(MEGASEARCH_DEPENDENCY_SOURCE "Method to use for acquiring MEGASEARCH's build dependencies" "${MEGASEARCH_DEPENDENCY_SOURCE_DEFAULT}" "AUTO" "BUNDLED" "SYSTEM") define_option(MEGASEARCH_VERBOSE_THIRDPARTY_BUILD "Show output from ExternalProjects rather than just logging to files" OFF) define_option(MEGASEARCH_BOOST_USE_SHARED "Rely on boost shared libraries where relevant" OFF) define_option(MEGASEARCH_BOOST_VENDORED "Use vendored Boost instead of existing Boost. \ Note that this requires linking Boost statically" ON) define_option(MEGASEARCH_BOOST_HEADER_ONLY "Use only BOOST headers" OFF) define_option(MEGASEARCH_WITH_BZ2 "Build with BZ2 compression" ON) define_option(MEGASEARCH_WITH_EASYLOGGINGPP "Build with Easylogging++ library" ON) define_option(MEGASEARCH_WITH_FAISS "Build with FAISS library" ON) define_option(MEGASEARCH_WITH_FAISS_GPU_VERSION "Build with FAISS GPU version" ON) define_option_string(MEGASEARCH_FAISS_GPU_ARCH "Specifying which GPU architectures to build against" "-gencode=arch=compute_61,code=sm_61") define_option(MEGASEARCH_WITH_LAPACK "Build with LAPACK library" ON) define_option(MEGASEARCH_WITH_LZ4 "Build with lz4 compression" ON) define_option(MEGASEARCH_WITH_OPENBLAS "Build with OpenBLAS library" ON) define_option(MEGASEARCH_WITH_ROCKSDB "Build with RocksDB library" ON) define_option(MEGASEARCH_WITH_SNAPPY "Build with Snappy compression" ON) define_option(MEGASEARCH_WITH_SQLITE "Build with SQLite library" ON) define_option(MEGASEARCH_WITH_SQLITE_ORM "Build with SQLite ORM library" ON) define_option(MEGASEARCH_WITH_THRIFT "Build with Apache Thrift library" ON) define_option(MEGASEARCH_WITH_YAMLCPP "Build with yaml-cpp library" ON) define_option(MEGASEARCH_WITH_ZLIB "Build with zlib compression" ON) if(CMAKE_VERSION VERSION_LESS 3.7) set(MEGASEARCH_WITH_ZSTD_DEFAULT OFF) else() # ExternalProject_Add(SOURCE_SUBDIR) is available since CMake 3.7. set(MEGASEARCH_WITH_ZSTD_DEFAULT ON) endif() define_option(MEGASEARCH_WITH_ZSTD "Build with zstd compression" ${MEGASEARCH_WITH_ZSTD_DEFAULT}) #---------------------------------------------------------------------- if(MSVC) set_option_category("MSVC") define_option(MSVC_LINK_VERBOSE "Pass verbose linking options when linking libraries and executables" OFF) define_option(MEGASEARCH_USE_STATIC_CRT "Build MEGASEARCH with statically linked CRT" OFF) endif() #---------------------------------------------------------------------- #set_option_category("Test and benchmark") # #define_option(MEGASEARCH_BUILD_TESTS "Build the MEGASEARCH googletest unit tests" ON) #---------------------------------------------------------------------- macro(config_summary) message(STATUS "---------------------------------------------------------------------") message(STATUS "MEGASEARCH version: ${MEGASEARCH_VERSION}") message(STATUS) message(STATUS "Build configuration summary:") message(STATUS " Generator: ${CMAKE_GENERATOR}") message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") message(STATUS " Source directory: ${CMAKE_CURRENT_SOURCE_DIR}") if(${CMAKE_EXPORT_COMPILE_COMMANDS}) message( STATUS " Compile commands: ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json") endif() foreach(category ${MEGASEARCH_OPTION_CATEGORIES}) message(STATUS) message(STATUS "${category} options:") set(option_names ${MEGASEARCH_${category}_OPTION_NAMES}) set(max_value_length 0) foreach(name ${option_names}) string(LENGTH "\"${${name}}\"" value_length) if(${max_value_length} LESS ${value_length}) set(max_value_length ${value_length}) endif() endforeach() foreach(name ${option_names}) if("${${name}_OPTION_TYPE}" STREQUAL "string") set(value "\"${${name}}\"") else() set(value "${${name}}") endif() set(default ${${name}_OPTION_DEFAULT}) set(description ${${name}_OPTION_DESCRIPTION}) string(LENGTH ${description} description_length) if(${description_length} LESS 70) string( SUBSTRING " " ${description_length} -1 description_padding) else() set(description_padding " ") endif() set(comment "[${name}]") if("${value}" STREQUAL "${default}") set(comment "[default] ${comment}") endif() if(NOT ("${${name}_OPTION_ENUM}" STREQUAL "")) set(comment "${comment} [${${name}_OPTION_ENUM}]") endif() string( SUBSTRING "${value} " 0 ${max_value_length} value) message(STATUS " ${description} ${description_padding} ${value} ${comment}") endforeach() endforeach() endmacro()