cmake_minimum_required (VERSION 3.23) #------------------------------------------------ #--- Setup compiler settings --- #------------------------------------------------ # Set C language standard set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) # Only standard features, no compiler-specific extensions # Set C++ language standard set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Only standard features, no compiler-specific extensions # Options set(APP_WIN32 ON CACHE BOOL "Build app as a Windows GUI application" FORCE) # Set compiler flags based on build type set(GENERAL_C_FLAGS /MP # Enable multi-processor compilation ) set(GENERAL_CXX_FLAGS /MP # Enable multi-processor compilation /EHsc # Enable C++ exception handling ) set(DEBUG_C_FLAGS /Od # Disable optimization for debugging /Zi # Generate complete debugging information /RTC1 # Enable runtime error checks /Ob0 # Disable inline expansion /W3 # Enable standard warnings # /W4 # Enable high-level warnings ) set(DEBUG_CXX_FLAGS /Od # Disable optimization for debugging /Zi # Generate complete debugging information /RTC1 # Enable runtime error checks /Ob0 # Disable inline expansion /W3 # Enable standard warnings # /W4 # Enable high-level warnings ) set(RELEASE_C_FLAGS /O2 # Optimize for speed /Ot # Favor fast code /Oi # Generate intrinsic functions /GL # Enable whole program optimization /Ob2 # Enable inline expansion /W3 # Enable standard warnings # /W4 # Enable high-level warnings ) set(RELEASE_CXX_FLAGS /O2 # Optimize for speed /Ot # Favor fast code /Oi # Generate intrinsic functions /GL # Enable whole program optimization /Ob2 # Enable inline expansion /W3 # Enable standard warnings # /W4 # Enable high-level warnings ) #------------------------------------------------ #--- Project configuration --- #------------------------------------------------ # Define the project settings project("kwa.fr") # Source directory set(SRC_DIR "src" ) # Resource files (add resource files here if needed) set(RESOURCE_FILES # "src/file.rc" ) #------------------------------------------------ #--- Sanity checks --- #------------------------------------------------ # Ensure build type is set (Debug, Release, etc.) if(NOT CMAKE_BUILD_TYPE) message(FATAL_ERROR "CMAKE_BUILD_TYPE must be set") endif() # Ensure DEV_LIB environment variable is defined (used for external libraries) if(NOT DEFINED ENV{DEV_LIB}) message(FATAL_ERROR "DEV_LIB environment variable must be defined") endif() set(DEV_LIB $ENV{DEV_LIB}) #------------------------------------------------ #--- Include directories --- #------------------------------------------------ # General include directories (add your common include paths here) set(GENERAL_INCLUDE_DIRS "src" "sdi_toolBox_1.0.x/toolBox" "sdi_toolBox_2.x.x/toolBox" "${DEV_LIB}/boost_1_87_0" "${DEV_LIB}/wxWidgets-3.2.8/include/msvc" "${DEV_LIB}/wxWidgets-3.2.8/include" "${DEV_LIB}/openssl-3.5.0/include" "${DEV_LIB}/hidapi-0.15.0/include" "${DEV_LIB}/webview2/build/native/include" ) # Additional include directories for Debug configuration set(DEBUG_INCLUDE_DIRS # "path/to/debug/include" ) # Additional include directories for Release configuration set(RELEASE_INCLUDE_DIRS # "path/to/debug/include" ) #------------------------------------------------ #--- Library directories --- #------------------------------------------------ # General library directories (add your common library paths here) set(GENERAL_LIBRARY_DIRS ${CMAKE_BINARY_DIR} "${DEV_LIB}/boost_1_87_0/stage/lib" "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll" "${DEV_LIB}/openssl-3.5.0/lib" "${DEV_LIB}/hidapi-0.15.0/lib" "${DEV_LIB}/webview2/build/native/x64" ) # Additional library directories for Debug configuration set(DEBUG_LIBRARY_DIRS # "path/to/debug/lib" ) # Additional library directories for Release configuration set(RELEASE_LIBRARY_DIRS # "path/to/debug/lib" ) #------------------------------------------------ #--- Preprocessor definitions --- #------------------------------------------------ # General preprocessor definitions (add your common defines here) set(GENERAL_PREPROCESSOR_DEFINITIONS "_CRT_SECURE_NO_DEPRECATE" "_CRT_NONSTDC_NO_DEPRECATE" "_UNICODE" "_WINDOWS" "NOMINMAX" "UNICODE" "WIN32" "WIN32_LEAN_AND_MEAN" "WXUSINGDLL" ) # Additional preprocessor definitions for Debug configuration set(DEBUG_PREPROCESSOR_DEFINITIONS "_DEBUG" "DEBUG" "WXDEBUG" ) # Additional preprocessor definitions for Release configuration set(RELEASE_PREPROCESSOR_DEFINITIONS "NDEBUG" ) #------------------------------------------------ #--- Libraries and DLLs --- #------------------------------------------------ # General libraries to link (add your common libraries here) set(GENERAL_LIB "WebView2Loader.dll.lib" "hidapid.lib" ) # Additional libraries for Debug configuration set(DEBUG_LIB # "libDebug.lib" "wxmsw32ud_webview.lib" ) # Additional libraries for Release configuration set(RELEASE_LIB # "libRelease.lib" "wxmsw32u_webview.lib" ) # General DLLs to copy after build (add your common DLLs here) set(GENERAL_BIN "${DEV_LIB}/webview2/build/native/x64/WebView2Loader.dll" ) # Additional DLLs for Debug configuration set(DEBUG_BIN "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxbase32ud_vc_x64_custom.dll" "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxmsw32ud_core_vc_x64_custom.dll" "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxmsw32ud_webview_vc_x64_custom.dll" ) # Additional DLLs for Release configuration set(RELEASE_BIN "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxbase32u_vc_x64_custom.dll" "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxmsw32u_core_vc_x64_custom.dll" "${DEV_LIB}/wxWidgets-3.2.8/lib/vc_x64_dll/wxmsw32u_webview_vc_x64_custom.dll" ) #------------------------------------------------ #--- WebView2 SDK --- #------------------------------------------------ #------------------------------------------------ #--- MSVC Debug Information Format Policy --- #------------------------------------------------ # Ensure CMake policy CMP0141 is set to NEW to control the MSVC debug information format. # This sets CMAKE_MSVC_DEBUG_INFORMATION_FORMAT to "EditAndContinue" for Debug and RelWithDebInfo configurations, # and to "ProgramDatabase" for other configurations, but only when using the MSVC compiler. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") endif() #------------------------------------------------ #--- Source files gathering --- #------------------------------------------------ # Collect all C and C++ source files from each directory in SRC_DIR set(SOURCES_C "") set(SOURCES_CPP "") foreach(DIR IN LISTS SRC_DIR) file(GLOB_RECURSE DIR_SOURCES_C "${DIR}/*.c") file(GLOB_RECURSE DIR_SOURCES_CPP "${DIR}/*.cpp") list(APPEND SOURCES_C ${DIR_SOURCES_C}) list(APPEND SOURCES_CPP ${DIR_SOURCES_CPP}) endforeach() #------------------------------------------------ #--- Target definition --- #------------------------------------------------ # Define the main executable target message(STATUS "APP_WIN32='${APP_WIN32}'") if(APP_WIN32) add_executable(${PROJECT_NAME} WIN32 ${SOURCES_C} ${SOURCES_CPP} ${RESOURCE_FILES} ) else() add_executable(${PROJECT_NAME} ${SOURCES_C} ${SOURCES_CPP} ${RESOURCE_FILES} ) endif() #------------------------------------------------ #--- Target properties setup --- #------------------------------------------------ # Setup include directories target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE ${GENERAL_INCLUDE_DIRS} $<$:${DEBUG_INCLUDE_DIRS}> $<$:${RELEASE_INCLUDE_DIRS}> ) # Setup library directories target_link_directories(${PROJECT_NAME} PRIVATE ${GENERAL_LIBRARY_DIRS} $<$:${DEBUG_LIBRARY_DIRS}> $<$:${RELEASE_LIBRARY_DIRS}> ) # Setup preprocessor definitions target_compile_definitions(${PROJECT_NAME} PRIVATE ${GENERAL_PREPROCESSOR_DEFINITIONS} $<$:${DEBUG_PREPROCESSOR_DEFINITIONS}> $<$:${RELEASE_PREPROCESSOR_DEFINITIONS}> ) # Setup linked libraries target_link_libraries(${PROJECT_NAME} PRIVATE ${GENERAL_LIB} $<$:${DEBUG_LIB}> $<$:${RELEASE_LIB}> ) # Setup compiler options set(PROJET_C_FLAGS ${GENERAL_C_FLAGS} $<$:${DEBUG_C_FLAGS}> $<$:${RELEASE_C_FLAGS}> ) set(PROJET_CXX_FLAGS ${GENERAL_CXX_FLAGS} $<$:${DEBUG_CXX_FLAGS}> $<$:${RELEASE_CXX_FLAGS}> ) target_compile_options(${PROJECT_NAME} PRIVATE $<$:${PROJET_C_FLAGS}> # Apply to C files $<$:${PROJET_CXX_FLAGS}> # Apply to C++ files ) # Setup compiler and linker options (MSVC specific) if(MSVC) target_link_options(${PROJECT_NAME} PRIVATE "/ignore:4099" "/PROFILE") endif() #------------------------------------------------ #--- Post-build: Copy DLLs --- #------------------------------------------------ # Copy DLLs to the output directory after build foreach(dll IN LISTS GENERAL_BIN) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${dll}" "${CMAKE_BINARY_DIR}" VERBATIM ) endforeach() if(CMAKE_BUILD_TYPE STREQUAL "Debug") foreach(dll IN LISTS DEBUG_BIN) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${dll}" "${CMAKE_BINARY_DIR}" VERBATIM ) endforeach() elseif(CMAKE_BUILD_TYPE STREQUAL "Release") foreach(dll IN LISTS RELEASE_BIN) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${dll}" "${CMAKE_BINARY_DIR}" VERBATIM ) endforeach() endif() #------------------------------------------------ #--- Project compilation log --- #------------------------------------------------ # Print project and environment information for diagnostics message(STATUS "--------------------------------------------------------") message(STATUS "┏(-_-)┛┗(-_-)┓┗(-_-)┛┏(-_-)┓┏(-_-)┓┗(-_-)┛┏(-_-)┛┗(-_-)┓") message(STATUS "--------------------------------------------------------") message(STATUS "--- Platform Information -------------------------------") message(STATUS "System Name: ${CMAKE_SYSTEM_NAME}") message(STATUS "Processor: ${CMAKE_SYSTEM_PROCESSOR}") message(STATUS "CMake Generator: ${CMAKE_GENERATOR}") message(STATUS "--------------------------------------------------------") message(STATUS "--- Compiler/Language Settings -------------------------") message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS "C Standard: ${CMAKE_C_STANDARD}") message(STATUS "C Compiler ID: ${CMAKE_C_COMPILER_ID}") message(STATUS "C Compiler Version: ${CMAKE_C_COMPILER_VERSION}") message(STATUS "C Common Compiler Flags: ${GENERAL_C_FLAGS}") message(STATUS "C Debug Compiler Flags: ${DEBUG_C_FLAGS}") message(STATUS "C Release Compiler Flags: ${RELEASE_C_FLAGS}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "C++ Compiler ID: ${CMAKE_CXX_COMPILER_ID}") message(STATUS "C++ Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}") message(STATUS "C++ Common Compiler Flags: ${GENERAL_CXX_FLAGS}") message(STATUS "C++ Debug Compiler Flags: ${DEBUG_CXX_FLAGS}") message(STATUS "C++ Release Compiler Flags: ${RELEASE_CXX_FLAGS}") message(STATUS "Common Linker Flags: ${CMAKE_EXE_LINKER_FLAGS}") message(STATUS "Debug Linker Flags: ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") message(STATUS "Release Linker Flags: ${CMAKE_EXE_LINKER_FLAGS_RELEASE}") message(STATUS "--------------------------------------------------------") message(STATUS "--- Path Information -----------------------------------") message(STATUS "Source Dir: ${CMAKE_CURRENT_SOURCE_DIR}") message(STATUS "Binary Dir: ${CMAKE_CURRENT_BINARY_DIR}") if(MSVC) message(STATUS "--------------------------------------------------------") message(STATUS "--- Microsoft Visual C++ (MSVC) Information ------------") # Check the major compiler version if(MSVC_VERSION GREATER_EQUAL 1950) message(STATUS "MSVC Compiler Version: ${MSVC_VERSION} (Visual Studio 2026 or newer)") elseif(MSVC_VERSION GREATER_EQUAL 1930) message(STATUS "MSVC Compiler Version: ${MSVC_VERSION} (Visual Studio 2022)") endif() message(STATUS "MSVC Toolset Version: ${MSVC_TOOLSET_VERSION}") endif() message(STATUS "--------------------------------------------------------") message(STATUS "--- Project Information --------------------------------") message(STATUS "Project Name: ${PROJECT_NAME}") message(STATUS "Preset Name: ${PRESET_NAME}") message(STATUS "--------------------------------------------------------") message(STATUS "┏(-_-)┛┗(-_-)┓┗(-_-)┛┏(-_-)┓┏(-_-)┓┗(-_-)┛┏(-_-)┛┗(-_-)┓") message(STATUS "--------------------------------------------------------")