Skip to content
Snippets Groups Projects
CMakeLists.txt 6.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • cmake_minimum_required(VERSION 3.2)
    
    project(QGroundControl LANGUAGES CXX)
    
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel;Coverage")
    
    # CMake build type
    # Debug Release RelWithDebInfo MinSizeRel Coverage
    if (NOT CMAKE_BUILD_TYPE)
    	# default to release with debug symbols
    	set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type" FORCE)
    endif()
    
    if(DEFINED ENV{QT_VERSION})
    	set(QT_VERSION $ENV{QT_VERSION})
    endif()
    
    if(NOT QT_VERSION)
    
    	# try Qt 5.12.0 if none specified, last LTS.
    	set(QT_VERSION "5.12.0")
    
    endif()
    
    if(DEFINED ENV{QT_MKSPEC})
    	set(QT_MKSPEC $ENV{QT_MKSPEC})
    endif()
    
    if(UNIX AND NOT APPLE)
    	set(LINUX TRUE)
    endif()
    
    if(NOT QT_MKSPEC)
    	if(APPLE)
    		set(QT_MKSPEC clang_64)
    	elseif(LINUX)
    		set(QT_MKSPEC gcc_64)
    	elseif(WIN32)
    		set(QT_MKSPEC msvc2017_64)
    		#set(QT_MKSPEC winrt_x64_msvc2017)
    	endif()
    endif()
    
    # Add folder where are supportive functions
    list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
    
    message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
    message(STATUS "Qt version: ${QT_VERSION}")
    message(STATUS "Qt spec: ${QT_MKSPEC}")
    
    set(COMPANY "Mavlink")
    set(COPYRIGHT "Copyright (c) 2018 QGroundControl. All rights reserved.")
    set(IDENTIFIER "io.mavlink.qgroundcontrol")
    
    execute_process(
    	COMMAND git submodule update --init
    	WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    	)
    
    execute_process(
    	COMMAND git describe --always --tags
    	OUTPUT_VARIABLE git_tag
    	OUTPUT_STRIP_TRAILING_WHITESPACE
    	WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    	)
    
    add_definitions(
    	-DQGC_APPLICATION_NAME="QGroundControl"
    	-DQGC_ORG_NAME="QGroundControl.org"
    	-DQGC_ORG_DOMAIN="org.qgroundcontrol"
    	)
    
    message(STATUS "QGroundControl version: ${git_tag}")
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    #=============================================================================
    # ccache
    #
    option(CCACHE "Use ccache if available" ON)
    find_program(CCACHE_PROGRAM ccache)
    if (CCACHE AND CCACHE_PROGRAM AND NOT DEFINED ENV{CCACHE_DISABLE})
    	set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
    endif()
    
    #=============================================================================
    # Qt5
    #
    find_package(Qt5 ${QT_VERSION}
    	COMPONENTS
    		Bluetooth
    		Concurrent
    		Core
    		Location
    		Multimedia
    		Network
    		Positioning
    		Quick
    		QuickWidgets
    		Sql
    		Svg
    		Test
    		TextToSpeech
    		Widgets
    		Xml
    	REQUIRED
    	HINTS
    		$ENV{HOME}/Qt/${QT_VERSION}/${QT_MKSPEC}
    		$ENV{QT_PATH}/${QT_VERSION}/${QT_MKSPEC}
    		C:/Qt
    )
    
    if(NOT QT_MKSPEC MATCHES "winrt")
    	find_package(Qt5 ${QT_VERSION}
    		COMPONENTS
    			SerialPort
    		REQUIRED
    		HINTS
    			$ENV{HOME}/Qt/${QT_VERSION}/${QT_MKSPEC}
    			$ENV{QT_PATH}/${QT_VERSION}/${QT_MKSPEC}
    			C:/Qt
    	)
    endif()
    
    if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
    	include(CTest)
    	enable_testing()
    	add_definitions(-DUNITTEST_BUILD)
    endif()
    
    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    	# clang and AppleClang
    	add_compile_options(
    		-Wall
    		-Wextra
    
    		-Wno-address-of-packed-member # ignore for mavlink
    	)
    
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    	# GCC
    	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
    		add_compile_options(-fdiagnostics-color=always)
    	endif()
    
    	add_compile_options(
    		-Wall
    		-Wextra
    	)
    	
    elseif (WIN32)
    
    	add_definitions(-D_USE_MATH_DEFINES)
    	add_compile_options(
    		/wd4244 # warning C4244: '=': conversion from 'double' to 'float', possible loss of data
    		)
    
    endif()
    
    # TODO: get qtquick compiler working
    #qtquick_compiler_add_resources(QGC_RESOURCES ${QGC_RESOURCES}
    #find_package(Qt5QuickCompiler)
    
    include_directories(
    	libs/eigen
    
    	libs/mavlink/include/mavlink/v2.0
    	libs/mavlink/include/mavlink/v2.0/ardupilotmega
    	libs/mavlink/include/mavlink/v2.0/common
    
    Daniel Agar's avatar
    Daniel Agar committed
    
    	libs/shapelib
    
    add_subdirectory(libs)
    
    add_subdirectory(src)
    
    
    Daniel Agar's avatar
    Daniel Agar committed
    set(QGC_RESOURCES
    	#HackAndroidFileDialog.qrc
    	HackFileDialog.qrc
    	qgcresources.qrc
    	qgroundcontrol.qrc
    
    
    	src/FirmwarePlugin/APM/APMResources.qrc
    	src/FirmwarePlugin/PX4/PX4Resources.qrc
    	src/Airmap/airmap.qrc
    	src/Airmap/dummy/airmap_dummy.qrc
    
    Daniel Agar's avatar
    Daniel Agar committed
    	)
    
    if(BUILD_TESTING)
    	list(APPEND QGC_RESOURCES
    		UnitTest.qrc
    	)
    endif()
    
    
    if(ANDROID)
    
    Daniel Agar's avatar
    Daniel Agar committed
    	add_library(QGroundControl SHARED ${QGC_RESOURCES})
    
    	add_executable(QGroundControl ${QGC_RESOURCES})
    
    target_link_libraries(QGroundControl PRIVATE qgc)
    
    Daniel Agar's avatar
    Daniel Agar committed
    if(BUILD_TESTING)
            target_link_libraries(QGroundControl PRIVATE Qt5::Test)
    endif()
    
    
    if(NOT QT_MKSPEC MATCHES "winrt")
    	target_link_libraries(QGroundControl
    
    Daniel Agar's avatar
    Daniel Agar committed
    elseif(APPLE)
    
    	get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
    	get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
    	find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")
    
    	add_custom_command(TARGET QGroundControl
    		POST_BUILD
    		COMMAND
    			${MACDEPLOYQT_EXECUTABLE} $<TARGET_FILE_DIR:QGroundControl>/../.. -appstore-compliant -qmldir=${CMAKE_SOURCE_DIR}/src
    		COMMAND
    			rsync -a ${CMAKE_SOURCE_DIR}/libs/lib/Frameworks $<TARGET_FILE_DIR:QGroundControl>/../../Contents/
    		COMMAND
    			${CMAKE_INSTALL_NAME_TOOL} -change "@rpath/SDL2.framework/Versions/A/SDL2" "@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2" $<TARGET_FILE:QGroundControl>
    
    Daniel Agar's avatar
    Daniel Agar committed
    	set_target_properties(QGroundControl PROPERTIES MACOSX_BUNDLE YES)
    
    
    elseif(WIN32)
    
    	if(MSVC) # Check if we are using the Visual Studio compiler
    		set_target_properties(${PROJECT_NAME} PROPERTIES
    			WIN32_EXECUTABLE YES
    			LINK_FLAGS "/ENTRY:mainCRTStartup"
    		)
    	endif()
    
    	# deploy
    	include(Windeployqt)
    	windeployqt(QGroundControl "QGroundControl-installer.exe")
    
    elseif(ANDROID)
    	include(AddQtAndroidApk)
    	add_qt_android_apk(QGroundControl.apk QGroundControl
    		PACKAGE_NAME "io.mavlink.qgroundcontrol"
    		#KEYSTORE ${CMAKE_CURRENT_LIST_DIR}/mykey.keystore myalias
    		#KEYSTORE_PASSWORD xxxxx
    	)
    
    elseif(LINUX)
    	# TODO: investigate https://github.com/probonopd/linuxdeployqt
    
    	add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/release/package/QGroundControl.AppImage
    		COMMAND ${CMAKE_SOURCE_DIR}/deploy/create_linux_appimage.sh ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/release/package;
    		DEPENDS QGroundControl
    		USES_TERMINAL
    	)
    	add_custom_target(appimage DEPENDS ${CMAKE_BINARY_DIR}/release/package/QGroundControl.AppImage)
    
    endif()