cmake_minimum_required(VERSION 3.13) set(CMAKE_CXX_STANDARD 20) project(Pomme CXX) set(POMME_SRCDIR src) set(POMME_SOURCES ${POMME_SRCDIR}/Pomme.cpp ${POMME_SRCDIR}/Pomme.h ${POMME_SRCDIR}/PommeDebug.cpp ${POMME_SRCDIR}/PommeDebug.h ${POMME_SRCDIR}/PommeEnums.h ${POMME_SRCDIR}/PommeFiles.h ${POMME_SRCDIR}/PommeGraphics.h ${POMME_SRCDIR}/PommeInit.h ${POMME_SRCDIR}/PommeInput.h ${POMME_SRCDIR}/PommeSound.h ${POMME_SRCDIR}/PommeTypes.h ${POMME_SRCDIR}/PommeVideo.h ${POMME_SRCDIR}/Files/Files.cpp ${POMME_SRCDIR}/Files/HostVolume.cpp ${POMME_SRCDIR}/Files/HostVolume.h ${POMME_SRCDIR}/Files/Resources.cpp ${POMME_SRCDIR}/Files/Volume.h ${POMME_SRCDIR}/Memory/Memory.cpp ${POMME_SRCDIR}/Text/TextUtilities.cpp ${POMME_SRCDIR}/Time/TimeManager.cpp ${POMME_SRCDIR}/Utilities/bigendianstreams.cpp ${POMME_SRCDIR}/Utilities/bigendianstreams.h ${POMME_SRCDIR}/Utilities/FixedPool.h ${POMME_SRCDIR}/Utilities/GrowablePool.h ${POMME_SRCDIR}/Utilities/IEEEExtended.cpp ${POMME_SRCDIR}/Utilities/IEEEExtended.h ${POMME_SRCDIR}/Utilities/memstream.cpp ${POMME_SRCDIR}/Utilities/memstream.h ${POMME_SRCDIR}/Utilities/StringUtils.cpp ${POMME_SRCDIR}/Utilities/StringUtils.h ${POMME_SRCDIR}/Utilities/structpack.cpp ${POMME_SRCDIR}/Utilities/structpack.h $<$:${POMME_SRCDIR}/Platform/Windows/PommeWindows.cpp> $<$:${POMME_SRCDIR}/Platform/Windows/PommeWindows.h> ) if (NOT(POMME_NO_SOUND_FORMATS)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/SoundFormats/AIFF.cpp ${POMME_SRCDIR}/SoundFormats/IMA4.cpp ${POMME_SRCDIR}/SoundFormats/MACE.cpp ${POMME_SRCDIR}/SoundFormats/Midi.cpp ${POMME_SRCDIR}/SoundFormats/SoundFormats.cpp ${POMME_SRCDIR}/SoundFormats/xlaw.cpp ) else() add_compile_definitions(POMME_NO_SOUND_FORMATS) endif() if (NOT(POMME_NO_MP3)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/SoundFormats/mp3.cpp) else() add_compile_definitions(POMME_NO_MP3) endif() if (NOT(POMME_NO_SOUND_MIXER)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/SoundMixer/ChannelImpl.cpp ${POMME_SRCDIR}/SoundMixer/ChannelImpl.h ${POMME_SRCDIR}/SoundMixer/cmixer.cpp ${POMME_SRCDIR}/SoundMixer/cmixer.h ${POMME_SRCDIR}/SoundMixer/SoundManager.cpp ) else() add_compile_definitions(POMME_NO_SOUND_MIXER) endif() if (NOT(POMME_NO_GRAPHICS)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/Graphics/ARGBPixmap.cpp ${POMME_SRCDIR}/Graphics/Color.cpp ${POMME_SRCDIR}/Graphics/ColorManager.cpp ${POMME_SRCDIR}/Graphics/Graphics.cpp ${POMME_SRCDIR}/Graphics/Icons.cpp ${POMME_SRCDIR}/Graphics/PICT.cpp ${POMME_SRCDIR}/Graphics/SysFont.h ${POMME_SRCDIR}/Graphics/SystemPalettes.cpp ) else() add_compile_definitions(POMME_NO_GRAPHICS) endif() if (NOT(POMME_NO_INPUT)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/Input/SDLInput.cpp ) else() add_compile_definitions(POMME_NO_INPUT) endif() if (NOT(POMME_NO_VIDEO)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/Video/Cinepak.cpp ${POMME_SRCDIR}/Video/Cinepak.h ${POMME_SRCDIR}/Video/moov.cpp ) else() add_compile_definitions(POMME_NO_VIDEO) endif() if (NOT(POMME_NO_QD3D)) list(APPEND POMME_SOURCES ${POMME_SRCDIR}/QD3D/3DMFInternal.h ${POMME_SRCDIR}/QD3D/3DMFParser.cpp ${POMME_SRCDIR}/QD3D/QD3D.cpp ${POMME_SRCDIR}/QD3D/QD3D.h ${POMME_SRCDIR}/QD3D/QD3DMath.cpp ${POMME_SRCDIR}/QD3D/QD3DMath.h ) else() add_compile_definitions(POMME_NO_QD3D) endif() add_library(${PROJECT_NAME} ${POMME_SOURCES}) find_package(SDL2 REQUIRED) add_compile_definitions( "$<$:_DEBUG>" ) target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS} ${POMME_SRCDIR} ) if(MSVC) # By default, MSVC may add /EHsc to CMAKE_CXX_FLAGS, which we don't want (we use /EHs below) string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # By default, MSVC may add /W3 to CMAKE_CXX_FLAGS, which we don't want (we use /W4 below) # Note that this is not required with "cmake_minimum_required(VERSION 3.15)" or later string(REPLACE "/W3" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # On Win32, we need NOGDI and NOUSER to be able to define some Mac functions # whose names are otherwise taken by Windows APIs. target_compile_definitions(${PROJECT_NAME} PRIVATE WIN32_LEAN_AND_MEAN NOGDI NOUSER) target_compile_options(${PROJECT_NAME} PRIVATE /EHs # synchronous exceptions; also, extern "C" functions may throw exceptions /W4 /wd4068 # ignore unrecognized pragmas /wd4201 # nonstandard extension (nameless struct) /wd4244 # conversion from double to float /wd4458 # declaration of variable hides class member /MP # multiprocessor compilation ) else() target_compile_options(${PROJECT_NAME} PRIVATE -fexceptions -Wall -Wextra -Wshadow -Wno-multichar -Wno-unknown-pragmas -Wstrict-aliasing=2 ) endif()