blob: 4e457c9424b152effb1fa91fc0d13a5668926cda [file] [log] [blame]
# **********************************************************
# Copyright (c) 2012-2020 Google, Inc. All rights reserved.
# **********************************************************
# 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 Google, Inc. 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 GOOGLE, INC. 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.
###########################################################################
# Usage:
#
# 1) Run check_doxygen_version() at configure time
# 2) Add a custom command to update the Doxyfile that calls
# process_doxyfile(), using a path obtained from
# doxygen_path()
# 3) Add a custom command that calls docs_rundoxygen.cmake
#
###########################################################################
# If doxygen_ver is blank, determines the version and returns it in ver_out.
# Prints a warning or a fatal error on an unsupported version.
function (check_doxygen_version DOXYGEN_EXECUTABLE doxygen_ver ver_out)
# older versions of FindDoxygen.cmake don't set DOXYGEN_VERSION
if (NOT doxygen_ver)
execute_process(COMMAND
${DOXYGEN_EXECUTABLE} --version
RESULT_VARIABLE doxygen_v_result
ERROR_VARIABLE doxygen_v_error
OUTPUT_VARIABLE doxygen_v_out
)
string(REGEX MATCH "^[0-9]*\\.[0-9]*\\.[0-9]*" doxygen_ver "${doxygen_v_out}")
endif ()
if (doxygen_ver STREQUAL "1.8.0" OR
doxygen_ver STREQUAL "1.7.3")
# 1.8.0 fails to build (i#814) while 1.7.3 doesn't have the navbar for some reason.
message(FATAL_ERROR "doxygen version ${doxygen_ver} is not supported. "
"Use an earlier or later version.")
endif ()
if (doxygen_ver MATCHES "^1.7.[3-6]")
# These versions have a "Related Pages" index which we don't want.
# Plus, 1.7.3-1.7.5 won't have a home page link on the navbar.
message(STATUS "WARNING: doxygen versions 1.7.3-1.7.6 will not produce "
"release-quality documentation.")
endif ()
set(${ver_out} ${doxygen_ver} PARENT_SCOPE)
endfunction (check_doxygen_version)
# Transforms each variable in list_of_path_vars in-place to become
# a path suitable for passing to DOXYGEN_EXECUTABLE.
function (doxygen_path_xform DOXYGEN_EXECUTABLE list_of_path_vars)
if (WIN32)
# We can't rely on the presence of "cygwin" in the path to indicate this
# is a cygwin executable, as some users place native-Windows apps in
# c:/cygwin/usr/local/bin. We thus try to write to a cygwin path.
# Doxygen will happily clobber if our temp file already exists.
execute_process(COMMAND
${DOXYGEN_EXECUTABLE} -g /tmp/_test_doxygen_.dox
RESULT_VARIABLE doxygen_query_result
ERROR_VARIABLE doxygen_query_error
OUTPUT_VARIABLE doxygen_query_out
)
if (NOT doxygen_query_result)
# Cygwin doxygen cannot handle mixed paths!
# *** E:/cygwin/bin/doxygen.exe failed: ***
# Failed to open temporary file
# /d/derek/opensource/dynamorio/build/api/docs/D:/derek/opensource/dynamorio/build/api/docs/doxygen_objdb_3156.tmp
# We're using native windows cmake, so
# file(TO_CMAKE_PATH) => mixed, file(TO_NATIVE_PATH) => windows
# and thus we invoke cygpath. But, caller should keep the
# original path to use for passing to process_doxyfile().
find_program(CYGPATH cygpath)
if (NOT CYGPATH)
message(FATAL_ERROR "cannot find cygpath: thus cannot use cygwin doxygen")
endif ()
foreach (var ${list_of_path_vars})
execute_process(COMMAND
${CYGPATH} -u "${${var}}"
RESULT_VARIABLE cygpath_result
ERROR_VARIABLE cygpath_err
OUTPUT_VARIABLE ${var}
)
if (cygpath_result OR cygpath_err)
message(FATAL_ERROR "*** ${CYGPATH} failed: ***\n${cygpath_err}")
endif ()
string(REGEX REPLACE "[\r\n]" "" ${var} "${${var}}")
set(${var} ${${var}} PARENT_SCOPE)
endforeach ()
endif ()
endif ()
endfunction (doxygen_path_xform)
# Modifies doxyfile to work with docs_rundoxygen.cmake
function (process_doxyfile doxyfile DOXYGEN_EXECUTABLE doxygen_ver)
get_filename_component(outdir ${doxyfile} PATH)
file(READ ${doxyfile} string)
string(REGEX REPLACE
"(header.html)"
"\"${outdir}/\\1\"" string "${string}")
if (doxygen_ver STRGREATER "1.7.2")
# For 1.7.3+ we use xml file to tweak treeview contents
string(REGEX REPLACE
"(TREEVIEW_WIDTH[^\n]*)"
"\\1\nLAYOUT_FILE = \"${outdir}/DoxygenLayout.xml\"" string "${string}")
endif ()
endfunction (process_doxyfile)