mirror of
https://github.com/cmclark00/retro-imager.git
synced 2025-05-18 16:05:21 +01:00
- Adds "hidden" shift+ctrl+X shortcut for eXpert image customization options. Allows one to set certain options on RPI OS images, namely: * disable overscan * set hostname * enable ssh and - set Pi user password if using password authentication OR - set authorized_keys (if running Imager on Linux/Mac this will have contents of ~/.ssh/id_rsa.pub prefilled) * configure wifi settings (if computer running Imager is connected by wifi it will prefill wifi SSID and if on Windows also PSK). * set time zone and keyboard layout Related to feature requests/issues: Ref #127 Ref #86 Ref #102 Ref #73 Ref #68 Ref #25 Ref #12 - Option Window also allows setting a couple other general settings: * Adds option for audible notification (beep) when imaging completes. Closes #46 * Adds option not to eject media when done. Closes #144 - No longer suspends a number of Windows services during Imaging (We want Windows to detect the drive and mount it, or we may not be able to alter files on FAT partition).
258 lines
11 KiB
CMake
258 lines
11 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
# Copyright (C) 2020 Raspberry Pi (Trading) Limited
|
|
|
|
cmake_minimum_required(VERSION 2.8.12)
|
|
if (APPLE)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
project(rpi-imager LANGUAGES CXX C)
|
|
set(IMAGER_VERSION_MAJOR 1)
|
|
set(IMAGER_VERSION_MINOR 6)
|
|
set(IMAGER_VERSION_STR "${IMAGER_VERSION_MAJOR}.${IMAGER_VERSION_MINOR}")
|
|
set(IMAGER_VERSION_CSV "${IMAGER_VERSION_MAJOR},${IMAGER_VERSION_MINOR},0,0")
|
|
add_definitions(-DIMAGER_VERSION_STR="${IMAGER_VERSION_STR}")
|
|
add_definitions(-DIMAGER_VERSION_CSV=${IMAGER_VERSION_CSV})
|
|
|
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
set(CMAKE_AUTOMOC ON)
|
|
set(CMAKE_AUTORCC ON)
|
|
|
|
# Adding headers explicity so they are displayed in Qt Creator
|
|
set(HEADERS config.h imagewriter.h networkaccessmanagerfactory.h nan.h drivelistitem.h drivelistmodel.h drivelistmodelpollthread.h driveformatthread.h powersaveblocker.h
|
|
downloadthread.h downloadextractthread.h localfileextractthread.h downloadstatstelemetry.h dependencies/mountutils/src/mountutils.hpp dependencies/sha256crypt/sha256crypt.h)
|
|
|
|
# Add dependencies
|
|
if (APPLE)
|
|
set_source_files_properties("icons/rpi-imager.icns" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
|
set(DEPENDENCIES acceleratedcryptographichash.cpp mac/macfile.cpp mac/macfile.h dependencies/mountutils/src/darwin/functions.cpp
|
|
dependencies/drivelist/src/darwin/list.mm dependencies/drivelist/src/darwin/REDiskList.m icons/rpi-imager.icns)
|
|
enable_language(OBJC C)
|
|
elseif (UNIX)
|
|
set(DEPENDENCIES acceleratedcryptographichash.cpp dependencies/mountutils/src/linux/functions.cpp linux/linuxdrivelist.cpp)
|
|
find_package(Qt5DBus)
|
|
if(Qt5DBus_FOUND)
|
|
set(DEPENDENCIES ${DEPENDENCIES} linux/udisks2api.cpp linux/udisks2api.h)
|
|
set(EXTRALIBS Qt5::DBus)
|
|
message("udisks2 support enabled")
|
|
else()
|
|
message("DBUS not found. Disabling udisks2 support")
|
|
endif()
|
|
elseif (WIN32)
|
|
set(DEPENDENCIES acceleratedcryptographichash.cpp dependencies/mountutils/src/windows/functions.cpp dependencies/drivelist/src/windows/list.cpp
|
|
windows/winfile.cpp windows/winfile.h
|
|
windows/rpi-imager.rc)
|
|
find_package(Qt5WinExtras REQUIRED)
|
|
set(EXTRALIBS setupapi wlanapi Qt5::WinExtras)
|
|
endif()
|
|
|
|
include_directories(BEFORE .)
|
|
|
|
# Test if we need libatomic
|
|
include(CheckCXXSourceCompiles)
|
|
check_cxx_source_compiles("
|
|
#include <atomic>
|
|
#include <stdint.h>
|
|
int main() {
|
|
std::atomic<int64_t> x;
|
|
x = 1;
|
|
return (int) x;
|
|
}"
|
|
atomicbuiltin)
|
|
|
|
if (NOT atomicbuiltin)
|
|
find_library(ATOMIC_LIBRARY NAMES atomic libatomic.so.1)
|
|
if (NOT ATOMIC_LIBRARY)
|
|
message( FATAL_ERROR "Missing libatomic while architecture does need it" )
|
|
endif()
|
|
endif()
|
|
|
|
set(SOURCES "main.cpp" "imagewriter.cpp" "networkaccessmanagerfactory.cpp"
|
|
"drivelistitem.cpp" "drivelistmodel.cpp" "drivelistmodelpollthread.cpp" "downloadthread.cpp" "downloadextractthread.cpp"
|
|
"driveformatthread.cpp" "localfileextractthread.cpp" "powersaveblocker.cpp" "downloadstatstelemetry.cpp" "qml.qrc" "dependencies/sha256crypt/sha256crypt.c")
|
|
|
|
find_package(Qt5 COMPONENTS Core Quick LinguistTools Svg OPTIONAL_COMPONENTS Widgets)
|
|
if (Qt5Widgets_FOUND)
|
|
set(EXTRALIBS ${EXTRALIBS} Qt5::Widgets)
|
|
endif()
|
|
|
|
#qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} i18n/rpi-imager_en.ts i18n/rpi-imager_nl.ts i18n/rpi-imager_zh_cn.ts i18n/rpi-imager_tr.ts i18n/rpi-imager_fr.ts i18n/rpi-imager_de.ts i18n/rpi-imager_sk.ts i18n/rpi-imager_it.ts)
|
|
qt5_add_translation(QM_FILES i18n/rpi-imager_en.ts i18n/rpi-imager_nl.ts i18n/rpi-imager_zh_cn.ts i18n/rpi-imager_tr.ts i18n/rpi-imager_fr.ts i18n/rpi-imager_de.ts i18n/rpi-imager_sk.ts i18n/rpi-imager_it.ts)
|
|
configure_file(i18n/translations.qrc "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)
|
|
set(SOURCES ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc ${QM_FILES})
|
|
|
|
if (WIN32)
|
|
# Adding WIN32 prevents a console window being opened on Windows
|
|
add_executable(${PROJECT_NAME} WIN32 ${SOURCES} ${HEADERS} ${DEPENDENCIES})
|
|
else()
|
|
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${DEPENDENCIES})
|
|
endif()
|
|
|
|
# Because dependencies are typically not available by default on Windows, build bundled code
|
|
if (WIN32)
|
|
# Target Windows 7 (needed for drivelist module)
|
|
add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
|
|
|
|
find_package(OpenSSL REQUIRED)
|
|
|
|
# Bundled zlib
|
|
add_subdirectory(dependencies/zlib-1.2.11)
|
|
set(ZLIB_LIBRARY zlibstatic)
|
|
set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib-1.2.11)
|
|
|
|
# Bundled libcurl
|
|
set(CMAKE_CURL_INCLUDES)
|
|
set(CURL_LIBRARIES cmcurl)
|
|
add_subdirectory(dependencies/cmcurl)
|
|
set(CURL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/cmcurl/include)
|
|
|
|
# Bundled liblzma
|
|
add_subdirectory(dependencies/cmliblzma)
|
|
set(LIBLZMA_HAS_AUTO_DECODER 1)
|
|
set(LIBLZMA_HAS_EASY_ENCODER 1)
|
|
set(LIBLZMA_HAS_LZMA_PRESET 1)
|
|
set(LIBLZMA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/cmliblzma/liblzma/api)
|
|
set(LIBLZMA_LIBRARY cmliblzma)
|
|
|
|
# Bundled libarchive
|
|
set(ENABLE_TEST OFF CACHE BOOL "")
|
|
set(ENABLE_TAR OFF CACHE BOOL "")
|
|
set(ENABLE_CPIO OFF CACHE BOOL "")
|
|
set(ENABLE_CAT OFF CACHE BOOL "")
|
|
add_subdirectory(dependencies/libarchive-3.4.2)
|
|
set(LibArchive_LIBRARIES archive_static)
|
|
set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.4.2/libarchive)
|
|
|
|
# Bundled fat32format
|
|
add_subdirectory(dependencies/fat32format)
|
|
add_dependencies(${PROJECT_NAME} fat32format)
|
|
|
|
# Strip debug symbols
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_STRIP} "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe")
|
|
|
|
# Code signing
|
|
find_program(SIGNTOOL "signtool.exe" PATHS "c:/Program Files (x86)/Microsoft SDKs/ClickOnce/SignTool")
|
|
if (NOT SIGNTOOL)
|
|
message(FATAL_ERROR "Unable to locate signtool.exe used for code signing")
|
|
endif()
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND "${SIGNTOOL}" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe")
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND "${SIGNTOOL}" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a "${CMAKE_BINARY_DIR}/dependencies/fat32format/fat32format.exe")
|
|
|
|
# Windeploy
|
|
find_program(WINDEPLOYQT "windeployqt.exe" PATHS "${Qt5_DIR}/../../../bin")
|
|
if (NOT WINDEPLOYQT)
|
|
message(FATAL_ERROR "Unable to locate windeployqt.exe")
|
|
endif()
|
|
|
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/deploy")
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe" "${CMAKE_BINARY_DIR}/dependencies/fat32format/fat32format.exe" "${CMAKE_SOURCE_DIR}/license.txt"
|
|
"${CMAKE_BINARY_DIR}/deploy")
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy
|
|
"${Qt5_DIR}/../../../bin/libssl-1_1.dll" "${Qt5_DIR}/../../../bin/libcrypto-1_1.dll"
|
|
"${CMAKE_BINARY_DIR}/deploy")
|
|
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/windows/rpi-imager.nsi.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/rpi-imager.nsi"
|
|
@ONLY)
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND "${WINDEPLOYQT}" --no-translations --no-webkit2 --no-opengl-sw --angle --qmldir "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/deploy/rpi-imager.exe")
|
|
|
|
# Remove excess files
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E remove
|
|
"${CMAKE_BINARY_DIR}/deploy/imageformats/qtiff.dll"
|
|
"${CMAKE_BINARY_DIR}/deploy/imageformats/qwebp.dll"
|
|
"${CMAKE_BINARY_DIR}/deploy/imageformats/qgif.dll")
|
|
|
|
elseif(APPLE)
|
|
find_package(ZLIB REQUIRED)
|
|
find_package(CURL REQUIRED)
|
|
|
|
# Bundled liblzma
|
|
add_subdirectory(dependencies/cmliblzma)
|
|
set(LIBLZMA_HAS_AUTO_DECODER 1)
|
|
set(LIBLZMA_HAS_EASY_ENCODER 1)
|
|
set(LIBLZMA_HAS_LZMA_PRESET 1)
|
|
set(LIBLZMA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/cmliblzma/liblzma/api)
|
|
set(LIBLZMA_LIBRARY cmliblzma)
|
|
|
|
# Bundled libarchive
|
|
set(ENABLE_TEST OFF CACHE BOOL "")
|
|
set(ENABLE_TAR OFF CACHE BOOL "")
|
|
set(ENABLE_CPIO OFF CACHE BOOL "")
|
|
set(ENABLE_CAT OFF CACHE BOOL "")
|
|
add_subdirectory(dependencies/libarchive-3.4.2)
|
|
set(LibArchive_LIBRARIES archive_static)
|
|
set(LibArchive_INCLUDE_DIR dependencies/libarchive-3.4.2/libarchive)
|
|
|
|
find_library(Cocoa Cocoa)
|
|
find_library(CoreFoundation CoreFoundation)
|
|
find_library(DiskArbitration DiskArbitration)
|
|
find_library(Security Security)
|
|
set(EXTRALIBS ${EXTRALIBS} ${CoreFoundation} ${DiskArbitration} ${Security} ${Cocoa})
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE YES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.plist.in)
|
|
|
|
find_program(MACDEPLOYQT "macdeployqt" PATHS "${Qt5_DIR}/../../../bin")
|
|
if (NOT MACDEPLOYQT)
|
|
message(FATAL_ERROR "Unable to locate macdeployqt")
|
|
endif()
|
|
|
|
add_custom_command(TARGET ${PROJECT_NAME}
|
|
POST_BUILD
|
|
COMMAND "${MACDEPLOYQT}" "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app" -qmldir="${CMAKE_CURRENT_SOURCE_DIR}")
|
|
|
|
else()
|
|
find_package(CURL 7.32.0 REQUIRED)
|
|
find_package(LibArchive 3.2.0 REQUIRED)
|
|
find_package(OpenSSL REQUIRED)
|
|
if (NOT CMAKE_CROSSCOMPILING)
|
|
find_program(LSBLK "lsblk")
|
|
if (NOT LSBLK)
|
|
message(FATAL_ERROR "Unable to locate lsblk (used for disk enumeration)")
|
|
endif()
|
|
|
|
execute_process(COMMAND "${LSBLK}" "--json" RESULT_VARIABLE ret)
|
|
if (ret EQUAL "1")
|
|
message(FATAL_ERROR "util-linux package too old. lsblk does not support --json (used for disk enumeration)")
|
|
endif()
|
|
endif()
|
|
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/linux/rpi-imager.metainfo.xml.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/rpi-imager.metainfo.xml"
|
|
@ONLY)
|
|
|
|
install(TARGETS rpi-imager DESTINATION bin)
|
|
install(FILES icons/rpi-imager.png DESTINATION share/icons/hicolor/128x128/apps)
|
|
install(FILES linux/rpi-imager.desktop DESTINATION share/applications)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/rpi-imager.metainfo.xml" DESTINATION share/metainfo)
|
|
endif()
|
|
|
|
get_target_property(QT_TARGET_TYPE Qt5::Core TYPE)
|
|
if(${QT_TARGET_TYPE} STREQUAL "STATIC_LIBRARY")
|
|
find_package(Qt5QmlImportScanner REQUIRED)
|
|
qt5_import_qml_plugins(${PROJECT_NAME})
|
|
qt5_import_plugins(${PROJECT_NAME} INCLUDE Qt5::QSvgPlugin)
|
|
endif()
|
|
|
|
include_directories(${CURL_INCLUDE_DIR} ${LibArchive_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR})
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick Qt5::Svg ${CURL_LIBRARIES} ${LibArchive_LIBRARIES} ${OPENSSL_LIBRARIES} ${ATOMIC_LIBRARY} ${EXTRALIBS})
|