cmake_minimum_required(VERSION 3.5.1) ############# # Constants # ############# set(ASSETS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/assets") ########### # Options # ########### option(JAPANESE "Enable the Japanese-language build (instead of the unofficial Aeon Genesis English translation)" OFF) option(FIX_BUGS "Fix various bugs in the game" OFF) option(FIX_MAJOR_BUGS "Fix bugs that invoke undefined behaviour or cause memory leaks" OFF) option(DEBUG_SAVE "Re-enable the dummied-out 'Debug Save' option, and the ability to drag-and-drop save files onto the window" OFF) option(LTO "Enable link-time optimisation" OFF) option(MSVC_LINK_STATIC_RUNTIME "Link the static MSVC runtime library" OFF) ######### # Setup # ######### project(CSE2 LANGUAGES C CXX) add_executable(CSE2 WIN32 "${ASSETS_DIRECTORY}/resources/CSE2.rc" "src/ArmsItem.cpp" "src/ArmsItem.h" "src/Back.cpp" "src/Back.h" "src/Boss.cpp" "src/Boss.h" "src/BossAlmo1.cpp" "src/BossAlmo1.h" "src/BossAlmo2.cpp" "src/BossAlmo2.h" "src/BossBallos.cpp" "src/BossBallos.h" "src/BossFrog.cpp" "src/BossFrog.h" "src/BossIronH.cpp" "src/BossIronH.h" "src/BossLife.cpp" "src/BossLife.h" "src/BossOhm.cpp" "src/BossOhm.h" "src/BossPress.cpp" "src/BossPress.h" "src/BossTwinD.cpp" "src/BossTwinD.h" "src/BossX.cpp" "src/BossX.h" "src/BulHit.cpp" "src/BulHit.h" "src/Bullet.cpp" "src/Bullet.h" "src/Caret.cpp" "src/Caret.h" "src/CommonDefines.h" "src/Config.cpp" "src/Config.h" "src/Dialog.cpp" "src/Dialog.h" "src/Draw.cpp" "src/Draw.h" "src/Ending.cpp" "src/Ending.h" "src/Escape.cpp" "src/Escape.h" "src/Fade.cpp" "src/Fade.h" "src/Flags.cpp" "src/Flags.h" "src/Flash.cpp" "src/Flash.h" "src/Frame.cpp" "src/Frame.h" "src/Game.cpp" "src/Game.h" "src/Generic.cpp" "src/Generic.h" "src/GenericLoad.cpp" "src/GenericLoad.h" "src/Input.cpp" "src/Input.h" "src/KeyControl.cpp" "src/KeyControl.h" "src/Main.cpp" "src/Main.h" "src/Map.cpp" "src/Map.h" "src/MapName.cpp" "src/MapName.h" "src/MiniMap.cpp" "src/MiniMap.h" "src/MyChar.cpp" "src/MyChar.h" "src/MycHit.cpp" "src/MycHit.h" "src/MycParam.cpp" "src/MycParam.h" "src/NpcAct.h" "src/NpcAct000.cpp" "src/NpcAct020.cpp" "src/NpcAct040.cpp" "src/NpcAct060.cpp" "src/NpcAct080.cpp" "src/NpcAct100.cpp" "src/NpcAct120.cpp" "src/NpcAct140.cpp" "src/NpcAct160.cpp" "src/NpcAct180.cpp" "src/NpcAct200.cpp" "src/NpcAct220.cpp" "src/NpcAct240.cpp" "src/NpcAct260.cpp" "src/NpcAct280.cpp" "src/NpcAct300.cpp" "src/NpcAct320.cpp" "src/NpcAct340.cpp" "src/NpChar.cpp" "src/NpChar.h" "src/NpcHit.cpp" "src/NpcHit.h" "src/NpcTbl.cpp" "src/NpcTbl.h" "src/Organya.cpp" "src/Organya.h" "src/PixTone.cpp" "src/PixTone.h" "src/Profile.cpp" "src/Profile.h" "src/SelStage.cpp" "src/SelStage.h" "src/Shoot.cpp" "src/Shoot.h" "src/Sound.cpp" "src/Sound.h" "src/Stage.cpp" "src/Stage.h" "src/Star.cpp" "src/Star.h" "src/TextScr.cpp" "src/TextScr.h" "src/Triangle.cpp" "src/Triangle.h" "src/ValueView.cpp" "src/ValueView.h" "src/WindowsWrapper.h" ) ################### # Option handling # ################### if(JAPANESE) set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") target_compile_definitions(CSE2 PRIVATE JAPANESE) else() set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_english") endif() if(FIX_BUGS) target_compile_definitions(CSE2 PRIVATE FIX_BUGS) endif() if(FIX_BUGS OR FIX_MAJOR_BUGS) target_compile_definitions(CSE2 PRIVATE FIX_MAJOR_BUGS) endif() if(DEBUG_SAVE) target_compile_definitions(CSE2 PRIVATE DEBUG_SAVE) endif() if(LTO) include(CheckIPOSupported) check_ipo_supported(RESULT result) if(result) set_target_properties(CSE2 PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif() # This is messy as hell, and has been replaced by CMAKE_MSVC_RUNTIME_LIBRARY, # but that's a very recent CMake addition, so we're still doing it this way for now if(MSVC AND MSVC_LINK_STATIC_RUNTIME) # Statically-link the CRT (vcpkg static libs do this) foreach(flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif() endforeach() endif() ########## # Tweaks # ########## # Make some tweaks if we're using MSVC if(MSVC) # Disable warnings that normally fire up on MSVC when using "unsafe" functions instead of using MSVC's "safe" _s functions target_compile_definitions(CSE2 PRIVATE _CRT_SECURE_NO_WARNINGS) # Make it so source files are recognized as UTF-8 by MSVC target_compile_options(CSE2 PRIVATE "/utf-8") endif() ################## # Misc. settings # ################## # Force strict C90 set_target_properties(CSE2 PROPERTIES C_STANDARD 90 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF ) # Force strict C++98 set_target_properties(CSE2 PROPERTIES CXX_STANDARD 98 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) # Name debug builds "CSE2_debug", to distinguish them set_target_properties(CSE2 PROPERTIES DEBUG_OUTPUT_NAME "CSE2_debug") # Send executable to the build_en/build_jp directory set_target_properties(CSE2 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BUILD_DIRECTORY} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIRECTORY} RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${BUILD_DIRECTORY} RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${BUILD_DIRECTORY} RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIRECTORY} ) ################ # Dependencies # ################ # Link libraries target_link_libraries(CSE2 PRIVATE ddraw dsound version shlwapi imm32 winmm dxguid gdi32) # Newer MSVC is missing `dinput.lib` if(MSVC AND NOT (MSVC_VERSION LESS 1500)) target_link_libraries(CSE2 PRIVATE dinput8) else() target_link_libraries(CSE2 PRIVATE dinput) endif()