From af815c2f362f8025639a0bf79d6f48a6e28a4a4a Mon Sep 17 00:00:00 2001 From: Jackson Coxson Date: Wed, 20 Aug 2025 12:42:49 -0600 Subject: [PATCH] cmake for building idevice++ --- cpp/CMakeLists.txt | 117 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 cpp/CMakeLists.txt diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt new file mode 100644 index 0000000..ea895be --- /dev/null +++ b/cpp/CMakeLists.txt @@ -0,0 +1,117 @@ +cmake_minimum_required(VERSION 3.16) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Project +project(idevice++ + VERSION 0.1.0 + LANGUAGES CXX +) + +# ---- Options --------------------------------------------------------------- + +# Path to the Rust static library (override on the command line if needed): +# cmake -DIDEVICE_FFI_PATH=/absolute/path/to/libidevice_ffi.a .. +set(IDEVICE_FFI_PATH + "${CMAKE_CURRENT_SOURCE_DIR}/../target/release/libidevice_ffi.a" + CACHE FILEPATH "Path to libidevice_ffi.a produced by Rust build" +) + +# Optional extra libraries/frameworks if your Rust/C bridge needs them: +# e.g. -framework CoreFoundation on macOS, etc. +set(IDEVICEPP_EXTRA_LIBS + "" + CACHE STRING "Extra libraries to link (space-separated)" +) + +# ---- Tooling --------------------------------------------------------------- + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Helpful for shared libs + +# Threads +find_package(Threads REQUIRED) + +# On some platforms dl is required for Rust staticlibs that use libdl +include(CheckLibraryExists) +set(HAVE_LIBDL FALSE) +if(UNIX AND NOT APPLE) + check_library_exists(dl dlopen "" HAVE_LIBDL) +endif() + +# ---- Imported Rust static library ------------------------------------------ + +if(NOT EXISTS "${IDEVICE_FFI_PATH}") + message(FATAL_ERROR "IDEVICE_FFI_PATH does not exist: ${IDEVICE_FFI_PATH}") +endif() + +add_library(idevice_ffi STATIC IMPORTED GLOBAL) +set_target_properties(idevice_ffi PROPERTIES + IMPORTED_LOCATION "${IDEVICE_FFI_PATH}" +) + +# ---- Our C++ library ------------------------------------------------------- + +# Collect sources (convenience: tracks new files when you re-run CMake) +file(GLOB_RECURSE IDEVICEPP_SOURCES + CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc" + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cxx" +) + +# Respect BUILD_SHARED_LIBS (OFF=static, ON=shared) +add_library(${PROJECT_NAME}) +target_sources(${PROJECT_NAME} PRIVATE ${IDEVICEPP_SOURCES}) + +# Public headers live under include/, e.g. include/idevice++/Foo.hpp +target_include_directories(${PROJECT_NAME} + PUBLIC + "$" + "$" +) + +# Link dependencies +target_link_libraries(${PROJECT_NAME} + PUBLIC + idevice_ffi + Threads::Threads +) + +# Link libdl on Linux if present +if(HAVE_LIBDL) + target_link_libraries(${PROJECT_NAME} PUBLIC dl) +endif() + +# Windows winsock (if you ever build there) +if(WIN32) + target_link_libraries(${PROJECT_NAME} PUBLIC ws2_32) +endif() + +# Extra user-specified libs/frameworks +if(IDEVICEPP_EXTRA_LIBS) + # Split by spaces and link each one + separate_arguments(_extra_libs NATIVE_COMMAND ${IDEVICEPP_EXTRA_LIBS}) + target_link_libraries(${PROJECT_NAME} PUBLIC ${_extra_libs}) +endif() + +# Visibility / warnings (tweak to taste) +if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE /permissive- /W4 /WX-) +else() + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic) +endif() + +# ---- Examples (optional) --------------------------------------------------- + +option(BUILD_EXAMPLES "Build examples in examples/ directory" OFF) +if(BUILD_EXAMPLES) + file(GLOB EXAMPLE_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/examples/*.cpp") + foreach(ex_src IN LISTS EXAMPLE_SOURCES) + get_filename_component(exe_name "${ex_src}" NAME_WE) + add_executable(${exe_name} "${ex_src}") + target_link_libraries(${exe_name} PRIVATE ${PROJECT_NAME}) + target_include_directories(${exe_name} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include") + endforeach() +endif() +