ref: 1d064204d5e8b019402d3824cf234dc8138c86eb
dir: /CMakeLists.txt/
cmake_minimum_required(VERSION 3.7.2) if((${CMAKE_VERSION} VERSION_EQUAL 3.9) OR (${CMAKE_VERSION} VERSION_GREATER 3.9)) cmake_policy(SET CMP0069 NEW) endif() option(JAPANESE "Enable the Japanese-language build" OFF) option(FIX_BUGS "Fix certain bugs (see src/Bug Fixes.txt)" OFF) option(NONPORTABLE "Enable bits of code that aren't portable, but are what the original game used" OFF) option(FORCE_LOCAL_LIBS "Compile the built-in versions of SDL2, FreeType, and FLTK instead of using the system-provided ones" OFF) # Default to Release build if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() project(CSE2 LANGUAGES C CXX) if(MSVC) # 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() ## # CSE2 ## add_executable(CSE2 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/Draw.cpp src/Draw.h src/Ending.cpp src/Ending.h src/Escape.cpp src/Escape.h src/Fade.cpp src/Fade.h src/File.cpp src/File.h src/Flags.cpp src/Flags.h src/Flash.cpp src/Flash.h src/Font.cpp src/Font.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/Resource.cpp src/Resource.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 ) set(RESOURCES BITMAP/Credit01.bmp BITMAP/Credit02.bmp BITMAP/Credit03.bmp BITMAP/Credit04.bmp BITMAP/Credit05.bmp BITMAP/Credit06.bmp BITMAP/Credit07.bmp BITMAP/Credit08.bmp BITMAP/Credit09.bmp BITMAP/Credit10.bmp BITMAP/Credit11.bmp BITMAP/Credit12.bmp BITMAP/Credit14.bmp BITMAP/Credit15.bmp BITMAP/Credit16.bmp BITMAP/Credit17.bmp BITMAP/Credit18.bmp CURSOR/CURSOR_IKA.bmp CURSOR/CURSOR_NORMAL.bmp ORG/Access.org ORG/Anzen.org ORG/Balcony.org ORG/Ballos.org ORG/BreakDown.org ORG/Cemetery.org ORG/Curly.org ORG/Dr.org ORG/Ending.org ORG/Escape.org ORG/Fanfale1.org ORG/Fanfale2.org ORG/Fanfale3.org ORG/FireEye.org ORG/Gameover.org ORG/Ginsuke.org ORG/Grand.org ORG/Gravity.org ORG/Hell.org ORG/ironH.org ORG/Jenka.org ORG/Jenka2.org ORG/Kodou.org ORG/LastBtl3.org ORG/LastBtl.org ORG/LastCave.org ORG/Marine.org ORG/Maze.org ORG/MDown2.org ORG/Mura.org ORG/Oside.org ORG/Plant.org ORG/quiet.org ORG/Requiem.org ORG/Toroko.org ORG/Vivi.org ORG/Wanpak2.org ORG/Wanpaku.org ORG/Weed.org ORG/White.org ORG/XXXX.org ORG/Zonbie.org WAVE/Wave.dat ) # Handle options if(JAPANESE) set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build_jp") list(APPEND RESOURCES "BITMAP/pixel_jp.bmp") target_compile_definitions(CSE2 PRIVATE JAPANESE) else() set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build_en") list(APPEND RESOURCES "BITMAP/pixel.bmp") endif() if(FIX_BUGS) target_compile_definitions(CSE2 PRIVATE FIX_BUGS) endif() if(EXISTS "/opt/vc/include/bcm_host.h") # Detect Raspberry Pi target_compile_definitions(CSE2 PRIVATE RASPBERRY_PI) endif() if(NONPORTABLE) target_compile_definitions(CSE2 PRIVATE NONPORTABLE) endif() # Make some tweaks if we're targetting Windows if(WIN32) target_sources(CSE2 PRIVATE "res/ICON/ICON.rc") target_compile_definitions(CSE2 PRIVATE WINDOWS) set_target_properties(CSE2 PROPERTIES WIN32_EXECUTABLE YES) # Disable the console window else() list(APPEND RESOURCES "ICON/ICON_MINI.bmp") endif() # Make some tweaks if we're using MSVC if(MSVC) target_compile_definitions(CSE2 PRIVATE _CRT_SECURE_NO_WARNINGS) # Shut up those stupid warnings endif() # Magic to convert resources to header files add_executable(bin2h "src/misc/bin2h.c") if(MSVC) target_compile_definitions(bin2h PRIVATE _CRT_SECURE_NO_WARNINGS) # Shut up those stupid warnings endif() foreach(FILENAME IN LISTS RESOURCES) set(IN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res") set(OUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/Resource") get_filename_component(DIRECTORY "${FILENAME}" DIRECTORY) add_custom_command( OUTPUT "${OUT_DIR}/${FILENAME}.h" COMMAND ${CMAKE_COMMAND} -E make_directory "${OUT_DIR}/${DIRECTORY}" COMMAND bin2h "${IN_DIR}/${FILENAME}" "${OUT_DIR}/${FILENAME}.h" DEPENDS bin2h "${IN_DIR}/${FILENAME}" ) target_sources(CSE2 PRIVATE "${OUT_DIR}/${FILENAME}.h") endforeach() # Force strict C90 set_property(TARGET CSE2 PROPERTY C_STANDARD 90) set_property(TARGET CSE2 PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET CSE2 PROPERTY C_EXTENSIONS OFF) # Force strict C++98 set_property(TARGET CSE2 PROPERTY CXX_STANDARD 98) set_property(TARGET CSE2 PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET CSE2 PROPERTY CXX_EXTENSIONS OFF) # Enable link-time optimisation if available if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") if((${CMAKE_VERSION} VERSION_EQUAL 3.9) OR (${CMAKE_VERSION} VERSION_GREATER 3.9)) include(CheckIPOSupported) check_ipo_supported(RESULT result) if(result) set_target_properties(CSE2 PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif() endif() # Find dependencies find_package(SDL2) if(TARGET SDL2::SDL2 AND NOT FORCE_LOCAL_LIBS) # CMake-generated config (Arch, vcpkg, Raspbian) message(STATUS "Using system SDL2") target_link_libraries(CSE2 SDL2::SDL2 SDL2::SDL2main) elseif(SDL2_FOUND AND NOT FORCE_LOCAL_LIBS) # Autotools-generated config (MSYS2) message(STATUS "Using system SDL2") target_include_directories(CSE2 PRIVATE ${SDL2_INCLUDE_DIRS}) target_link_libraries(CSE2 ${SDL2_LIBRARIES}) else() # Compile it ourselves message(STATUS "Using local SDL2") set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) add_subdirectory("external/SDL2" EXCLUDE_FROM_ALL) target_link_libraries(CSE2 SDL2-static SDL2main) endif() find_package(Freetype) if(FREETYPE_FOUND AND NOT FORCE_LOCAL_LIBS) message(STATUS "Using system FreeType") target_include_directories(CSE2 PRIVATE ${FREETYPE_INCLUDE_DIRS}) target_link_libraries(CSE2 ${FREETYPE_LIBRARIES}) else() # Compile it ourselves message(STATUS "Using local FreeType") if(FORCE_LOCAL_LIBS) set(CMAKE_DISABLE_FIND_PACKAGE_HarfBuzz ON) set(CMAKE_DISABLE_FIND_PACKAGE_ZLIB ON) set(CMAKE_DISABLE_FIND_PACKAGE_PNG ON) set(CMAKE_DISABLE_FIND_PACKAGE_BZip2 ON) endif() add_subdirectory("external/freetype" EXCLUDE_FROM_ALL) target_link_libraries(CSE2 freetype) endif() # 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} ) ## # DoConfig ## add_subdirectory("DoConfig") # Send executable to the build_en/build_jp directory set_target_properties(DoConfig 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} )