From e6350151c9369e9539e28495365b4a2230f84e08 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Thu, 5 Sep 2019 12:48:46 +0000 Subject: [PATCH] Revert "Remove the leftover CMakeLists.txt file" This reverts commit c7c507710320c7c5b5caa88fd7016743e0497ee9. It probably doesn't work anymore, but I plan to get it working again in this branch. --- CMakeLists.txt | 446 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..ec5e7e34 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,446 @@ +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() + +set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game") +set(ASSETS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/assets") + +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) +set(RENDERER "Texture" CACHE STRING "Which renderer the game should use: 'OpenGL3' for an OpenGL 3.2 renderer, 'Texture' for SDL2's hardware-accelerated Texture API, 'Surface' for SDL2's software-rendered Surface API, and 'Software' for a handwritten software renderer") + +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 + src/Backends/Rendering.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(DATA_DIRECTORY "${ASSETS_DIRECTORY}/data_jp") + list(APPEND RESOURCES "BITMAP/pixel_jp.bmp") + target_compile_definitions(CSE2 PRIVATE JAPANESE) +else() + set(DATA_DIRECTORY "${ASSETS_DIRECTORY}/data_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() + +if(RENDERER MATCHES "OpenGL3") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/OpenGL3.cpp") +elseif(RENDERER MATCHES "Texture") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/SDLTexture.cpp") +elseif(RENDERER MATCHES "Surface") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/SDLSurface.cpp") +elseif(RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Software.cpp") +else() + message(FATAL_ERROR "Invalid RENDERER selected") +endif() + +# Make some tweaks if we're targetting Windows +if(WIN32) + target_sources(CSE2 PRIVATE "${ASSETS_DIRECTORY}/resources/ICON/ICON.rc") + target_compile_definitions(CSE2 PRIVATE WINDOWS) + set_target_properties(CSE2 PROPERTIES WIN32_EXECUTABLE YES) # Disable the console window + target_link_libraries(CSE2 "version.lib") # Link this for some code in Generic.cpp +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() + +# Decide the embedded font +if(JAPANESE) + list(APPEND RESOURCES "FONT/msgothic.ttc") +elseif(NOT WIN32) + list(APPEND RESOURCES "FONT/cour.ttf") +endif() + +# Build bin2h externally, so it isn't cross-compiled when CSE2 is (Emscripten) +include(ExternalProject) + +ExternalProject_Add(bin2h + SOURCE_DIR "${CMAKE_SOURCE_DIR}/bin2h" + DOWNLOAD_COMMAND "" + UPDATE_COMMAND "" + BUILD_BYPRODUCTS "/bin/bin2h" + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX= + -DCMAKE_BUILD_TYPE=Release + INSTALL_COMMAND + ${CMAKE_COMMAND} --build . --config Release --target install +) + +ExternalProject_Get_Property(bin2h INSTALL_DIR) + +add_executable(bin2h_tool IMPORTED) +add_dependencies(bin2h_tool bin2h) +set_target_properties(bin2h_tool PROPERTIES IMPORTED_LOCATION "${INSTALL_DIR}/bin/bin2h") + +# Convert resources to header files +foreach(FILENAME IN LISTS RESOURCES) + set(IN_DIR "${ASSETS_DIRECTORY}/resources") + 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_tool "${IN_DIR}/${FILENAME}" "${OUT_DIR}/${FILENAME}.h" + DEPENDS bin2h_tool "${IN_DIR}/${FILENAME}" + ) + target_sources(CSE2 PRIVATE "${OUT_DIR}/${FILENAME}.h") +endforeach() + +# 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 +) + +# Include directory for third-party software +target_include_directories(CSE2 PRIVATE "external") + +# 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} +) + +# Copy data folder to build directory +add_custom_command(TARGET CSE2 POST_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory "${BUILD_DIRECTORY}/data" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${DATA_DIRECTORY}" "${BUILD_DIRECTORY}/data" +) + +# 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 + +if(NOT FORCE_LOCAL_LIBS) + find_package(SDL2) +endif() + +if(TARGET SDL2::SDL2) + # CMake-generated config (Arch, vcpkg, Raspbian) + message(STATUS "Using system SDL2") + target_link_libraries(CSE2 SDL2::SDL2 SDL2::SDL2main) +elseif(SDL2_FOUND) + # 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) + if(MSVC) + set(LIBC ON) # Needed to prevent possible 'symbol already defined' errors + endif() + add_subdirectory("external/SDL2" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 SDL2-static SDL2main) +endif() + +if(NOT FORCE_LOCAL_LIBS) + find_package(Freetype) +endif() + +if(FREETYPE_FOUND) + 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() + +if(RENDERER MATCHES "OpenGL3") + if(NOT FORCE_LOCAL_LIBS) + find_package(GLEW) + endif() + + if(TARGET GLEW::GLEW) + message(STATUS "Using system GLEW") + target_link_libraries(CSE2 GLEW::GLEW) + else() + # Compile it ourselves + message(STATUS "Using local GLEW") + target_sources(CSE2 PRIVATE "external/glew/glew.c" "external/glew/GL/glew.h") + target_include_directories(CSE2 PRIVATE "external/glew") + endif() + + find_package(OpenGL REQUIRED) + target_link_libraries(CSE2 OpenGL::GL) +endif() + +## +# DoConfig +## + +add_subdirectory("DoConfig") + +# Name debug builds "DoConfig_debug", to distinguish them +set_target_properties(DoConfig PROPERTIES DEBUG_OUTPUT_NAME "DoConfig_debug") + +# 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} +)