summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 8826e5e7b0642f14544015aae7c38d1a070e0dcd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
cmake_minimum_required(VERSION 3.18)

set(CMAKE_CXX_STANDARD 23)
include_guard(GLOBAL)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC OFF)

# set(TARGET_SYSROOT /home/nikita/rpi/rpi-sysroot)
set(TARGET_SYSROOT /home/nikita/rpi/rpi_zero-sysroot)
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
message("CMAKE_SYSROOT: ${CMAKE_SYSROOT}")
set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu)

# arch:
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig)
# gentoo:
# set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:/usr/lib/aarch64-rpi5-linux-gnu/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")


# NOTE: in case of header issues during inno-maker driver compilation - try to
# reinstall linux-headers-<your exact running kernel version here>, like this
# sudo apt install linux-headers-6.6.74+rpt-rpi-v8 --reinstall

# NOTE: on your rpi you'll need to install
# libcamera-dev, libcamera-ipa (TODO: check if ipa is needed)
# libqt6gui6
# libqt6httpserver6
# libqt6serialport6 (if you want to control your 3d printer from rpi)
# libtbb-dev (or just comment out source code related to execution policies)
# libpistache-dev - TODO: remove this dep, orpheus uses qt http server
# don't forget to rsync local copy of rpi fs with real rpi fs
# NOTE: to be able to run orpheus remotely from QtCreator, run this on your RPI:
# $ sudo chown -R user:adm /usr/local/bin/
# NOTE: to use rotary encoder you'll need WiringPi which is not in rpi repos, so
# $ git clone https://github.com/WiringPi/WiringPi.git
# check README.md for installation instructions. You may get this while installing
# .deb package, but it's ok:
# N: Download is performed unsandboxed as root as file
# '/home/user/git/third_party/WiringPi/wiringpi_3.12_arm64.deb' couldn't be
# accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)


# NOTE: I've added ld symlink on host to be able to run moc
# arch:
# sudo ln -s /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 /lib/ld-linux-aarch64.so.1
# gentoo:
# sudo ln -s /usr/aarch64-rpi5-linux-gnu/lib/ld-linux-aarch64.so.1 /lib/ld-linux-aarch64.so.1
#
# TODO: check how to add this env var to cmake, it's needed to run moc,
# otherwise you'll get the following error
#
# ...../rpi-sysroot/usr/lib/qt6/libexec/moc: error while loading shared libraries:
# libpcre2-16.so.0: cannot open shared object file: No such file or directory
#
# export this path for qtcreator:
# LD_LIBRARY_PATH=/home/nikita/rpi/rpi-sysroot/usr/lib/aarch64-linux-gnu/:$LD_LIBRARY_PATH
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}/usr)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT})

find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBCAMERA REQUIRED IMPORTED_TARGET libcamera)
find_library(LIBCAMERA_LIBRARY libcamera.so REQUIRED)
find_library(LIBCAMERA_BASE_LIBRARY libcamera-base.so REQUIRED)
message(STATUS ${CAMERA_INCLUDE_DIRS})
message(STATUS ${LIBCAMERA_LIBRARY})
message(STATUS ${LIBCAMERA_BASE_LIBRARY})
pkg_check_modules(CAMERA REQUIRED libcamera)
set(LIBCAMERA_LIBRARIES "${LIBCAMERA_LIBRARY}" "${LIBCAMERA_BASE_LIBRARY}")
project(orpheus LANGUAGES CXX)
find_package(OpenMP)
if (OPENMP_FOUND)
    message("found openmp")
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")

find_package(Qt6 6.4 REQUIRED COMPONENTS Gui Quick HttpServer SerialPort)

find_package(TBB REQUIRED)

qt_standard_project_setup(REQUIRES 6.4)

include_directories("${CAMERA_INCLUDE_DIRS}" src)

# libpistache
pkg_check_modules(Pistache REQUIRED IMPORTED_TARGET libpistache)

# add_executable(${PROJECT_NAME}
file(GLOB_RECURSE SOURCES src/*.h src/*.cpp src/*.c src/*.qrc)
message("sources: ${SOURCES}")
qt_add_executable(apporpheus ${SOURCES})
target_link_libraries(app${PROJECT_NAME}
    PRIVATE
    "${LIBCAMERA_LIBRARIES}"
    PkgConfig::Pistache
    Qt6::Gui
    Qt6::HttpServer
    Qt6::SerialPort
    wiringPi
    TBB::tbb
)

include(GNUInstallDirs)
install(TARGETS app${PROJECT_NAME}
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if ("${CMAKE_BUILD_TYPE}" MATCHES "Release")
    message("it's Release")
    add_compile_options(-Ofast -fno-unroll-loops -Wall)
    # add_compile_options(-Wall -Wextra -Wpedantic)
    # add_compile_options(-O3 -Wall)
else()
    message("it's not Release")
endif()