From a39a816ea9ee53cf8440546bb5921547e49f88bd Mon Sep 17 00:00:00 2001 From: shweet Date: Sun, 11 Jan 2026 13:13:45 -0500 Subject: [PATCH] update cmake --- CMakeLists.txt | 339 ++++++++++++++++++++--------------------- compile_commands.json | 2 +- src/anm2/anm2.cpp | 8 +- src/resource/strings.h | 1 + 4 files changed, 173 insertions(+), 177 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b93950..5ed7f3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,70 +1,74 @@ cmake_minimum_required(VERSION 3.27) project(anm2ed LANGUAGES C CXX) -if (WIN32 AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" - CACHE STRING "Vcpkg toolchain file") -endif () +if(WIN32 AND DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) + set(CMAKE_TOOLCHAIN_FILE + "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + CACHE STRING "Vcpkg toolchain file") +endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -if (CMAKE_EXPORT_COMPILE_COMMANDS AND NOT WIN32) - execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_BINARY_DIR}/compile_commands.json - ${CMAKE_SOURCE_DIR}/compile_commands.json - ) -endif () +if(CMAKE_EXPORT_COMPILE_COMMANDS AND NOT WIN32) + execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_BINARY_DIR}/compile_commands.json + ${CMAKE_SOURCE_DIR}/compile_commands.json) +endif() set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -if (MSVC) - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") -endif () +if(MSVC) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:ProgramDatabase>") +endif() set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) -set(SDL_STATIC ON CACHE BOOL "" FORCE) -set(SDL_SHARED OFF CACHE BOOL "" FORCE) -if (NOT WIN32) - set(SDL_ALSA ON CACHE BOOL "" FORCE) - set(SDL_ALSA_SHARED ON CACHE BOOL "" FORCE) - set(SDL_JACK ON CACHE BOOL "" FORCE) - set(SDL_JACK_SHARED ON CACHE BOOL "" FORCE) - set(SDL_PIPEWIRE ON CACHE BOOL "" FORCE) - set(SDL_PIPEWIRE_SHARED ON CACHE BOOL "" FORCE) - set(SDL_SNDIO ON CACHE BOOL "" FORCE) - set(SDL_SNDIO_SHARED ON CACHE BOOL "" FORCE) -endif () -set(SDL_HAPTIC OFF CACHE BOOL "" FORCE) -set(SDL_JOYSTICK OFF CACHE BOOL "" FORCE) -set(SDL_SENSOR OFF CACHE BOOL "" FORCE) -set(SDL_HIDAPI OFF CACHE BOOL "" FORCE) -set(SDL_CAMERA OFF CACHE BOOL "" FORCE) -set(SDL_TRAY OFF CACHE BOOL "" FORCE) -set(SDL_VULKAN OFF CACHE BOOL "" FORCE) +macro(anm2ed_set_cache_bool name value) + set(${name} ${value} CACHE BOOL "" FORCE) +endmacro() + +anm2ed_set_cache_bool(SDL_STATIC ON) +anm2ed_set_cache_bool(SDL_SHARED OFF) +if(NOT WIN32) + anm2ed_set_cache_bool(SDL_ALSA ON) + anm2ed_set_cache_bool(SDL_ALSA_SHARED ON) + anm2ed_set_cache_bool(SDL_JACK ON) + anm2ed_set_cache_bool(SDL_JACK_SHARED ON) + anm2ed_set_cache_bool(SDL_PIPEWIRE ON) + anm2ed_set_cache_bool(SDL_PIPEWIRE_SHARED ON) + anm2ed_set_cache_bool(SDL_SNDIO ON) + anm2ed_set_cache_bool(SDL_SNDIO_SHARED ON) +endif() +anm2ed_set_cache_bool(SDL_HAPTIC OFF) +anm2ed_set_cache_bool(SDL_JOYSTICK OFF) +anm2ed_set_cache_bool(SDL_SENSOR OFF) +anm2ed_set_cache_bool(SDL_HIDAPI OFF) +anm2ed_set_cache_bool(SDL_CAMERA OFF) +anm2ed_set_cache_bool(SDL_TRAY OFF) +anm2ed_set_cache_bool(SDL_VULKAN OFF) add_subdirectory(external/SDL EXCLUDE_FROM_ALL) -set(SDLMIXER_DEPS_SHARED OFF CACHE BOOL "" FORCE) -set(SDLMIXER_AIFF OFF CACHE BOOL "" FORCE) -set(SDLMIXER_AU OFF CACHE BOOL "" FORCE) -set(SDLMIXER_FLAC_LIBFLAC OFF CACHE BOOL "" FORCE) -set(SDLMIXER_FLAC_DRFLAC OFF CACHE BOOL "" FORCE) -set(SDLMIXER_GME OFF CACHE BOOL "" FORCE) -set(SDLMIXER_MOD_XMP OFF CACHE BOOL "" FORCE) -set(SDLMIXER_MP3_DRMP3 OFF CACHE BOOL "" FORCE) -set(SDLMIXER_MP3_MPG123 OFF CACHE BOOL "" FORCE) -set(SDLMIXER_MIDI_FLUIDSYNTH OFF CACHE BOOL "" FORCE) -set(SDLMIXER_MIDI_TIMIDITY OFF CACHE BOOL "" FORCE) -set(SDLMIXER_OPUS ON CACHE BOOL "" FORCE) -set(SDLMIXER_VOC OFF CACHE BOOL "" FORCE) -set(SDLMIXER_VORBIS_STB ON CACHE BOOL "" FORCE) -set(SDLMIXER_VORBIS_VORBISFILE OFF CACHE BOOL "" FORCE) -set(SDLMIXER_VORBIS_TREMOR OFF CACHE BOOL "" FORCE) -set(SDLMIXER_WAVE ON CACHE BOOL "" FORCE) -set(SDLMIXER_WAVPACK OFF CACHE BOOL "" FORCE) -set(SDLMIXER_TEST OFF CACHE BOOL "" FORCE) -set(SDLMIXER_INSTALL OFF CACHE BOOL "" FORCE) +anm2ed_set_cache_bool(SDLMIXER_DEPS_SHARED OFF) +anm2ed_set_cache_bool(SDLMIXER_AIFF OFF) +anm2ed_set_cache_bool(SDLMIXER_AU OFF) +anm2ed_set_cache_bool(SDLMIXER_FLAC_LIBFLAC OFF) +anm2ed_set_cache_bool(SDLMIXER_FLAC_DRFLAC OFF) +anm2ed_set_cache_bool(SDLMIXER_GME OFF) +anm2ed_set_cache_bool(SDLMIXER_MOD_XMP OFF) +anm2ed_set_cache_bool(SDLMIXER_MP3_DRMP3 OFF) +anm2ed_set_cache_bool(SDLMIXER_MP3_MPG123 OFF) +anm2ed_set_cache_bool(SDLMIXER_MIDI_FLUIDSYNTH OFF) +anm2ed_set_cache_bool(SDLMIXER_MIDI_TIMIDITY OFF) +anm2ed_set_cache_bool(SDLMIXER_OPUS ON) +anm2ed_set_cache_bool(SDLMIXER_VOC OFF) +anm2ed_set_cache_bool(SDLMIXER_VORBIS_STB ON) +anm2ed_set_cache_bool(SDLMIXER_VORBIS_VORBISFILE OFF) +anm2ed_set_cache_bool(SDLMIXER_VORBIS_TREMOR OFF) +anm2ed_set_cache_bool(SDLMIXER_WAVE ON) +anm2ed_set_cache_bool(SDLMIXER_WAVPACK OFF) +anm2ed_set_cache_bool(SDLMIXER_TEST OFF) +anm2ed_set_cache_bool(SDLMIXER_INSTALL OFF) add_subdirectory(external/SDL_mixer EXCLUDE_FROM_ALL) add_subdirectory(external/lunasvg) @@ -72,149 +76,134 @@ add_subdirectory(external/lunasvg) set(GLAD_SRC ${CMAKE_CURRENT_SOURCE_DIR}/include/glad/glad.cpp) set(IMGUI_SRC - external/imgui/imgui.cpp - external/imgui/imgui_draw.cpp - external/imgui/imgui_widgets.cpp - external/imgui/imgui_tables.cpp - external/imgui/backends/imgui_impl_sdl3.cpp - external/imgui/backends/imgui_impl_opengl3.cpp -) + external/imgui/imgui.cpp + external/imgui/imgui_draw.cpp + external/imgui/imgui_widgets.cpp + external/imgui/imgui_tables.cpp + external/imgui/backends/imgui_impl_sdl3.cpp + external/imgui/backends/imgui_impl_opengl3.cpp) set(TINYXML2_SRC external/tinyxml2/tinyxml2.cpp) file(GLOB PROJECT_SRC CONFIGURE_DEPENDS - src/anm2/*.cpp - src/anm2/*.h - src/resource/*.cpp - src/resource/*.h - src/imgui/*.cpp - src/imgui/*.h - src/imgui/window/*.cpp - src/imgui/window/*.h - src/imgui/wizard/*.cpp - src/imgui/wizard/*.h - src/util/*.cpp - src/util/*.h - src/window/*.cpp - src/window/*.h - src/*.cpp - src/*.h -) + src/anm2/*.cpp + src/anm2/*.h + src/resource/*.cpp + src/resource/*.h + src/imgui/*.cpp + src/imgui/*.h + src/imgui/window/*.cpp + src/imgui/window/*.h + src/imgui/wizard/*.cpp + src/imgui/wizard/*.h + src/util/*.cpp + src/util/*.h + src/window/*.cpp + src/window/*.h + src/*.cpp + src/*.h) -add_executable(${PROJECT_NAME} - ${GLAD_SRC} - ${IMGUI_SRC} - ${TINYXML2_SRC} - ${PROJECT_SRC} -) -if (MSVC) - target_compile_options(${PROJECT_NAME} PRIVATE "$<$:/std:c++latest>") +add_executable(${PROJECT_NAME} ${GLAD_SRC} ${IMGUI_SRC} ${TINYXML2_SRC} ${PROJECT_SRC}) + +target_compile_definitions(${PROJECT_NAME} PRIVATE IMGUI_DISABLE_OBSOLETE_FUNCTIONS IMGUI_DEBUG_PARANOID + IMGUI_ENABLE_DOCKING) + +target_include_directories( + ${PROJECT_NAME} + PRIVATE include + include/glad + external + external/imgui + external/glm + external/tinyxml2 + external/lunasvg + external/SDL + external/SDL_mixer + external/SDL_mixer/include + src + src/imgui + src/resource + src/util) + +if(WIN32) + enable_language(RC) + target_sources(${PROJECT_NAME} PRIVATE anm2ed.rc) + + target_compile_options(${PROJECT_NAME} PRIVATE /EHsc) + target_link_options(${PROJECT_NAME} PRIVATE /STACK:0xffffff) + + target_link_options( + ${PROJECT_NAME} + PRIVATE "$<$,$>:/SUBSYSTEM:WINDOWS>" + "$<$,$>>:-mwindows>") +else() + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -pedantic) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG) + target_compile_options(${PROJECT_NAME} PRIVATE -O0 -pg) + else() + set(CMAKE_BUILD_TYPE "Release") + target_compile_options(${PROJECT_NAME} PRIVATE -Os) + endif() + target_link_libraries(${PROJECT_NAME} PRIVATE m) endif() -if (WIN32) - enable_language(RC) - target_sources(${PROJECT_NAME} PRIVATE anm2ed.rc) - target_compile_options(${PROJECT_NAME} PRIVATE /EHsc) - target_link_options(${PROJECT_NAME} PRIVATE /STACK:0xffffff) - target_link_options(${PROJECT_NAME} PRIVATE - "$<$,$>:/SUBSYSTEM:WINDOWS>" - "$<$,$>>:-mwindows>" - ) -else () - target_compile_options(${PROJECT_NAME} PRIVATE - -Wall -Wextra -pedantic - ) - if (CMAKE_BUILD_TYPE STREQUAL "Debug") - target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG) - target_compile_options(${PROJECT_NAME} PRIVATE -O0 -pg) - else () - set(CMAKE_BUILD_TYPE "Release") - target_compile_options(${PROJECT_NAME} PRIVATE -Os) - endif () +if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE "$<$:/std:c++latest>") + target_compile_options(${PROJECT_NAME} PRIVATE "$<$:/Zi>") + target_link_options(${PROJECT_NAME} PRIVATE "$<$:/DEBUG>") +endif() - target_link_libraries(${PROJECT_NAME} PRIVATE m) -endif () - -target_compile_definitions(${PROJECT_NAME} PRIVATE - IMGUI_DISABLE_OBSOLETE_FUNCTIONS - IMGUI_DEBUG_PARANOID - IMGUI_ENABLE_DOCKING -) - -target_include_directories(${PROJECT_NAME} PRIVATE - include - include/glad - external - external/imgui - external/glm - external/tinyxml2 - external/lunasvg - external/SDL - external/SDL_mixer - external/SDL_mixer/include - src - src/imgui - src/resource - src/util -) - -if (WIN32) - set(OPENGL_LIB opengl32) - set(PLATFORM_LIBS - ws2_32 - bcrypt - imm32 - version - winmm - shell32 - ole32 - advapi32 - gdi32 - user32 - setupapi - legacy_stdio_definitions - ) - if (TARGET SDL3::SDL3main) - set(SDL_MAIN_TARGET SDL3::SDL3main) - else () - set(SDL_MAIN_TARGET) - endif () -else () - set(OPENGL_LIB GL) - set(PLATFORM_LIBS) +if(WIN32) + set(OPENGL_LIB opengl32) + set(PLATFORM_LIBS + ws2_32 + bcrypt + imm32 + version + winmm + shell32 + ole32 + advapi32 + gdi32 + user32 + setupapi + legacy_stdio_definitions) + if(TARGET SDL3::SDL3main) + set(SDL_MAIN_TARGET SDL3::SDL3main) + else() set(SDL_MAIN_TARGET) -endif () + endif() +else() + set(OPENGL_LIB GL) + set(PLATFORM_LIBS) + set(SDL_MAIN_TARGET) +endif() -target_link_libraries(${PROJECT_NAME} PRIVATE - ${OPENGL_LIB} - SDL3-static - ${SDL_MAIN_TARGET} - SDL3_mixer::SDL3_mixer - lunasvg - ${PLATFORM_LIBS} -) +target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENGL_LIB} SDL3-static ${SDL_MAIN_TARGET} + SDL3_mixer::SDL3_mixer lunasvg ${PLATFORM_LIBS}) message(STATUS "System: ${CMAKE_SYSTEM_NAME}") message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Compiler: ${CMAKE_CXX_COMPILER}") get_target_property(PROJECT_COMPILE_OPTIONS ${PROJECT_NAME} COMPILE_OPTIONS) -if (NOT PROJECT_COMPILE_OPTIONS) - set(PROJECT_COMPILE_OPTIONS "") -endif () +if(NOT PROJECT_COMPILE_OPTIONS) + set(PROJECT_COMPILE_OPTIONS "") +endif() string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) set(EFFECTIVE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -if (BUILD_TYPE_UPPER) - set(CONFIG_FLAGS_VAR "CMAKE_CXX_FLAGS_${BUILD_TYPE_UPPER}") - if (DEFINED ${CONFIG_FLAGS_VAR}) - string(APPEND EFFECTIVE_CXX_FLAGS " ${${CONFIG_FLAGS_VAR}}") - endif () -endif () +if(BUILD_TYPE_UPPER) + set(CONFIG_FLAGS_VAR "CMAKE_CXX_FLAGS_${BUILD_TYPE_UPPER}") + if(DEFINED ${CONFIG_FLAGS_VAR}) + string(APPEND EFFECTIVE_CXX_FLAGS " ${${CONFIG_FLAGS_VAR}}") + endif() +endif() string(STRIP "${EFFECTIVE_CXX_FLAGS}" EFFECTIVE_CXX_FLAGS) -if (EFFECTIVE_CXX_FLAGS STREQUAL "") - set(EFFECTIVE_CXX_FLAGS "") -endif () +if(EFFECTIVE_CXX_FLAGS STREQUAL "") + set(EFFECTIVE_CXX_FLAGS "") +endif() message(STATUS "Compiler Flags: ${EFFECTIVE_CXX_FLAGS}") message(STATUS "Target Compile Options: ${PROJECT_COMPILE_OPTIONS}") diff --git a/compile_commands.json b/compile_commands.json index 5e95284..20713af 120000 --- a/compile_commands.json +++ b/compile_commands.json @@ -1 +1 @@ -/home/anon/sda/Personal/Repos/anm2ed/build/compile_commands.json \ No newline at end of file +/home/anon/sda/Personal/Repos/anm2ed/build-cmake-cleancheck/compile_commands.json \ No newline at end of file diff --git a/src/anm2/anm2.cpp b/src/anm2/anm2.cpp index fb48ac9..814e771 100644 --- a/src/anm2/anm2.cpp +++ b/src/anm2/anm2.cpp @@ -65,10 +65,16 @@ namespace anm2ed::anm2 XMLDocument document; document.InsertFirstChild(to_element(document)); + if (!std::filesystem::exists(path)) + { + if (errorString) *errorString = localize.get(ERROR_FILE_NOT_FOUND); + return false; + } + File file(path, "wb"); if (!file) { - if (errorString) *errorString = localize.get(ERROR_FILE_NOT_FOUND); + if (errorString) *errorString = localize.get(ERROR_FILE_PERMISSIONS); return false; } diff --git a/src/resource/strings.h b/src/resource/strings.h index c9c0ce4..6cf7fdb 100644 --- a/src/resource/strings.h +++ b/src/resource/strings.h @@ -419,6 +419,7 @@ namespace anm2ed X(TOAST_PNG_FORMAT_INVALID, "PNG format invalid. Make sure it contains \"{}\".", "Formato PNG inválido. Asegúrate de que contenga \"{}\".", "Недопустимый формат PNG. Убедитесь, что он содержит \"{}\".", "PNG 格式无效。请确保其中包含 \"{}\"。", "PNG 형식이 잘못되었습니다. \"{}\"을 포함하는지 확인하세요.") \ X(TOAST_REDO, "Redo: {0}", "Rehacer: {0}", "Повтор: {0}", "重做: {0}", "다시 실행: {0}") \ X(ERROR_FILE_NOT_FOUND, "File not found!", "¡Archivo no encontrado!", "Файл не найден!", "找不到文件!", "파일을 찾을 수 없습니다!") \ + X(ERROR_FILE_PERMISSIONS, "File does not have write permissions!", "¡El archivo no tiene permisos de escritura!", "У файла нет прав на запись!", "文件没有写入权限!", "파일에 쓰기 권한이 없습니다!") \ X(TOAST_RELOAD_SPRITESHEET, "Reloaded spritesheet #{0}: {1}", "Se ha recargado spritesheet #{0}: {1}", "Спрайт-лист #{0} перезагружен: {1}", "重新加载了图集 #{0}: {1}", "{0}번 스프라이트 시트 다시 불러옴: {1}") \ X(TOAST_RELOAD_SOUND, "Reloaded sound #{0}: {1}", "Se ha recargado sonido #{0}: {1}", "Звук #{0} перезагружен: {1}", "重新加载了声音 #{0}: {1}", "{0}번 사운드 다시 불러옴: {1}") \ X(TOAST_REMOVE_SPRITESHEET, "Removed spritesheet #{0}: {1}", "Se ha removido spritesheet #{0}: {1}", "Спрайт-лист #{0} удален: {1}", "去除了图集 #{0}: {1}", "{0}번 스프라이트 시트 제거됨: {1}") \