diff options
author | Pino Toscano <pino@kde.org> | 2016-12-28 10:01:03 +0100 |
---|---|---|
committer | Pino Toscano <pino@kde.org> | 2017-05-15 19:50:45 +0200 |
commit | c61aee80d6477005e5b92c1ea918acc6d0cfd8fb (patch) | |
tree | 21a00cb9c60c66b80fbf6f960b4d095971ca78ce | |
parent | f11a95b6ea1d4781a94ff6fae5c9ff0093530fe5 (diff) | |
download | extra-cmake-modules-c61aee80d6477005e5b92c1ea918acc6d0cfd8fb.tar.gz extra-cmake-modules-c61aee80d6477005e5b92c1ea918acc6d0cfd8fb.tar.bz2 |
Add a new FindGperf module
Summary:
Add a simple module to look for GNU gperf at build time, providing an
helper macro for adding generations to a list of sources.
gperf will be used to generate the C/C++ sources at build time, instead
of using static versions in VCS; at least kcodecs, khtml, and kio-extras
will be switched to this method.
Reviewers: #windows, #frameworks, #build_system, kde-mac, adridg, rjvbb
Reviewed By: adridg, rjvbb
Subscribers: kfunk, rjvbb, adridg
Tags: #frameworks, #build_system
Differential Revision: https://phabricator.kde.org/D3830
-rw-r--r-- | find-modules/FindGperf.cmake | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/find-modules/FindGperf.cmake b/find-modules/FindGperf.cmake new file mode 100644 index 00000000..12b3451f --- /dev/null +++ b/find-modules/FindGperf.cmake @@ -0,0 +1,125 @@ +#.rst: +# FindGperf +# ----------- +# +# Try to find GNU gperf. +# +# If the gperf executable is not in your PATH, you can provide +# an alternative name or full path location with the ``Gperf_EXECUTABLE`` +# variable. +# +# This will define the following variables: +# +# ``Gperf_FOUND`` +# True if gperf is available. +# +# ``Gperf_EXECUTABLE`` +# The gperf executable. +# +# If ``Gperf_FOUND`` is TRUE, it will also define the following imported +# target: +# +# ``GPerf::Gperf`` +# The gperf executable. +# +# and the following public function: +# +# ecm_gperf_generate(<GperfInput> <OutputFile> <OutputVariable> +# [GENERATION_FLAGS <flags>]) +# +# Run ``gperf`` on ``<GperfInput>`` to generate ``<OutputFile>``, adding it to +# the ``<OutputVariable>`` variable which contains the source for the target +# where ``<OutputFile>`` is going to be built. The optional +# ``GENERATION_FLAGS`` argument is needed to pass extra parameters to +# ``gperf`` (note you cannot override that way the output file). +# +# A simple invocation would be: +# +# ecm_gperf_generate(simple.gperf ${CMAKE_CURRENT_BINARY_DIR}/simple.h MySources) +# +# Since 5.35.0. + +#============================================================================= +# Copyright 2016-2017 Pino Toscano <pino@kde.org> +# +# 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 copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +#============================================================================= + +include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake) + +ecm_find_package_version_check(Gperf) + +# Find gperf +find_program(Gperf_EXECUTABLE NAMES gperf) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Gperf + FOUND_VAR + Gperf_FOUND + REQUIRED_VARS + Gperf_EXECUTABLE +) + +mark_as_advanced(Gperf_EXECUTABLE) + +if (Gperf_FOUND) + if (NOT TARGET GPerf::Gperf) + add_executable(GPerf::Gperf IMPORTED) + set_target_properties(GPerf::Gperf PROPERTIES + IMPORTED_LOCATION "${Gperf_EXECUTABLE}" + ) + endif() +endif() + +include(FeatureSummary) +set_package_properties(Gperf PROPERTIES + URL "http://www.gnu.org/software/gperf/" + DESCRIPTION "Perfect hash function generator" +) + + +include(CMakeParseArguments) + +function(ecm_gperf_generate input_file output_file out_var) + # Parse arguments + set(oneValueArgs GENERATION_FLAGS) + cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" ${ARGN}) + + if(ARGS_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to ecm_gperf_generate(): \"${ARGS_UNPARSED_ARGUMENTS}\"") + endif() + + get_filename_component(_infile ${input_file} ABSOLUTE) + set(_extraopts "${ARGS_GENERATION_FLAGS}") + separate_arguments(_extraopts) + add_custom_command(OUTPUT ${output_file} + COMMAND ${Gperf_EXECUTABLE} ${_extraopts} --output-file=${output_file} ${_infile} + DEPENDS ${_infile} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + VERBATIM + ) + + list(APPEND ${out_var} "${output_file}") + set(${out_var} ${${out_var}} PARENT_SCOPE) +endfunction() |