Skip to content

Commit

Permalink
Work on CI builds and CMake support
Browse files Browse the repository at this point in the history
  • Loading branch information
emericg committed Feb 6, 2024
1 parent 261cf08 commit a05f770
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 76 deletions.
16 changes: 7 additions & 9 deletions .github/workflows/builds_mobile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ jobs:
submodules: recursive

# Java environment (already installed in 'ubuntu-20.04')
#- name: Install JDK environment
# uses: actions/setup-java@v2
#- name: Setup Java environment
# uses: actions/setup-java@v4
# with:
# distribution: 'zulu'
# java-version: '11'
# java-version: '17'

# Android environment (already installed in 'ubuntu-20.04')
#- name: Setup Android SDK
# uses: android-actions/setup-android@v2
#- name: Setup Android environment
# uses: android-actions/setup-android@v3
#- name: Install Android SDK / NDK / tools
# run: |
# sdkmanager "platforms;android-34"
Expand All @@ -54,12 +54,11 @@ jobs:
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
aqtversion: '==3.1.*'
host: 'linux'
target: 'android'
arch: 'android_arm64_v8a'
modules: qtconnectivity qtcharts qtshadertools qt5compat
aqtversion: '==3.1.*'
py7zrversion: '==0.20.*'
extra: '--autodesktop'

# Setup env
Expand Down Expand Up @@ -89,11 +88,10 @@ jobs:
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
aqtversion: '==3.1.*'
host: 'mac'
target: 'ios'
modules: qtconnectivity qtcharts qtshadertools qt5compat
aqtversion: '==3.1.*'
py7zrversion: '==0.20.*'
extra: '--autodesktop'

# Setup env
Expand Down
165 changes: 103 additions & 62 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,35 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 REQUIRED COMPONENTS Core Bluetooth Network Sql)
find_package(Qt6 REQUIRED COMPONENTS Gui Qml Quick QuickControls2 Svg Widgets Charts)
string(TIMESTAMP CURRENT_TIMESTAMP "%s" UTC)
set(APP_NAME ${CMAKE_PROJECT_NAME})
set(APP_VERSION ${CMAKE_PROJECT_VERSION})
set(APP_VERSION_CODE ${TIMESTAMP})

qt_standard_project_setup()
################################################################################

message(STATUS "[CMAKE] CMAKE_VERSION = ${CMAKE_VERSION}")
message(STATUS "[CMAKE] CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
message(STATUS "[SYSTEM] (HOST) SYSTEM NAME = ${CMAKE_HOST_SYSTEM_NAME}")
message(STATUS "[SYSTEM] (HOST) SYSTEM VERSION = ${CMAKE_HOST_SYSTEM_VERSION}")
message(STATUS "[SYSTEM] (TARGET) SYSTEM NAME = ${CMAKE_SYSTEM_NAME}")
message(STATUS "[SYSTEM] (TARGET) SYSTEM VERSION = ${CMAKE_SYSTEM_VERSION}")
message(STATUS "[PROJECT] SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message(STATUS "[PROJECT] BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
message(STATUS "[PROJECT] TOOLCHAIN_FILE = ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS "[PROJECT] QT_HOST_PATH = ${QT_HOST_PATH}")

################################################################################

qt_add_executable(WatchFlower
src/AndroidService.cpp src/AndroidService.h
find_package(Qt6 6.5 REQUIRED COMPONENTS Core Bluetooth Network Sql)
find_package(Qt6 6.5 REQUIRED COMPONENTS Gui Qml Quick QuickControls2 Svg Widgets Charts)

qt_standard_project_setup()

set(SOURCES
src/NotificationManager.cpp src/NotificationManager.h
src/DatabaseManager.cpp src/DatabaseManager.h
src/SettingsManager.cpp src/SettingsManager.h
src/SystrayManager.cpp src/SystrayManager.h
src/MenubarManager.cpp src/MenubarManager.h
src/NotificationManager.cpp src/NotificationManager.h
src/PlantDatabase.cpp src/PlantDatabase.h
src/Plant.cpp src/Plant.h src/PlantUtils.h
src/Journal.cpp src/Journal.h
Expand Down Expand Up @@ -67,85 +82,119 @@ qt_add_executable(WatchFlower
assets/devices.qrc
assets/plants.qrc
)
set(SOURCES_ANDROID
src/AndroidService.cpp src/AndroidService.h
)
if(NOT IOS AND NOT ANDROID)
set(SOURCES_DESKTOP
src/SystrayManager.cpp src/SystrayManager.h
src/MenubarManager.cpp src/MenubarManager.h
)
endif()

qt_add_executable(${CMAKE_PROJECT_NAME}
${SOURCES}
${SOURCES_ANDROID}
${SOURCES_DESKTOP}
)

target_include_directories(WatchFlower PRIVATE src/)
target_include_directories(WatchFlower PRIVATE src/thirdparty/)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE src/)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE src/thirdparty/)

################################################################################

## Android
if(ANDROID)
set(QT_ANDROID_ABIS "armeabi-v7a;arm64-v8a;x86;x86_64")
set(QT_ANDROID_BUILD_ALL_ABIS "ON")

set_target_properties(WatchFlower PROPERTIES
QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets/android"
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
QT_ANDROID_ABIS "armeabi-v7a;arm64-v8a;x86;x86_64"
QT_ANDROID_BUILD_ALL_ABIS ON
QT_ANDROID_MIN_SDK_VERSION 23
QT_ANDROID_TARGET_SDK_VERSION 34
QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets/android/"
)

target_compile_definitions(WatchFlower PRIVATE QT_CONNECTIVITY_PATCHED)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QT_CONNECTIVITY_PATCHED)

target_link_libraries(WatchFlower PRIVATE Qt::CorePrivate)
# Android background service
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt::CorePrivate)
endif()

if(APPLE)
set(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.emeric.watchflower.ios")
set(CMAKE_XCODE_ATTRIBUTE_MARKETING_VERSION "${PROJECT_VERSION}")

set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "")
set(CMAKE_XCODE_ATTRIBUTE_PROVISIONING_PROFILE "")
endif()

## macOS
if(APPLE AND NOT IOS)
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
set(CMAKE_XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/assets/macos/Info.plist")
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/assets/macos/${CMAKE_PROJECT_NAME}.entitlements")
endif()

## iOS
if(IOS)
target_link_libraries(QmlAppTemplate PRIVATE
Qt::GuiPrivate
"-framework UIKit"
)
set(IPHONEOS_DEPLOYMENT_TARGET "14.0")
set(CMAKE_OSX_ARCHITECTURES "arm64")
set(CMAKE_OSX_SYSROOT "iphoneos")
set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0")
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "14.0")
set(CMAKE_XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/assets/ios/Info.plist")
set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2") # iPhone,iPad
endif()

## Windows
if(WIN32)
target_compile_definitions(WatchFlower PRIVATE _USE_MATH_DEFINES)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE _USE_MATH_DEFINES)
endif()

################################################################################

# SingleApplication
set(QAPPLICATION_CLASS QApplication)
add_subdirectory(src/thirdparty/SingleApplication)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE SingleApplication)

# AppUtils
set(APP_NAME ${CMAKE_PROJECT_NAME})
set(APP_VERSION ${CMAKE_PROJECT_VERSION})
add_subdirectory(src/thirdparty/AppUtils)
target_link_libraries(WatchFlower PRIVATE AppUtils)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE AppUtils)

# MobileUI
add_subdirectory(src/thirdparty/MobileUI)
target_link_libraries(WatchFlower PRIVATE MobileUI)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE MobileUI)

# MobileSharing
add_subdirectory(src/thirdparty/MobileSharing)
target_link_libraries(WatchFlower PRIVATE MobileSharing)

# SingleApplication
set(QAPPLICATION_CLASS QApplication)
add_subdirectory(src/thirdparty/SingleApplication)
target_link_libraries(WatchFlower PRIVATE SingleApplication)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE MobileSharing)

# Qt
target_link_libraries(WatchFlower PRIVATE
Qt::Core
Qt::Bluetooth
Qt::Network
Qt::Sql
Qt::Gui
Qt::Qml
Qt::Quick
Qt::QuickControls2
Qt::Svg
Qt::Widgets
Qt::Charts
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
Qt6::Core
Qt6::Bluetooth
Qt6::Network
Qt6::Sql
Qt6::Gui
Qt6::Qml
Qt6::Quick
Qt6::QuickControls2
Qt6::Svg
Qt6::Charts
)
if(NOT IOS AND NOT ANDROID)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
Qt6::Widgets
)
endif()

################################################################################

if(lupdate_only)
target_sources(WatchFlower PUBLIC
target_sources(${CMAKE_PROJECT_NAME} PUBLIC
qml/*.js qml/*.qml
qml/components/*.qml
qml/components_generic/*.qml
Expand All @@ -154,40 +203,32 @@ if(lupdate_only)
endif()

if(CMAKE_BUILD_TYPE STREQUAL Release)
target_compile_definitions(WatchFlower PRIVATE
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
NDEBUG
QT_NO_DEBUG
QT_NO_DEBUG_OUTPUT
)
endif()

set_target_properties(WatchFlower PROPERTIES
WIN32_EXECUTABLE ON
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE ON
WIN32_EXECUTABLE ON
)

install(TARGETS WatchFlower
BUNDLE DESTINATION . # used by macOS
install(TARGETS ${CMAKE_PROJECT_NAME}
BUNDLE DESTINATION .
ARCHIVE DESTINATION .
LIBRARY DESTINATION . # used by Android
LIBRARY DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_qml_app_script(
TARGET WatchFlower
FILENAME_VARIABLE deploy_script
TARGET ${CMAKE_PROJECT_NAME}
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM
MACOS_BUNDLE_POST_BUILD
)
install(SCRIPT ${deploy_script})

################################################################################

message(STATUS "[PROJECT] CMAKE_VERSION = ${CMAKE_VERSION}")
message(STATUS "[PROJECT] CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
message(STATUS "[PROJECT] CMAKE_TOOLCHAIN_FILE = ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS "[DEFINE] SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message(STATUS "[DEFINE] BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
message(STATUS "[SYSTEM] HOST SYSTEM NAME = ${CMAKE_HOST_SYSTEM_NAME}")
message(STATUS "[SYSTEM] (TARGET) SYSTEM NAME = ${CMAKE_SYSTEM_NAME}")
6 changes: 2 additions & 4 deletions assets/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ buildscript {
dependencies {
//classpath 'com.android.tools.build:gradle:8.2.1' // works with Qt 6.7+ // Java 17
classpath 'com.android.tools.build:gradle:8.1.4' // works with Qt 6.5+ // Java 17
//classpath 'com.android.tools.build:gradle:7.4.2' // works with Qt 6.5
//classpath 'com.android.tools.build:gradle:7.2.1' // works with Qt 6.4
}
}

Expand Down Expand Up @@ -64,8 +62,8 @@ android {
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

packagingOptions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class WatchFlowerAndroidNotifier {
private static int channelColor = Color.WHITE;
private static int channelImportance = NotificationManager.IMPORTANCE_DEFAULT;

public static void notify(Context context, String title, String message, int channel) {
public static void notify(final Context context, final String title, final String message, final int channel) {

if (channel == 0) {
channelId = "watchflower_app";
Expand Down
5 changes: 5 additions & 0 deletions qml/SettingsAdvanced.qml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ Loader {
text: "build mode: %1".arg(utilsApp.appBuildModeFull())
font.pixelSize: Theme.fontSizeContent
}
Text {
color: Theme.colorSubText
text: "build architecture: %1".arg(utilsApp.qtArchitecture())
font.pixelSize: Theme.fontSizeContent
}
Text {
color: Theme.colorSubText
text: "build date: %1".arg(utilsApp.appBuildDateTime())
Expand Down

0 comments on commit a05f770

Please sign in to comment.