From 6f4042097542da128897e9322e67709c93ef3f66 Mon Sep 17 00:00:00 2001 From: Tomas Pecka <peckato1@fit.cvut.cz> Date: Tue, 26 Mar 2019 13:52:56 +0100 Subject: [PATCH] CMake: Redesign FindGraphviz --- CMake/Modules/FindGraphviz.cmake | 200 ++++++------------------------- CMake/generate.conf | 6 +- 2 files changed, 38 insertions(+), 168 deletions(-) diff --git a/CMake/Modules/FindGraphviz.cmake b/CMake/Modules/FindGraphviz.cmake index 2f5d5f71ec..949c2bc3b3 100644 --- a/CMake/Modules/FindGraphviz.cmake +++ b/CMake/Modules/FindGraphviz.cmake @@ -1,170 +1,40 @@ -# - Try to find Graphviz -# Once done this will define +# - Find GraphViz +# Find the native GraphViz headers and libraries. # -# GRAPHVIZ_FOUND - system has Graphviz -# GRAPHVIZ_INCLUDE_DIR - the Graphviz include directory -# GRAPHVIZ_LIBRARY - Link these to use Graphviz -# GRAPHVIZ_VERSION = The value of PACKAGE_VERSION defined in graphviz_version.h -# GRAPHVIZ_MAJOR_VERSION = The library major version number -# GRAPHVIZ_MINOR_VERSION = The library minor version number -# GRAPHVIZ_PATCH_VERSION = The library patch version number -# GRAPHVIZ_COMPILE_FLAGS = List of compile flags needed by the GraphViz installation headers -# -# This module reads hints about search locations from the following env or cache variables: -# GRAPHVIZ_ROOT - Graphviz installation prefix -# (containing bin/, include/, etc.) - -# Copyright (c) 2009, Adrien Bustany, <madcat@mymadcat.com> -# Copyright (c) 2013-2018 Kevin Funk <kevin.funk@kdab.com> - -# Version computation and some cleanups by Allen Winter <allen.winter@kdab.com> -# Bug fixing for WIN32 by Guillaume Jacquenot <guillaume.jacquenot@gmail.com> -# Copyright (c) 2012-2018 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com> - -# Redistribution and use is allowed according to the terms of the GPLv3+ license. - -include(CheckIncludeFiles) -include(CMakePushCheckState) - -if(NOT GRAPHVIZ_MIN_VERSION) - set(GRAPHVIZ_MIN_VERSION "2.00") -endif() - -if(GRAPHVIZ_INCLUDE_DIR AND GRAPHVIZ_CDT_LIBRARY - AND (GRAPHVIZ_CGRAPH_LIBRARY OR GRAPHVIZ_GRAPH_LIBRARY) AND GRAPHVIZ_PATHPLAN_LIBRARY) - set(GRAPHVIZ_FIND_QUIETLY TRUE) -endif() - -if (GRAPHVIZ_ROOT) - set(_GRAPHVIZ_ROOT ${GRAPHVIZ_ROOT}) -else() - set(_GRAPHVIZ_ROOT $ENV{GRAPHVIZ_ROOT}) -endif() - -if(NOT _GRAPHVIZ_ROOT) - if(WIN32) - find_program(DOT_TOOL dot) - get_filename_component(_GRAPHVIZ_ROOT ${DOT_TOOL} PATH) - endif() -endif() - -if(_GRAPHVIZ_ROOT) - set(_GRAPHVIZ_INCLUDE_DIR ${_GRAPHVIZ_ROOT}/include) - set(_GRAPHVIZ_LIBRARY_DIR ${_GRAPHVIZ_ROOT}/lib) - set(_GRAPHVIZ_FIND_OPTS NO_DEFAULT_PATH) -else() - set(_GRAPHVIZ_FIND_OPTS "") -endif() - -find_path(GRAPHVIZ_INCLUDE_DIR NAMES graphviz/graph.h graphviz/cgraph.h - HINTS ${_GRAPHVIZ_INCLUDE_DIR} - ${_GRAPHVIZ_FIND_OPTS}) - -if(WIN32) - if(CMAKE_BUILD_TYPE STREQUAL "Release") - set(GRAPHVIZ_LIB_PATH_SUFFIX "release/lib") - else() - set(GRAPHVIZ_LIB_PATH_SUFFIX "debug/lib") - endif() -else() - set(GRAPHVIZ_LIB_PATH_SUFFIX) -endif() +# GRAPHVIZ_INCLUDE_DIRS +# GRAPHVIZ_LIBRARIES +# GRAPHVIZ_FOUND -find_library(GRAPHVIZ_CDT_LIBRARY NAMES cdt - HINTS ${_GRAPHVIZ_LIBRARY_DIR} PATH_SUFFIXES ${GRAPHVIZ_LIB_PATH_SUFFIX} - ${_GRAPHVIZ_FIND_OPTS}) -find_library(GRAPHVIZ_GVC_LIBRARY NAMES gvc - HINTS ${_GRAPHVIZ_LIBRARY_DIR} PATH_SUFFIXES ${GRAPHVIZ_LIB_PATH_SUFFIX} - ${_GRAPHVIZ_FIND_OPTS}) -find_library(GRAPHVIZ_CGRAPH_LIBRARY NAMES cgraph - HINTS ${_GRAPHVIZ_LIBRARY_DIR} PATH_SUFFIXES ${GRAPHVIZ_LIB_PATH_SUFFIX} - ${_GRAPHVIZ_FIND_OPTS}) -find_library(GRAPHVIZ_GRAPH_LIBRARY NAMES graph - HINTS ${_GRAPHVIZ_LIBRARY_DIR} PATH_SUFFIXES ${GRAPHVIZ_LIB_PATH_SUFFIX} - ${_GRAPHVIZ_FIND_OPTS}) -find_library(GRAPHVIZ_PATHPLAN_LIBRARY NAMES pathplan - HINTS ${_GRAPHVIZ_LIBRARY_DIR} PATH_SUFFIXES ${GRAPHVIZ_LIB_PATH_SUFFIX} - ${_GRAPHVIZ_FIND_OPTS}) -cmake_push_check_state() -set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${GRAPHVIZ_INCLUDE_DIR}) -check_include_files(graphviz/graphviz_version.h HAVE_GRAPHVIZ_VERSION_H) -cmake_pop_check_state() +FIND_PATH(GRAPHVIZ_INCLUDE_DIR NAMES graphviz/cgraph.h graphviz/graphviz_version.h) +FIND_LIBRARY(GRAPHVIZ_GVC_LIBRARY NAMES gvc) +FIND_LIBRARY(GRAPHVIZ_CDT_LIBRARY NAMES cdt) +FIND_LIBRARY(GRAPHVIZ_PATHPLAN_LIBRARY NAMES pathplan) +#FIND_LIBRARY(GRAPHVIZ_GRAPH_LIBRARY NAMES graph) -if(GRAPHVIZ_INCLUDE_DIR AND GRAPHVIZ_CDT_LIBRARY AND GRAPHVIZ_GVC_LIBRARY - AND (GRAPHVIZ_CGRAPH_LIBRARY OR GRAPHVIZ_GRAPH_LIBRARY) AND GRAPHVIZ_PATHPLAN_LIBRARY) - if(HAVE_GRAPHVIZ_VERSION_H OR WIN32) - set(GRAPHVIZ_FOUND TRUE) - endif() +if(GRAPHVIZ_INCLUDE_DIR) + file(READ "${GRAPHVIZ_INCLUDE_DIR}/graphviz/graphviz_version.h" GRAPHVIZ_VERSION_FILE) + string(REGEX MATCH "PACKAGE_VERSION \"(.*)\"" _ ${GRAPHVIZ_VERSION_FILE}) + SET(GRAPHVIZ_VERSION ${CMAKE_MATCH_1}) else() - set(GRAPHVIZ_FOUND FALSE) -endif() - -# Ok, now compute the version and make sure its greater then the min required -if(GRAPHVIZ_FOUND) - if(NOT WIN32) - set(FIND_GRAPHVIZ_VERSION_SOURCE - "#include <graphviz/graphviz_version.h>\n#include <stdio.h>\n int main()\n {\n printf(\"%s\",PACKAGE_VERSION);return 1;\n }\n") - set(FIND_GRAPHVIZ_VERSION_SOURCE_FILE ${CMAKE_BINARY_DIR}/CMakeTmp/FindGRAPHVIZ.cxx) - file(WRITE "${FIND_GRAPHVIZ_VERSION_SOURCE_FILE}" "${FIND_GRAPHVIZ_VERSION_SOURCE}") - - set(FIND_GRAPHVIZ_VERSION_ADD_INCLUDES - "-DINCLUDE_DIRECTORIES:STRING=${GRAPHVIZ_INCLUDE_DIR}") - - if(NOT CMAKE_CROSSCOMPILING) - try_run(RUN_RESULT COMPILE_RESULT - ${CMAKE_BINARY_DIR} - ${FIND_GRAPHVIZ_VERSION_SOURCE_FILE} - CMAKE_FLAGS "${FIND_GRAPHVIZ_VERSION_ADD_INCLUDES}" - RUN_OUTPUT_VARIABLE GRAPHVIZ_VERSION) - endif() - - if(COMPILE_RESULT AND RUN_RESULT EQUAL 1 AND NOT CMAKE_CROSSCOMPILING) - message(STATUS "Found Graphviz version ${GRAPHVIZ_VERSION}") - if(${GRAPHVIZ_VERSION} VERSION_LESS ${GRAPHVIZ_MIN_VERSION}) - message(STATUS "Graphviz version ${GRAPHVIZ_VERSION} is too old. At least version ${GRAPHVIZ_MIN_VERSION} is needed.") - set(GRAPHVIZ_FOUND FALSE) - set(GRAPHVIZ_INCLUDE_DIR "") - set(GRAPHVIZ_CDT_LIBRARY "") - set(GRAPHVIZ_GVC_LIBRARY "") - set(GRAPHVIZ_CGRAPH_LIBRARY "") - set(GRAPHVIZ_GRAPH_LIBRARY "") - set(GRAPHVIZ_PATHPLAN_LIBRARY "") - else(${GRAPHVIZ_VERSION} VERSION_LESS ${GRAPHVIZ_MIN_VERSION}) - # Compute the major and minor version numbers - if(NOT CMAKE_CROSSCOMPILING) - string(REPLACE "." ";" VL ${GRAPHVIZ_VERSION}) - list(GET VL 0 GRAPHVIZ_MAJOR_VERSION) - list(GET VL 1 GRAPHVIZ_MINOR_VERSION) - list(GET VL 2 GRAPHVIZ_PATCH_VERSION) - endif() - endif(${GRAPHVIZ_VERSION} VERSION_LESS ${GRAPHVIZ_MIN_VERSION}) - else() - if(NOT CMAKE_CROSSCOMPILING) - message(FATAL_ERROR "Unable to compile or run the graphviz version detection program.") - endif() - endif() - elseif(WIN32) - find_program(DOT_TOOL dot PATHS ${_GRAPHVIZ_ROOT}/bin) - execute_process(COMMAND ${DOT_TOOL} -V OUTPUT_VARIABLE DOT_VERSION_OUTPUT ERROR_VARIABLE DOT_VERSION_OUTPUT) - string(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+)" GRAPHVIZ_VERSION "${DOT_VERSION_OUTPUT}") - string(REPLACE "." ";" VL ${GRAPHVIZ_VERSION}) - list(GET VL 0 GRAPHVIZ_MAJOR_VERSION) - list(GET VL 1 GRAPHVIZ_MINOR_VERSION) - list(GET VL 2 GRAPHVIZ_PATCH_VERSION) - endif() - - set(GRAPHVIZ_COMPILE_FLAGS "") - check_include_files(string.h HAVE_STRING_H) - if (HAVE_STRING_H) - list(APPEND GRAPHVIZ_COMPILE_FLAGS "-DHAVE_STRING_H=1") - endif() - - if(NOT GRAPHVIZ_FIND_QUIETLY) - message(STATUS "Found Graphviz: ${GRAPHVIZ_CDT_LIBRARY} ${GRAPHVIZ_GVC_LIBRARY} ${GRAPHVIZ_CGRAPH_LIBRARY} ${GRAPHVIZ_GRAPH_LIBRARY} ${GRAPHVIZ_PATHPLAN_LIBRARY}") - endif() -else() - if(GRAPHVIZ_FIND_REQUIRED) - message(FATAL_ERROR "Could NOT find Graphivz") - endif() -endif() + SET(GRAPHVIZ_VERSION) +endif() + +# Handle the QUIETLY and REQUIRED arguments and set GRAPHVIZ_FOUND to TRUE if all listed variables are TRUE. +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Graphviz + FOUND_VAR GRAPHVIZ_FOUND + REQUIRED_VARS GRAPHVIZ_GVC_LIBRARY GRAPHVIZ_CDT_LIBRARY GRAPHVIZ_PATHPLAN_LIBRARY GRAPHVIZ_INCLUDE_DIR + VERSION_VAR GRAPHVIZ_VERSION + ) + +# Copy the results to the output variables. +IF(GRAPHVIZ_FOUND) + SET(GRAPHVIZ_LIBRARIES ${GRAPHVIZ_GVC_LIBRARY} ${GRAPHVIZ_CDT_LIBRARY} ${GRAPHVIZ_PATHPLAN_LIBRARY}) + SET(GRAPHVIZ_INCLUDE_DIRS ${GRAPHVIZ_INCLUDE_DIR}) +ELSE(GRAPHVIZ_FOUND) + SET(GRAPHVIZ_LIBRARIES) + SET(GRAPHVIZ_INCLUDE_DIRS) +ENDIF(GRAPHVIZ_FOUND) + +MARK_AS_ADVANCED(GRAPHVIZ_INCLUDE_DIRS GRAPHVIZ_LIBRARIES) diff --git a/CMake/generate.conf b/CMake/generate.conf index e973235713..490dd0604f 100644 --- a/CMake/generate.conf +++ b/CMake/generate.conf @@ -52,9 +52,9 @@ include:${Qt5Xml_INCLUDE_DIRS} find: Qt5 5.7 REQUIRED COMPONENTS Core Xml [CMake:Deps:graphviz] -link: ${GRAPHVIZ_GVC_LIBRARY} ${GRAPHVIZ_CGRAPH_LIBRARY} -include: ${GRAPHVIZ_INCLUDE_DIR} -find: Graphviz +link: ${GRAPHVIZ_LIBRARIES} +include: ${GRAPHVIZ_INCLUDE_DIRS} +find: Graphviz REQUIRED [CMake:Deps:json] link: ${JSONCPP_LIBRARIES} -- GitLab