cmake_minimum_required(VERSION 3.1...3.10)

if(POLICY CMP0077)
  cmake_policy(SET CMP0077 NEW)
endif()

project(SPTK VERSION 4.4)

option(SPTK_INSTALL "Install SPTK library" ON)
option(SPTK_INSTALL_DRAW_COMMANDS "Install Python-based drawing commands" ON)
option(SPTK_BUILD_COMMANDS "Build SPTK commands" ON)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5.0)
    message(FATAL_ERROR "require clang >= 3.5.0")
  endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.5)
    message(FATAL_ERROR "require gcc >= 4.8.5")
  endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0)
    message(FATAL_ERROR "require msvc >= Visual Studio 2015")
  endif()
endif()

set(CMAKE_CXX_STANDARD 11)
if(MSVC)
  set(CMAKE_CXX_FLAGS
      "/O2 /W4 /wd4100 /wd4456 /wd4706 /EHsc /D_CRT_SECURE_NO_WARNINGS")
else()
  set(CMAKE_CXX_FLAGS "-O2 -Wall -Wno-deprecated-register")
endif()

add_definitions(-DDR_WAV_IMPLEMENTATION)
add_definitions(-DDR_WAV_NO_WCHAR)
add_definitions(-DDR_FLAC_IMPLEMENTATION)
add_definitions(-DDR_FLAC_NO_WCHAR)
add_definitions(-DDR_MP3_IMPLEMENTATION)
add_definitions(-DDR_MP3_FLOAT_OUTPUT)
add_definitions(-DSTB_VORBIS_NO_PUSHDATA_API)

add_definitions(-DOUTSIDE_SPEEX)
add_definitions(-DRANDOM_PREFIX=sptk_speex)
add_definitions(-DFLOATING_POINT)

add_definitions(-DENABLE_SINC_BEST_CONVERTER)
add_definitions(-DENABLE_SINC_MEDIUM_CONVERTER)
add_definitions(-DENABLE_SINC_FAST_CONVERTER)

set(SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
set(THIRD_PARTY_DIR ${PROJECT_SOURCE_DIR}/third_party)

set(CC_SOURCES
    ${THIRD_PARTY_DIR}/GETOPT/ya_getopt.cc
    ${THIRD_PARTY_DIR}/REAPER/core/file_resource.cc
    ${THIRD_PARTY_DIR}/REAPER/core/float_matrix.cc
    ${THIRD_PARTY_DIR}/REAPER/core/track.cc
    ${THIRD_PARTY_DIR}/REAPER/epoch_tracker/epoch_tracker.cc
    ${THIRD_PARTY_DIR}/REAPER/epoch_tracker/fd_filter.cc
    ${THIRD_PARTY_DIR}/REAPER/epoch_tracker/fft_reaper.cc
    ${THIRD_PARTY_DIR}/REAPER/epoch_tracker/lpc_analyzer.cc
    ${THIRD_PARTY_DIR}/REAPER/wave/codec_riff.cc
    ${THIRD_PARTY_DIR}/REAPER/wave/wave.cc
    ${THIRD_PARTY_DIR}/REAPER/wave/wave_io.cc
    ${THIRD_PARTY_DIR}/SpeexDSP/resample.cc
    ${THIRD_PARTY_DIR}/SWIPE/swipe.cc
    ${THIRD_PARTY_DIR}/SWIPE/vector.cc
    ${THIRD_PARTY_DIR}/Snack/jkGetF0.cc
    ${THIRD_PARTY_DIR}/Snack/sigproc.cc
    ${THIRD_PARTY_DIR}/WORLD/aperiodicity.cc
    ${THIRD_PARTY_DIR}/WORLD/cheaptrick.cc
    ${THIRD_PARTY_DIR}/WORLD/common.cc
    ${THIRD_PARTY_DIR}/WORLD/d4c.cc
    ${THIRD_PARTY_DIR}/WORLD/dio.cc
    ${THIRD_PARTY_DIR}/WORLD/fft_world.cc
    ${THIRD_PARTY_DIR}/WORLD/harvest.cc
    ${THIRD_PARTY_DIR}/WORLD/matlabfunctions.cc
    ${THIRD_PARTY_DIR}/WORLD/stonemask.cc
    ${THIRD_PARTY_DIR}/WORLD/synthesis.cc
    ${THIRD_PARTY_DIR}/libsamplerate/samplerate.cc
    ${THIRD_PARTY_DIR}/libsamplerate/src_linear.cc
    ${THIRD_PARTY_DIR}/libsamplerate/src_sinc.cc
    ${THIRD_PARTY_DIR}/libsamplerate/src_zoh.cc
    ${SOURCE_DIR}/analysis/adaptive_generalized_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/adaptive_mel_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/adaptive_mel_generalized_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/aperiodicity_extraction.cc
    ${SOURCE_DIR}/analysis/aperiodicity_extraction_by_tandem.cc
    ${SOURCE_DIR}/analysis/aperiodicity_extraction_by_world.cc
    ${SOURCE_DIR}/analysis/autocorrelation_analysis.cc
    ${SOURCE_DIR}/analysis/fast_fourier_transform_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/goertzel_analysis.cc
    ${SOURCE_DIR}/analysis/mel_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/mel_filter_bank_analysis.cc
    ${SOURCE_DIR}/analysis/mel_frequency_cepstral_coefficients_analysis.cc
    ${SOURCE_DIR}/analysis/mel_generalized_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/perceptual_linear_predictive_coefficients_analysis.cc
    ${SOURCE_DIR}/analysis/pitch_extraction.cc
    ${SOURCE_DIR}/analysis/pitch_extraction_by_dio.cc
    ${SOURCE_DIR}/analysis/pitch_extraction_by_harvest.cc
    ${SOURCE_DIR}/analysis/pitch_extraction_by_rapt.cc
    ${SOURCE_DIR}/analysis/pitch_extraction_by_reaper.cc
    ${SOURCE_DIR}/analysis/pitch_extraction_by_swipe.cc
    ${SOURCE_DIR}/analysis/second_order_all_pass_mel_cepstral_analysis.cc
    ${SOURCE_DIR}/analysis/spectrum_extraction.cc
    ${SOURCE_DIR}/analysis/spectrum_extraction_by_world.cc
    ${SOURCE_DIR}/analysis/zero_crossing_analysis.cc
    ${SOURCE_DIR}/check/line_spectral_pairs_stability_check.cc
    ${SOURCE_DIR}/check/linear_predictive_coefficients_stability_check.cc
    ${SOURCE_DIR}/check/mlsa_digital_filter_stability_check.cc
    ${SOURCE_DIR}/compression/a_law_compression.cc
    ${SOURCE_DIR}/compression/a_law_expansion.cc
    ${SOURCE_DIR}/compression/dynamic_range_compression.cc
    ${SOURCE_DIR}/compression/huffman_coding.cc
    ${SOURCE_DIR}/compression/huffman_decoding.cc
    ${SOURCE_DIR}/compression/huffman_encoding.cc
    ${SOURCE_DIR}/compression/inverse_multistage_vector_quantization.cc
    ${SOURCE_DIR}/compression/inverse_uniform_quantization.cc
    ${SOURCE_DIR}/compression/inverse_vector_quantization.cc
    ${SOURCE_DIR}/compression/linde_buzo_gray_algorithm.cc
    ${SOURCE_DIR}/compression/mu_law_compression.cc
    ${SOURCE_DIR}/compression/mu_law_expansion.cc
    ${SOURCE_DIR}/compression/multistage_vector_quantization.cc
    ${SOURCE_DIR}/compression/uniform_quantization.cc
    ${SOURCE_DIR}/compression/vector_quantization.cc
    ${SOURCE_DIR}/conversion/all_pole_to_all_zero_digital_filter_coefficients.cc
    ${SOURCE_DIR}/conversion/autocorrelation_to_composite_sinusoidal_modeling.cc
    ${SOURCE_DIR}/conversion/cepstrum_to_autocorrelation.cc
    ${SOURCE_DIR}/conversion/cepstrum_to_minimum_phase_impulse_response.cc
    ${SOURCE_DIR}/conversion/cepstrum_to_negative_derivative_of_phase_spectrum.cc
    ${SOURCE_DIR}/conversion/composite_sinusoidal_modeling_to_autocorrelation.cc
    ${SOURCE_DIR}/conversion/filter_coefficients_to_group_delay.cc
    ${SOURCE_DIR}/conversion/filter_coefficients_to_phase_spectrum.cc
    ${SOURCE_DIR}/conversion/filter_coefficients_to_spectrum.cc
    ${SOURCE_DIR}/conversion/generalized_cepstrum_gain_normalization.cc
    ${SOURCE_DIR}/conversion/generalized_cepstrum_inverse_gain_normalization.cc
    ${SOURCE_DIR}/conversion/line_spectral_pairs_to_linear_predictive_coefficients.cc
    ${SOURCE_DIR}/conversion/linear_predictive_coefficients_to_cepstrum.cc
    ${SOURCE_DIR}/conversion/linear_predictive_coefficients_to_line_spectral_pairs.cc
    ${SOURCE_DIR}/conversion/linear_predictive_coefficients_to_parcor_coefficients.cc
    ${SOURCE_DIR}/conversion/log_area_ratio_to_parcor_coefficients.cc
    ${SOURCE_DIR}/conversion/mel_cepstrum_inverse_power_normalization.cc
    ${SOURCE_DIR}/conversion/mel_cepstrum_power_normalization.cc
    ${SOURCE_DIR}/conversion/mel_cepstrum_to_mlsa_digital_filter_coefficients.cc
    ${SOURCE_DIR}/conversion/mel_generalized_cepstrum_to_mel_generalized_cepstrum.cc
    ${SOURCE_DIR}/conversion/mel_generalized_cepstrum_to_spectrum.cc
    ${SOURCE_DIR}/conversion/mel_generalized_line_spectral_pairs_to_spectrum.cc
    ${SOURCE_DIR}/conversion/minimum_phase_impulse_response_to_cepstrum.cc
    ${SOURCE_DIR}/conversion/mlsa_digital_filter_coefficients_to_mel_cepstrum.cc
    ${SOURCE_DIR}/conversion/negative_derivative_of_phase_spectrum_to_cepstrum.cc
    ${SOURCE_DIR}/conversion/parcor_coefficients_to_linear_predictive_coefficients.cc
    ${SOURCE_DIR}/conversion/parcor_coefficients_to_log_area_ratio.cc
    ${SOURCE_DIR}/conversion/spectrum_to_autocorrelation.cc
    ${SOURCE_DIR}/conversion/spectrum_to_spectrum.cc
    ${SOURCE_DIR}/conversion/waveform_to_autocorrelation.cc
    ${SOURCE_DIR}/conversion/waveform_to_spectrum.cc
    ${SOURCE_DIR}/filter/all_pole_digital_filter.cc
    ${SOURCE_DIR}/filter/all_pole_lattice_digital_filter.cc
    ${SOURCE_DIR}/filter/all_zero_digital_filter.cc
    ${SOURCE_DIR}/filter/all_zero_lattice_digital_filter.cc
    ${SOURCE_DIR}/filter/infinite_impulse_response_digital_filter.cc
    ${SOURCE_DIR}/filter/inverse_mglsa_digital_filter.cc
    ${SOURCE_DIR}/filter/inverse_pseudo_quadrature_mirror_filter_banks.cc
    ${SOURCE_DIR}/filter/line_spectral_pairs_digital_filter.cc
    ${SOURCE_DIR}/filter/median_filter.cc
    ${SOURCE_DIR}/filter/mglsa_digital_filter.cc
    ${SOURCE_DIR}/filter/mlsa_digital_filter.cc
    ${SOURCE_DIR}/filter/pseudo_quadrature_mirror_filter_banks.cc
    ${SOURCE_DIR}/filter/second_order_digital_filter.cc
    ${SOURCE_DIR}/filter/world_synthesis.cc
    ${SOURCE_DIR}/generation/delta_calculation.cc
    ${SOURCE_DIR}/generation/excitation_generation.cc
    ${SOURCE_DIR}/generation/m_sequence_generation.cc
    ${SOURCE_DIR}/generation/nonrecursive_maximum_likelihood_parameter_generation.cc
    ${SOURCE_DIR}/generation/normal_distributed_random_value_generation.cc
    ${SOURCE_DIR}/generation/periodic_waveform_generation.cc
    ${SOURCE_DIR}/generation/recursive_maximum_likelihood_parameter_generation.cc
    ${SOURCE_DIR}/generation/uniform_distributed_random_value_generation.cc
    ${SOURCE_DIR}/input/input_source_delay.cc
    ${SOURCE_DIR}/input/input_source_filling_magic_number.cc
    ${SOURCE_DIR}/input/input_source_from_array.cc
    ${SOURCE_DIR}/input/input_source_from_matrix.cc
    ${SOURCE_DIR}/input/input_source_from_stream.cc
    ${SOURCE_DIR}/input/input_source_from_vector.cc
    ${SOURCE_DIR}/input/input_source_interpolation.cc
    ${SOURCE_DIR}/input/input_source_interpolation_with_magic_number.cc
    ${SOURCE_DIR}/input/input_source_preprocessing_for_filter_gain.cc
    ${SOURCE_DIR}/math/discrete_cosine_transform.cc
    ${SOURCE_DIR}/math/discrete_fourier_transform.cc
    ${SOURCE_DIR}/math/distance_calculation.cc
    ${SOURCE_DIR}/math/durand_kerner_method.cc
    ${SOURCE_DIR}/math/dynamic_time_warping.cc
    ${SOURCE_DIR}/math/entropy_calculation.cc
    ${SOURCE_DIR}/math/fast_fourier_transform.cc
    ${SOURCE_DIR}/math/fourier_transform.cc
    ${SOURCE_DIR}/math/frequency_transform.cc
    ${SOURCE_DIR}/math/gaussian_mixture_model_based_conversion.cc
    ${SOURCE_DIR}/math/gaussian_mixture_modeling.cc
    ${SOURCE_DIR}/math/histogram_calculation.cc
    ${SOURCE_DIR}/math/inverse_discrete_cosine_transform.cc
    ${SOURCE_DIR}/math/inverse_discrete_fourier_transform.cc
    ${SOURCE_DIR}/math/inverse_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/inverse_fourier_transform.cc
    ${SOURCE_DIR}/math/levinson_durbin_recursion.cc
    ${SOURCE_DIR}/math/lp_norm_calculation.cc
    ${SOURCE_DIR}/math/matrix.cc
    ${SOURCE_DIR}/math/matrix2d.cc
    ${SOURCE_DIR}/math/minmax_accumulation.cc
    ${SOURCE_DIR}/math/mode_accumulation.cc
    ${SOURCE_DIR}/math/principal_component_analysis.cc
    ${SOURCE_DIR}/math/product_accumulation.cc
    ${SOURCE_DIR}/math/real_valued_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/real_valued_inverse_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/reverse_levinson_durbin_recursion.cc
    ${SOURCE_DIR}/math/scalar_operation.cc
    ${SOURCE_DIR}/math/second_order_all_pass_frequency_transform.cc
    ${SOURCE_DIR}/math/second_order_all_pass_inverse_frequency_transform.cc
    ${SOURCE_DIR}/math/statistics_accumulation.cc
    ${SOURCE_DIR}/math/symmetric_matrix.cc
    ${SOURCE_DIR}/math/symmetric_system_solver.cc
    ${SOURCE_DIR}/math/toeplitz_plus_hankel_system_solver.cc
    ${SOURCE_DIR}/math/two_dimensional_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/two_dimensional_inverse_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/two_dimensional_real_valued_fast_fourier_transform.cc
    ${SOURCE_DIR}/math/vandermonde_system_solver.cc
    ${SOURCE_DIR}/postfilter/mel_cepstrum_postfilter.cc
    ${SOURCE_DIR}/resampler/libsamplerate_resampler.cc
    ${SOURCE_DIR}/resampler/r8brain_resampler.cc
    ${SOURCE_DIR}/resampler/resampler.cc
    ${SOURCE_DIR}/resampler/speex_resampler.cc
    ${SOURCE_DIR}/utils/data_symmetrizing.cc
    ${SOURCE_DIR}/utils/misc_utils.cc
    ${SOURCE_DIR}/utils/sptk_utils.cc
    ${SOURCE_DIR}/window/chebyshev_window.cc
    ${SOURCE_DIR}/window/cosine_window.cc
    ${SOURCE_DIR}/window/data_windowing.cc
    ${SOURCE_DIR}/window/kaiser_window.cc
    ${SOURCE_DIR}/window/standard_window.cc)

add_library(sptk STATIC ${CC_SOURCES})
target_include_directories(
  sptk
  PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
         $<BUILD_INTERFACE:${THIRD_PARTY_DIR}>
         $<BUILD_INTERFACE:${THIRD_PARTY_DIR}/REAPER>
         $<BUILD_INTERFACE:${THIRD_PARTY_DIR}/WORLD>)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

if(SPTK_INSTALL)
  install(
    TARGETS sptk
    EXPORT ${PROJECT_NAME}Targets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    INCLUDES
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

  install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/SPTK
          DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

  install(
    EXPORT ${PROJECT_NAME}Targets
    FILE ${PROJECT_NAME}Targets.cmake
    NAMESPACE ${PROJECT_NAME}::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})

  configure_package_config_file(
    ${PROJECT_SOURCE_DIR}/Config.cmake.in
    ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})

  write_basic_package_version_file(
    ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion)

  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
endif()

set(MAIN_SOURCES
    ${SOURCE_DIR}/main/acorr.cc
    ${SOURCE_DIR}/main/acr2csm.cc
    ${SOURCE_DIR}/main/aeq.cc
    ${SOURCE_DIR}/main/alaw.cc
    ${SOURCE_DIR}/main/amgcep.cc
    ${SOURCE_DIR}/main/ap.cc
    ${SOURCE_DIR}/main/average.cc
    ${SOURCE_DIR}/main/b2mc.cc
    ${SOURCE_DIR}/main/bcp.cc
    ${SOURCE_DIR}/main/bcut.cc
    ${SOURCE_DIR}/main/c2acr.cc
    ${SOURCE_DIR}/main/c2mpir.cc
    ${SOURCE_DIR}/main/c2ndps.cc
    ${SOURCE_DIR}/main/cdist.cc
    ${SOURCE_DIR}/main/clip.cc
    ${SOURCE_DIR}/main/csm2acr.cc
    ${SOURCE_DIR}/main/dct.cc
    ${SOURCE_DIR}/main/decimate.cc
    ${SOURCE_DIR}/main/delay.cc
    ${SOURCE_DIR}/main/delta.cc
    ${SOURCE_DIR}/main/dequantize.cc
    ${SOURCE_DIR}/main/df2.cc
    ${SOURCE_DIR}/main/dfs.cc
    ${SOURCE_DIR}/main/dmp.cc
    ${SOURCE_DIR}/main/drc.cc
    ${SOURCE_DIR}/main/dtw.cc
    ${SOURCE_DIR}/main/dtw_merge.cc
    ${SOURCE_DIR}/main/entropy.cc
    ${SOURCE_DIR}/main/excite.cc
    ${SOURCE_DIR}/main/extract.cc
    ${SOURCE_DIR}/main/f0eval.cc
    ${SOURCE_DIR}/main/fbank.cc
    ${SOURCE_DIR}/main/fd.cc
    ${SOURCE_DIR}/main/fft.cc
    ${SOURCE_DIR}/main/fft2.cc
    ${SOURCE_DIR}/main/fftcep.cc
    ${SOURCE_DIR}/main/fftr.cc
    ${SOURCE_DIR}/main/fftr2.cc
    ${SOURCE_DIR}/main/frame.cc
    ${SOURCE_DIR}/main/freqt.cc
    ${SOURCE_DIR}/main/gmm.cc
    ${SOURCE_DIR}/main/gmmp.cc
    ${SOURCE_DIR}/main/gnorm.cc
    ${SOURCE_DIR}/main/goertzel.cc
    ${SOURCE_DIR}/main/grpdelay.cc
    ${SOURCE_DIR}/main/histogram.cc
    ${SOURCE_DIR}/main/huffman.cc
    ${SOURCE_DIR}/main/huffman_decode.cc
    ${SOURCE_DIR}/main/huffman_encode.cc
    ${SOURCE_DIR}/main/ialaw.cc
    ${SOURCE_DIR}/main/idct.cc
    ${SOURCE_DIR}/main/ifft.cc
    ${SOURCE_DIR}/main/ifft2.cc
    ${SOURCE_DIR}/main/ignorm.cc
    ${SOURCE_DIR}/main/iltcdf.cc
    ${SOURCE_DIR}/main/imglsadf.cc
    ${SOURCE_DIR}/main/impulse.cc
    ${SOURCE_DIR}/main/imsvq.cc
    ${SOURCE_DIR}/main/interpolate.cc
    ${SOURCE_DIR}/main/ipnorm.cc
    ${SOURCE_DIR}/main/ipqmf.cc
    ${SOURCE_DIR}/main/iulaw.cc
    ${SOURCE_DIR}/main/lar2par.cc
    ${SOURCE_DIR}/main/lbg.cc
    ${SOURCE_DIR}/main/levdur.cc
    ${SOURCE_DIR}/main/linear_intpl.cc
    ${SOURCE_DIR}/main/lpc.cc
    ${SOURCE_DIR}/main/lpc2c.cc
    ${SOURCE_DIR}/main/lpc2lsp.cc
    ${SOURCE_DIR}/main/lpc2par.cc
    ${SOURCE_DIR}/main/lpccheck.cc
    ${SOURCE_DIR}/main/lpnorm.cc
    ${SOURCE_DIR}/main/lsp2lpc.cc
    ${SOURCE_DIR}/main/lspcheck.cc
    ${SOURCE_DIR}/main/lspdf.cc
    ${SOURCE_DIR}/main/ltcdf.cc
    ${SOURCE_DIR}/main/magic_intpl.cc
    ${SOURCE_DIR}/main/mc2b.cc
    ${SOURCE_DIR}/main/mcpf.cc
    ${SOURCE_DIR}/main/medfilt.cc
    ${SOURCE_DIR}/main/median.cc
    ${SOURCE_DIR}/main/merge.cc
    ${SOURCE_DIR}/main/mfcc.cc
    ${SOURCE_DIR}/main/mgc2mgc.cc
    ${SOURCE_DIR}/main/mgc2sp.cc
    ${SOURCE_DIR}/main/mgcep.cc
    ${SOURCE_DIR}/main/mglsadf.cc
    ${SOURCE_DIR}/main/mglsp2sp.cc
    ${SOURCE_DIR}/main/minmax.cc
    ${SOURCE_DIR}/main/mlpg.cc
    ${SOURCE_DIR}/main/mlsacheck.cc
    ${SOURCE_DIR}/main/mode.cc
    ${SOURCE_DIR}/main/mpir2c.cc
    ${SOURCE_DIR}/main/mseq.cc
    ${SOURCE_DIR}/main/msvq.cc
    ${SOURCE_DIR}/main/nan.cc
    ${SOURCE_DIR}/main/ndps2c.cc
    ${SOURCE_DIR}/main/norm0.cc
    ${SOURCE_DIR}/main/nrand.cc
    ${SOURCE_DIR}/main/onehot.cc
    ${SOURCE_DIR}/main/par2lar.cc
    ${SOURCE_DIR}/main/par2lpc.cc
    ${SOURCE_DIR}/main/pca.cc
    ${SOURCE_DIR}/main/pcas.cc
    ${SOURCE_DIR}/main/phase.cc
    ${SOURCE_DIR}/main/plp.cc
    ${SOURCE_DIR}/main/pitch.cc
    ${SOURCE_DIR}/main/pitch2sin.cc
    ${SOURCE_DIR}/main/pitch_mark.cc
    ${SOURCE_DIR}/main/pitch_spec.cc
    ${SOURCE_DIR}/main/pnorm.cc
    ${SOURCE_DIR}/main/poledf.cc
    ${SOURCE_DIR}/main/pqmf.cc
    ${SOURCE_DIR}/main/quantize.cc
    ${SOURCE_DIR}/main/ramp.cc
    ${SOURCE_DIR}/main/rand.cc
    ${SOURCE_DIR}/main/raw2wav.cc
    ${SOURCE_DIR}/main/resamp.cc
    ${SOURCE_DIR}/main/reverse.cc
    ${SOURCE_DIR}/main/rlevdur.cc
    ${SOURCE_DIR}/main/rmse.cc
    ${SOURCE_DIR}/main/root_pol.cc
    ${SOURCE_DIR}/main/sin.cc
    ${SOURCE_DIR}/main/smcep.cc
    ${SOURCE_DIR}/main/snr.cc
    ${SOURCE_DIR}/main/sopr.cc
    ${SOURCE_DIR}/main/spec.cc
    ${SOURCE_DIR}/main/step.cc
    ${SOURCE_DIR}/main/swab.cc
    ${SOURCE_DIR}/main/symmetrize.cc
    ${SOURCE_DIR}/main/train.cc
    ${SOURCE_DIR}/main/transpose.cc
    ${SOURCE_DIR}/main/ulaw.cc
    ${SOURCE_DIR}/main/vc.cc
    ${SOURCE_DIR}/main/vopr.cc
    ${SOURCE_DIR}/main/vprod.cc
    ${SOURCE_DIR}/main/vstat.cc
    ${SOURCE_DIR}/main/vsum.cc
    ${SOURCE_DIR}/main/wav2raw.cc
    ${SOURCE_DIR}/main/window.cc
    ${SOURCE_DIR}/main/world_synth.cc
    ${SOURCE_DIR}/main/x2x.cc
    ${SOURCE_DIR}/main/zcross.cc
    ${SOURCE_DIR}/main/zerodf.cc)

if(SPTK_BUILD_COMMANDS)
  foreach(SOURCE ${MAIN_SOURCES})
    get_filename_component(BIN ${SOURCE} NAME_WE)
    add_executable(${BIN} ${SOURCE})
    target_link_libraries(${BIN} sptk)
    if(SPTK_INSTALL)
      install(TARGETS ${BIN} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    endif()
  endforeach()
endif()

set(PYTHON_SOURCES
    ${SOURCE_DIR}/draw/fdrw.py
    ${SOURCE_DIR}/draw/glogsp.py
    ${SOURCE_DIR}/draw/gpolezero.py
    ${SOURCE_DIR}/draw/grlogsp.py
    ${SOURCE_DIR}/draw/gseries.py
    ${SOURCE_DIR}/draw/gspecgram.py
    ${SOURCE_DIR}/draw/gwave.py)

if(NOT WIN32 AND SPTK_INSTALL_DRAW_COMMANDS)
  install(FILES ${SOURCE_DIR}/draw/sptk/draw_utils.py
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/sptk)

  foreach(SOURCE ${PYTHON_SOURCES})
    get_filename_component(BIN ${SOURCE} NAME_WE)
    install(
      PROGRAMS ${SOURCE}
      DESTINATION ${CMAKE_INSTALL_BINDIR}
      RENAME ${BIN})
  endforeach()
endif()
