diff --git a/.github/workflows/linux-build.sh b/.github/workflows/linux-build.sh index b5b4d3b4..56bb9744 100755 --- a/.github/workflows/linux-build.sh +++ b/.github/workflows/linux-build.sh @@ -8,11 +8,11 @@ export BASE=${TMPDIR}/Builder/repos/futurerestore/ cd ${BASE} ln -sf ${DEP_ROOT}/Linux_x86_64_Release/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-x86_64 -DARCH=x86_64 -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_LINKER=ld.lld-13 +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-x86_64 -DARCH=x86_64 -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_LINKER=ld.lld-13 -DNO_PKGCFG make -j4 -l4 -C cmake-build-release-x86_64 cd ${BASE} ln -sf ${DEP_ROOT}/Linux_x86_64_Debug/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-x86_64 -DARCH=x86_64 -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_LINKER=ld.lld-13 +cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-x86_64 -DARCH=x86_64 -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_LINKER=ld.lld-13 -DNO_PKGCFG make -j4 -l4 -C cmake-build-debug-x86_64 llvm-strip-13 -s cmake-build-release-x86_64/src/futurerestore diff --git a/.github/workflows/mac-build.sh b/.github/workflows/mac-build.sh index 18412ee2..5695c4bb 100755 --- a/.github/workflows/mac-build.sh +++ b/.github/workflows/mac-build.sh @@ -7,19 +7,19 @@ export BASE=/Users/runner/work/futurerestore/futurerestore/ cd /Users/runner/work/futurerestore/futurerestore/ ln -sf ${DEP_ROOT}/macOS_x86_64_Release/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-x86_64 -DARCH=x86_64 +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-x86_64 -DARCH=x86_64 -DNO_PKGCFG make -j4 -l4 -C cmake-build-release-x86_64 ln -sf ${DEP_ROOT}/macOS_x86_64_Debug/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-x86_64 -DARCH=x86_64 +cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-x86_64 -DARCH=x86_64 -DNO_PKGCFG make -j4 -l4 -C cmake-build-debug-x86_64 ln -sf ${DEP_ROOT}/macOS_arm64_Release/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-arm64 -DARCH=arm64 +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release-arm64 -DARCH=arm64 -DNO_PKGCFG make -j4 -l4 -C cmake-build-release-arm64 ln -sf ${DEP_ROOT}/macOS_arm64_Debug/{lib/,include/} ${DEP_ROOT}/ -cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-arm64 -DARCH=arm64 +cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug-arm64 -DARCH=arm64 -DNO_PKGCFG make -j4 -l4 -C cmake-build-debug-arm64 llvm-strip -s cmake-build-release-x86_64/src/futurerestore llvm-strip -s cmake-build-release-arm64/src/futurerestore diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d4ff3e2..21126aa9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.22) +find_package(PkgConfig REQUIRED) set(SUBPROJECT_BUILD 1) if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin") if(NOT DEFINED NO_XCODE AND NOT DEFINED ENV{NO_XCODE}) @@ -16,15 +17,17 @@ if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin") set(ARCH "${CMAKE_SYSTEM_PROCESSOR}") endif() endif() - if("${ARCH}" STREQUAL "x86_64" OR "$ENV{ARCH}" STREQUAL "x86_64") - set(MINVER -mmacosx-version-min=10.12) - set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12) - else() - set(MINVER -mmacosx-version-min=11.0) - set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) + if(NOT DEFINED MINVER OR NOT DEFINED "$ENV{MINVER}" AND DEFINED NO_PKGCFG AND "$ENV{NO_PKGCFG}" MATCHES "1") + if("${ARCH}" STREQUAL "x86_64" OR "$ENV{ARCH}" STREQUAL "x86_64") + set(MINVER -mmacosx-version-min=10.12) + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12) + else() + set(MINVER -mmacosx-version-min=11.0) + set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) + endif() endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch ${ARCH} -isysroot ${SYSROOT} ${MINVER} -fembed-bitcode=off -flto=thin -pthread") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch ${ARCH} -isysroot ${SYSROOT} ${MINVER} -fembed-bitcode=off -flto=thin -pthread") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch ${ARCH} -isysroot ${SYSROOT} ${MINVER} -fembed-bitcode=off -flto=thin -pthread -mrelax-all -std=gnu++20") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch ${ARCH} -isysroot ${SYSROOT} ${MINVER} -fembed-bitcode=off -flto=thin -pthread -mrelax-all -std=gnu17") elseif(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--allow-multiple-definition -pthread") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--allow-multiple-definition -pthread") @@ -38,4 +41,5 @@ set(CMAKE_CXX_STANDARD 20) project(futurerestore) add_subdirectory(external/tsschecker) add_subdirectory(external/idevicerestore) -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) + diff --git a/COMPILING.md b/COMPILING.md index 11f4af16..e7c6d21f 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -48,6 +48,12 @@ If you want to build in release mode pass in the RELEASE=1 environment variable. * Example: `RELEASE=1 ./build.sh -DARCH=x86_64` or `RELEASE=0 ./build.sh -DARCH=x86_64` + + If you want to disable pkg-config linking you can provide the `NO_PKGCFG` flag. + + By default pkg-config linking is enabled. dep_root will be used when disabled. + * Example: `./build.sh -DARCH=x86_64 -DNO_PKGCFG` + * or `NO_PKGCFG=1 ./build.sh -DARCH=x86_64` If you want to overwrite the compiler on mac you can provide `NO_XCODE` flag. * Example: `CC=gcc CXX=g++ ./build.sh -DARCH=x86_64 -DNO_XCODE` @@ -58,5 +64,9 @@ * By default it will remove cmake and cache and reconfigure for each subsequent build. The compiled binary will be located at: - * `cmake-build-release/src/futurerestore` for release build - * `cmake-build-debug/src/futurerestore` for debug builds \ No newline at end of file + * `cmake-build-release/src/futurerestore` for release builds + * `cmake-build-debug/src/futurerestore` for debug builds + + Otherwise you can install the binary via: + * `make -C cmake-build-release install` for release builds + * `make -C cmake-build-debug install` for debug builds \ No newline at end of file diff --git a/build.sh b/build.sh index b8fd4790..30768619 100755 --- a/build.sh +++ b/build.sh @@ -1,13 +1,26 @@ -#!/bin/bash +#!/usr/bin/env bash +which cmake >/dev/null +# if [[ "$?" -gt 0 ]]; then echo "[!] cmake not installed or not found, refusing to build!"; exit 1; fi +which make >/dev/null +if [[ "$?" -gt 0 ]]; then echo "[!] make not installed or not found, refusing to build!"; exit 1; fi +echo "[*] Building futurerestore" +export FR_INSTALL_DIR="/usr/local/bin" if [[ -z "$NO_CLEAN" ]]; then rm -rf cmake-build-release cmake-build-debug; fi if [[ "$RELEASE" == "1" ]] then - if [[ ! "$NO_CLEAN" == "1" ]]; then cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release $@; fi - make -C cmake-build-release clean - make -C cmake-build-release - llvm-strip -s cmake-build-release/src/futurerestore + if [[ ! "$NO_CLEAN" == "1" ]]; then cmake -DCMAKE_INSTALL_PREFIX="${FR_INSTALL_DIR}" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-release $@; fi + make -s -C cmake-build-release clean + make -s -C cmake-build-release + if [[ "$?" -gt 0 ]]; then echo "[!] Failed to build futurerestore!"; exit 1; fi + which llvm-strip >/dev/null + if [[ "$?" -lt 1 ]]; then llvm-strip -s cmake-build-release/src/futurerestore; else echo "[!] llvm-strip not installed or not found, not stripping release binary."; fi + echo "[*] Run make -C cmake-build-release install, to install futurerestore or obtain the binary at cmake-build-release/src/futurerestore" + echo "[*] Successfully built futurerestore." else - if [[ ! "$NO_CLEAN" == "1" ]]; then cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug $@ ; fi - make -C cmake-build-debug clean - make -C cmake-build-debug + if [[ ! "$NO_CLEAN" == "1" ]]; then cmake -DCMAKE_INSTALL_PREFIX="${FR_INSTALL_DIR}" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=$(which make) -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_MESSAGE_LOG_LEVEL="WARNING" -G "CodeBlocks - Unix Makefiles" -S ./ -B cmake-build-debug $@ ; fi + make -s -C cmake-build-debug clean + make -s -C cmake-build-debug + if [[ "$?" -gt 0 ]]; then echo "[!] Failed to build futurerestore!"; exit 1; fi + echo "[*] Run make -C cmake-build-debug install, to install futurerestore or obtain the binary at cmake-build-debug/src/futurerestore" + echo "[*] Successfully built futurerestore." fi diff --git a/external/idevicerestore b/external/idevicerestore index 78e077cc..4710028c 160000 --- a/external/idevicerestore +++ b/external/idevicerestore @@ -1 +1 @@ -Subproject commit 78e077ccd41b5ee8d6c35702805a01a954d62cfc +Subproject commit 4710028c9ebc5363847258055b539580a9db904f diff --git a/external/tsschecker b/external/tsschecker index ba70a6ad..9f141b33 160000 --- a/external/tsschecker +++ b/external/tsschecker @@ -1 +1 @@ -Subproject commit ba70a6ad0c818b67028276c430ef221591692d2a +Subproject commit 9f141b333befed9b45203a4f45e49707ec08ff24 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 07ed413c..b07ff9c4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,51 +1,83 @@ project(futurerestore) +set(CMAKE_C_FLAGS_RELEASE "-Os -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-Os -DNDEBUG") +set(CMAKE_C_FLAGS_DEBUG "-g -O0 -DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -DDEBUG") +set(CMAKE_C_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) add_executable(futurerestore main.cpp futurerestore.cpp) target_include_directories(futurerestore PRIVATE - "${CMAKE_SOURCE_DIR}/dep_root/include" "${CMAKE_SOURCE_DIR}/external/idevicerestore/src" "${CMAKE_SOURCE_DIR}/external/tsschecker/external/jssy/jssy" "${CMAKE_SOURCE_DIR}/external/tsschecker/tsschecker") -target_link_directories(futurerestore PRIVATE - "${CMAKE_SOURCE_DIR}/dep_root/lib" - "${CMAKE_SOURCE_DIR}/dep_root/lib/xpwn" - ) -target_link_libraries(futurerestore PRIVATE - z - zip - png16 - crypto - ssl - "-lgeneral" - plist-2.0 - fragmentzip - img4tool - common - xpwn - insn - offsetfinder64 - ipatcher - tsschecker - idevicerestore - jssy - curl - imobiledevice-glue-1.0 - imobiledevice-1.0 - irecovery-1.0 - usbmuxd-2.0 - pthread) -if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin") +set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}") +if(NOT DEFINED NO_PKGCFG AND NOT "$ENV{NO_PKGCFG}" MATCHES "1") + pkg_check_modules(DEPS REQUIRED + libzip + zlib + libpng16 + libcrypto + libssl + libplist-2.0 + libimobiledevice-glue-1.0 + libimobiledevice-1.0 + libirecovery-1.0 + libusbmuxd-2.0 + libgeneral + libcurl + libfragmentzip + libimg4tool + libinsn + liboffsetfinder64 + libipatcher) + target_include_directories(futurerestore PRIVATE "${DEPS_INCLUDE_DIRS}") + target_link_directories(futurerestore PRIVATE "${DEPS_LIBRARY_DIRS}") + target_link_libraries(futurerestore PRIVATE "${DEPS_LIBRARIES}" tsschecker idevicerestore) +else() + target_include_directories(futurerestore PRIVATE + "${CMAKE_SOURCE_DIR}/dep_root/include") + target_link_directories(futurerestore PRIVATE + "${CMAKE_SOURCE_DIR}/dep_root/lib" + "${CMAKE_SOURCE_DIR}/dep_root/lib/xpwn" + ) target_link_libraries(futurerestore PRIVATE + z + zip + png16 + crypto + ssl + "-lgeneral" + plist-2.0 + fragmentzip + img4tool + common + xpwn + insn + offsetfinder64 + ipatcher + tsschecker + idevicerestore + jssy + curl + imobiledevice-glue-1.0 + imobiledevice-1.0 + irecovery-1.0 + usbmuxd-2.0 + pthread) + endif() + if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(futurerestore PRIVATE compression "-framework CoreFoundation" "-framework IOKit") -else() - target_link_libraries(futurerestore PRIVATE - usb-1.0 - dl - udev - lzfse) + else() + target_link_libraries(futurerestore PRIVATE + usb-1.0 + dl + udev + lzfse) endif() execute_process(COMMAND git rev-list --count HEAD WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE VERSION_COMMIT_COUNT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND git rev-parse HEAD WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE VERSION_COMMIT_SHA ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -55,3 +87,6 @@ add_definitions( -DVERSION_COMMIT_COUNT="${VERSION_COMMIT_COUNT}" -DVERSION_COMMIT_SHA="${VERSION_COMMIT_SHA}" -DVERSION_RELEASE="${VERSION_RELEASE}") +install(TARGETS futurerestore + DESTINATION ${CMAKE_INSTALL_PREFIX}) +