diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a5fa66..5d6739f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,63 +1,67 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0048 NEW) project(kgraphviewer VERSION "2.4.3") set(KGRAPHVIEWERLIB_SOVERION 3) set(QT_MIN_VERSION "5.4.0") set(KF5_MIN_VERSION "5.16.0") find_package(ECM ${KF5_MIN_VERSION} REQUIRED CONFIG) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) include(CMakePackageConfigHelpers) include(KDEInstallDirs) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDEClangFormat) include(KDECMakeSettings) include(FeatureSummary) include(GenerateExportHeader) include(ECMInstallIcons) include(ECMQtDeclareLoggingCategory) include(ECMSetupVersion) # search basic libraries first find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core DBus Widgets Svg PrintSupport) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS CoreAddons DocTools Parts WidgetsAddons IconThemes ) find_package(Boost 1.36 REQUIRED) -find_package(Graphviz REQUIRED) +find_package(Graphviz 2.30.0 REQUIRED) -if(NOT DOT) - MESSAGE(STATUS "dot executable from Graphviz not found. You will need it at runtime") -endif(NOT DOT) +find_package(DOT) +set_package_properties(DOT PROPERTIES + DESCRIPTION "Tool to draw directed graphs" + URL "http://www.graphviz.org/" + PURPOSE "Needed for parsing .dot files" + TYPE RUNTIME +) option(BUILD_GRAPHEDITOR "Build the graph editor app (WIP, not yet functional). [default=OFF]" OFF) add_definitions( -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050400 -DQT_USE_QSTRINGBUILDER -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_URL_CAST_FROM_STRING -DQT_STRICT_ITERATORS -DQT_NO_SIGNALS_SLOTS_KEYWORDS ) add_subdirectory(src) add_subdirectory(doc) install(FILES kgraphviewer.categories DESTINATION ${KDE_INSTALL_CONFDIR}) # add clang-format target for all our real source files file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES src/*.cpp src/*.h) kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/cmake/FindDOT.cmake b/cmake/FindDOT.cmake new file mode 100644 index 0000000..779420f --- /dev/null +++ b/cmake/FindDOT.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2018, Raphael Kubo da Costa +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * 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. +# * Neither the name of Intel Corporation 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +# +# Try to find the dot program. +# +# After successful discovery, this will set for inclusion where needed: +# DOT_FOUND - True if dot(1) has been found +# DOT_EXECUTABLE - the full path to the dot(1) tool + +find_program(DOT_EXECUTABLE dot) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(DOT + REQUIRED_VARS DOT_EXECUTABLE) diff --git a/cmake/FindGraphviz.cmake b/cmake/FindGraphviz.cmake index d4c4bac..5b97bd0 100644 --- a/cmake/FindGraphviz.cmake +++ b/cmake/FindGraphviz.cmake @@ -1,165 +1,79 @@ # This cmake file comes from MOAB: # MOAB, a Mesh-Oriented datABase, is a software component for creating, # storing and accessing finite element mesh data. # # Copyright 2004 Sandia Corporation. Under the terms of Contract # DE-AC04-94AL85000 with Sandia Coroporation, the U.S. Government # retains certain rights in this software. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. A copy of the full # GNU Lesser General Public License can be found at # http://www.gnu.org/copyleft/lesser.html. # # For more information, contact the authors of this software at # moab@sandia.gov. # # this will set the following variables: # graphviz_LIBRARIES # graphviz_FOUND # graphviz_INCLUDE_DIRECTORIES -if ( NOT WIN32 ) - - find_package(PkgConfig) - pkg_check_modules( graphviz ${REQUIRED} libgvc libcdt libcgraph libpathplan ) - if ( graphviz_FOUND ) - set ( graphviz_INCLUDE_DIRECTORIES ${graphviz_INCLUDE_DIRS} ) - endif ( graphviz_FOUND ) +find_package(PkgConfig) +pkg_check_modules(pc_graphviz ${REQUIRED} libgvc libcdt libcgraph libpathplan) -endif ( NOT WIN32 ) - -find_path( graphviz_INCLUDE_DIRECTORIES +find_path(graphviz_INCLUDE_DIRECTORIES NAMES gvc.h - PATHS - ${graphviz_INCLUDE_DIRS} - /usr/local/include - /usr/include - PATH_SUFFIXES graphviz + HINTS ${pc_graphviz_INCLUDEDIR} + ${pc_graphviz_INCLUDE_DIRS} ) -find_library( graphviz_GVC_LIBRARY +find_library(graphviz_GVC_LIBRARY NAMES gvc - PATHS - ${graphviz_LIBRARY_DIRS} - /usr/local/lib64 - /usr/lib64 - /usr/local/lib - /usr/lib + HINTS ${pc_graphviz_LIBDIR} + ${pc_graphviz_LIBRARY_DIRS} ) -find_library( graphviz_CDT_LIBRARY +find_library(graphviz_CDT_LIBRARY NAMES cdt - PATHS - ${graphviz_LIBRARY_DIRS} - /usr/local/lib64 - /usr/lib64 - /usr/local/lib - /usr/lib + HINTS ${pc_graphviz_LIBDIR} + ${pc_graphviz_LIBRARY_DIRS} ) -find_library( graphviz_GRAPH_LIBRARY +find_library(graphviz_GRAPH_LIBRARY NAMES cgraph - PATHS - ${graphviz_LIBRARY_DIRS} - /usr/local/lib64 - /usr/lib64 - /usr/local/lib - /usr/lib + HINTS ${pc_graphviz_LIBDIR} + ${pc_graphviz_LIBRARY_DIRS} ) -find_library( graphviz_PATHPLAN_LIBRARY +find_library(graphviz_PATHPLAN_LIBRARY NAMES pathplan - PATHS - ${graphviz_LIBRARY_DIRS} - /usr/local/lib64 - /usr/lib64 - /usr/local/lib - /usr/lib + HINTS ${pc_graphviz_LIBDIR} + ${pc_graphviz_LIBRARY_DIRS} ) -if ( graphviz_INCLUDE_DIRECTORIES AND - graphviz_GVC_LIBRARY AND graphviz_CDT_LIBRARY AND - graphviz_GRAPH_LIBRARY AND graphviz_PATHPLAN_LIBRARY ) - set ( graphviz_FOUND 1 ) - set ( graphviz_LIBRARIES - "${graphviz_GVC_LIBRARY};${graphviz_GRAPH_LIBRARY};" - "${graphviz_CDT_LIBRARY};${graphviz_PATHPLAN_LIBRARY}" - CACHE FILEPATH "Libraries for graphviz" ) -else ( graphviz_INCLUDE_DIRECTORIES AND - graphviz_GVC_LIBRARY AND graphviz_CDT_LIBRARY AND - graphviz_GRAPH_LIBRARY AND graphviz_PATHPLAN_LIBRARY ) - set ( graphviz_FOUND 0 ) -endif ( graphviz_INCLUDE_DIRECTORIES AND - graphviz_GVC_LIBRARY AND graphviz_CDT_LIBRARY AND - graphviz_GRAPH_LIBRARY AND graphviz_PATHPLAN_LIBRARY ) - - -find_program(DOT dot) - -if (DOT) - -EXECUTE_PROCESS(COMMAND dot -V - OUTPUT_VARIABLE _dot_query_output - RESULT_VARIABLE _dot_result - ERROR_VARIABLE _dot_query_output ) - -IF(_dot_result MATCHES 0) - STRING(REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1" GRAPHVIZVERSION "${_dot_query_output}" ) -ELSE(_dot_result MATCHES 0) - SET(_dot_query_output) -ENDIF(_dot_result MATCHES 0) -IF (GRAPHVIZVERSION) - -# we need at least version 2.30.0 -IF (NOT GRAPHVIZ_MIN_VERSION) -SET(GRAPHVIZ_MIN_VERSION "2.30.0") -ENDIF (NOT GRAPHVIZ_MIN_VERSION) +set(graphviz_LIBRARIES + "${graphviz_GVC_LIBRARY}" "${graphviz_CDT_LIBRARY}" + "${graphviz_GRAPH_LIBRARY}" "${graphviz_PATHPLAN_LIBRARY}") -#now parse the parts of the user given version string into variables -STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" req_graphviz_major_vers "${GRAPHVIZ_MIN_VERSION}") -IF (NOT req_graphviz_major_vers) -MESSAGE( FATAL_ERROR "Invalid GraphViz version string given: \"${GRAPHVIZ_MIN_VERSION}\", expected e.g. \"2.30.0\"") -ENDIF (NOT req_graphviz_major_vers) +if (EXISTS "${graphviz_INCLUDE_DIRECTORIES}/graphviz_version.h") + file(READ "${graphviz_INCLUDE_DIRECTORIES}/graphviz_version.h" _graphviz_version_content) + string(REGEX MATCH "#define +PACKAGE_VERSION +\"([0-9]+\\.[0-9]+\\.[0-9]+)\"" _dummy "${_graphviz_version_content}") + set(graphviz_VERSION "${CMAKE_MATCH_1}") +endif () -# now parse the parts of the user given version string into variables -STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_graphviz_major_vers "${GRAPHVIZ_MIN_VERSION}") -STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" req_graphviz_minor_vers "${GRAPHVIZ_MIN_VERSION}") -STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_graphviz_patch_vers "${GRAPHVIZ_MIN_VERSION}") - -IF (NOT req_graphviz_major_vers EQUAL 2) -MESSAGE( FATAL_ERROR "Invalid GraphViz version string given: \"${GRAPHVIZ_MIN_VERSION}\", major version 4 is required, e.g. \"2.30.0\"") -ENDIF (NOT req_graphviz_major_vers EQUAL 2) - -# and now the version string given by qmake -STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" GRAPHVIZ_VERSION_MAJOR "${GRAPHVIZVERSION}") -STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+.*" "\\1" GRAPHVIZ_VERSION_MINOR "${GRAPHVIZVERSION}") -STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" GRAPHVIZ_VERSION_PATCH "${GRAPHVIZVERSION}") - -# compute an overall version number which can be compared at once -MATH(EXPR req_vers "${req_graphviz_major_vers}*10000 + ${req_graphviz_minor_vers}*100 + ${req_graphviz_patch_vers}") -MATH(EXPR found_vers "${GRAPHVIZ_VERSION_MAJOR}*10000 + ${GRAPHVIZ_VERSION_MINOR}*100 + ${GRAPHVIZ_VERSION_PATCH}") - -IF (found_vers LESS req_vers) -SET(graphviz_FOUND FALSE) -SET(GRAPHVIZ_INSTALLED_VERSION_TOO_OLD TRUE) -ELSE (found_vers LESS req_vers) -SET(graphviz_FOUND TRUE) -ENDIF (found_vers LESS req_vers) -ENDIF (GRAPHVIZVERSION) - - -endif (DOT) +if ("${Graphviz_FIND_VERSION}" VERSION_GREATER "${graphviz_VERSION}") + message(FATAL_ERROR "Required version (" ${Graphviz_FIND_VERSION} ") is higher than found version (" ${graphviz_VERSION} ")") +endif () include(FindPackageHandleStandardArgs) - -# handle the QUIETLY and REQUIRED arguments and set GRAPHVIZ_FOUND to TRUE if -# all listed variables are TRUE -find_package_handle_standard_args(GraphViz DEFAULT_MSG graphviz_LIBRARIES graphviz_INCLUDE_DIRECTORIES) +find_package_handle_standard_args(GraphViz + REQUIRED_VARS graphviz_LIBRARIES graphviz_INCLUDE_DIRECTORIES + VERSION_VAR graphviz_VERSION)