diff --git a/CMakeLists.txt b/CMakeLists.txt index b66a7c29..aca94509 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required (VERSION 3.13) +cmake_policy(SET CMP0091 NEW) project (sfizz VERSION 1.0.0 LANGUAGES CXX C) # External configuration CMake scripts diff --git a/README.md b/README.md index f80de21d..c665dd23 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ cd vcpkg Assuming you want to build for x64, install the relevant packages as follows ```powershell -.\vcpkg.exe install libsndfile:x64-windows-static zlib:x64-windows-static libsamplerate:x64-windows-static +.\vcpkg.exe install libsndfile:x64-windows-static zlib:x64-windows-static libsamplerate:x64-windows-static benchmark:x64-windows-static ``` In the sfizz source directory, you can then build with CMake as usual, although you should clone the windows branch: diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index ceb5e852..160c248f 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -6,120 +6,150 @@ set(BENCHMARK_SIMD_SOURCES ${SFIZZ_SIMD_SOURCES}) list(TRANSFORM BENCHMARK_SIMD_SOURCES PREPEND "../src/") add_executable(bm_opf_high_vs_low BM_OPF_high_vs_low.cpp) -target_link_libraries(bm_opf_high_vs_low PRIVATE benchmark absl::span) +target_link_libraries(bm_opf_high_vs_low PRIVATE absl::span) +sfizz_link_benchmark(bm_opf_high_vs_low) target_include_directories(bm_opf_high_vs_low PRIVATE ../src/sfizz ../src/external) add_executable(bm_write BM_writeInterleaved.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_write PRIVATE benchmark absl::span) +target_link_libraries(bm_write PRIVATE absl::span) +sfizz_link_benchmark(bm_write) target_include_directories(bm_write PRIVATE ../src/sfizz ../src/external) add_executable(bm_read BM_readInterleaved.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_read PRIVATE benchmark absl::span) +target_link_libraries(bm_read PRIVATE absl::span) +sfizz_link_benchmark(bm_read) target_include_directories(bm_read PRIVATE ../src/sfizz ../src/external) add_executable(bm_fill BM_fill.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_fill PRIVATE benchmark absl::span) +target_link_libraries(bm_fill PRIVATE absl::span) +sfizz_link_benchmark(bm_fill) target_include_directories(bm_fill PRIVATE ../src/sfizz ../src/external) add_executable(bm_mathfuns BM_mathfuns.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_mathfuns PRIVATE benchmark absl::span) +target_link_libraries(bm_mathfuns PRIVATE absl::span) +sfizz_link_benchmark(bm_mathfuns) target_include_directories(bm_mathfuns PRIVATE ../src/sfizz ../src/external) add_executable(bm_gain BM_gain.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_gain PRIVATE benchmark absl::span) +target_link_libraries(bm_gain PRIVATE absl::span) +sfizz_link_benchmark(bm_gain) target_include_directories(bm_gain PRIVATE ../src/sfizz ../src/external) add_executable(bm_divide BM_divide.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_divide PRIVATE benchmark absl::span) +target_link_libraries(bm_divide PRIVATE absl::span) +sfizz_link_benchmark(bm_divide) target_include_directories(bm_divide PRIVATE ../src/sfizz ../src/external) add_executable(bm_looping BM_looping.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_looping PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_looping PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_looping) target_include_directories(bm_looping PRIVATE ../src/sfizz ../src/external) add_executable(bm_saturating BM_saturating.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_saturating PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_saturating PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_saturating) target_include_directories(bm_saturating PRIVATE ../src/sfizz ../src/external) add_executable(bm_ramp BM_ramp.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_ramp PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_ramp PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_ramp) target_include_directories(bm_ramp PRIVATE ../src/sfizz ../src/external) add_executable(bm_ADSR BM_ADSR.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_ADSR PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_ADSR PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_ADSR) target_include_directories(bm_ADSR PRIVATE ../src/sfizz ../src/external) add_executable(bm_add BM_add.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_add PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_add PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_add) target_include_directories(bm_add PRIVATE ../src/sfizz ../src/external) add_executable(bm_multiplyAdd BM_multiplyAdd.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_multiplyAdd PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_multiplyAdd PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_multiplyAdd) target_include_directories(bm_multiplyAdd PRIVATE ../src/sfizz ../src/external) add_executable(bm_subtract BM_subtract.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_subtract PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_subtract PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_subtract) target_include_directories(bm_subtract PRIVATE ../src/sfizz ../src/external) add_executable(bm_copy BM_copy.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_copy PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_copy PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_copy) target_include_directories(bm_copy PRIVATE ../src/sfizz ../src/external) add_executable(bm_pan BM_pan.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_pan PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_pan PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_pan) target_include_directories(bm_pan PRIVATE ../src/sfizz ../src/external) add_executable(bm_mean BM_mean.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_mean PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_mean PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_mean) target_include_directories(bm_mean PRIVATE ../src/sfizz ../src/external) add_executable(bm_meanSquared BM_meanSquared.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_meanSquared PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_meanSquared PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_meanSquared) target_include_directories(bm_meanSquared PRIVATE ../src/sfizz ../src/external) add_executable(bm_cumsum BM_cumsum.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_cumsum PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_cumsum PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_cumsum) target_include_directories(bm_cumsum PRIVATE ../src/sfizz ../src/external) add_executable(bm_diff BM_diff.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_diff PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_diff PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_diff) target_include_directories(bm_diff PRIVATE ../src/sfizz ../src/external) add_executable(bm_interpolationCast BM_interpolationCast.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_interpolationCast PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_interpolationCast PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_interpolationCast) target_include_directories(bm_interpolationCast PRIVATE ../src/sfizz ../src/external) add_executable(bm_pointerIterationOrOffsets BM_pointerIterationOrOffsets.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_pointerIterationOrOffsets PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_pointerIterationOrOffsets PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_pointerIterationOrOffsets) target_include_directories(bm_pointerIterationOrOffsets PRIVATE ../src/sfizz ../src/external) +if (NOT WIN32) add_executable(bm_resample BM_resample.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_resample PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_resample PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_resample) sfizz_link_libsndfile(bm_resample) sfizz_link_libsamplerate(bm_resample) target_include_directories(bm_resample PRIVATE ../src/sfizz ../src/external) +endif() add_executable(bm_envelopes BM_envelopes.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_envelopes PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_envelopes PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_envelopes) target_include_directories(bm_envelopes PRIVATE ../src/sfizz ../src/external) add_executable(bm_wavfile BM_wavfile.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_wavfile PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_wavfile PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_wavfile) sfizz_link_libsndfile(bm_wavfile) target_include_directories(bm_wavfile PRIVATE ../src/sfizz ../src/external) add_executable(bm_flacfile BM_flacfile.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_flacfile PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_flacfile PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_flacfile) sfizz_link_libsndfile(bm_flacfile) target_include_directories(bm_flacfile PRIVATE ../src/sfizz ../src/external) add_executable(bm_readChunk BM_readChunk.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_readChunk PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_readChunk PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_readChunk) sfizz_link_libsndfile(bm_readChunk) target_include_directories(bm_readChunk PRIVATE ../src/sfizz ../src/external) add_executable(bm_resampleChunk BM_resampleChunk.cpp ${BENCHMARK_SIMD_SOURCES}) -target_link_libraries(bm_resampleChunk PRIVATE benchmark absl::span absl::algorithm) +target_link_libraries(bm_resampleChunk PRIVATE absl::span absl::algorithm) +sfizz_link_benchmark(bm_resampleChunk) sfizz_link_libsndfile(bm_resampleChunk) target_include_directories(bm_resampleChunk PRIVATE ../src/sfizz ../src/external) @@ -147,13 +177,16 @@ add_dependencies(sfizz_benchmarks bm_subtract bm_multiplyAdd bm_readChunk - bm_resample bm_resampleChunk bm_envelopes bm_wavfile bm_flacfile ) +if (NOT WIN32) +add_dependencies(sfizz_benchmarks bm_resample) +endif() + file(COPY "sample1.wav" DESTINATION ${CMAKE_BINARY_DIR}/benchmarks) file(COPY "sample2.wav" DESTINATION ${CMAKE_BINARY_DIR}/benchmarks) file(COPY "sample3.wav" DESTINATION ${CMAKE_BINARY_DIR}/benchmarks) diff --git a/cmake/SfizzConfig.cmake b/cmake/SfizzConfig.cmake index 24e3fa82..aee23c4c 100644 --- a/cmake/SfizzConfig.cmake +++ b/cmake/SfizzConfig.cmake @@ -22,25 +22,35 @@ endif() if (WIN32) find_package(LibSndFile REQUIRED) + find_package(benchmark CONFIG REQUIRED) find_path(SNDFILE_INCLUDE_DIR sndfile.hh) find_path(SAMPLERATE_INCLUDE_DIR samplerate.h) set(CMAKE_CXX_STANDARD 17) add_compile_options(/Zc:__cplusplus) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() function(SFIZZ_LINK_LIBSNDFILE TARGET) if (WIN32) target_link_libraries (${TARGET} PRIVATE sndfile-static) - target_include_directories(${TARGET} PRIVATE ${SNDFILE_INCLUDE_DIR}) + target_include_directories(${TARGET} PUBLIC ${SNDFILE_INCLUDE_DIR}) else() target_link_libraries(${TARGET} PRIVATE sndfile) endif() endfunction(SFIZZ_LINK_LIBSNDFILE) +function(SFIZZ_LINK_BENCHMARK TARGET) + if (WIN32) + target_link_libraries (${TARGET} PRIVATE benchmark::benchmark benchmark::benchmark_main) + else() + target_link_libraries(${TARGET} PRIVATE benchmark) + endif() +endfunction(SFIZZ_LINK_BENCHMARK) + function(SFIZZ_LINK_LIBSAMPLERATE TARGET) if (WIN32) target_link_libraries (${TARGET} PRIVATE samplerate) - target_include_directories(${TARGET} PRIVATE ${SAMPLERATE_INCLUDE_DIR}) + target_include_directories(${TARGET} PUBLIC ${SAMPLERATE_INCLUDE_DIR}) else() target_link_libraries(${TARGET} PRIVATE samplerate) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a7b439b4..2483c433 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,22 +19,27 @@ target_include_directories (sfizz_parser PUBLIC sfizz) target_include_directories (sfizz_parser PUBLIC external) target_link_libraries (sfizz_parser PRIVATE absl::strings) +add_library (sfizz_objects OBJECT) +target_sources(sfizz_objects PRIVATE ${SFIZZ_SOURCES}) +target_include_directories (sfizz_objects PUBLIC external) +target_link_libraries (sfizz_objects PUBLIC absl::strings absl::span) +target_link_libraries (sfizz_objects PRIVATE sfizz_parser absl::flat_hash_map Threads::Threads) +if (UNIX AND NOT APPLE) + target_link_libraries (sfizz_objects PRIVATE atomic) +endif() +sfizz_link_libsndfile(sfizz_objects) + # Sfizz core library -add_library(sfizz STATIC) -target_sources(sfizz PRIVATE ${SFIZZ_SOURCES} sfizz/sfizz_wrapper.cpp) -target_include_directories (sfizz PUBLIC .) -target_include_directories (sfizz PUBLIC external) -target_link_libraries (sfizz PUBLIC absl::strings absl::span) -target_link_libraries (sfizz PRIVATE sfizz_parser absl::flat_hash_map Threads::Threads) -sfizz_link_libsndfile(sfizz) +add_library(sfizz_static STATIC) +target_sources(sfizz_static PRIVATE sfizz/sfizz_wrapper.cpp) +target_link_libraries (sfizz_static PRIVATE sfizz_objects) +target_include_directories (sfizz_static PUBLIC .) +target_include_directories (sfizz_static PUBLIC external) # Object dependency is not transitive? +target_link_libraries (sfizz_static PUBLIC absl::strings absl::span) # Object dependency is not transitive? sfizz_enable_lto_if_needed(sfizz) -if (UNIX AND NOT APPLE) - target_link_libraries (sfizz PRIVATE atomic) -endif() - add_library (sfizz::parser ALIAS sfizz_parser) -add_library (sfizz::sfizz ALIAS sfizz) +add_library (sfizz::sfizz ALIAS sfizz_static) # install(TARGETS sfizz_parser DESTINATION . EXCLUDE_FROM_ALL) # install(TARGETS sfizz DESTINATION . EXCLUDE_FROM_ALL) @@ -42,12 +47,12 @@ add_library (sfizz::sfizz ALIAS sfizz) # Shared library and installation target if (SFIZZ_SHARED) add_library (sfizz_shared SHARED) - target_compile_options(sfizz_shared PRIVATE -DSFIZZ_EXPORT_SYMBOLS) - target_sources(sfizz_shared PRIVATE ${SFIZZ_SOURCES} sfizz/sfizz_wrapper.cpp) + target_sources(sfizz_shared PRIVATE sfizz/sfizz_wrapper.cpp) target_include_directories (sfizz_shared PRIVATE .) - target_link_libraries (sfizz_shared PRIVATE sfizz_parser absl::flat_hash_map Threads::Threads absl::strings absl::span) + target_link_libraries (sfizz_shared PRIVATE sfizz_objects) + target_compile_definitions(sfizz_shared PRIVATE SFIZZ_EXPORT_SYMBOLS) set_target_properties (sfizz_shared PROPERTIES OUTPUT_NAME sfizz PUBLIC_HEADER sfizz.h) - sfizz_link_libsndfile(sfizz_shared) + # sfizz_link_libsndfile(sfizz_shared) sfizz_enable_lto_if_needed(sfizz_shared) configure_file (${PROJECT_SOURCE_DIR}/scripts/sfizz.pc.in sfizz.pc @ONLY) if (UNIX)