#!/usr/bin/cmake cmake_minimum_required (VERSION 3.18) # ------------------------------------------------------------------------------------------------- project( Opus VERSION 1.3.1 DESCRIPTION "Free audio codec that beats any other codec in any category" ) # The description is no exaggeration. # - Opus offers the highest quality of any lossy audio codec, # - while at the same time having much better compression, # - and being quicker for low-latency (i.e. VoIP) than dedicated codecs. # :) include("../../BuildSystem/cmake/cplusplus.cmake") # Opus uses OGG containers as well but unlike Vorbis, # comes with its own implementation of the OGG reading/writing methods #if(NOT (TARGET OGG)) # add_subdirectory(${PROJECT_SOURCE_DIR}/../ogg ${CMAKE_BINARY_DIR}/ogg) #endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/downloads/opus-1.3.1.tar.gz) message(STATUS "Downloading Opus sources") # Alternative: https://ftp.osuosl.org/pub/xiph/releases/opus/opus-1.3.1.tar.gz file( DOWNLOAD https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz ${PROJECT_SOURCE_DIR}/downloads/opus-1.3.1.tar.gz SHOW_PROGRESS EXPECTED_HASH SHA256=65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d STATUS DOWNLOAD_STATUS ) if(NOT DOWNLOAD_STATUS EQUAL 0) file(REMOVE ${PROJECT_SOURCE_DIR}/downloads/opus-1.3.1.tar.gz) message(FATAL_ERROR "Download failed, stopping build (error ${DOWNLOAD_STATUS})") endif() endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/build) message(STATUS "Extracting Opus sources") file( ARCHIVE_EXTRACT INPUT ${PROJECT_SOURCE_DIR}/downloads/opus-1.3.1.tar.gz DESTINATION ${CMAKE_BINARY_DIR}/extract ) file( RENAME ${CMAKE_BINARY_DIR}/extract/opus-1.3.1 ${PROJECT_SOURCE_DIR}/build ) endif() file( COPY "${PROJECT_SOURCE_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/build/src/" ) configure_file( "${PROJECT_SOURCE_DIR}/opus_buildtype.cmake" "${PROJECT_SOURCE_DIR}/build//opus_buildtype.cmake" COPYONLY ) # ------------------------------------------------------------------------------------------------- set( sourceFiles "build/src/analysis.c" "build/src/mapping_matrix.c" "build/src/mlp.c" "build/src/mlp_data.c" "build/src/opus.c" #"build/src/opus_compare.c" "build/src/opus_decoder.c" #"build/src/opus_demo.c" "build/src/opus_encoder.c" "build/src/opus_multistream.c" "build/src/opus_multistream_decoder.c" "build/src/opus_multistream_encoder.c" "build/src/opus_projection_decoder.c" "build/src/opus_projection_encoder.c" "build/src/repacketizer.c" #"build/src/repacketizer_demo.c" "build/silk/A2NLSF.c" "build/silk/ana_filt_bank_1.c" #"build/silk/arm/arm_silk_map.c" #"build/silk/arm/biquad_alt_neon_intr.c" #"build/silk/arm/LPC_inv_pred_gain_neon_intr.c" #"build/silk/arm/NSQ_del_dec_neon_intr.c" #"build/silk/arm/NSQ_neon.c" "build/silk/biquad_alt.c" "build/silk/bwexpander.c" "build/silk/bwexpander_32.c" "build/silk/check_control_input.c" "build/silk/CNG.c" "build/silk/code_signs.c" "build/silk/control_audio_bandwidth.c" "build/silk/control_codec.c" "build/silk/control_SNR.c" "build/silk/debug.c" "build/silk/decoder_set_fs.c" "build/silk/decode_core.c" "build/silk/decode_frame.c" "build/silk/decode_indices.c" "build/silk/decode_parameters.c" "build/silk/decode_pitch.c" "build/silk/decode_pulses.c" "build/silk/NLSF_encode.c" "build/silk/NLSF_stabilize.c" "build/silk/NLSF_unpack.c" "build/silk/NLSF_VQ.c" "build/silk/NLSF_VQ_weights_laroia.c" "build/silk/NSQ.c" "build/silk/NSQ_del_dec.c" "build/silk/pitch_est_tables.c" "build/silk/PLC.c" "build/silk/process_NLSFs.c" "build/silk/quant_LTP_gains.c" "build/silk/resampler.c" "build/silk/resampler_down2.c" "build/silk/resampler_down2_3.c" "build/silk/resampler_private_AR2.c" "build/silk/resampler_private_down_FIR.c" "build/silk/resampler_private_IIR_FIR.c" "build/silk/resampler_private_up2_HQ.c" "build/silk/resampler_rom.c" "build/silk/sigm_Q15.c" "build/silk/sort.c" "build/silk/stereo_decode_pred.c" "build/silk/stereo_encode_pred.c" "build/silk/stereo_find_predictor.c" "build/silk/stereo_LR_to_MS.c" "build/silk/stereo_MS_to_LR.c" "build/silk/stereo_quant_pred.c" "build/silk/sum_sqr_shift.c" "build/silk/tables_gain.c" "build/silk/tables_LTP.c" "build/silk/tables_NLSF_CB_NB_MB.c" "build/silk/tables_NLSF_CB_WB.c" "build/silk/tables_other.c" "build/silk/tables_pitch_lag.c" "build/silk/tables_pulses_per_block.c" "build/silk/table_LSF_cos.c" "build/silk/tests/test_unit_LPC_inv_pred_gain.c" "build/silk/VAD.c" "build/silk/VQ_WMat_EC.c" "build/silk/x86/NSQ_del_dec_sse4_1.c" "build/silk/x86/NSQ_sse4_1.c" "build/silk/x86/VAD_sse4_1.c" "build/silk/x86/VQ_WMat_EC_sse4_1.c" "build/silk/x86/x86_silk_map.c" "build/silk/encode_indices.c" "build/silk/encode_pulses.c" "build/silk/enc_API.c" #"build/silk/fixed/apply_sine_window_FIX.c" #"build/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c" #"build/silk/fixed/autocorr_FIX.c" #"build/silk/fixed/burg_modified_FIX.c" #"build/silk/fixed/corrMatrix_FIX.c" #"build/silk/fixed/encode_frame_FIX.c" #"build/silk/fixed/find_LPC_FIX.c" #"build/silk/fixed/find_LTP_FIX.c" #"build/silk/fixed/find_pitch_lags_FIX.c" #"build/silk/fixed/find_pred_coefs_FIX.c" #"build/silk/fixed/k2a_FIX.c" #"build/silk/fixed/k2a_Q16_FIX.c" #"build/silk/fixed/LTP_analysis_filter_FIX.c" #"build/silk/fixed/LTP_scale_ctrl_FIX.c" #"build/silk/fixed/noise_shape_analysis_FIX.c" #"build/silk/fixed/pitch_analysis_core_FIX.c" #"build/silk/fixed/process_gains_FIX.c" #"build/silk/fixed/regularize_correlations_FIX.c" #"build/silk/fixed/residual_energy16_FIX.c" #"build/silk/fixed/residual_energy_FIX.c" #"build/silk/fixed/schur64_FIX.c" #"build/silk/fixed/schur_FIX.c" #"build/silk/fixed/vector_ops_FIX.c" #"build/silk/fixed/warped_autocorrelation_FIX.c" #"build/silk/fixed/x86/burg_modified_FIX_sse4_1.c" #"build/silk/fixed/x86/vector_ops_FIX_sse4_1.c" "build/silk/float/apply_sine_window_FLP.c" "build/silk/float/autocorrelation_FLP.c" "build/silk/float/burg_modified_FLP.c" "build/silk/float/bwexpander_FLP.c" "build/silk/float/corrMatrix_FLP.c" "build/silk/float/encode_frame_FLP.c" "build/silk/float/energy_FLP.c" "build/silk/float/find_LPC_FLP.c" "build/silk/float/find_LTP_FLP.c" "build/silk/float/find_pitch_lags_FLP.c" "build/silk/float/find_pred_coefs_FLP.c" "build/silk/float/inner_product_FLP.c" "build/silk/float/k2a_FLP.c" "build/silk/float/LPC_analysis_filter_FLP.c" "build/silk/float/LPC_inv_pred_gain_FLP.c" "build/silk/float/LTP_analysis_filter_FLP.c" "build/silk/float/LTP_scale_ctrl_FLP.c" "build/silk/float/noise_shape_analysis_FLP.c" "build/silk/float/pitch_analysis_core_FLP.c" "build/silk/float/process_gains_FLP.c" "build/silk/float/regularize_correlations_FLP.c" "build/silk/float/residual_energy_FLP.c" "build/silk/float/scale_copy_vector_FLP.c" "build/silk/float/scale_vector_FLP.c" "build/silk/float/schur_FLP.c" "build/silk/float/sort_FLP.c" "build/silk/float/warped_autocorrelation_FLP.c" "build/silk/float/wrappers_FLP.c" "build/silk/gain_quant.c" "build/silk/HP_variable_cutoff.c" "build/silk/init_decoder.c" "build/silk/init_encoder.c" "build/silk/inner_prod_aligned.c" "build/silk/interpolate.c" "build/silk/lin2log.c" "build/silk/log2lin.c" "build/silk/LPC_analysis_filter.c" "build/silk/LPC_fit.c" "build/silk/LPC_inv_pred_gain.c" "build/silk/LP_variable_cutoff.c" "build/silk/NLSF2A.c" "build/silk/NLSF_decode.c" "build/silk/dec_API.c" "build/silk/NLSF_del_dec_quant.c" "build/silk/shell_coder.c" #"build/celt/arm/armcpu.c" #"build/celt/arm/arm_celt_map.c" #"build/celt/arm/celt_fft_ne10.c" #"build/celt/arm/celt_mdct_ne10.c" #"build/celt/arm/celt_neon_intr.c" #"build/celt/arm/pitch_neon_intr.c" "build/celt/bands.c" "build/celt/celt.c" "build/celt/celt_decoder.c" "build/celt/celt_encoder.c" "build/celt/celt_lpc.c" "build/celt/cwrs.c" "build/celt/entcode.c" "build/celt/entdec.c" "build/celt/entenc.c" "build/celt/kiss_fft.c" "build/celt/laplace.c" "build/celt/mathops.c" "build/celt/mdct.c" "build/celt/modes.c" #"build/celt/opus_custom_demo.c" "build/celt/pitch.c" "build/celt/quant_bands.c" "build/celt/rate.c" #"build/celt/tests/test_unit_cwrs32.c" #"build/celt/tests/test_unit_dft.c" #"build/celt/tests/test_unit_entropy.c" #"build/celt/tests/test_unit_laplace.c" #"build/celt/tests/test_unit_mathops.c" #"build/celt/tests/test_unit_mdct.c" #"build/celt/tests/test_unit_rotation.c" #"build/celt/tests/test_unit_types.c" "build/celt/vq.c" "build/celt/x86/celt_lpc_sse4_1.c" "build/celt/x86/pitch_sse.c" "build/celt/x86/pitch_sse2.c" "build/celt/x86/pitch_sse4_1.c" "build/celt/x86/vq_sse2.c" "build/celt/x86/x86cpu.c" "build/celt/x86/x86_celt_map.c" ) file( GLOB_RECURSE headerFiles CONFIGURE_DEPENDS "build/include/*.h" ) # ------------------------------------------------------------------------------------------------- add_library(Opus STATIC) add_library(Opus::Static ALIAS Opus) target_compile_definitions( Opus PRIVATE HAVE_CONFIG_H ) target_include_directories( Opus PUBLIC "build/include/" PRIVATE "build/" PRIVATE "build/celt/" PRIVATE "build/silk/" PRIVATE "build/silk/float/" PRIVATE "build/src/" ) target_sources( Opus PUBLIC ${headerFiles} PRIVATE ${sourceFiles} ) #target_link_libraries( # Opus # PUBLIC OGG::Static #) #set_target_properties(Opus PROPERTIES PREFIX "") set_target_properties(Opus PROPERTIES OUTPUT_NAME "opus") # ------------------------------------------------------------------------------------------------- #set_property(GLOBAL PROPERTY QUIET_INSTALL ON) #install( # DIRECTORY build/include/ # DESTINATION ${PROJECT_SOURCE_DIR}/Include #) install( TARGETS Opus ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/bin/${NUCLEX_COMPILER_TAG} ) # ------------------------------------------------------------------------------------------------- file( WRITE "${PROJECT_SOURCE_DIR}/OpusConfig.cmake" "#!/usr/bin/cmake # Configuration to include Opus in a CMake-based project. If you want to # reference Opus as an externally compiled static library, do this: # # set(Opus_DIR \"../ThirdParty/opus\") # find_package(Opus REQUIRED CONFIG) # # target_link_libraries( # MyAwesomeProject # PRIVATE GTest::Static # PRIVATE GTest::Main # ) # # Alternatively, if you want to build Opus together with your project, # use the normal CMakeLists.txt with CMake's add_subdirectory() command: # # add_subdirectory( # \"\${PROJECT_SOURCE_DIR}/../ThirdParty/opus\" # \"\${CMAKE_BINARY_DIR}/opus\" # ) # # target_link_libraries( # MyAwesomeProject # PRIVATE Opus # PRIVATE OpusMain # ) # # ------------------------------------------------------------------------------------------------- if(NOT DEFINED NUCLEX_COMPILER_TAG) message( FATAL_ERROR \"NUCLEX_COMPILER_TAG not defined! Include cplusplus.cmake before importing this package \\ in order to generate a tag identifying the platform/compiler/architecture/variant!\" ) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}\") # TODO: Warn and link release build when compiling in debug mode # TODO: Warn and link build for older compiler version if found message( FATAL_ERROR \"Directory '\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}' not found. \\ Please either build and install this project before importing it via \\ find_package() or use this project's main CMakeFiles.txt via add_subdirectory()!\" ) endif() # ------------------------------------------------------------------------------------------------- add_library(Opus::Static STATIC IMPORTED) add_library(Opus::Main STATIC IMPORTED) # This may cause warnings on recent GCC versions (10.0.0+?) with LTO because GCC detects # that the headers used during build (residing in build/) are not the same used when # linking the library (copies resising in Include/). # # CMake doesn't run the install step during build, so the only way to get the headers # in place before building would be by copying them rather than installing them. set_target_properties( Opus::Static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"\${CMAKE_CURRENT_LIST_DIR}/Include\" IMPORTED_LINK_INTERFACE_LANGUAGES \"CXX\" ) set_target_properties( Opus::Main PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"\${CMAKE_CURRENT_LIST_DIR}/Include\" IMPORTED_LINK_INTERFACE_LANGUAGES \"CXX\" ) if(WIN32) set_target_properties( Opus::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/opus.lib\" ) else() set_target_properties( Opus::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/libopus.a\" ) endif() message(STATUS \"Imported Opus targets with binaries in '\${CMAKE_CURRENT_LIST_DIR}'\")" ) # -------------------------------------------------------------------------------------------------