From 2b145b074581ddf3b4ad78a402cdf5fab500b125 Mon Sep 17 00:00:00 2001 From: Dale Whinham Date: Thu, 16 Jan 2020 22:46:50 +0000 Subject: [PATCH] CMake: Modernize and improve compatibility Use CMake v3.xx's modern dependency system to pass compiler flags, definitions, include paths and link libraries down from library targets to dependants. Remove the use of CMake's global functions such as include_directories() functions, and instead use functions that work on individual targets. For Windows, where we build RtAudio as a submodule, cascade into its own CMake project instead of building the library manually. --- CMakeLists.txt | 16 ++- src/compression/CMakeLists.txt | 101 +++++++++----- src/fx/CMakeLists.txt | 17 +-- src/midi/CMakeLists.txt | 92 ++++++------ src/milkyplay/CMakeLists.txt | 209 ++++++++++++++++------------ src/ppui/CMakeLists.txt | 84 +++++------ src/ppui/osinterface/CMakeLists.txt | 152 ++++++++++---------- src/tracker/CMakeLists.txt | 167 +++++++++------------- 8 files changed, 445 insertions(+), 393 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b6ed9f1..b5f345bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,15 @@ # along with MilkyTracker. If not, see . # -cmake_minimum_required(VERSION 2.8.5) +cmake_minimum_required(VERSION 3.10) project(MilkyTracker) +# Enable IDE solution folders +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +# Enable tracker-specific functions in MilkyPlay +add_definitions(-DMILKYTRACKER) + # Adhere to GNU filesystem layout conventions include(GNUInstallDirs) @@ -38,7 +44,7 @@ string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) string(TOLOWER ${CMAKE_SYSTEM_NAME} SYSTEM_NAME_LOWER) # Additional CMake modules -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # Version number in format X.YY.ZZ set(VER_X 1) @@ -159,8 +165,7 @@ elseif(WIN32) message(STATUS "Enabled MIDI support (WinMM)") add_subdirectory(src/midi) else() - # Workaround for SDL bug #3295, which we might hit if the distro's SDL2 - # package includes the sdl2-config.cmake file + # Workaround for SDL bug #3295, which occurs in SDL2 <2.0.5 # https://bugzilla.libsdl.org/show_bug.cgi?id=3295 cmake_policy(SET CMP0004 OLD) @@ -216,3 +221,6 @@ add_subdirectory(src/fx) add_subdirectory(src/milkyplay) add_subdirectory(src/ppui) add_subdirectory(src/tracker) + +# Set MilkyTracker target as startup project in Visual Studio +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT tracker) diff --git a/src/compression/CMakeLists.txt b/src/compression/CMakeLists.txt index 1a3d2a3a..2979a96a 100644 --- a/src/compression/CMakeLists.txt +++ b/src/compression/CMakeLists.txt @@ -19,8 +19,13 @@ # along with MilkyTracker. If not, see . # -set( - SOURCES +# Define this library as an object library; the objects will not be archived. +# The compression library is special in that each decompressor has a constructor +# which statically self-registers the decompressor into a global decompressors +# list. Because they are not each individually referenced in code, the linker +# will discard them if they are archived into a static library. +add_library(compression OBJECT + # Sources # AIFFWriter.m Decompressor.cpp DecompressorLZX.cpp @@ -28,10 +33,8 @@ set( DecompressorUMX.cpp PP20.cpp unlzx.cpp -) -set( - HEADERS + # Headers # AIFFWriter.h Decompressor.h DecompressorLZX.h @@ -41,6 +44,15 @@ set( unlzx.h ) +target_include_directories(compression + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../milkyplay + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface/posix +) + # Under macOS and Windows, build sources from Git submodules if present if(APPLE OR WIN32) set(LHASA_SUBMODULE_DIR ${PROJECT_SOURCE_DIR}/src/submodules/lhasa) @@ -125,7 +137,7 @@ if(APPLE) # zziplib relies on xmlto to build its manpages, but if not found, its # build system fails at the docs target with an unhelpful error find_program(XMLTO xmlto) - if (NOT XMLTO) + if(NOT XMLTO) message(WARNING "xmlto could not be found; building zziplib may fail" ) @@ -145,7 +157,8 @@ if(APPLE) ExternalProject_Add(zziplib PREFIX ${ZZIPLIB_DESTDIR} SOURCE_DIR ${ZZIPLIB_SUBMODULE_DIR} - CONFIGURE_COMMAND ./configure --prefix=${ZZIPLIB_DESTDIR} + CONFIGURE_COMMAND autoreconf -f -i + COMMAND ./configure --prefix=${ZZIPLIB_DESTDIR} --without-debug --disable-dependency-tracking CFLAGS=${EXTERNAL_C_FLAGS} CXXFLAGS=${EXTERNAL_CXX_FLAGS} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} @@ -180,26 +193,27 @@ if(WIN32) ) ExternalProject_Add(zlib - PREFIX ${ZLIB_DESTDIR} SOURCE_DIR ${ZLIB_SUBMODULE_DIR} + PREFIX ${ZLIB_DESTDIR} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO} -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL} ) + + # Place target into IDE subfolder + set_target_properties(zlib PROPERTIES FOLDER "Externals/zlib") endif() if(EXISTS ${LHASA_SUBMODULE_DIR}/lib/public/lhasa.h) message(STATUS "Found LHASA as a submodule") set(LHASA_FOUND ON) - set( - LHASA_INCLUDE_DIRS + set(LHASA_INCLUDE_DIRS ${LHASA_SUBMODULE_DIR}/lib ${LHASA_SUBMODULE_DIR}/lib/public ) - set( - LHASA_SOURCES + set(LHASA_SOURCES ${LHASA_SUBMODULE_DIR}/lib/crc16.c ${LHASA_SUBMODULE_DIR}/lib/ext_header.c ${LHASA_SUBMODULE_DIR}/lib/lh1_decoder.c @@ -238,9 +252,9 @@ if(WIN32) ${LHASA_SUBMODULE_DIR}/lib/public/lha_reader.h ${LHASA_SUBMODULE_DIR}/lib/public/lhasa.h ) - source_group(lhasa FILES ${LHASA_SOURCES} ${LHASA_HEADERS}) - list(APPEND SOURCES ${LHASA_SOURCES}) - list(APPEND HEADERS ${LHASA_HEADERS}) + target_sources(compression PRIVATE ${LHASA_SOURCES} ${LHASA_HEADERS}) + source_group("Source Files\\lhasa" FILES ${LHASA_SOURCES}) + source_group("Header Files\\lhasa" FILES ${LHASA_HEADERS}) endif() if(EXISTS ${ZZIPLIB_SUBMODULE_DIR}/zzip/zzip.h) @@ -285,38 +299,58 @@ if(WIN32) ${ZZIPLIB_SUBMODULE_DIR}/zzip/zzip.h ${ZZIPLIB_SUBMODULE_DIR}/zzip/zzip32.h ) - source_group(zziplib FILES ${ZZIPLIB_SOURCES} ${ZZIPLIB_HEADERS}) - list(APPEND SOURCES ${ZZIPLIB_SOURCES}) - list(APPEND HEADERS ${ZZIPLIB_HEADERS}) + target_sources(compression PRIVATE ${ZZIPLIB_SOURCES} ${ZZIPLIB_HEADERS}) + source_group("Source Files\\zziplib" FILES ${ZZIPLIB_SOURCES}) + source_group("Header Files\\zziplib" FILES ${ZZIPLIB_HEADERS}) endif() endif() # Optional decompressors if(LHASA_FOUND) message(STATUS "Enabled LHA decompressor") - list(APPEND SOURCES DecompressorLHA.cpp) - list(APPEND HEADERS DecompressorLHA.h) - include_directories(${LHASA_INCLUDE_DIRS}) + target_sources(compression PRIVATE + # Sources + DecompressorLHA.cpp + + # Headers + DecompressorLHA.h + ) + target_include_directories(compression PRIVATE ${LHASA_INCLUDE_DIRS}) else() message("LHA decompressor disabled (lhasa unavailable)") endif() if(ZLIB_FOUND) message(STATUS "Enabled GZIP decompressor") - list(APPEND SOURCES DecompressorGZIP.cpp) - list(APPEND HEADERS DecompressorGZIP.h) - include_directories(${ZLIB_INCLUDE_DIRS}) + target_sources(compression PRIVATE + # Sources + DecompressorGZIP.cpp + + # Headers + DecompressorGZIP.h + ) + target_include_directories(compression PRIVATE ${ZLIB_INCLUDE_DIRS}) else() message("GZIP decompressor disabled (zlib unvailable)") endif() if(ZLIB_FOUND AND ZZIPLIB_FOUND) message(STATUS "Enabled ZIP decompressor") - list(APPEND SOURCES DecompressorZIP.cpp ZipExtractor.cpp zziplib/MyIO.cpp) - list(APPEND HEADERS DecompressorZIP.h ZipExtractor.h zziplib/MyIO.h) - include_directories( - ${PROJECT_SOURCE_DIR}/src/compression/zziplib - ${ZZIPLIB_INCLUDE_DIRS} + target_sources(compression PRIVATE + # Sources + DecompressorZIP.cpp + ZipExtractor.cpp + zziplib/MyIO.cpp + + # Headers + DecompressorZIP.h + ZipExtractor.h + zziplib/MyIO.h + ) + target_include_directories(compression + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/zziplib + ${ZZIPLIB_INCLUDE_DIRS} ) else() if(NOT ZLIB_FOUND AND NOT ZZIPLIB_FOUND) @@ -328,9 +362,6 @@ else() endif() endif() -# Define this library as an object library; the objects will not be archived -add_library(compression OBJECT ${SOURCES} ${HEADERS}) - # Ensure dependencies are built before this library if(APPLE) if(LHASA_FOUND) @@ -346,9 +377,3 @@ if(WIN32) add_dependencies(compression zlib) endif() endif() - -include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay - ${PROJECT_SOURCE_DIR}/src/ppui - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix -) diff --git a/src/fx/CMakeLists.txt b/src/fx/CMakeLists.txt index 32c3d15f..70de5c6f 100644 --- a/src/fx/CMakeLists.txt +++ b/src/fx/CMakeLists.txt @@ -19,7 +19,8 @@ # along with MilkyTracker. If not, see . # -set(SOURCES +add_library(fx STATIC + # Sources Camera.cpp Filter.cpp Fire.cpp @@ -38,9 +39,8 @@ set(SOURCES Twister.cpp TwisterFX.cpp fpmath.cpp -) -set(HEADERS + # Headers Camera.h FXAbstract.h FXInterface.h @@ -64,9 +64,10 @@ set(HEADERS fpmath.h ) -include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${PROJECT_SOURCE_DIR}/src/ppui +target_include_directories(fx + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface/posix + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} ) - -add_library(fx ${SOURCES} ${HEADERS}) diff --git a/src/midi/CMakeLists.txt b/src/midi/CMakeLists.txt index 24ca0b48..8481d157 100644 --- a/src/midi/CMakeLists.txt +++ b/src/midi/CMakeLists.txt @@ -19,33 +19,51 @@ # along with MilkyTracker. If not, see . # -set(HEADERS +add_library(midi STATIC + # Headers MidiTools.h ) +target_include_directories(midi + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../milkyplay + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface + ${CMAKE_CURRENT_SOURCE_DIR}/../tracker +) + # Add platform-specific sources and include paths if(APPLE) - set( - SOURCES + target_sources(midi PRIVATE + # Sources osx/MidiReceiver_CoreMIDI.mm - ) - list( - APPEND HEADERS + + # Headers osx/MidiReceiver_CoreMIDI.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix + + # Enable ARC (automatic reference counting) for OS X build + target_compile_options(midi PRIVATE -fobjc-arc) + + target_include_directories(midi + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/osx + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface/posix ) + + target_link_libraries(midi PUBLIC ${CORE_MIDI_LIBRARY}) elseif(WIN32) - set( - SOURCES + target_sources(midi PRIVATE + # Sources win32/LongMsg.cpp win32/MidiInDevice.cpp win32/MidiReceiver_win32.cpp win32/ShortMsg.cpp - ) - list( - APPEND HEADERS + + # Headers win32/LongMsg.h win32/MIDIInDevice.h win32/MIDIMsg.h @@ -53,43 +71,29 @@ elseif(WIN32) win32/ShortMsg.h win32/midi.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/win32 + + target_include_directories(midi + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/win32 + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface/win32 ) + + target_link_libraries(midi PUBLIC winmm) else() - set( - SOURCES + target_sources(midi PRIVATE + # Sources posix/MidiReceiver_pthread.cpp - ) - list( - APPEND HEADERS + + # Headers posix/MidiReceiver_pthread.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${RTMIDI_INCLUDE_DIR} - ) -endif() - -include_directories( - ${PROJECT_SOURCE_DIR}/src/midi - ${PROJECT_SOURCE_DIR}/src/milkyplay - ${PROJECT_SOURCE_DIR}/src/ppui - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface - ${PROJECT_SOURCE_DIR}/src/tracker -) -add_library(midi ${SOURCES} ${HEADERS}) - -if(APPLE) - # Enable ARC (automatic reference counting) for OS X build - set_property( - TARGET midi APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc" + target_include_directories(midi + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../ppui/osinterface/posix + ${RTMIDI_INCLUDE_DIRS} ) - target_link_libraries(midi ${CORE_MIDI_LIBRARY}) -elseif(WIN32) - target_link_libraries(midi winmm) -else() - target_link_libraries(midi ${RTMIDI_LIBRARIES}) + target_link_libraries(midi PUBLIC ${RTMIDI_LIBRARIES}) endif() diff --git a/src/milkyplay/CMakeLists.txt b/src/milkyplay/CMakeLists.txt index a4340c2c..3e2e4058 100644 --- a/src/milkyplay/CMakeLists.txt +++ b/src/milkyplay/CMakeLists.txt @@ -19,8 +19,8 @@ # along with MilkyTracker. If not, see . # -set( - SOURCES +add_library(milkyplay STATIC + # Sources AudioDriverBase.cpp AudioDriverManager.cpp AudioDriver_NULL.cpp @@ -69,10 +69,8 @@ set( XIInstrument.cpp XMFile.cpp XModule.cpp -) -set( - HEADERS + # Headers AudioDriverBase.h AudioDriverManager.h AudioDriver_COMPENSATE.h @@ -110,121 +108,156 @@ set( computed-blep.h ) -# Add platform-specific sources, include paths and definitions +target_include_directories(milkyplay + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE + # Include the CMake-generated version header from the build directory + # (version string required when saving modules) + ${PROJECT_BINARY_DIR}/src/tracker +) + +# Add platform-specific sources, include paths, definitions and link libraries if(APPLE) - list(APPEND SOURCES drivers/osx/AudioDriver_COREAUDIO.mm) - list(APPEND HEADERS drivers/osx/AudioDriver_COREAUDIO.h) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/osx + target_sources(milkyplay + PRIVATE + # Sources + drivers/osx/AudioDriver_COREAUDIO.mm + + # Headers + drivers/osx/AudioDriver_COREAUDIO.h + ) + target_include_directories(milkyplay + PRIVATE + drivers/osx + ) + target_link_libraries(milkyplay + PRIVATE + ${COCOA_LIBRARY} + ${CORE_AUDIO_LIBRARY} + ${CORE_FOUNDATION_LIBRARY} ) message(STATUS "Enabled Core Audio support") elseif(WIN32) # Basic WaveOut support - list(APPEND SOURCES drivers/windows/AudioDriver_MMSYSTEM.cpp) - list(APPEND HEADERS drivers/windows/AudioDriver_MMSYSTEM.h) - include_directories(${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/windows) + target_sources(milkyplay + PRIVATE + # Sources + drivers/windows/AudioDriver_MMSYSTEM.cpp + + # Headers + drivers/windows/AudioDriver_MMSYSTEM.h + ) + + target_include_directories(milkyplay + PRIVATE + drivers/windows + ) + message(STATUS "Enabled WaveOut support") # Build sources from RtAudio Git submodule if present set(RTAUDIO_SUBMODULE_DIR ${PROJECT_SOURCE_DIR}/src/submodules/rtaudio) - if(EXISTS ${RTAUDIO_SUBMODULE_DIR}/RtAudio.cpp) + if(EXISTS ${RTAUDIO_SUBMODULE_DIR}/CMakeLists.txt) message(STATUS "Enabled RtAudio support") - list( - APPEND SOURCES - ${RTAUDIO_SUBMODULE_DIR}/include/asio.cpp - ${RTAUDIO_SUBMODULE_DIR}/include/asiodrivers.cpp - ${RTAUDIO_SUBMODULE_DIR}/include/asiolist.cpp - ${RTAUDIO_SUBMODULE_DIR}/include/iasiothiscallresolver.cpp - ${RTAUDIO_SUBMODULE_DIR}/RtAudio.cpp - drivers/generic/AudioDriver_RTAUDIO.cpp - drivers/generic/RtAudio4Impl.cpp - ) - list( - APPEND HEADERS - ${RTAUDIO_SUBMODULE_DIR}/include/asio.h - ${RTAUDIO_SUBMODULE_DIR}/include/asiodrivers.h - ${RTAUDIO_SUBMODULE_DIR}/include/asiodrvr.h - ${RTAUDIO_SUBMODULE_DIR}/include/asiolist.h - ${RTAUDIO_SUBMODULE_DIR}/include/asiosys.h - ${RTAUDIO_SUBMODULE_DIR}/include/dsound.h - ${RTAUDIO_SUBMODULE_DIR}/include/FunctionDiscoveryKeys_devpkey.h - ${RTAUDIO_SUBMODULE_DIR}/include/ginclude.h - ${RTAUDIO_SUBMODULE_DIR}/include/iasiodrv.h - ${RTAUDIO_SUBMODULE_DIR}/include/iasiothiscallresolver.h - ${RTAUDIO_SUBMODULE_DIR}/include/soundcard.h - ${RTAUDIO_SUBMODULE_DIR}/RtAudio.h - drivers/generic/AudioDriver_RTAUDIO.h + + set(RTAUDIO_BUILD_SHARED_LIBS OFF) + set(RTAUDIO_BUILD_TESTING OFF) + add_subdirectory(${RTAUDIO_SUBMODULE_DIR} ${CMAKE_BINARY_DIR}/src/submodules/rtaudio) + + target_sources(milkyplay + PRIVATE + # Sources + drivers/generic/AudioDriver_RTAUDIO.cpp + drivers/generic/RtAudio4Impl.cpp + + # Headers + drivers/generic/AudioDriver_RTAUDIO.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/generic - ${RTAUDIO_SUBMODULE_DIR} - ${RTAUDIO_SUBMODULE_DIR}/include + + target_include_directories(milkyplay + PRIVATE + drivers/generic + ${RTAUDIO_SUBMODULE_DIR} ) - add_definitions( - -D__WINDOWS_DS__ - -D__WINDOWS_ASIO__ - -D__WINDOWS_WASAPI__ + + target_link_libraries(milkyplay PRIVATE rtaudio) + + # Place targets into IDE subfolder + set_target_properties( + rtaudio + uninstall + Continuous + Experimental + Nightly + NightlyMemoryCheck + PROPERTIES FOLDER "Externals/RtAudio" ) else() - add_definitions(-D__SKIPRTAUDIO__) + target_compile_definitions(milkyplay PRIVATE -D__SKIPRTAUDIO__) message("RtAudio support disabled (RtAudio unavailable)") endif() + target_link_libraries(milkyplay PRIVATE winmm dsound) else() - add_definitions(-DDRIVER_UNIX) + target_compile_definitions(milkyplay PRIVATE -DDRIVER_UNIX) if(ALSA_FOUND) - list(APPEND SOURCES drivers/alsa/AudioDriver_ALSA.cpp) - list(APPEND HEADERS drivers/alsa/AudioDriver_ALSA.h) - add_definitions(-DHAVE_LIBASOUND) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/alsa - ${ALSA_INCLUDE_DIRS} + target_sources(milkyplay PRIVATE + # Sources + drivers/alsa/AudioDriver_ALSA.cpp + + # Headers + drivers/alsa/AudioDriver_ALSA.h + ) + target_compile_definitions(milkyplay PUBLIC -DHAVE_LIBASOUND) + target_include_directories(milkyplay + PUBLIC + ${ALSA_INCLUDE_DIRS} + PRIVATE + drivers/alsa ) + target_link_libraries(milkyplay PUBLIC ${ALSA_LIBRARIES}) message(STATUS "Enabled ALSA support") endif() if(JACK_FOUND) - list(APPEND SOURCES drivers/jack/AudioDriver_JACK.cpp) - list(APPEND HEADERS drivers/jack/AudioDriver_JACK.h) - add_definitions(-DHAVE_JACK_JACK_H) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/jack + target_sources(milkyplay PRIVATE + # Sources + drivers/jack/AudioDriver_JACK.cpp + + # Headers + drivers/jack/AudioDriver_JACK.h + ) + target_compile_definitions(milkyplay PRIVATE -DHAVE_JACK_JACK_H) + target_include_directories(milkyplay PRIVATE + drivers/jack ${JACK_INCLUDE_DIRS} ) + target_link_libraries(milkyplay PUBLIC ${CMAKE_DL_LIBS}) message(STATUS "Enabled JACK support") endif() if(SDL2_FOUND) - list(APPEND SOURCES drivers/sdl/AudioDriver_SDL.cpp) - list(APPEND HEADERS drivers/sdl/AudioDriver_SDL.h) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay/drivers/sdl + target_sources(milkyplay PRIVATE + # Sources + drivers/sdl/AudioDriver_SDL.cpp + + # Headers + drivers/sdl/AudioDriver_SDL.h + ) + target_include_directories(milkyplay PRIVATE + drivers/sdl ${SDL2_INCLUDE_DIRS} ) + + if(TARGET SDL2::SDL2) + # If the distro built SDL2 with CMake, we can just link to an exported target + target_link_libraries(milkyplay PUBLIC SDL2::SDL2) + else() + # Otherwise we need to do things the old-fashioned way for compatibility + target_include_directories(milkyplay PUBLIC ${SDL2_INCLUDE_DIRS}) + target_link_libraries(milkyplay PUBLIC ${SDL2_LIBRARIES}) + endif() message(STATUS "Enabled SDL2 support") endif() endif() - -add_definitions(-DMILKYTRACKER) - -include_directories( - # Include the CMake-generated version header from the build directory - # (version string required when saving modules) - ${PROJECT_BINARY_DIR}/src/tracker - ${PROJECT_SOURCE_DIR}/src/milkyplay -) - -add_library(milkyplay ${SOURCES} ${HEADERS}) - -if(APPLE) - target_link_libraries( - milkyplay - ${COCOA_LIBRARY} - ${CORE_AUDIO_LIBRARY} - ${CORE_FOUNDATION_LIBRARY} - ) -elseif(WIN32) - target_link_libraries(milkyplay winmm dsound) -else() - target_link_libraries(milkyplay ${CMAKE_DL_LIBS} ${ALSA_LIBRARIES}) -endif() diff --git a/src/ppui/CMakeLists.txt b/src/ppui/CMakeLists.txt index 10efbd7e..df809706 100644 --- a/src/ppui/CMakeLists.txt +++ b/src/ppui/CMakeLists.txt @@ -21,8 +21,8 @@ add_subdirectory(osinterface) -set( - SOURCES +add_library(ppui STATIC + # Sources Button.cpp CheckBox.cpp CheckBoxLabel.cpp @@ -57,10 +57,8 @@ set( StaticText.cpp Tools.cpp TransparentContainer.cpp -) -set( - HEADERS + # Headers BasicTypes.h Button.h CheckBox.h @@ -104,51 +102,55 @@ set( VirtualKeys.h ) +target_include_directories(ppui + PUBLIC + . + PRIVATE + osinterface +) + +target_link_libraries(ppui PRIVATE osinterface) + # Add platform-specific sources and include paths if(APPLE) - list(APPEND SOURCES cocoa/DisplayDevice_COCOA.mm) - list(APPEND HEADERS cocoa/DisplayDevice_COCOA.h) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${PROJECT_SOURCE_DIR}/src/tracker/cocoa + target_sources(ppui + PRIVATE + cocoa/DisplayDevice_COCOA.mm + cocoa/DisplayDevice_COCOA.h ) -elseif(WIN32) - list(APPEND SOURCES win32/DisplayDevice_WIN32.cpp) - list(APPEND HEADERS win32/DisplayDevice_WIN32.h) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/win32 - ${PROJECT_SOURCE_DIR}/src/milkyplay + target_include_directories(ppui + PRIVATE + ${PROJECT_SOURCE_DIR}/src/tracker/cocoa + PUBLIC + cocoa ) -else() - list(APPEND SOURCES - sdl/DisplayDeviceFB_SDL.cpp - sdl/DisplayDevice_SDL.cpp +elseif(WIN32) + target_sources(ppui + PRIVATE + win32/DisplayDevice_WIN32.cpp + win32/DisplayDevice_WIN32.h ) - list(APPEND HEADERS - sdl/DisplayDeviceFB_SDL.h - sdl/DisplayDevice_SDL.h + target_include_directories(ppui + PRIVATE + ${PROJECT_SOURCE_DIR}/src/milkyplay + PUBLIC + win32 ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${SDL2_INCLUDE_DIRS} +else() + target_sources(ppui + PRIVATE + # Sources + sdl/DisplayDeviceFB_SDL.cpp + sdl/DisplayDevice_SDL.cpp + + # Headers + sdl/DisplayDeviceFB_SDL.h + sdl/DisplayDevice_SDL.h ) + target_include_directories(ppui PUBLIC sdl) endif() -include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface -) - -add_library(ppui ${SOURCES} ${HEADERS}) - if(APPLE) # Enable ARC (automatic reference counting) for OS X build - set_property( - TARGET ppui APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc" - ) + target_compile_options(ppui PRIVATE -fobjc-arc) endif() - -target_link_libraries( - ppui - osinterface -) diff --git a/src/ppui/osinterface/CMakeLists.txt b/src/ppui/osinterface/CMakeLists.txt index bad3cec4..6452f515 100644 --- a/src/ppui/osinterface/CMakeLists.txt +++ b/src/ppui/osinterface/CMakeLists.txt @@ -19,13 +19,11 @@ # along with MilkyTracker. If not, see . # -set( - SOURCES +add_library(osinterface STATIC + # Sources PPPathFactory.cpp -) -set( - HEADERS + # Headers PPMessageBox.h PPModalDialog.h PPOpenPanel.h @@ -35,83 +33,93 @@ set( PPSystem.h ) +target_include_directories(osinterface + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/.. +) + # Add platform-specific sources and include paths if(APPLE) - list(APPEND SOURCES - cocoa/PPMessageBox_COCOA.mm - cocoa/PPOpenPanel_COCOA.mm - cocoa/PPQuitSaveAlert_COCOA.mm - cocoa/PPSavePanel_COCOA.mm - posix/PPMutex.cpp - posix/PPPath_POSIX.cpp - posix/PPSystem_POSIX.cpp - ) - list(APPEND HEADERS - posix/PPMutex.h - posix/PPPath_POSIX.h - posix/PPSystemString_POSIX.h - posix/PPSystem_POSIX.h - ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix + target_sources(osinterface + PRIVATE + # Sources + cocoa/PPMessageBox_COCOA.mm + cocoa/PPOpenPanel_COCOA.mm + cocoa/PPQuitSaveAlert_COCOA.mm + cocoa/PPSavePanel_COCOA.mm + posix/PPMutex.cpp + posix/PPPath_POSIX.cpp + posix/PPSystem_POSIX.cpp + + # Headers + posix/PPMutex.h + posix/PPPath_POSIX.h + posix/PPSystemString_POSIX.h + posix/PPSystem_POSIX.h ) + target_include_directories(osinterface PUBLIC posix) elseif(WIN32) - list(APPEND SOURCES - win32/PPMessageBox_WIN32.cpp - win32/PPMutex.cpp - win32/PPOpenPanel_WIN32.cpp - win32/PPPath_WIN32.cpp - win32/PPQuitSaveAlert_WIN32.cpp - win32/PPSavePanel_WIN32.cpp - win32/PPSystem_WIN32.cpp - win32/WaitWindow_WIN32.cpp - ) - list(APPEND HEADERS - win32/PPMutex.h - win32/PPPath_WIN32.h - win32/PPSystemString_WIN32.h - win32/PPSystem_WIN32.h - win32/WaitWindow_WIN32.h + target_sources(osinterface + PRIVATE + # Sources + win32/PPMessageBox_WIN32.cpp + win32/PPMutex.cpp + win32/PPOpenPanel_WIN32.cpp + win32/PPPath_WIN32.cpp + win32/PPQuitSaveAlert_WIN32.cpp + win32/PPSavePanel_WIN32.cpp + win32/PPSystem_WIN32.cpp + win32/WaitWindow_WIN32.cpp + + # Headers + win32/PPMutex.h + win32/PPPath_WIN32.h + win32/PPSystemString_WIN32.h + win32/PPSystem_WIN32.h + win32/WaitWindow_WIN32.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/milkyplay - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/win32 + target_include_directories(osinterface + PRIVATE + ${PROJECT_SOURCE_DIR}/src/milkyplay + PUBLIC + win32 ) else() - list(APPEND SOURCES - posix/PPPath_POSIX.cpp - posix/PPSystem_POSIX.cpp - sdl/PPMessageBox_SDL.cpp - sdl/PPMutex.cpp - sdl/PPOpenPanel_SDL.cpp - sdl/PPQuitSaveAlert_SDL.cpp - sdl/PPSavePanel_SDL.cpp - sdl/SDL_ModalLoop.cpp - ) - list(APPEND HEADERS - posix/PPMutex.h - posix/PPPath_POSIX.h - posix/PPSystemString_POSIX.h - posix/PPSystem_POSIX.h - sdl/PPMutex.h - sdl/SDL_ModalLoop.h - ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${SDL2_INCLUDE_DIRS} - ) -endif() + target_sources(osinterface + PRIVATE + # Sources + posix/PPPath_POSIX.cpp + posix/PPSystem_POSIX.cpp + sdl/PPMessageBox_SDL.cpp + sdl/PPMutex.cpp + sdl/PPOpenPanel_SDL.cpp + sdl/PPQuitSaveAlert_SDL.cpp + sdl/PPSavePanel_SDL.cpp + sdl/SDL_ModalLoop.cpp -include_directories( - ${PROJECT_SOURCE_DIR}/src/ppui - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface -) + # Headers + posix/PPMutex.h + posix/PPPath_POSIX.h + posix/PPSystemString_POSIX.h + posix/PPSystem_POSIX.h + sdl/PPMutex.h + sdl/SDL_ModalLoop.h + ) + target_include_directories(osinterface PUBLIC posix) -add_library(osinterface ${SOURCES} ${HEADERS}) + if(TARGET SDL2::SDL2) + # If the distro built SDL2 with CMake, we can just link to an exported target + target_link_libraries(osinterface PUBLIC SDL2::SDL2) + else() + # Otherwise we need to do things the old-fashioned way for compatibility + target_include_directories(osinterface PUBLIC ${SDL2_INCLUDE_DIRS}) + target_link_libraries(osinterface PUBLIC ${SDL2_LIBRARIES}) + endif() +endif() if(APPLE) # Enable ARC (automatic reference counting) for OS X build - set_property( - TARGET osinterface APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc" - ) + target_compile_options(osinterface PRIVATE -fobjc-arc) endif() diff --git a/src/tracker/CMakeLists.txt b/src/tracker/CMakeLists.txt index b7a96a73..0a935330 100644 --- a/src/tracker/CMakeLists.txt +++ b/src/tracker/CMakeLists.txt @@ -19,8 +19,8 @@ # along with MilkyTracker. If not, see . # -set( - SOURCES +add_executable(tracker + # Sources AnimatedFXControl.cpp ColorExportImport.cpp ColorPaletteContainer.cpp @@ -104,10 +104,8 @@ set( Undo.cpp VRand.cpp Zapper.cpp -) -set( - HEADERS + # Headers ${PROJECT_BINARY_DIR}/src/tracker/version.h AnimatedFXControl.h ColorExportImport.h @@ -189,27 +187,42 @@ set( Zapper.h ) -include_directories( - # Include the CMake-generated version header from the build directory - ${PROJECT_BINARY_DIR}/src/tracker - ${PROJECT_SOURCE_DIR}/src/compression - ${PROJECT_SOURCE_DIR}/src/fx - ${PROJECT_SOURCE_DIR}/src/milkyplay - ${PROJECT_SOURCE_DIR}/src/ppui - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface - ${PROJECT_SOURCE_DIR}/src/ppui/sdl - ${PROJECT_SOURCE_DIR}/src/tracker +# Set target name for the executable +if(APPLE OR WIN32) + # OS X and Windows get a mixed-case binary name + set_target_properties(tracker PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) +else() + # Linux/other UNIX get a lower-case binary name + set_target_properties(tracker PROPERTIES OUTPUT_NAME ${PROJECT_NAME_LOWER}) +endif() + +target_include_directories(tracker + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + # Include the CMake-generated version header from the build directory + ${PROJECT_BINARY_DIR}/src/tracker +) + +target_link_libraries(tracker + fx + milkyplay + osinterface + ppui ) -# Add the compression library. -# The compression library is special in that each decompressor has a constructor -# which statically self-registers the decompressor into a global decompressors -# list. Because they are not each individually referenced in code, the linker -# will discard them if they are archived into a static library. We could work -# around it with compiler-specific flags such as GCC's --whole-archive or -# Clang's --force_load, but instead we use this special CMake feature which lets -# us easily pull in the individual objects without having to manually list them. -list(APPEND SOURCES $) +if(CMAKE_VERSION GREATER_EQUAL 3.12) + # CMake >=3.12 can just "link" to object libraries and inherit any objects + # and include paths + target_link_libraries(tracker compression) +else() + # Do things the hard way for older CMake + target_sources(tracker PRIVATE + $ + ) + target_include_directories(tracker PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../compression + ) +endif() # Add platform-specific sources and include paths if(APPLE) @@ -235,76 +248,49 @@ if(APPLE) ${ICONS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) - list( - APPEND SOURCES + target_sources(tracker PRIVATE + # Sources ${ICONS} cocoa/AppDelegate.mm cocoa/MTKeyTranslator.mm cocoa/MTTrackerView.mm cocoa/main.mm cocoa/resources/Application.xib - ) - list( - APPEND HEADERS + + # Headers cocoa/AppDelegate.h cocoa/MTKeyTranslator.h cocoa/MTTrackerView.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/midi/osx - ${PROJECT_SOURCE_DIR}/src/ppui/cocoa - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ${PROJECT_SOURCE_DIR}/src/tracker/cocoa + + target_include_directories(tracker PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/cocoa ) elseif(WIN32) - list( - APPEND SOURCES + target_sources(tracker PRIVATE + # Sources win32/PreferencesDialog.cpp win32/ThreadTimer.cpp win32/Win32_main.cpp win32/Win32_resources.rc - ) - list( - APPEND HEADERS + + # Headers win32/PreferencesDialog.h win32/ThreadTimer.h win32/Win32_resource.h ) - include_directories( - ${PROJECT_SOURCE_DIR}/src/midi/win32 - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/win32 - ${PROJECT_SOURCE_DIR}/src/ppui/win32 - ) else() - list( - APPEND SOURCES + target_sources(tracker PRIVATE + # Sources sdl/SDL_KeyTranslation.cpp sdl/SDL_Main.cpp - ) - list( - APPEND HEADERS + + # Headers sdl/SDL_KeyTranslation.h ) - include_directories( - ${SDL2_INCLUDE_DIRS} - ${PROJECT_SOURCE_DIR}/src/ppui/osinterface/posix - ) -endif() - -add_definitions(-DMILKYTRACKER) - -# Set target names for the executables -if(APPLE OR WIN32) - # OS X and Windows get a mixed-case binary name - set(TARGET_NAME ${PROJECT_NAME}) -else() - # Linux/other UNIX get a lower-case binary name - set(TARGET_NAME ${PROJECT_NAME_LOWER}) endif() if(APPLE) - add_executable(${TARGET_NAME} MACOSX_BUNDLE ${SOURCES} ${HEADERS}) - # Xcode can deal with Interface Builder xibs automatically - if we are not # generating for Xcode, then we must manually compile and install any xibs if(NOT CMAKE_GENERATOR STREQUAL "Xcode") @@ -321,16 +307,16 @@ if(APPLE) ) # Destination for compiled xib - set(RESOURCES_DIR $/../Resources) + set(RESOURCES_DIR $/../Resources) # Ensure the destination directory of the compiled xib exists add_custom_command( - TARGET ${TARGET_NAME} PRE_BUILD COMMAND mkdir -p ${RESOURCES_DIR} + TARGET tracker PRE_BUILD COMMAND mkdir -p ${RESOURCES_DIR} ) # Compile the xib file add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD COMMAND ${IBTOOL} --errors + TARGET tracker POST_BUILD COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text --minimum-deployment-target 10.7 --compile ${RESOURCES_DIR}/${MACOSX_BUNDLE_NSMAIN_NIB_FILE}.nib ${XIB_FILE} @@ -338,63 +324,48 @@ if(APPLE) ) endif() + # Build as an Application Bundle + set_target_properties(tracker PROPERTIES MACOSX_BUNDLE TRUE) + # Pass in the Info.plist template, whose variables are defined in the # top-level CMakeLists.txt - set_target_properties( - ${TARGET_NAME} - PROPERTIES + set_target_properties(tracker PROPERTIES MACOSX_BUNDLE_INFO_PLIST - ${PROJECT_SOURCE_DIR}/src/tracker/cocoa/resources/Info.plist.in + ${CMAKE_CURRENT_SOURCE_DIR}/cocoa/resources/Info.plist.in ) # Enable ARC (automatic reference counting) for OS X build - set_property( - TARGET ${TARGET_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc" - ) + target_compile_options(tracker PRIVATE -fobjc-arc) - target_link_libraries( - ${TARGET_NAME} + target_link_libraries(tracker midi ${CORE_VIDEO_LIBRARY} ${OPENGL_LIBRARY} ) elseif(WIN32) - add_executable(${TARGET_NAME} WIN32 ${SOURCES} ${HEADERS}) + set_target_properties(tracker PROPERTIES WIN32_EXECUTABLE TRUE) - target_link_libraries(${TARGET_NAME} midi) + target_link_libraries(tracker midi) else() - add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS}) - - target_link_libraries(${TARGET_NAME} ${SDL2_LIBRARIES}) - if(ALSA_FOUND AND RTMIDI_FOUND) - add_definitions(-DHAVE_LIBASOUND) - target_link_libraries(${TARGET_NAME} midi ${RTMIDI_LIBRARIES}) + target_link_libraries(tracker midi) endif() endif() if(ZLIB_FOUND) - target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES}) + target_link_libraries(tracker ${ZLIB_LIBRARIES}) endif() if(UNIX) if(ZZIPLIB_FOUND) - target_link_libraries(${TARGET_NAME} ${ZZIPLIB_LIBRARIES}) + target_link_libraries(tracker ${ZZIPLIB_LIBRARIES}) endif() if(LHASA_FOUND) - target_link_libraries(${TARGET_NAME} ${LHASA_LIBRARIES}) + target_link_libraries(tracker ${LHASA_LIBRARIES}) endif() endif() -target_link_libraries( - ${TARGET_NAME} - fx - milkyplay - osinterface - ppui -) - # OS X and Windows install to the root of the prefix, the others install to bin if(APPLE OR WIN32) set(INSTALL_DEST .) @@ -402,4 +373,4 @@ else() set(INSTALL_DEST ${CMAKE_INSTALL_BINDIR}) endif() -install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_DEST}) +install(TARGETS tracker DESTINATION ${INSTALL_DEST})