]> sigrok.org Git - pulseview.git/blobdiff - CMakeLists.txt
pv: adjust application source code for Qt6 support
[pulseview.git] / CMakeLists.txt
index 7791b1b138daa601b888f1f59ffe1c1d445e95c3..9fd2e9a3cd2d4af6df624d5e594ba2faae22303c 100644 (file)
@@ -74,8 +74,43 @@ add_subdirectory(manual)
 #= Dependencies
 #-------------------------------------------------------------------------------
 
+include(CheckCSourceCompiles)
+include(CheckCXXCompilerFlag)
+include(CheckCXXSourceCompiles)
+include(CMakePushCheckState)
+include(memaccess)
+
+find_package(PkgConfig)
+
+check_cxx_compiler_flag("-std=c++17" HAVE_STD_CXX_17)
+check_cxx_compiler_flag("-std=c++14" HAVE_STD_CXX_14)
+check_cxx_compiler_flag("-std=c++11" HAVE_STD_CXX_11)
+if(HAVE_STD_CXX_17)
+       message(STATUS "Using C++17 for the application build")
+       set(CMAKE_CXX_STANDARD 17)
+       set(REQUIRED_STD_CXX_FLAGS "-std=c++17")
+elseif(HAVE_STD_CXX_14)
+       message(STATUS "Using C++14 for the application build")
+       set(CMAKE_CXX_STANDARD 14)
+       set(REQUIRED_STD_CXX_FLAGS "-std=c++14")
+elseif(HAVE_STD_CXX_11)
+       message(STATUS "Using C++11 for the application build")
+       set(CMAKE_CXX_STANDARD 11)
+       set(REQUIRED_STD_CXX_FLAGS "-std=c++11")
+else()
+       message(FATAL_ERROR "Need modern C++, at least language standard 11")
+endif()
+
 list(APPEND PKGDEPS glib-2.0>=2.28.0)
-list(APPEND PKGDEPS glibmm-2.4>=2.28.0)
+
+# Try to find the prefered glibmm-2.4. If not found then add glibmm-2.68
+# to the dependency list.
+pkg_check_modules(GLIBMM_2_4 glibmm-2.4>2.28.0)
+if(GLIBMM_2_4_FOUND)
+       list(APPEND PKGDEPS glibmm-2.4>=2.28.0)
+else()
+       list(APPEND PKGDEPS glibmm-2.68>=2.68.0)
+endif()
 
 if(ENABLE_FLOW)
        list(APPEND PKGDEPS gstreamermm-1.0>=1.8.0)
@@ -93,7 +128,6 @@ if(ANDROID)
        list(APPEND PKGDEPS libsigrokandroidutils>=0.1.0)
 endif()
 
-find_package(PkgConfig)
 pkg_check_modules(LIBSRCXX ${LIBSR_CXX_BINDING})
 if(NOT LIBSRCXX_FOUND OR NOT LIBSRCXX_VERSION)
        message(FATAL_ERROR "libsigrok C++ bindings missing, check libsigrok's 'configure' output (missing dependencies?)")
@@ -151,48 +185,44 @@ find_package(Threads REQUIRED)
 
 # Helper for checking for atomics
 function(check_working_cxx_atomics varname additional_lib)
-  include(CheckCXXSourceCompiles)
-  include(CMakePushCheckState)
-  cmake_push_check_state()
-  set(CMAKE_REQUIRED_FLAGS "-std=c++11")
-  set(CMAKE_REQUIRED_LIBRARIES "${additional_lib}")
-  set(CMAKE_REQUIRED_QUIET 1)
-  CHECK_CXX_SOURCE_COMPILES("
+       cmake_push_check_state()
+       set(CMAKE_REQUIRED_FLAGS "${REQUIRED_STD_CXX_FLAGS}")
+       set(CMAKE_REQUIRED_LIBRARIES "${additional_lib}")
+       set(CMAKE_REQUIRED_QUIET 1)
+       CHECK_CXX_SOURCE_COMPILES("
 #include <atomic>
 std::atomic<int> x;
 int main() {
-  return std::atomic_fetch_add_explicit(&x, 1, std::memory_order_seq_cst);
+       return std::atomic_fetch_add_explicit(&x, 1, std::memory_order_seq_cst);
 }
 " ${varname})
-  cmake_pop_check_state()
+       cmake_pop_check_state()
 endfunction(check_working_cxx_atomics)
 
 # First check if atomics work without the library.
 # If not, check if the library exists, and atomics work with it.
 check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB "")
 if(HAVE_CXX_ATOMICS_WITHOUT_LIB)
-  message(STATUS "Atomics provided by the C-library - yes")
+       message(STATUS "Atomics provided by the C-library - yes")
 else()
-  message(STATUS "Atomics provided by the C-library - no")
-  find_library(LIBATOMIC_LIBRARY NAMES atomic PATH_SUFFIXES lib)
-  if(LIBATOMIC_LIBRARY)
-    check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB "${LIBATOMIC_LIBRARY}")
-    if (HAVE_CXX_ATOMICS_WITH_LIB)
-      message(STATUS "Atomics provided by libatomic - yes")
-    else()
-      message(STATUS "Atomics provided by libatomic - no")
-      message(FATAL_ERROR "Compiler must support std::atomic!")
-    endif()
-  else()
-    message(FATAL_ERROR "Compiler appears to require libatomic, but cannot find it.")
-  endif()
+       message(STATUS "Atomics provided by the C-library - no")
+       find_library(LIBATOMIC_LIBRARY NAMES atomic PATH_SUFFIXES lib)
+       if(LIBATOMIC_LIBRARY)
+               check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB "${LIBATOMIC_LIBRARY}")
+               if (HAVE_CXX_ATOMICS_WITH_LIB)
+                       message(STATUS "Atomics provided by libatomic - yes")
+               else()
+                       message(STATUS "Atomics provided by libatomic - no")
+                       message(FATAL_ERROR "Compiler must support std::atomic!")
+               endif()
+       else()
+               message(FATAL_ERROR "Compiler appears to require libatomic, but cannot find it.")
+       endif()
 endif()
 
 # Check availability of features which depend on library versions.
 # TODO Ideally use check_symbol_exists() instead, reduce boilerplate.
 if(ENABLE_DECODE)
-       include(CheckCSourceCompiles)
-       include(CMakePushCheckState)
        cmake_push_check_state()
        set(CMAKE_REQUIRED_INCLUDES "${PKGDEPS_INCLUDE_DIRS}")
        set(CMAKE_REQUIRED_LIBRARIES "sigrokdecode")
@@ -215,7 +245,6 @@ endif()
 #= System Introspection
 #-------------------------------------------------------------------------------
 
-include(memaccess)
 memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS)
 
 #===============================================================================
@@ -225,7 +254,11 @@ memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS)
 set(PV_TITLE PulseView)
 set(PV_VERSION_STRING "0.5.0")
 
-set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.4_VERSION})
+if(GLIBMM_2_4_FOUND)
+       set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.4_VERSION})
+else()
+       set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.68_VERSION})
+endif()
 
 include(GetGitRevisionDescription)
 
@@ -486,7 +519,8 @@ qt5_add_resources(pulseview_RESOURCES_RCC ${CMAKE_BINARY_DIR}/translations.qrc)
 add_definitions(-DQT_NO_KEYWORDS)
 add_definitions(-D__STDC_LIMIT_MACROS)
 add_definitions(-Wall -Wextra)
-add_definitions(-std=c++11)
+add_definitions(${REQUIRED_STD_CXX_FLAGS})
+
 add_definitions(-DBOOST_MATH_DISABLE_FLOAT128=1)
 if(WIN32)
        add_definitions(-Wa,-mbig-obj -O3)