diff --git a/CMakeLists.txt b/CMakeLists.txt index 18b1e8d6522615ff64be01082efa0f6a46f1102c..e31155464694eb41e3b84fc557943534c9262381 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.1) +include(opus_buildtype.cmake) include(opus_functions.cmake) get_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR) @@ -17,6 +18,11 @@ message(STATUS "Opus project version: ${PROJECT_VERSION}") project(Opus LANGUAGES C VERSION ${PROJECT_VERSION}) +option(OPUS_STACK_PROTECTOR "Use stack protection" ON) +option(OPUS_USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF) +option(OPUS_CUSTOM_MODES "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames" + OFF) +option(OPUS_BUILD_PROGRAMS "Build programs" OFF) option(OPUS_FIXED_POINT "Compile as fixed-point (for machines without a fast enough FPU)" OFF) option(OPUS_ENABLE_FLOAT_API @@ -32,6 +38,16 @@ include(GNUInstallDirs) include(CMakeDependentOption) include(FeatureSummary) +if(OPUS_STACK_PROTECTOR) + if(NOT MSVC) # GC on by default on MSVC + check_and_set_flag(STACK_PROTECTION_STRONG -fstack-protector-strong) + endif() +else() + if(MSVC) + check_and_set_flag(BUFFER_SECURITY_CHECK /GS-) + endif() +endif() + if(OPUS_CPU_X86 OR OPUS_CPU_X64) cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE "Does runtime check for SSE1 support" @@ -100,6 +116,12 @@ set_package_properties(Git PURPOSE "required to set up package version") +add_feature_info(STACK_PROTECTOR OPUS_STACK_PROTECTOR "Use stack protection") +add_feature_info(USE_ALLOCA OPUS_USE_ALLOCA + "Use alloca for stack arrays (on non-C99 compilers)") +add_feature_info(CUSTOM_MODES OPUS_CUSTOM_MODES + "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames") +add_feature_info(BUILD_PROGRAMS OPUS_BUILD_PROGRAMS "Build programs") add_feature_info( FIXED_POINT OPUS_FIXED_POINT "compile as fixed-point (for machines without a fast enough FPU)") @@ -161,8 +183,25 @@ target_include_directories( silk) target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES}) +target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING) -target_compile_definitions(opus PRIVATE CUSTOM_MODES OPUS_BUILD) +if(NOT MSVC) + target_compile_definitions(opus PRIVATE FORTIFY_SOURCE=2) +endif() + +# It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99 +# variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack +# allocation If none is defined, then the fallback is a non-threadsafe global +# array +if(OPUS_USE_ALLOCA OR MSVC) + target_compile_definitions(opus PRIVATE USE_ALLOCA) +else() + target_compile_definitions(opus PRIVATE VAR_ARRAYS) +endif() + +if(OPUS_CUSTOM_MODES) + target_compile_definitions(opus PRIVATE CUSTOM_MODES) +endif() if(BUILD_SHARED_LIBS) if(WIN32) @@ -312,10 +351,19 @@ if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) endif() -if(BUILD_PROGRAMS) +if(OPUS_BUILD_PROGRAMS) # demo + if(OPUS_CUSTOM_MODES) + add_executable(opus_custom_demo ${opus_custom_demo_sources}) + target_include_directories(opus_custom_demo + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(opus_custom_demo PRIVATE opus) + endif() + add_executable(opus_demo ${opus_demo_sources}) target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_include_directories(opus_demo PRIVATE silk) # debug.h + target_include_directories(opus_demo PRIVATE celt) # arch.h target_link_libraries(opus_demo PRIVATE opus) # compare diff --git a/opus_buildtype.cmake b/opus_buildtype.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6797f50bfa671c330b98898423c54df63bc8af76 --- /dev/null +++ b/opus_buildtype.cmake @@ -0,0 +1,18 @@ +# Set a default build type if none was specified +set(default_build_type "Release") + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message( + STATUS + "Setting build type to '${default_build_type}' as none was specified.") + set(CMAKE_BUILD_TYPE "${default_build_type}" + CACHE STRING "Choose the type of build." + FORCE) + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS + "Debug" + "Release" + "MinSizeRel" + "RelWithDebInfo") +endif() diff --git a/opus_config.cmake b/opus_config.cmake index e41d6b0c383ec87bb320ae8e95230c3f53b663c0..a0bfd5839c8bba1bd447eb34e3a23049129eb4bf 100644 --- a/opus_config.cmake +++ b/opus_config.cmake @@ -3,11 +3,6 @@ include(opus_functions.cmake) configure_file(config.h.cmake.in config.h @ONLY) add_definitions(-DHAVE_CONFIG_H) -option(FIXED_POINT "Use fixed-point code (for devices with less powerful FPU)" - OFF) -option(USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF) -option(BUILD_PROGRAMS "Build programs" OFF) - set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY C_STANDARD 99) @@ -15,16 +10,6 @@ if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() -# It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99 -# variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack -# allocation If none is defined, then the fallback is a non-threadsafe global -# array -if(USE_ALLOCA OR MSVC) - add_definitions(-DUSE_ALLOCA) -else() - add_definitions(-DVAR_ARRAYS) -endif() - include(CheckLibraryExists) check_library_exists(m floor "" HAVE_LIBM) if(HAVE_LIBM) diff --git a/opus_sources.cmake b/opus_sources.cmake index ecdf39879544ec0abb41effd250ce1ba549ebe3c..225543af3641db00f010439d55324a7ab378246f 100644 --- a/opus_sources.cmake +++ b/opus_sources.cmake @@ -26,7 +26,8 @@ get_opus_sources(CELT_SOURCES_ARM_NEON_INTR celt_sources.mk celt_sources_arm_neon_intr) get_opus_sources(CELT_SOURCES_ARM_NE10 celt_sources.mk celt_sources_arm_ne10) -get_opus_sources(opus_custom_demo_SOURCES Makefile.am opus_demo_sources) +get_opus_sources(opus_demo_SOURCES Makefile.am opus_demo_sources) +get_opus_sources(opus_custom_demo_SOURCES Makefile.am opus_custom_demo_sources) get_opus_sources(opus_compare_SOURCES Makefile.am opus_compare_sources) get_opus_sources(tests_test_opus_api_SOURCES Makefile.am test_opus_api_sources) get_opus_sources(tests_test_opus_encode_SOURCES Makefile.am