
set( TARGET Tenacity )
set( TARGET_ROOT ${CMAKE_SOURCE_DIR}/src )

include(CheckFunctionExists)

message( STATUS "========== Configuring ${TARGET} ==========" )

# Allow modules to link against the Tenacity executable
set( CMAKE_ENABLE_EXPORTS ON )

add_executable( ${TARGET} )
add_dependencies( ${TARGET} locale )
add_dependencies( ${TARGET} nyquist )
add_dependencies( ${TARGET} plug-ins )

def_vars()

# Add a target that will provide the git revision info
# whenever it changes.  (Must be done at build time, not
# configuration time.)
if( DEFINED TENACITY_REV_LONG AND DEFINED AUDACITY_REV_TIME )
   file( WRITE "${_PRVDIR}/RevisionIdent.h"
      "#define REV_LONG \"${TENACITY_REV_LONG}\"\n#define REV_TIME \"${TENACITY_REV_TIME}\"\n"
   )
elseif( GIT_FOUND )
   add_custom_target(
      version
      COMMAND
         ${CMAKE_COMMAND} -D GIT="${GIT_EXECUTABLE}"
                          -D "_PRVDIR=${_PRVDIR}"
                          -P "cmake-proxies/cmake-modules/Version.cmake"
      WORKING_DIRECTORY
         ${CMAKE_SOURCE_DIR}
   )

   add_dependencies( ${TARGET} version )
else()
   # No Git installed and no version data is available.
   # Generate an empty file and let AboutDialog do the rest
   # WRITE, unlike TOUCH, will create any directories needed
   # (see https://github.com/audacity/audacity/issues/2163)
   file( WRITE "${_PRVDIR}/RevisionIdent.h" "" )
endif()

# Handle Audio Units option
if( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
   option(
      use_audio_units
      "Use Audio Units plug-in support [on, off]"
      ON
   )
   set( USE_AUDIO_UNITS ${use_audio_units} CACHE INTERNAL "" )
endif()

# Detect, what platform we're on. Used for TenacityApp, VST effects, and Audio
# Unit effects.
#
# We always assume that GTK is used on platforms other than Windows and macOS,
# as there is no other implementation avalaible now
if( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
   set( wxIS_MAC on )
elseif( CMAKE_SYSTEM_NAME MATCHES "Windows" )
   set ( wxIS_WIN on )
else()
   set ( wxIS_GTK on)
endif()

#
#
#
list( APPEND SOURCES
   PRIVATE
      AColor.cpp
      AColor.h
      AColorResources.h
      ActiveProject.cpp
      ActiveProject.h
      ActiveProjects.cpp
      ActiveProjects.h
      AboutDialog.cpp
      AboutDialog.h
      AdornedRulerPanel.cpp
      AdornedRulerPanel.h
      AudioIO.cpp
      AudioIO.h
      AudioIOListener.h
      AutoRecoveryDialog.cpp
      AutoRecoveryDialog.h
      BatchCommandDialog.cpp
      BatchCommandDialog.h
      BatchCommands.cpp
      BatchCommands.h
      BatchProcessDialog.cpp
      BatchProcessDialog.h
      Benchmark.cpp
      Benchmark.h
      CellularPanel.cpp
      CellularPanel.h
      Clipboard.cpp
      Clipboard.h
      CommonCommandFlags.cpp
      CommonCommandFlags.h
      DBConnection.cpp
      DBConnection.h
      Diags.cpp
      Diags.h
      Envelope.cpp
      Envelope.h
      EnvelopeEditor.cpp
      EnvelopeEditor.h
      FileFormats.cpp
      FileFormats.h
      FreqWindow.cpp
      FreqWindow.h
      HelpText.cpp
      HelpText.h
      HistoryWindow.cpp
      HistoryWindow.h
      HitTestResult.h
      ImageManipulation.cpp
      ImageManipulation.h
      Journal.cpp
      Journal.h
      JournalEvents.cpp
      JournalEvents.h
      JournalOutput.cpp
      JournalOutput.h
      JournalRegistry.cpp
      JournalRegistry.h
      JournalWindowPaths.cpp
      JournalWindowPaths.h
      KeyboardCapture.cpp
      KeyboardCapture.h
      LabelDialog.cpp
      LabelDialog.h
      LabelTrack.cpp
      LabelTrack.h
      LangChoice.cpp
      LangChoice.h
      Legacy.cpp
      Legacy.h
      LogWindow.cpp
      LogWindow.h
      Lyrics.cpp
      Lyrics.h
      LyricsWindow.cpp
      LyricsWindow.h
      MacroMagic.h
      Menus.cpp
      Menus.h
      Mix.cpp
      Mix.h
      MixerBoard.cpp
      MixerBoard.h
      ModuleManager.cpp
      ModuleManager.h
      ModuleSettings.cpp
      ModuleSettings.h
      $<$<BOOL:${USE_MIDI}>:NoteTrack.cpp>
      $<$<BOOL:${USE_MIDI}>:NoteTrack.h>
      PitchName.cpp
      PitchName.h
      PlaybackSchedule.cpp
      PlaybackSchedule.h
      PluginManager.cpp
      PluginManager.h
      PluginRegistrationDialog.cpp
      PluginRegistrationDialog.h
      Printing.cpp
      Printing.h
      Profiler.cpp
      Profiler.h
      ProjectAudioIO.cpp
      ProjectAudioIO.h
      ProjectAudioManager.cpp
      ProjectAudioManager.h
      ProjectFileIO.cpp
      ProjectFileIO.h
      ProjectFileManager.cpp
      ProjectFileManager.h
      ProjectHistory.cpp
      ProjectHistory.h
      ProjectManager.cpp
      ProjectManager.h
      ProjectSelectionManager.cpp
      ProjectSelectionManager.h
      ProjectSerializer.cpp
      ProjectSerializer.h
      ProjectSettings.cpp
      ProjectSettings.h
      ProjectWindow.cpp
      ProjectWindow.h
      ProjectWindowBase.cpp
      ProjectWindowBase.h
      RefreshCode.h
      ProjectWindows.cpp
      ProjectWindows.h
      RingBuffer.cpp
      RingBuffer.h
      SampleBlock.cpp
      SampleBlock.h
      TenacityApp.cpp
      TenacityApp.h
      $<$<BOOL:${wxIS_MAC}>:TenacityApp.mm>
      TenacityFileConfig.cpp
      TenacityFileConfig.h
      TenacityHeaders.cpp
      TenacityHeaders.h
      Screenshot.cpp
      Screenshot.h
      SelectUtilities.cpp
      SelectUtilities.h
      SelectFile.cpp
      SelectFile.h
      SelectionState.cpp
      SelectionState.h
      Sequence.cpp
      Sequence.h
      Snap.cpp
      Snap.h
      SoundActivatedRecord.cpp
      SoundActivatedRecord.h
      SpectrumAnalyst.cpp
      SpectrumAnalyst.h
      SplashDialog.cpp
      SplashDialog.h
      SqliteSampleBlock.cpp
      Tags.cpp
      Tags.h
      SyncLock.cpp
      SyncLock.h
      TimeDialog.cpp
      TimeDialog.h
      TimeTrack.cpp
      TimeTrack.h
      TimerRecordDialog.cpp
      TimerRecordDialog.h
      TrackArt.cpp
      TrackArt.h
      TrackArtist.cpp
      TrackArtist.h
      TrackInfo.cpp
      TrackInfo.h
      TrackPanel.cpp
      TrackPanel.h
      TrackPanelAx.cpp
      TrackPanelAx.h
      TrackPanelCell.cpp
      TrackPanelCell.h
      TrackPanelConstants.h
      TrackPanelDrawable.cpp
      TrackPanelDrawable.h
      TrackPanelDrawingContext.h
      TrackPanelListener.h
      TrackPanelMouseEvent.h
      TrackPanelResizeHandle.cpp
      TrackPanelResizeHandle.h
      TrackPanelResizerCell.cpp
      TrackPanelResizerCell.h
      TrackUtilities.cpp
      TrackUtilities.h
      UIHandle.cpp
      UIHandle.h
      UndoManager.cpp
      UndoManager.h
      VoiceKey.cpp
      VoiceKey.h
      WaveClip.cpp
      WaveClip.h
      WaveTrack.cpp
      WaveTrack.h
      WaveTrackLocation.h
      WrappedType.cpp
      WrappedType.h

      # Commands

      commands/AppCommandEvent.cpp
      commands/AppCommandEvent.h
      commands/AudacityCommand.cpp
      commands/AudacityCommand.h
      commands/BatchEvalCommand.cpp
      commands/BatchEvalCommand.h
      commands/Command.cpp
      commands/Command.h
      commands/CommandBuilder.cpp
      commands/CommandBuilder.h
      commands/CommandContext.cpp
      commands/CommandContext.h
      commands/CommandDirectory.cpp
      commands/CommandDirectory.h
      commands/CommandFlag.h
      commands/CommandFunctors.h
      commands/CommandHandler.cpp
      commands/CommandHandler.h
      commands/CommandManager.cpp
      commands/CommandManager.h
      commands/CommandManagerWindowClasses.h
      commands/CommandMisc.h
      commands/CommandSignature.cpp
      commands/CommandSignature.h
      commands/CommandTargets.cpp
      commands/CommandTargets.h
      commands/CommandType.cpp
      commands/CommandType.h
      commands/CompareAudioCommand.cpp
      commands/CompareAudioCommand.h
      commands/Demo.cpp
      commands/Demo.h
      commands/DragCommand.cpp
      commands/DragCommand.h
      commands/GetInfoCommand.cpp
      commands/GetInfoCommand.h
      commands/HelpCommand.cpp
      commands/HelpCommand.h
      commands/ImportExportCommands.cpp
      commands/ImportExportCommands.h
      commands/Keyboard.cpp
      commands/Keyboard.h
      commands/LoadCommands.cpp
      commands/LoadCommands.h
      commands/MessageCommand.cpp
      commands/MessageCommand.h
      commands/OpenSaveCommands.cpp
      commands/OpenSaveCommands.h
      commands/PreferenceCommands.cpp
      commands/PreferenceCommands.h
      commands/ResponseQueue.cpp
      commands/ResponseQueue.h
      commands/ScreenshotCommand.cpp
      commands/ScreenshotCommand.h
      commands/ScriptCommandRelay.cpp
      commands/ScriptCommandRelay.h
      commands/SelectCommand.cpp
      commands/SelectCommand.h
      commands/SetClipCommand.cpp
      commands/SetClipCommand.h
      commands/SetEnvelopeCommand.cpp
      commands/SetEnvelopeCommand.h
      commands/SetLabelCommand.cpp
      commands/SetLabelCommand.h
      commands/SetProjectCommand.cpp
      commands/SetProjectCommand.h
      commands/SetTrackInfoCommand.cpp
      commands/SetTrackInfoCommand.h
      commands/Validators.h

      # Built-in Effects

      effects/Amplify.cpp
      effects/Amplify.h
      effects/AutoDuck.cpp
      effects/AutoDuck.h
      effects/BassTreble.cpp
      effects/BassTreble.h
      effects/Biquad.cpp
      effects/Biquad.h
      effects/ChangePitch.cpp
      effects/ChangePitch.h
      effects/ChangeSpeed.cpp
      effects/ChangeSpeed.h
      effects/ChangeTempo.cpp
      effects/ChangeTempo.h
      effects/ClickRemoval.cpp
      effects/ClickRemoval.h
      effects/Compressor.cpp
      effects/Compressor.h
      effects/Compressor2.cpp
      effects/Compressor2.h
      effects/Contrast.cpp
      effects/Contrast.h
      effects/Distortion.cpp
      effects/Distortion.h
      effects/DtmfGen.cpp
      effects/DtmfGen.h
      effects/EBUR128.cpp
      effects/EBUR128.h
      effects/Echo.cpp
      effects/Echo.h
      effects/Effect.cpp
      effects/Effect.h
      effects/EffectManager.cpp
      effects/EffectManager.h
      effects/EffectUI.cpp
      effects/EffectUI.h
      effects/Equalization.cpp
      effects/Equalization.h
      effects/Equalization48x.cpp
      effects/Equalization48x.h
      effects/Fade.cpp
      effects/Fade.h
      effects/FindClipping.cpp
      effects/FindClipping.h
      effects/Generator.cpp
      effects/Generator.h
      effects/Invert.cpp
      effects/Invert.h
      effects/LoadEffects.cpp
      effects/LoadEffects.h
      effects/Loudness.cpp
      effects/Loudness.h
      effects/Noise.cpp
      effects/Noise.h
      effects/NoiseReduction.cpp
      effects/NoiseReduction.h
      effects/NoiseRemoval.cpp
      effects/NoiseRemoval.h
      effects/Normalize.cpp
      effects/Normalize.h
      effects/Paulstretch.cpp
      effects/Paulstretch.h
      effects/Phaser.cpp
      effects/Phaser.h
      effects/RealtimeEffectManager.cpp
      effects/RealtimeEffectManager.h
      effects/Repair.cpp
      effects/Repair.h
      effects/Repeat.cpp
      effects/Repeat.h
      effects/Reverb.cpp
      effects/Reverb.h
      effects/Reverb_libSoX.h
      effects/Reverse.cpp
      effects/Reverse.h
      effects/SBSMSEffect.cpp
      effects/SBSMSEffect.h
      effects/ScienFilter.cpp
      effects/ScienFilter.h
      effects/ScoreAlignDialog.cpp
      effects/ScoreAlignDialog.h
      effects/Silence.cpp
      effects/Silence.h
      effects/SimpleMono.cpp
      effects/SimpleMono.h
      effects/SoundTouchEffect.cpp
      effects/SoundTouchEffect.h
      effects/StereoToMono.cpp
      effects/StereoToMono.h
      effects/TimeScale.cpp
      effects/TimeScale.h
      effects/TimeWarper.cpp
      effects/TimeWarper.h
      effects/ToneGen.cpp
      effects/ToneGen.h
      effects/TruncSilence.cpp
      effects/TruncSilence.h
      effects/TwoPassSimpleMono.cpp
      effects/TwoPassSimpleMono.h
      effects/Wahwah.cpp
      effects/Wahwah.h

      # Shuttle system
      shuttle/Shuttle.cpp
      shuttle/Shuttle.h
      shuttle/ShuttleGetDefinition.cpp
      shuttle/ShuttleGetDefinition.h
      shuttle/ShuttleGui.cpp
      shuttle/ShuttleGui.h
      shuttle/ShuttlePrefs.cpp
      shuttle/ShuttlePrefs.h


      # VST Effects

      $<$<BOOL:${USE_VST2}>:
         effects/VST/VSTControl.h
         effects/VST/VSTEffect.cpp
         effects/VST/VSTEffect.h
         effects/VST/aeffectx.h
      >

      $<$<AND:$<BOOL:${USE_VST2}>,$<BOOL:${wxIS_GTK}>>:
         effects/VST/VSTControlGTK.cpp
         effects/VST/VSTControlGTK.h
      >

      $<$<AND:$<BOOL:${USE_VST2}>,$<BOOL:${wxIS_WIN}>>:
         effects/VST/VSTControlMSW.cpp
         effects/VST/VSTControlMSW.h
      >

      $<$<AND:$<BOOL:${USE_VST2}>,$<BOOL:${wxIS_MAC}>>:
         effects/VST/VSTControlOSX.h
         effects/VST/VSTControlOSX.mm
      >

      # Audio Unit Effects

      $<$<AND:$<BOOL:${USE_AUDIO_UNITS}>,$<BOOL:${wxIS_MAC}>>:
         effects/audiounits/AUControl.h
         effects/audiounits/AUControl.mm
         effects/audiounits/AudioUnitEffect.cpp
         effects/audiounits/AudioUnitEffect.h
      >

      # Ladspa Effects

      $<$<BOOL:${USE_LADSPA}>:
         effects/ladspa/LadspaEffect.cpp
         effects/ladspa/LadspaEffect.h
         effects/ladspa/ladspa.h
      >

      # LV2 Effects

      $<$<BOOL:${USE_LV2}>:
         effects/lv2/LV2Effect.cpp
         effects/lv2/LV2Effect.h
         effects/lv2/LoadLV2.cpp
         effects/lv2/LoadLV2.h
         effects/lv2/NativeWindow.h
         effects/lv2/lv2_external_ui.h
         effects/lv2/zix/common.h
         effects/lv2/zix/ring.cpp
         effects/lv2/zix/ring.h
      >

      # Nyquist Effects

      $<$<BOOL:${USE_NYQUIST}>:
         effects/nyquist/LoadNyquist.cpp
         effects/nyquist/LoadNyquist.h
         effects/nyquist/Nyquist.cpp
         effects/nyquist/Nyquist.h
      >

      # VAMP Effects

      $<$<BOOL:${USE_VAMP}>:
         effects/vamp/LoadVamp.cpp
         effects/vamp/LoadVamp.h
         effects/vamp/VampEffect.cpp
         effects/vamp/VampEffect.h
      >

      # Export

      export/Export.cpp
      export/Export.h
      export/ExportPlugin.cpp
      export/ExportPlugin.h
      export/ExportDialog.cpp
      export/ExportDialog.h

      # Standard exporters
      export/ExportCL.cpp
      export/ExportMP3.cpp
      export/ExportMP3.h
      export/ExportMultiple.cpp
      export/ExportMultiple.h
      export/ExportPCM.cpp

      # Optional exporters
      $<$<BOOL:${USE_FFMPEG}>:
         export/ExportFFmpeg.cpp
         export/ExportFFmpegDialogs.cpp
         export/ExportFFmpegDialogs.h
      >

      $<$<BOOL:${USE_LIBFLAC}>:
         export/ExportFLAC.cpp
      >

      $<$<BOOL:${USE_LIBMATROSKA}>:
         export/ExportMka.cpp
      >

      $<$<BOOL:${USE_LIBTWOLAME}>:
         export/ExportMP2.cpp
      >

      $<$<AND:$<BOOL:${USE_LIBOGG}>,$<BOOL:${USE_LIBVORBIS}>>:
         export/ExportOGG.cpp
      >

      # FFmpeg

      ffmpeg/FFmpeg.h
      ffmpeg/FFmpeg.cpp

      $<$<BOOL:${USE_FFMPEG}>:
         ffmpeg/FFmpegNotFoundDialog.h
         ffmpeg/FFmpegNotFoundDialog.cpp
      >

      # Import

      import/FormatClassifier.cpp
      import/FormatClassifier.h
      import/Import.cpp
      import/Import.h
      import/ImportForwards.h
      import/MultiFormatReader.cpp
      import/MultiFormatReader.h
      import/RawAudioGuess.cpp
      import/RawAudioGuess.h
      import/SpecPowerMeter.cpp
      import/SpecPowerMeter.h

      # Standard importers

      import/ImportAUP.cpp
      import/ImportLOF.cpp
      import/ImportPCM.cpp
      import/ImportPlugin.h
      import/ImportPlugin.cpp
      import/ImportRaw.cpp
      import/ImportRaw.h

      # Optional importers

      $<$<BOOL:${USE_FFMPEG}>:
         import/ImportFFmpeg.cpp
      >

      $<$<BOOL:${USE_LIBFLAC}>:
         import/ImportFLAC.cpp
      >

      $<$<BOOL:${USE_GSTREAMER}>:
         import/ImportGStreamer.cpp
      >

      $<$<BOOL:${USE_MIDI}>:
         import/ImportMIDI.cpp
         import/ImportMIDI.h
      >

      $<$<BOOL:${USE_LIBMAD}>:
         import/ImportMP3.cpp
      >

      $<$<AND:$<BOOL:${USE_LIBOGG}>,$<BOOL:${USE_LIBVORBIS}>>:
         import/ImportOGG.cpp
      >

      $<$<BOOL:${USE_LIBMATROSKA}>:
         import/ImportMka.cpp
      >

      # Menus

      menus/ClipMenus.cpp
      menus/EditMenus.cpp
      menus/ExtraMenus.cpp
      menus/FileMenus.cpp
      menus/HelpMenus.cpp
      menus/LabelMenus.cpp
      menus/NavigationMenus.cpp
      menus/PluginMenus.cpp
      menus/SelectMenus.cpp
      menus/ToolbarMenus.cpp
      menus/TrackMenus.cpp
      menus/TransportMenus.cpp
      menus/ViewMenus.cpp
      menus/WindowMenus.cpp

      # Preferences

      prefs/BatchPrefs.cpp
      prefs/BatchPrefs.h
      prefs/DevicePrefs.cpp
      prefs/DevicePrefs.h
      prefs/DirectoriesPrefs.cpp
      prefs/DirectoriesPrefs.h
      prefs/EffectsPrefs.cpp
      prefs/EffectsPrefs.h
      prefs/ExtImportPrefs.cpp
      prefs/ExtImportPrefs.h
      prefs/GUIPrefs.cpp
      prefs/GUIPrefs.h
      prefs/GUISettings.h
      prefs/ImportExportPrefs.cpp
      prefs/ImportExportPrefs.h
      prefs/KeyConfigPrefs.cpp
      prefs/KeyConfigPrefs.h
      prefs/LibraryPrefs.cpp
      prefs/LibraryPrefs.h
      prefs/MidiIOPrefs.cpp
      prefs/MidiIOPrefs.h
      prefs/ModulePrefs.cpp
      prefs/ModulePrefs.h
      prefs/MousePrefs.cpp
      prefs/MousePrefs.h
      prefs/PlaybackPrefs.cpp
      prefs/PlaybackPrefs.h
      prefs/PrefsDialog.cpp
      prefs/PrefsDialog.h
      prefs/PrefsPanel.cpp
      prefs/PrefsPanel.h
      prefs/QualityPrefs.cpp
      prefs/QualityPrefs.h
      prefs/RecordingPrefs.cpp
      prefs/RecordingPrefs.h
      prefs/SpectrogramSettings.cpp
      prefs/SpectrogramSettings.h
      prefs/SpectrumPrefs.cpp
      prefs/SpectrumPrefs.h
      prefs/ThemePrefs.cpp
      prefs/ThemePrefs.h
      prefs/TracksBehaviorsPrefs.cpp
      prefs/TracksBehaviorsPrefs.h
      prefs/TracksPrefs.cpp
      prefs/TracksPrefs.h
      prefs/WarningsPrefs.cpp
      prefs/WarningsPrefs.h
      prefs/WaveformPrefs.cpp
      prefs/WaveformPrefs.h
      prefs/WaveformSettings.cpp
      prefs/WaveformSettings.h

      # Theming
      # Built-in themes #######################################################
      theme/AudacityClassicThemeAsCeeCode.cpp
      theme/AudacityClassicThemeAsCeeCode.h
      theme/AudacityThemeAsCeeCode.cpp
      theme/AudacityThemeAsCeeCode.h
      theme/AudaciumDarkBlueThemeAsCeeCode.cpp
      theme/AudaciumDarkBlueThemeAsCeeCode.h
      theme/AudaciumDarkGreenThemeAsCeeCode.cpp
      theme/AudaciumDarkGreenThemeAsCeeCode.h
      theme/AudaciumDarkPinkThemeAsCeeCode.cpp      
      theme/AudaciumDarkPinkThemeAsCeeCode.h
      theme/AudaciumDarkPurpleThemeAsCeeCode.cpp
      theme/AudaciumDarkPurpleThemeAsCeeCode.h
      theme/AudaciumDarkOrangeThemeAsCeeCode.cpp
      theme/AudaciumDarkOrangeThemeAsCeeCode.h
      theme/AudaciumLightBlueThemeAsCeeCode.cpp
      theme/AudaciumLightBlueThemeAsCeeCode.h
      theme/AudaciumLightGreenThemeAsCeeCode.cpp
      theme/AudaciumLightGreenThemeAsCeeCode.h
      theme/AudaciumLightPinkThemeAsCeeCode.cpp
      theme/AudaciumLightPinkThemeAsCeeCode.h
      theme/AudaciumLightPurpleThemeAsCeeCode.cpp
      theme/AudaciumLightPurpleThemeAsCeeCode.h
      theme/AudaciumLightOrangeThemeAsCeeCode.cpp
      theme/AudaciumLightOrangeThemeAsCeeCode.h
      theme/DarkThemeAsCeeCode.cpp
      theme/DarkThemeAsCeeCode.h
      theme/HiContrastThemeAsCeeCode.cpp
      theme/HiContrastThemeAsCeeCode.h
      theme/LightThemeAsCeeCode.cpp
      theme/LightThemeAsCeeCode.h
      theme/ProToolsThemeAsCeeCode.cpp
      theme/ProToolsThemeAsCeeCode.h
      theme/SaucedacityThemeAsCeeCode.cpp
      theme/SaucedacityThemeAsCeeCode.h
      #########################################################################
      theme/AllThemeResources.cpp
      theme/AllThemeResources.h
      theme/FlowPacker.cpp
      theme/FlowPacker.h
      theme/Theme.cpp
      theme/Theme.h
      theme/ThemeFlags.h
      theme/SourceOutputStream.cpp
      theme/SourceOutputStream.h

      # Toolbars

      toolbars/ControlToolBar.cpp
      toolbars/ControlToolBar.h
      toolbars/DeviceToolBar.cpp
      toolbars/DeviceToolBar.h
      toolbars/EditToolBar.cpp
      toolbars/EditToolBar.h
      toolbars/MeterToolBar.cpp
      toolbars/MeterToolBar.h
      toolbars/ScrubbingToolBar.cpp
      toolbars/ScrubbingToolBar.h
      toolbars/SelectionBar.cpp
      toolbars/SelectionBar.h
      toolbars/SelectionBarListener.h
      toolbars/SpectralSelectionBar.cpp
      toolbars/SpectralSelectionBar.h
      toolbars/SpectralSelectionBarListener.h
      toolbars/TimeToolBar.cpp
      toolbars/TimeToolBar.h
      toolbars/ToolBar.cpp
      toolbars/ToolBar.h
      toolbars/ToolDock.cpp
      toolbars/ToolDock.h
      toolbars/ToolManager.cpp
      toolbars/ToolManager.h
      toolbars/ToolsToolBar.cpp
      toolbars/ToolsToolBar.h
      toolbars/TranscriptionToolBar.cpp
      toolbars/TranscriptionToolBar.h

      # Tracks

      tracks/labeltrack/ui/LabelDefaultClickHandle.cpp
      tracks/labeltrack/ui/LabelDefaultClickHandle.h
      tracks/labeltrack/ui/LabelGlyphHandle.cpp
      tracks/labeltrack/ui/LabelGlyphHandle.h
      tracks/labeltrack/ui/LabelTextHandle.cpp
      tracks/labeltrack/ui/LabelTextHandle.h
      tracks/labeltrack/ui/LabelTrackControls.cpp
      tracks/labeltrack/ui/LabelTrackControls.h
      tracks/labeltrack/ui/LabelTrackShifter.cpp
      tracks/labeltrack/ui/LabelTrackVRulerControls.cpp
      tracks/labeltrack/ui/LabelTrackVRulerControls.h
      tracks/labeltrack/ui/LabelTrackView.cpp
      tracks/labeltrack/ui/LabelTrackView.h
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackAffordanceControls.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackControls.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackShifter.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackView.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/NoteTrackView.h>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/StretchHandle.cpp>
      $<$<BOOL:${USE_MIDI}>:tracks/playabletrack/notetrack/ui/StretchHandle.h>
      tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp
      tracks/playabletrack/ui/PlayableTrackButtonHandles.h
      tracks/playabletrack/ui/PlayableTrackControls.cpp
      tracks/playabletrack/ui/PlayableTrackControls.h
      tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp
      tracks/playabletrack/wavetrack/ui/CutlineHandle.h
      tracks/playabletrack/wavetrack/ui/SampleHandle.cpp
      tracks/playabletrack/wavetrack/ui/SampleHandle.h
      tracks/playabletrack/wavetrack/ui/SpectrumVRulerControls.cpp
      tracks/playabletrack/wavetrack/ui/SpectrumVRulerControls.h
      tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp
      tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h
      tracks/playabletrack/wavetrack/ui/SpectrumView.cpp
      tracks/playabletrack/wavetrack/ui/SpectrumView.h
      tracks/playabletrack/wavetrack/ui/WaveClipTrimHandle.h
      tracks/playabletrack/wavetrack/ui/WaveClipTrimHandle.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceControls.h
      tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceHandle.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackAffordanceHandle.h
      tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackControls.h
      tracks/playabletrack/wavetrack/ui/WaveTrackShifter.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h
      tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h
      tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h
      tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackView.h
      tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.cpp
      tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h
      tracks/playabletrack/wavetrack/ui/WaveformVRulerControls.cpp
      tracks/playabletrack/wavetrack/ui/WaveformVRulerControls.h
      tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp
      tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h
      tracks/playabletrack/wavetrack/ui/WaveformView.cpp
      tracks/playabletrack/wavetrack/ui/WaveformView.h
      tracks/playabletrack/wavetrack/WaveTrackUtils.cpp
      tracks/playabletrack/wavetrack/WaveTrackUtils.h
      tracks/timetrack/ui/TimeTrackControls.cpp
      tracks/timetrack/ui/TimeTrackControls.h
      tracks/timetrack/ui/TimeTrackVRulerControls.cpp
      tracks/timetrack/ui/TimeTrackVRulerControls.h
      tracks/timetrack/ui/TimeTrackVZoomHandle.cpp
      tracks/timetrack/ui/TimeTrackVZoomHandle.h
      tracks/timetrack/ui/TimeTrackView.cpp
      tracks/timetrack/ui/TimeTrackView.h

      # Tracks UI

      tracks/ui/AffordanceHandle.cpp
      tracks/ui/AffordanceHandle.h
      tracks/ui/BackgroundCell.cpp
      tracks/ui/BackgroundCell.h
      tracks/ui/ButtonHandle.cpp
      tracks/ui/ButtonHandle.h
      tracks/ui/CommonTrackControls.cpp
      tracks/ui/CommonTrackControls.h
      tracks/ui/CommonTrackPanelCell.cpp
      tracks/ui/CommonTrackPanelCell.h
      tracks/ui/CommonTrackView.cpp
      tracks/ui/CommonTrackView.h
      tracks/ui/EditCursorOverlay.cpp
      tracks/ui/EditCursorOverlay.h
      tracks/ui/EnvelopeHandle.cpp
      tracks/ui/EnvelopeHandle.h
      tracks/ui/PlayIndicatorOverlay.cpp
      tracks/ui/PlayIndicatorOverlay.h
      tracks/ui/ScrubUI.cpp
      tracks/ui/ScrubUI.h
      tracks/ui/Scrubbing.cpp
      tracks/ui/Scrubbing.h
      tracks/ui/SelectHandle.cpp
      tracks/ui/SelectHandle.h
      tracks/ui/SliderHandle.cpp
      tracks/ui/SliderHandle.h
      tracks/ui/TextEditHelper.cpp
      tracks/ui/TextEditHelper.h
      tracks/ui/TimeShiftHandle.cpp
      tracks/ui/TimeShiftHandle.h
      tracks/ui/TrackButtonHandles.cpp
      tracks/ui/TrackButtonHandles.h
      tracks/ui/TrackControls.cpp
      tracks/ui/TrackControls.h
      tracks/ui/TrackSelectHandle.cpp
      tracks/ui/TrackSelectHandle.h
      tracks/ui/TrackVRulerControls.cpp
      tracks/ui/TrackVRulerControls.h
      tracks/ui/TrackView.cpp
      tracks/ui/TrackView.h
      tracks/ui/ZoomHandle.cpp
      tracks/ui/ZoomHandle.h

      # ui helpers
      ui/AccessibleLinksFormatter.h
      ui/AccessibleLinksFormatter.cpp

      # Widgets

      widgets/AButton.cpp
      widgets/AButton.h
      widgets/ASlider.cpp
      widgets/ASlider.h
      widgets/AuStaticText.cpp
      widgets/AuStaticText.h
      widgets/AttachableScrollBar.cpp
      widgets/AttachableScrollBar.h
      widgets/AudacityMessageBox.cpp
      widgets/AudacityMessageBox.h
      widgets/AudacityTextEntryDialog.cpp
      widgets/AudacityTextEntryDialog.h
      widgets/BackedPanel.cpp
      widgets/BackedPanel.h
      widgets/ErrorDialog.cpp
      widgets/ErrorDialog.h
      widgets/ExpandingToolBar.cpp
      widgets/ExpandingToolBar.h
      widgets/FileHistory.cpp
      widgets/FileHistory.h
      widgets/Grabber.cpp
      widgets/Grabber.h
      widgets/Grid.cpp
      widgets/Grid.h
      widgets/HelpSystem.cpp
      widgets/HelpSystem.h
      widgets/HtmlWindow.cpp
      widgets/HtmlWindow.h
      widgets/ImageRoll.cpp
      widgets/ImageRoll.h
      widgets/KeyView.cpp
      widgets/KeyView.h
      widgets/MeterPanel.cpp
      widgets/MeterPanel.h
      widgets/MeterPanelBase.cpp
      widgets/MeterPanelBase.h
      widgets/MultiDialog.cpp
      widgets/MultiDialog.h
      widgets/NumericTextCtrl.cpp
      widgets/NumericTextCtrl.h
      widgets/Overlay.cpp
      widgets/Overlay.h
      widgets/OverlayPanel.cpp
      widgets/OverlayPanel.h
      widgets/Plot.cpp
      widgets/Plot.h
      widgets/PopupMenuTable.cpp
      widgets/PopupMenuTable.h
      widgets/ProgressDialog.cpp
      widgets/ProgressDialog.h
      widgets/ReadOnlyText.h
      widgets/Ruler.cpp
      widgets/Ruler.h
      widgets/SliderTextCtrl.cpp
      widgets/SliderTextCtrl.h
      widgets/UnwritableLocationErrorDialog.cpp
      widgets/UnwritableLocationErrorDialog.h
      widgets/Warning.cpp
      widgets/Warning.h
      widgets/WindowAccessible.cpp
      widgets/WindowAccessible.h
      widgets/numformatter.cpp
      widgets/numformatter.h
      widgets/valnum.cpp
      widgets/valnum.h
      widgets/wxPanelWrapper.cpp
      widgets/wxPanelWrapper.h
      widgets/wxTextCtrlWrapper.h
      widgets/wxWidgetsBasicUI.cpp
      widgets/wxWidgetsBasicUI.h

      Experimental.cmake
)

#
#
#
list( APPEND INCLUDES
   PUBLIC
      ${_PRVDIR}
      ${CMAKE_SOURCE_DIR}/libraries
      ${TARGET_ROOT}
)

#
# Define resources
#
list( APPEND RESOURCES
   ../presets/EQDefaultCurves.xml
)

#
#
#
list( APPEND DEFINES
   PRIVATE
      BUILDING_AUDACITY
      CMAKE
      $<$<BOOL:${HAVE_LRINT}>:
         HAVE_LRINT
      >
      $<$<BOOL:${HAVE_LRINTF}>:
         HAVE_LRINTF
      >
      $<$<BOOL:${HAVE_MLOCK}>:
         HAVE_MLOCK
      >
      $<$<BOOL:${PA_USE_JACK}>:
         PA_USE_JACK
      >
      $<$<PLATFORM_ID:Windows>:
         _CRT_SECURE_NO_WARNINGS
         __STDC_CONSTANT_MACROS
         STRICT
      >
)

# We now use precompiled headers regardless, but only if ccache is not
# available and the user hasn't disabled it.
if( NOT CCACHE_PROGRAM AND NOT SCCACHE_PROGRAM )
   option(
      PCH
      "Use precompiled headers [yes, no]"
      YES
   )
endif()

tenacity_append_common_compiler_options( OPTIONS "${PCH}" )

list( APPEND LDFLAGS
   PRIVATE
      $<$<CXX_COMPILER_ID:MSVC>:/MANIFEST:NO>
      $<$<CXX_COMPILER_ID:GNU>:-Wl,--disable-new-dtags>
)

#
#
#
list( APPEND LIBRARIES
   PUBLIC
      ${CMAKE_REQUIRED_LIBRARIES}
      ZLIB::ZLIB
      wxWidgets::wxWidgets
      mp3lame::mp3lame
      SndFile::sndfile
      PortAudio::PortAudio
      ${SQLite3_LIBRARIES}
      $<$<BOOL:${USE_LIBID3TAG}>:id3tag::id3tag>
      $<$<BOOL:${USE_LIBFLAC}>:FLAC++::FLAC++>
      $<$<BOOL:${USE_LIBMAD}>:MAD::MAD>
      $<$<BOOL:${USE_LIBMATROSKA}>:Matroska::matroska>
      $<$<BOOL:${USE_LIBOGG}>:Ogg::ogg>
      $<$<BOOL:${USE_LIBVORBIS}>:Vorbis::vorbis>
      $<$<BOOL:${USE_LIBVORBIS}>:Vorbis::vorbisenc>
      $<$<BOOL:${USE_LIBVORBIS}>:Vorbis::vorbisfile>
      $<$<BOOL:${USE_LIBTWOLAME}>:libtwolame::libtwolame>
      $<$<BOOL:${USE_LV2}>:lilv::lilv>
      $<$<BOOL:${USE_LV2}>:suil::suil>
      $<$<BOOL:${USE_MIDI}>:PortMidi::PortMidi>
      $<$<BOOL:${USE_MIDI}>:PortSMF::PortSMF>
      nyquist
      $<$<BOOL:${USE_SBSMS}>:sbsms::sbsms>
      $<$<BOOL:${USE_SOUNDTOUCH}>:SoundTouch::SoundTouch>
      $<$<BOOL:${USE_VAMP}>:VampHostSDK::VampHostSDK>
      $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD,NetBSD,CYGWIN>:${GLIB_LIBRARIES}>
      $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD,NetBSD,CYGWIN,Haiku>:GTK::GTK>
      $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD,NetBSD,CYGWIN>:pthread>
      $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD,NetBSD,CYGWIN>:rt>
)

set( BUILDING_AUDACITY YES )
set( PKGLIBDIR "${_PKGLIB}" )
set( LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" )
set( HAVE_GTK ${GTK_FOUND} )

# Do not define these for Windows or Mac until further testing
# can be done against ExportMP3.cpp.  If either are defined, the
# build will fail.
if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows|Darwin" )
   if( FFMPEG_FOUND )
      set( DISABLE_DYNAMIC_LOADING_FFMPEG YES )
   endif()
endif()

if( CMAKE_SYSTEM_NAME MATCHES "Windows" )
   set_target_properties(
      ${TARGET}
      PROPERTIES
         # Make sure we're a GUI application and not a console tool
         WIN32_EXECUTABLE ON
   )

   # Define the Windows specific resources
   list( APPEND WIN_RESOURCES
      ../win/tenacity.rc
   )

   # Copy over the wxWidgets DLLs

   # Copy the required wxWidgets libs into the bundle
   add_custom_command(
      TARGET
         ${TARGET}
      COMMAND
         ${CMAKE_COMMAND} -D SRC="${_EXEDIR}/Tenacity.exe"
                          -D DST="${_EXEDIR}"
                          -D WXWIN="${_SHARED_PROXY_BASE_PATH}/$<CONFIG>/"
                          -P ${TENACITY_MODULE_PATH}/CopyLibs.cmake
      POST_BUILD
   )

   # Copy the VC runtime libraries as well
   add_custom_command(
      TARGET
         ${TARGET}
      COMMAND
         ${CMAKE_COMMAND} -E copy ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} ${_DEST}
      POST_BUILD
   )
elseif( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
   # Bug 2400 workaround
   #
   # Replaces the SDK version in the built executable with 10.13 to
   # prevent high CPU usage and slow drawing on Mojave or newer
   check_for_platform_version()
   if( PLATFORM_VERSION_SUPPORTED )
      list( APPEND LDFLAGS
         PRIVATE
            -Wl,-platform_version,macos,${MIN_MACOS_VERSION},${TARGET_MACOS_VERSION}
      )
   else()
      list( APPEND LDFLAGS
         PRIVATE
            -Wl,-sdk_version,10.13
      )
   endif()

   # Define Mac specific resources
   list( APPEND MAC_RESOURCES
      ../mac/Resources/Tenacity.icns
      ../mac/Resources/TenacityAIFF.icns
      ../mac/Resources/TenacityAU.icns
      ../mac/Resources/TenacityMP3.icns
      ../mac/Resources/TenacityOGG.icns
      ../mac/Resources/TenacityProject.icns
      ../mac/Resources/TenacityWAV.icns
   )

   set_target_properties(
      ${TARGET}
      PROPERTIES
         # Build a bundle
         MACOSX_BUNDLE ON
         # Add the resources
         RESOURCE "${MAC_RESOURCES};${RESOURCES}"
   )
   set_target_property_all( ${TARGET} RUNTIME_OUTPUT_DIRECTORY "${_DESTDIR}" )

   # These sources must be compiled as Objective C++ and excluded
   # from precompiled header usage
   set_source_files_properties(
      TenacityApp.mm
      KeyboardCapture.cpp
      effects/EffectUI.cpp
      effects/VST/VSTControlOSX.mm
      effects/audiounits/AUControl.mm
      menus/WindowMenus.cpp
      PROPERTIES
         COMPILE_FLAGS "-ObjC++"
         SKIP_PRECOMPILE_HEADERS YES
   )

   list( APPEND LIBRARIES
      PRIVATE
         "-framework Foundation"
         "-framework Cocoa"
         "-framework Carbon"
   )
   if(USE_AUDIO_UNITS)
      list(APPEND LIBRARIES
        PRIVATE
          "-framework AudioToolbox"
          "-framework AudioUnit"
          "-framework CoreAudioKit")
   endif()

   # Use the Aqua theme
   set( USE_AQUA_THEME 1 )

   # Copy the required wxWidgets libs into the bundle
   add_custom_command(
      TARGET
         ${TARGET}
      COMMAND
         ${CMAKE_COMMAND} -D SRC="${_EXEDIR}/Tenacity"
                          -D DST="${_PKGLIB}"
                          -D WXWIN="${_SHARED_PROXY_BASE_PATH}/$<CONFIG>"
                          -P ${TENACITY_MODULE_PATH}/CopyLibs.cmake
      POST_BUILD
   )

   # Define the Wrapper target
   set( WRAPPER_ROOT "${TARGET_ROOT}/../mac" )
   set( WRAPPER_SOURCES "${WRAPPER_ROOT}/Wrapper.c" )

   add_executable( Wrapper "${WRAPPER_SOURCES}" )
   add_dependencies( "${TARGET}" Wrapper )

   set_target_property_all( "Wrapper" RUNTIME_OUTPUT_DIRECTORY "${_EXEDIR}" )
   organize_source( "${WRAPPER_ROOT}" "mac" "${WRAPPER_SOURCES}" )

elseif( CMAKE_SYSTEM_NAME MATCHES "Haiku" )
   set_target_property_all( ${TARGET} RUNTIME_OUTPUT_DIRECTORY "${_DEST}" )
else()
   set_target_property_all( ${TARGET} RUNTIME_OUTPUT_DIRECTORY "${_DEST}" )

   # Build the list of mimetypes
   #
   # (Don't use generator expressions since it will leave null/empty
   # entries in the list.)
   set( MIMETYPES
      application/x-audacity-project
      application/x-audacity-project+sqlite3
   )
   if( USE_FFMPEG )
      list( APPEND MIMETYPES
         audio/aac
         audio/ac3
         audio/mp4
         audio/x-ms-wma
         video/mpeg
      )
   endif()
   if( USE_LIBFLAC )
      list( APPEND MIMETYPES
         audio/flac
         audio/x-flac
      )
   endif()
   if( USE_LIBMAD )
      list( APPEND MIMETYPES
         audio/mpeg
      )
   endif()
   if( USE_LIBMATROSKA )
      list( APPEND MIMETYPES
         audio/matroska
         video/matroska
         audio/x-matroska
         video/x-matroska
      )
   endif()
   if( USE_SNDFILE )
      list( APPEND MIMETYPES
         audio/basic
         audio/x-aiff
         audio/x-wav
      )
   endif()
   if( USE_LIBOGG AND USE_LIBVORBIS )
      list( APPEND MIMETYPES
         application/ogg
         audio/x-vorbis+ogg
      )
   endif()

   # Create the desktop file
   configure_file( ${APP_NAME}.desktop.in ${_INTDIR}/${APP_NAME}.desktop )

   # Copy the required wxWidgets libs into the bundle
   add_custom_command(
      TARGET
         ${TARGET}
      COMMAND
         ${CMAKE_COMMAND} -D SRC="${_EXEDIR}/tenacity"
                          -D DST="${_DEST}/${_PKGLIB}"
                          -D WXWIN="${_SHARED_PROXY_BASE_PATH}/$<CONFIG>"
                          -P ${TENACITY_MODULE_PATH}/CopyLibs.cmake
      POST_BUILD
   )

   add_executable(findlib ../linux/findlib.c)
   target_link_libraries(findlib ${CMAKE_DL_LIBS})
   set_target_property_all( findlib SKIP_BUILD_RPATH On )
endif()

set_target_property_all( ${TARGET} RUNTIME_OUTPUT_NAME ${APP_NAME} )

organize_source( "${TARGET_ROOT}/../presets" "presets" "${RESOURCES}" )
organize_source( "${TARGET_ROOT}" "src" "${SOURCES}" )
organize_source( "${TARGET_ROOT}/../mac/Resources" "mac" "${MAC_RESOURCES}" )
organize_source( "${TARGET_ROOT}/../win" "win" "${WIN_RESOURCES}" )

#
# Get those pesky CMake files out of the way (on Windows)
#
source_group(
    TREE
        "${_INTDIR}"
    PREFIX
        "CMake"
    FILES
        ${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.cxx
        ${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.hxx
)

# Define TENACITY_DLL_API
import_symbol_define( import_symbol TENACITY_DLL )
export_symbol_define( export_symbol TENACITY_DLL )
list( APPEND DEFINES PRIVATE "${export_symbol}" INTERFACE "${import_symbol}" )

# see AudioIO.cpp
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
if(HAVE_CLOCK_GETTIME)
   list( APPEND DEFINES HAVE_CLOCK_GETTIME )
endif()

target_sources( ${TARGET} PRIVATE ${SOURCES} ${RESOURCES} ${MAC_RESOURCES} ${WIN_RESOURCES} )
target_compile_definitions( ${TARGET} PRIVATE ${DEFINES} )
target_compile_options( ${TARGET} PRIVATE ${OPTIONS} )
target_include_directories( ${TARGET} PRIVATE ${INCLUDES} )
target_link_options( ${TARGET} PRIVATE ${LDFLAGS} )
target_link_libraries( ${TARGET} PUBLIC ${TENACITY_LIBRARIES} )
target_link_libraries( ${TARGET} ${LIBRARIES} )

if( NOT CCACHE_PROGRAM AND NOT SCCACHE_PROGRAM )
   if( PCH )
      message( STATUS "Using precompiled headers" )
      target_precompile_headers( ${TARGET} PRIVATE
         $<$<PLATFORM_ID:Windows>:${CMAKE_BINARY_DIR}/src/private/configwin.h>
         $<$<PLATFORM_ID:Darwin>:${CMAKE_BINARY_DIR}/src/private/configmac.h>
         $<$<NOT:$<PLATFORM_ID:Windows,Darwin>>:${CMAKE_BINARY_DIR}/src/private/configunix.h>
         TenacityHeaders.h
      )
   else()
      message( STATUS "Not using precompiled headers" )
   endif()
endif()

if( "${CMAKE_GENERATOR}" MATCHES "Xcode|Visual Studio*" )
   install(
      DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/"
      DESTINATION "."
      USE_SOURCE_PERMISSIONS
      PATTERN "*.pdb" EXCLUDE
      PATTERN "*.ilk" EXCLUDE
      PATTERN "*.dSYM" EXCLUDE
   )
else()
   if( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
      install( TARGETS ${TARGET}
               DESTINATION "."
               RESOURCE DESTINATION "${_APPDIR}/Resources" )
   elseif( CMAKE_SYSTEM_NAME MATCHES "Haiku" )
      install( TARGETS ${TARGET} RUNTIME )
      install( DIRECTORY "${_DEST}/${_LIBDIR}/"
               DESTINATION "${_LIBDIR}"
               USE_SOURCE_PERMISSIONS
               FILES_MATCHING PATTERN "*.so*" )
      install( FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" "${CMAKE_SOURCE_DIR}/README.md"
               DESTINATION "${_DATADIR}/doc/${APP_NAME}" )
      install( FILES "${CMAKE_SOURCE_DIR}/presets/EQDefaultCurves.xml"
               DESTINATION "${_PKGDATA}" )
   else()
      install( TARGETS ${TARGET} RUNTIME )
      install( DIRECTORY "${_DEST}/${_LIBDIR}/"
               DESTINATION "${_LIBDIR}"
               USE_SOURCE_PERMISSIONS
               FILES_MATCHING PATTERN "*.so*" )
      install( FILES "${_INTDIR}/${APP_NAME}.desktop"
               DESTINATION "${_DATADIR}/applications" )
      install( FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" "${CMAKE_SOURCE_DIR}/README.md"
               DESTINATION "${_DATADIR}/doc/${APP_NAME}" )
      install( FILES "${_SRCDIR}/tenacity.xml"
               DESTINATION "${_DATADIR}/mime/packages" )
      install( FILES "${CMAKE_SOURCE_DIR}/presets/EQDefaultCurves.xml"
               DESTINATION "${_PKGDATA}" )
   endif()
endif()

# collect dependency information for third party libraries
list( APPEND GRAPH_EDGES "Tenacity [shape=house]" )
foreach( LIBRARY ${LIBRARIES} )
   if (NOT LIBRARY MATCHES "PUBLIC|PRIVATE|INTERFACE")
      canonicalize_node_name(LIBRARY "${LIBRARY}")
      list( APPEND GRAPH_EDGES "\"${TARGET}\" -> \"${LIBRARY}\"" )
   endif()
endforeach()

#propagate collected edgets to root CMakeLists.txt
set( GRAPH_EDGES "${GRAPH_EDGES}" PARENT_SCOPE )
