diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a57941..86562c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,129 +1,130 @@ cmake_minimum_required(VERSION 3.5) set(KF5_VERSION "5.56.0") # handled by release scripts project(Solid VERSION ${KF5_VERSION}) include(FeatureSummary) find_package(ECM 5.55.0 NO_MODULE) set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(KDEInstallDirs) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) include(ECMQtDeclareLoggingCategory) set(REQUIRED_QT_VERSION 5.10.0) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Xml Widgets) if (NOT ANDROID) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED DBus) endif() if(WIN32) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Network) endif() include(GenerateExportHeader) include(CMakePackageConfigHelpers) include(ECMSetupVersion) include(ECMGenerateHeaders) include(ECMMarkNonGuiExecutable) include(ECMAddQch) find_package(FLEX REQUIRED) set_package_properties(FLEX PROPERTIES URL "http://flex.sourceforge.net" DESCRIPTION "Fast Lexical Analyzer" TYPE REQUIRED PURPOSE "Required for the Predicate parser" ) find_package(BISON REQUIRED) set_package_properties(BISON PROPERTIES URL "http://www.gnu.org/software/bison" DESCRIPTION "general-purpose parser generator" TYPE REQUIRED PURPOSE "Required for the Predicate parser" ) if (CMAKE_SYSTEM_NAME MATCHES Linux) find_package( UDev ) + if (UDev_FOUND) + set(UDEV_FOUND TRUE) # for config-solid.h + endif() - set_package_properties(UDev PROPERTIES URL "http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html" - DESCRIPTION "UDev support for Solid" - TYPE REQUIRED + set_package_properties(UDev PROPERTIES TYPE REQUIRED PURPOSE "Allows Solid to use UDev to provide information about devices on Linux" ) endif() include(ECMPoQmTools) option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF) add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)") ecm_setup_version(PROJECT VARIABLE_PREFIX SOLID VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/solid_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5SolidConfigVersion.cmake" SOVERSION 5) # TODO: Remove these remove_definitions(-DQT_NO_CAST_FROM_ASCII) remove_definitions(-DQT_NO_CAST_FROM_BYTEARRAY) if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po") ecm_install_po_files_as_qm(po) endif() option(WITH_NEW_SOLID_JOB "WIP: base Job class" Off) add_feature_info(Solid::Job WITH_NEW_SOLID_JOB "WIP: Base class for Solid Asynchronous apis") option(WITH_NEW_POWER_ASYNC_API "WIP: Asynchronous API for power management" Off) add_feature_info(Solid::PowerManagement WITH_NEW_POWER_ASYNC_API "WIP: Asynchronous API for power management") option(WITH_NEW_POWER_ASYNC_FREEDESKTOP "WIP: Freedesktop backend for the asynchronous api" Off) add_feature_info(Solid::PowerManagement WITH_NEW_POWER_ASYNC_FREEDESKTOP "WIP: Freedesktop backend for the asynchronous api") add_subdirectory(src) if (BUILD_TESTING) add_subdirectory(autotests) endif() # create a Config.cmake and a ConfigVersion.cmake file and install them set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Solid") if (BUILD_QCH) ecm_install_qch_export( TARGETS KF5Solid_QCH FILE KF5SolidQchTargets.cmake DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF5SolidQchTargets.cmake\")") endif() configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KF5SolidConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KF5SolidConfig.cmake" PATH_VARS KDE_INSTALL_DBUSINTERFACEDIR INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KF5SolidConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KF5SolidConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT KF5SolidTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5SolidTargets.cmake NAMESPACE KF5:: ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/solid_version.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel ) install(FILES solid.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/KF5SolidConfig.cmake.in b/KF5SolidConfig.cmake.in index 33d73d5..b597b3a 100644 --- a/KF5SolidConfig.cmake.in +++ b/KF5SolidConfig.cmake.in @@ -1,29 +1,29 @@ # SolidConfig.cmake provides information about the installed Solid library. # It can be used directly from CMake via find_package(Solid NO_MODULE) # # The following CMake variables are provided: # Solid_VERSION_MAJOR - the major version number of Solid # Solid_VERSION_MINOR - the minor version number of Solid # Solid_VERSION_PATCH - the patch version number of Solid # Solid_INCLUDE_DIRS - the include directories to use # Solid_HAVE_UDev - TRUE if device discovery via udev is supported # # Additionally, the following imported library targets are created, which may be used directly # with target_link_libraries(): # KF5::Solid - the Solid library @PACKAGE_INIT@ set(SOLID_DBUS_INTERFACES_DIR "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@") include(CMakeFindDependencyMacro) find_dependency(Qt5Core @REQUIRED_QT_VERSION@) include("${CMAKE_CURRENT_LIST_DIR}/KF5SolidTargets.cmake") @PACKAGE_INCLUDE_QCHTARGETS@ # "public" variables: -set(Solid_HAVE_UDev @UDEV_FOUND@ ) +set(Solid_HAVE_UDev @UDev_FOUND@ ) diff --git a/cmake/FindUDev.cmake b/cmake/FindUDev.cmake index 9d0f21d..ebfb9e9 100644 --- a/cmake/FindUDev.cmake +++ b/cmake/FindUDev.cmake @@ -1,50 +1,84 @@ -# - Try to find the UDev library -# Once done this will define +#.rst: +# FindUDev +# -------- # -# UDEV_FOUND - system has UDev -# UDEV_INCLUDE_DIR - the libudev include directory -# UDEV_LIBS - The libudev libraries +# Try to find the UDev library, once done this will define: +# +# ``UDev_FOUND`` +# System has UDev. +# +# ``UDev_INCLUDE_DIRS`` +# The libudev include directory. +# +# ``UDev_LIBRARIES`` +# The libudev libraries. +# +# ``UDev_VERSION`` +# The libudev version. +# +# If ``UDev_FOUND`` is TRUE, the following imported target +# will be available: +# +# ``UDev::UDev`` +# The UDev library +#============================================================================= # Copyright (c) 2010, Rafael Fernández López, +# Copyright (c) 2019, Volker Krause, # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. +#============================================================================= -find_path(UDEV_INCLUDE_DIR libudev.h) -find_library(UDEV_LIBS udev) +find_package(PkgConfig QUIET) +pkg_check_modules(PC_UDEV QUIET libudev) -if(UDEV_INCLUDE_DIR AND UDEV_LIBS) - include(CheckFunctionExists) - include(CMakePushCheckState) - cmake_push_check_state() - set(CMAKE_REQUIRED_LIBRARIES ${UDEV_LIBS} ) +find_path(UDev_INCLUDE_DIRS NAMES libudev.h HINTS ${PC_UDEV_INCLUDE_DIRS}) +find_library(UDev_LIBRARIES NAMES udev HINTS ${PC_UDEV_LIBRARY_DIRS}) - cmake_pop_check_state() - -endif() +set(UDev_VERSION ${PC_UDEV_VERSION}) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(UDev DEFAULT_MSG UDEV_INCLUDE_DIR UDEV_LIBS) +find_package_handle_standard_args(UDev + FOUND_VAR UDev_FOUND + REQUIRED_VARS UDev_INCLUDE_DIRS UDev_LIBRARIES + VERSION_VAR UDev_VERSION +) + +mark_as_advanced(UDev_INCLUDE_DIRS UDev_LIBRARIES) + +if(UDev_FOUND AND NOT TARGET UDev::UDev) + add_library(UDev::UDev UNKNOWN IMPORTED) + set_target_properties(UDev::UDev PROPERTIES + IMPORTED_LOCATION "${UDev_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${UDev_INCLUDE_DIRS}" + INTERFACE_COMPILE_DEFINITIONS "${PC_UDEV_CFLAGS_OTHER}" + ) +endif() -mark_as_advanced(UDEV_INCLUDE_DIR UDEV_LIBS) +include(FeatureSummary) +set_package_properties(UDev PROPERTIES + DESCRIPTION "API for enumerating and introspecting local devices (part of systemd)" + URL "https://freedesktop.org/wiki/Software/systemd/" +) diff --git a/src/solid/devices/CMakeLists.txt b/src/solid/devices/CMakeLists.txt index 4808c65..542b019 100644 --- a/src/solid/devices/CMakeLists.txt +++ b/src/solid/devices/CMakeLists.txt @@ -1,180 +1,180 @@ include (CheckCXXSourceCompiles) if(WIN32) add_definitions(-DYY_NO_UNISTD_H) endif() if(MSVC OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Intel")) check_cxx_source_compiles("int main() { __asm { pxor mm0, mm0 }; }" HAVE_X86_MMX) check_cxx_source_compiles("int main() { __asm { xorps xmm0, xmm0 }; }" HAVE_X86_SSE) check_cxx_source_compiles("int main() { __asm { xorpd xmm0, xmm0 }; }" HAVE_X86_SSE2) check_cxx_source_compiles("int main() { __asm { femms }; }" HAVE_X86_3DNOW) else() check_cxx_source_compiles(" #ifdef __SUNPRO_CC #define __asm__ asm #endif int main() { __asm__(\"pxor %mm0, %mm0\") ; }" HAVE_X86_MMX) check_cxx_source_compiles(" #ifdef __SUNPRO_CC #define __asm__ asm #endif int main() { __asm__(\"xorps %xmm0, %xmm0\"); }" HAVE_X86_SSE) check_cxx_source_compiles(" #ifdef __SUNPRO_CC #define __asm__ asm #endif int main() { __asm__(\"xorpd %xmm0, %xmm0\"); }" HAVE_X86_SSE2) check_cxx_source_compiles(" #ifdef __SUNPRO_CC #define __asm__ asm #endif int main() { __asm__(\"femms\"); }" HAVE_X86_3DNOW) endif() check_cxx_source_compiles(" #ifdef __SUNPRO_CC #define __asm__ asm #endif int main() { __asm__(\"mtspr 256, %0; vand %%v0, %%v0, %%v0\" : : \"r\"(-1) ); }" HAVE_PPC_ALTIVEC) configure_file(devices/config-processor.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-processor.h ) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/devices/ ${CMAKE_CURRENT_SOURCE_DIR}/devices/frontend/ ${CMAKE_CURRENT_BINARY_DIR}) set(solid_LIB_SRCS ${solid_LIB_SRCS} devices/managerbase.cpp devices/solidnamespace.cpp devices/predicateparse.cpp devices/frontend/device.cpp devices/frontend/devicemanager.cpp devices/frontend/deviceinterface.cpp devices/frontend/genericinterface.cpp devices/frontend/processor.cpp devices/frontend/block.cpp devices/frontend/storagedrive.cpp devices/frontend/opticaldrive.cpp devices/frontend/storagevolume.cpp devices/frontend/opticaldisc.cpp devices/frontend/storageaccess.cpp devices/frontend/camera.cpp devices/frontend/portablemediaplayer.cpp devices/frontend/networkshare.cpp devices/frontend/battery.cpp devices/frontend/predicate.cpp devices/ifaces/battery.cpp devices/ifaces/block.cpp devices/ifaces/camera.cpp devices/ifaces/opticaldrive.cpp devices/ifaces/device.cpp devices/ifaces/deviceinterface.cpp devices/ifaces/devicemanager.cpp devices/ifaces/genericinterface.cpp devices/ifaces/networkshare.cpp devices/ifaces/opticaldisc.cpp devices/ifaces/portablemediaplayer.cpp devices/ifaces/processor.cpp devices/ifaces/storagedrive.cpp devices/ifaces/storagevolume.cpp devices/ifaces/storageaccess.cpp devices/backends/shared/rootdevice.cpp devices/backends/shared/cpufeatures.cpp ) bison_target(SolidParser devices/predicate_parser.y ${CMAKE_CURRENT_BINARY_DIR}/predicate_parser.c COMPILE_FLAGS "-p Solid -d -b predicate_parser" ) set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/predicate_parser.h PROPERTY SKIP_AUTOMOC TRUE) # don't run automoc on this file flex_target(SolidLexer devices/predicate_lexer.l ${CMAKE_CURRENT_BINARY_DIR}/predicate_lexer.c COMPILE_FLAGS "-P Solid" ) add_flex_bison_dependency(SolidLexer SolidParser) list(APPEND solid_LIB_SRCS ${BISON_SolidParser_OUTPUTS} ${FLEX_SolidLexer_OUTPUTS}) include(devices/backends/fakehw/CMakeLists.txt) if(NOT WIN32 AND NOT APPLE AND NOT ANDROID) if (CMAKE_SYSTEM_NAME MATCHES FreeBSD) option(EXPERIMENTAL_BSDISKS "Use UDisks2/bsdisks backend instead of HAL to manage disk devices" OFF) else () set(EXPERIMENTAL_BSDISKS FALSE) endif() - if ( UDEV_FOUND ) + if ( UDev_FOUND ) message(STATUS "Building Solid UDev backend." ) include(devices/backends/udev/CMakeLists.txt) endif() message(STATUS "Building Solid UPower backend." ) include(devices/backends/upower/CMakeLists.txt) # FIXME: this should work on more Unix systems - if ((CMAKE_SYSTEM_NAME MATCHES Linux AND UDEV_FOUND) OR EXPERIMENTAL_BSDISKS) + if ((CMAKE_SYSTEM_NAME MATCHES Linux AND UDev_FOUND) OR EXPERIMENTAL_BSDISKS) message(STATUS "Building Solid UDisks2 backend." ) include(devices/backends/udisks2/CMakeLists.txt) endif () message(STATUS "Building Solid fstab backend." ) include(devices/backends/fstab/CMakeLists.txt) if (NOT CMAKE_SYSTEM_NAME MATCHES Linux) message(STATUS "Building Solid HAL backend." ) include(devices/backends/hal/CMakeLists.txt) endif() endif() include(CheckIncludeFiles) include(CheckFunctionExists) include(CheckCXXSourceCompiles) #Needed for the fstab backend check_include_files(mntent.h HAVE_MNTENT_H) check_include_files(sys/types.h HAVE_SYS_TYPES_H) check_include_files(sys/param.h HAVE_SYS_PARAM_H) check_include_files("stdio.h;sys/mnttab.h" HAVE_SYS_MNTTAB_H) check_include_files("sys/param.h;sys/mount.h" HAVE_SYS_MOUNT_H) check_function_exists(getmntinfo HAVE_GETMNTINFO) check_function_exists(setmntent HAVE_SETMNTENT) check_cxx_source_compiles(" #include #include int main(){ struct statvfs *mntbufp; int flags; return getmntinfo(&mntbufp, flags); } " GETMNTINFO_USES_STATVFS ) configure_file(devices/config-solid.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-solid.h ) if(APPLE) find_package(IOKit REQUIRED) message(STATUS "-- Building Solid IOKit backend." ) include(devices/backends/iokit/CMakeLists.txt) endif() if(WIN32) message(STATUS "-- Building Solid Windows backend." ) include(devices/backends/win/CMakeLists.txt) endif() set(solid_OPTIONAL_LIBS) if(WIN32) set(solid_OPTIONAL_LIBS ${solid_OPTIONAL_LIBS} Qt5::Network setupapi) set(solid_OPTIONAL_LIBS ${solid_OPTIONAL_LIBS} setupapi) endif() if(APPLE) set(solid_OPTIONAL_LIBS ${IOKIT_LIBRARY} "-framework DiskArbitration") endif() -if ( UDEV_FOUND ) - set(solid_OPTIONAL_LIBS ${solid_OPTIONAL_LIBS} ${UDEV_LIBS}) +if ( UDev_FOUND ) + set(solid_OPTIONAL_LIBS ${solid_OPTIONAL_LIBS} UDev::UDev) endif ()