Files
RMHook/CMakeLists.txt
√(noham)² 400e698765 Add native HTTP server, CLI scripts and docs
Implement a native macOS HTTP server for RMHook and wire it into the app. Adds HttpServer.h/.mm (CFSocket-based) with start/stop/isRunning APIs, broadcasts incoming POST /exportFile and /documentAccepted requests to the QML MessageBroker, and starts the server on port 8080 from reMarkable.m. Update CMakeLists to include HttpServer.mm and link Qt Qml when building qmlrebuild mode. Add documentation (docs/HTTP_SERVER.md) and QML snippets for MessageBroker integration, plus Python helper scripts (scripts/http_server.py and scripts/test_http_server.py) for invoking the endpoints. Also add small MessageBroker examples (src/utils/mb.m, src/utils/mb.qml) and update ResourceUtils to include additional QML resources.
2026-02-02 19:52:58 +01:00

146 lines
4.3 KiB
CMake

cmake_minimum_required(VERSION 3.15)
project(RMHook)
enable_language(OBJC OBJCXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# Build mode options
# - rmfakecloud: Redirect reMarkable cloud to rmfakecloud server (default)
# - qmlrebuild: Qt resource data registration hooking
# - dev: Development/reverse engineering mode with all hooks
option(BUILD_MODE_RMFAKECLOUD "Build with rmfakecloud support" ON)
option(BUILD_MODE_QMLREBUILD "Build with QML resource rebuilding" OFF)
option(BUILD_MODE_DEV "Build with dev/reverse engineering hooks" OFF)
# Compiler settings for macOS
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
# Architecture: x86_64 only for reMarkable
set(CMAKE_OSX_ARCHITECTURES "x86_64" "arm64")
# Project root directory
set(PROJECT_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
# Include directories
include_directories(
${PROJECT_ROOT_DIR}/src/core
${PROJECT_ROOT_DIR}/src/utils
${PROJECT_ROOT_DIR}/src/reMarkable
${PROJECT_ROOT_DIR}/libs/include
)
# Find required libraries
find_library(FOUNDATION_LIBRARY Foundation REQUIRED)
find_library(COCOA_LIBRARY Cocoa REQUIRED)
find_library(SECURITY_LIBRARY Security REQUIRED)
# Common libraries
set(LIBS
${FOUNDATION_LIBRARY}
${COCOA_LIBRARY}
${SECURITY_LIBRARY}
${PROJECT_ROOT_DIR}/libs/tinyhook.a # tinyhook for function hooking
${PROJECT_ROOT_DIR}/libs/libzstd.a # libzstd for compression/decompression
z # zlib for compression/decompression
)
# Locate Qt libraries
set(QT_LIB_TARGETS "")
set(_qt_candidate_roots "$ENV{HOME}/Qt/6.10.0")
foreach(_qt_root ${_qt_candidate_roots})
if(_qt_root AND EXISTS "${_qt_root}")
list(APPEND CMAKE_PREFIX_PATH "${_qt_root}")
endif()
endforeach()
find_package(Qt6 COMPONENTS Core Network WebSockets Qml QUIET)
if(Qt6_FOUND)
set(QT_LIB_TARGETS Qt6::Core Qt6::Network Qt6::WebSockets Qt6::Qml)
else()
find_package(Qt5 COMPONENTS Core Network WebSockets Qml QUIET)
if(Qt5_FOUND)
set(QT_LIB_TARGETS Qt5::Core Qt5::Network Qt5::WebSockets Qt5::Qml)
endif()
endif()
if(NOT QT_LIB_TARGETS)
message(FATAL_ERROR "Qt Core, Network and WebSockets not found. Set CMAKE_PREFIX_PATH to your Qt installation.")
endif()
# Common sources
set(COMMON_SOURCES
${PROJECT_ROOT_DIR}/src/utils/MemoryUtils.m
${PROJECT_ROOT_DIR}/src/utils/Constant.m
${PROJECT_ROOT_DIR}/src/utils/ResourceUtils.m
)
# reMarkable dylib
set(REMARKABLE_SOURCES
${PROJECT_ROOT_DIR}/src/reMarkable/reMarkable.m
${PROJECT_ROOT_DIR}/src/reMarkable/DevHooks.m
)
add_library(reMarkable SHARED
${COMMON_SOURCES}
${REMARKABLE_SOURCES}
)
# Set source files as Objective-C++
set_source_files_properties(
${REMARKABLE_SOURCES}
PROPERTIES LANGUAGE OBJCXX
)
set_target_properties(reMarkable PROPERTIES
PREFIX ""
SUFFIX ".dylib"
OUTPUT_NAME "reMarkable"
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_ROOT_DIR}/build/dylibs"
MACOSX_RPATH ON
)
add_definitions(-DQT_NO_VERSION_TAGGING)
# Add build mode compile definitions and conditionally add sources
if(BUILD_MODE_RMFAKECLOUD)
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_RMFAKECLOUD=1)
message(STATUS "Build mode: rmfakecloud (cloud redirection)")
endif()
if(BUILD_MODE_QMLREBUILD)
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_QMLREBUILD=1)
# Enable Qt MOC for MessageBroker (HttpServer is pure Obj-C/Foundation, no MOC needed)
set_target_properties(reMarkable PROPERTIES AUTOMOC ON)
# Add MessageBroker (needs MOC) and HttpServer (native macOS)
target_sources(reMarkable PRIVATE
${PROJECT_ROOT_DIR}/src/utils/MessageBroker.mm
${PROJECT_ROOT_DIR}/src/utils/HttpServer.mm
)
find_package(Qt6 COMPONENTS Qml QUIET)
if(Qt6Qml_FOUND)
target_link_libraries(reMarkable PRIVATE Qt6::Qml)
else()
find_package(Qt5 COMPONENTS Qml QUIET)
if(Qt5Qml_FOUND)
target_link_libraries(reMarkable PRIVATE Qt5::Qml)
endif()
endif()
message(STATUS "Build mode: qmlrebuild (resource hooking)")
endif()
if(BUILD_MODE_DEV)
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_DEV=1)
message(STATUS "Build mode: dev (reverse engineering)")
endif()
target_link_libraries(reMarkable PRIVATE
${LIBS}
${QT_LIB_TARGETS}
)