cmake_minimum_required(VERSION 3.10) project(dropshell VERSION 1.0.0 LANGUAGES CXX) # Force static linking globally set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE) set(CMAKE_POSITION_INDEPENDENT_CODE OFF) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") set(ZLIB_USE_STATIC_LIBS "ON") set(CMAKE_CXX_STANDARD 23) set(CMAKE_C_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Set default build type to Release if not specified if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build (Debug or Release)" FORCE) endif() # Configure build-specific compiler flags set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG") # Configure version information string(TIMESTAMP CURRENT_YEAR "%Y") string(TIMESTAMP CURRENT_MONTH "%m") string(TIMESTAMP CURRENT_DAY "%d") string(TIMESTAMP CURRENT_HOUR "%H") string(TIMESTAMP CURRENT_MINUTE "%M") set(PROJECT_VERSION "${CURRENT_YEAR}.${CURRENT_MONTH}${CURRENT_DAY}.${CURRENT_HOUR}${CURRENT_MINUTE}") string(TIMESTAMP RELEASE_DATE "%Y-%m-%d") # Configure version.hpp file configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/src/version.hpp.in" "${CMAKE_CURRENT_BINARY_DIR}/src/autogen/version.hpp" @ONLY ) # Set CMAKE_MODULE_PATH to include our custom find modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # Auto-detect source files file(GLOB_RECURSE SOURCES "src/*.cpp") file(GLOB_RECURSE HEADERS "src/*.hpp") # Add custom target to run cmake_prebuild.sh at the start of the build process add_custom_target(run_prebuild_script ALL COMMAND ${CMAKE_COMMAND} -E echo "Running cmake_prebuild.sh..." COMMAND ${CMAKE_COMMAND} -E env bash ${CMAKE_CURRENT_SOURCE_DIR}/cmake_prebuild.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) # Add executable add_executable(dropshell ${SOURCES}) add_dependencies(dropshell run_prebuild_script) # Mark the generated files as GENERATED so CMake knows they'll be created during build set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen/_agent-remote.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen/_agent-local.cpp PROPERTIES GENERATED TRUE ) # Explicitly add the generated agent files, as they might not be in the source directory when globbed at the start. target_sources(dropshell PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen/_agent-remote.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen/_agent-local.cpp ) # Set include directories # build dir goes first so that we can use the generated version.hpp target_include_directories(dropshell PRIVATE $ ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/utils ${CMAKE_CURRENT_SOURCE_DIR}/src/contrib ${CMAKE_CURRENT_SOURCE_DIR}/src/commands ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen ) if(WIN32) add_custom_command( TARGET dropshell POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ) endif() # Configure libassert include(FetchContent) FetchContent_Declare( libassert GIT_REPOSITORY https://github.com/jeremy-rifkin/libassert.git GIT_TAG v2.1.5 ) FetchContent_MakeAvailable(libassert) # Add cpptrace FetchContent_Declare( cpptrace GIT_REPOSITORY https://github.com/jeremy-rifkin/cpptrace.git GIT_TAG v0.8.3 ) FetchContent_MakeAvailable(cpptrace) # Add nlohmann/json FetchContent_Declare( nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.3 ) FetchContent_MakeAvailable(nlohmann_json) # Link libraries target_link_libraries(dropshell PRIVATE libassert::assert cpptrace::cpptrace nlohmann_json::nlohmann_json ) # Set static linking flags set_target_properties(dropshell PROPERTIES LINK_FLAGS "-static" ) # Install targets install(TARGETS dropshell RUNTIME DESTINATION $ENV{HOME}/.local/bin )