From 467556acea56f361a21b2a3761ca056b9da2d237 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 19 Aug 2017 10:17:02 -0700 Subject: [PATCH] Remove gperf usage from toolchain It turns out that gperf-3.1 changed types in the generated code in ways that aren't even trivially detectable without having to generate a test-file. It's just not worth using tools and libraries from clowns that don't understand or care about compatibility. So get rid of gperf. Signed-off-by: Linus Torvalds Signed-off-by: Christian Lamparter [removed gperf related stuff] --- README.md | 2 +- config/CMakeLists.txt | 6 +- config/kconf_id.c | 54 ++++++++++++++ config/lkc.h | 2 +- config/zconf.gperf | 50 ------------- config/zconf.y | 10 +-- extra/FindGPERF.cmake | 160 ------------------------------------------ 7 files changed, 62 insertions(+), 222 deletions(-) create mode 100644 config/kconf_id.c delete mode 100644 config/zconf.gperf delete mode 100644 extra/FindGPERF.cmake diff --git a/README.md b/README.md index 386e207..65a3aa7 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ tools and libraries: * gcc 6.0+ (including library and header dependencies) - * gperf, bison/flex + * bison/flex * cmake 3.8+ diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index ac3f0a7..0a96a82 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -11,14 +11,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../include/generated") -LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../extra") -FIND_PACKAGE(GPERF REQUIRED) - BISON_TARGET(zconf zconf.y zconf.tab.c COMPILE_FLAGS "-l -b zconf -p zconf -t") FLEX_TARGET(zconfscan zconf.l zconf.lex.c COMPILE_FLAGS "-Pzconf -L") -GPERF_TARGET(zconfhash zconf.gperf zconf.hash.c) -SET(zconf_deps ${FLEX_zconfscan_OUTPUTS} ${GPERF_zconfhash_OUTPUTS}) +SET(zconf_deps ${FLEX_zconfscan_OUTPUTS}) SET_SOURCE_FILES_PROPERTIES(${BISON_zconf_OUTPUTS} PROPERTIES OBJECT_DEPENDS "${zconf_deps}") diff --git a/config/kconf_id.c b/config/kconf_id.c new file mode 100644 index 0000000..5abbc72 --- /dev/null +++ b/config/kconf_id.c @@ -0,0 +1,54 @@ + +static struct kconf_id kconf_id_array[] = { + { "mainmenu", T_MAINMENU, TF_COMMAND }, + { "menu", T_MENU, TF_COMMAND }, + { "endmenu", T_ENDMENU, TF_COMMAND }, + { "source", T_SOURCE, TF_COMMAND }, + { "choice", T_CHOICE, TF_COMMAND }, + { "endchoice", T_ENDCHOICE, TF_COMMAND }, + { "comment", T_COMMENT, TF_COMMAND }, + { "config", T_CONFIG, TF_COMMAND }, + { "menuconfig", T_MENUCONFIG, TF_COMMAND }, + { "help", T_HELP, TF_COMMAND }, + { "---help---", T_HELP, TF_COMMAND }, + { "if", T_IF, TF_COMMAND|TF_PARAM }, + { "endif", T_ENDIF, TF_COMMAND }, + { "depends", T_DEPENDS, TF_COMMAND }, + { "optional", T_OPTIONAL, TF_COMMAND }, + { "default", T_DEFAULT, TF_COMMAND, S_UNKNOWN }, + { "prompt", T_PROMPT, TF_COMMAND }, + { "tristate", T_TYPE, TF_COMMAND, S_TRISTATE }, + { "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE }, + { "bool", T_TYPE, TF_COMMAND, S_BOOLEAN }, + { "boolean", T_TYPE, TF_COMMAND, S_BOOLEAN }, + { "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN }, + { "int", T_TYPE, TF_COMMAND, S_INT }, + { "hex", T_TYPE, TF_COMMAND, S_HEX }, + { "string", T_TYPE, TF_COMMAND, S_STRING }, + { "select", T_SELECT, TF_COMMAND }, + { "imply", T_IMPLY, TF_COMMAND }, + { "range", T_RANGE, TF_COMMAND }, + { "visible", T_VISIBLE, TF_COMMAND }, + { "option", T_OPTION, TF_COMMAND }, + { "on", T_ON, TF_PARAM }, + { "modules", T_OPT_MODULES, TF_OPTION }, + { "defconfig_list", T_OPT_DEFCONFIG_LIST, TF_OPTION }, + { "env", T_OPT_ENV, TF_OPTION }, + { "allnoconfig_y", T_OPT_ALLNOCONFIG_Y, TF_OPTION }, +}; + +#define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id)) + +static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len) +{ + int i; + + for (i = 0; i < KCONF_ID_ARRAY_SIZE; i++) { + struct kconf_id *id = kconf_id_array+i; + int l = strlen(id->name); + + if (len == l && !memcmp(str, id->name, len)) + return id; + } + return NULL; +} diff --git a/config/lkc.h b/config/lkc.h index 91ca126..cdcbe43 100644 --- a/config/lkc.h +++ b/config/lkc.h @@ -62,7 +62,7 @@ enum conf_def_mode { #define T_OPT_ALLNOCONFIG_Y 4 struct kconf_id { - int name; + const char *name; int token; unsigned int flags; enum symbol_type stype; diff --git a/config/zconf.gperf b/config/zconf.gperf deleted file mode 100644 index 574f7b3..0000000 --- a/config/zconf.gperf +++ /dev/null @@ -1,50 +0,0 @@ -%language=ANSI-C -%define hash-function-name kconf_id_hash -%define lookup-function-name kconf_id_lookup -%define string-pool-name kconf_id_strings -%compare-strncmp -%enum -%pic -%struct-type - -struct kconf_id; - -struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); - -%% -mainmenu, T_MAINMENU, TF_COMMAND -menu, T_MENU, TF_COMMAND -endmenu, T_ENDMENU, TF_COMMAND -source, T_SOURCE, TF_COMMAND -choice, T_CHOICE, TF_COMMAND -endchoice, T_ENDCHOICE, TF_COMMAND -comment, T_COMMENT, TF_COMMAND -config, T_CONFIG, TF_COMMAND -menuconfig, T_MENUCONFIG, TF_COMMAND -help, T_HELP, TF_COMMAND ----help---, T_HELP, TF_COMMAND -if, T_IF, TF_COMMAND|TF_PARAM -endif, T_ENDIF, TF_COMMAND -depends, T_DEPENDS, TF_COMMAND -optional, T_OPTIONAL, TF_COMMAND -default, T_DEFAULT, TF_COMMAND, S_UNKNOWN -prompt, T_PROMPT, TF_COMMAND -tristate, T_TYPE, TF_COMMAND, S_TRISTATE -def_tristate, T_DEFAULT, TF_COMMAND, S_TRISTATE -bool, T_TYPE, TF_COMMAND, S_BOOLEAN -boolean, T_TYPE, TF_COMMAND, S_BOOLEAN -def_bool, T_DEFAULT, TF_COMMAND, S_BOOLEAN -int, T_TYPE, TF_COMMAND, S_INT -hex, T_TYPE, TF_COMMAND, S_HEX -string, T_TYPE, TF_COMMAND, S_STRING -select, T_SELECT, TF_COMMAND -imply, T_IMPLY, TF_COMMAND -range, T_RANGE, TF_COMMAND -visible, T_VISIBLE, TF_COMMAND -option, T_OPTION, TF_COMMAND -on, T_ON, TF_PARAM -modules, T_OPT_MODULES, TF_OPTION -defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION -env, T_OPT_ENV, TF_OPTION -allnoconfig_y, T_OPT_ALLNOCONFIG_Y,TF_OPTION -%% diff --git a/config/zconf.y b/config/zconf.y index dfd6021..79c4f04 100644 --- a/config/zconf.y +++ b/config/zconf.y @@ -101,8 +101,8 @@ static struct menu *current_menu, *current_entry; } if_entry menu_entry choice_entry %{ -/* Include zconf.hash.c here so it can see the token constants. */ -#include "zconf.hash.c" +/* Include zconf_id.c here so it can see the token constants. */ +#include "kconf_id.c" %} %% @@ -119,7 +119,7 @@ stmt_list: | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } | stmt_list option_name error T_EOL { - zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name); + zconf_error("unexpected option \"%s\"", $2->name); } | stmt_list error T_EOL { zconf_error("invalid statement"); } ; @@ -551,13 +551,13 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok { if (id->token != endtoken) { zconf_error("unexpected '%s' within %s block", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); zconfnerrs++; return false; } if (current_menu->file != current_file) { zconf_error("'%s' in different file than '%s'", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); fprintf(stderr, "%s:%d: location of the '%s'\n", current_menu->file->name, current_menu->lineno, zconf_tokenname(starttoken)); diff --git a/extra/FindGPERF.cmake b/extra/FindGPERF.cmake deleted file mode 100644 index baf8749..0000000 --- a/extra/FindGPERF.cmake +++ /dev/null @@ -1,160 +0,0 @@ -# - Find gperf executable and provides a macro to generate custom build rules -# -# The module defines the following variables: -# GPERF_FOUND - true is gperf executable is found -# GPERF_EXECUTABLE - the path to the gperf executable -# GPERF_VERSION - the version of gperf -# GPERF_LIBRARIES - The gperf libraries -# -# The minimum required version of gperf can be specified using the -# standard syntax, e.g. FIND_PACKAGE(GPERF 2.5.13) -# -# -# If gperf is found on the system, the module provides the macro: -# GPERF_TARGET(Name GperfInput GperfOutput [COMPILE_FLAGS ]) -# which creates a custom command to generate the file from -# the file. If COMPILE_FLAGS option is specified, the next -# parameter is added to the gperf command line. Name is an alias used to -# get details of this custom command. Indeed the macro defines the -# following variables: -# GPERF_${Name}_DEFINED - true is the macro ran successfully -# GPERF_${Name}_OUTPUTS - the source file generated by the custom rule, an -# alias for GperfOutput -# GPERF_${Name}_INPUT - the gperf source file, an alias for ${GperfInput} -# -# Gperf scanners oftenly use tokens defined by Bison: the code generated -# by Gperf depends of the header generated by Bison. This module also -# defines a macro: -# ADD_GPERF_BISON_DEPENDENCY(GperfTarget BisonTarget) -# which adds the required dependency between a scanner and a parser -# where and are the first parameters of -# respectively GPERF_TARGET and BISON_TARGET macros. -# -# ==================================================================== -# Example: -# -# find_package(GPERF) -# -# GPERF_TARGET(MyHash hash.gperf ${CMAKE_CURRENT_BINARY_DIR}/hash.c) -# -# ==================================================================== - -#============================================================================= -# Copyright 2009 Kitware, Inc. -# Copyright 2006 Tristan Carel -# -# 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 names of Kitware, Inc., the Insight Software Consortium, -# nor the names of their 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 -# HOLDER 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. - -cmake_minimum_required(VERSION 2.8.4) - -FIND_PROGRAM(GPERF_EXECUTABLE gperf DOC "path to the gperf executable") -MARK_AS_ADVANCED(GPERF_EXECUTABLE) - -FIND_LIBRARY(FL_LIBRARY NAMES fl - DOC "path to the fl library") -MARK_AS_ADVANCED(FL_LIBRARY) -SET(GPERF_LIBRARIES ${FL_LIBRARY}) - -IF(GPERF_EXECUTABLE) - - EXECUTE_PROCESS(COMMAND ${GPERF_EXECUTABLE} --version - OUTPUT_VARIABLE GPERF_version_output - ERROR_VARIABLE GPERF_version_error - RESULT_VARIABLE GPERF_version_result - OUTPUT_STRIP_TRAILING_WHITESPACE) - - SET(ENV{LC_ALL} ${_Bison_SAVED_LC_ALL}) - - IF(NOT ${GPERF_version_result} EQUAL 0) - MESSAGE(SEND_ERROR "Command \"${GPERF_EXECUTABLE} --version\" failed with output:\n${GPERF_version_error}") - ELSE() - STRING(REGEX REPLACE "^GNU gperf ([^\n]+)\n.*" "\\1" - GPERF_VERSION "${GPERF_version_output}") - ENDIF() - - #============================================================ - # GPERF_TARGET (public macro) - #============================================================ - # - MACRO(GPERF_TARGET Name Input Output) - SET(GPERF_TARGET_usage "GPERF_TARGET( [COMPILE_FLAGS ]") - IF(${ARGC} GREATER 3) - IF(${ARGC} EQUAL 5) - IF("${ARGV3}" STREQUAL "COMPILE_FLAGS") - SET(GPERF_EXECUTABLE_opts "${ARGV4}") - SEPARATE_ARGUMENTS(GPERF_EXECUTABLE_opts) - ELSE() - MESSAGE(SEND_ERROR ${GPERF_TARGET_usage}) - ENDIF() - ELSE() - MESSAGE(SEND_ERROR ${GPERF_TARGET_usage}) - ENDIF() - ENDIF() - - ADD_CUSTOM_COMMAND(OUTPUT ${Output} - COMMAND ${GPERF_EXECUTABLE} - ARGS ${GPERF_EXECUTABLE_opts} < ${Input} > ${Output} - DEPENDS ${Input} - COMMENT "[GPERF][${Name}] Building hash with gperf ${GPERF_VERSION}" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - - SET(GPERF_${Name}_DEFINED TRUE) - SET(GPERF_${Name}_OUTPUTS ${Output}) - SET(GPERF_${Name}_INPUT ${Input}) - SET(GPERF_${Name}_COMPILE_FLAGS ${GPERF_EXECUTABLE_opts}) - ENDMACRO(GPERF_TARGET) - #============================================================ - - - #============================================================ - # ADD_GPERF_BISON_DEPENDENCY (public macro) - #============================================================ - # - MACRO(ADD_GPERF_BISON_DEPENDENCY GperfTarget BisonTarget) - - IF(NOT GPERF_${GperfTarget}_OUTPUTS) - MESSAGE(SEND_ERROR "Gperf target `${GperfTarget}' does not exists.") - ENDIF() - - IF(NOT BISON_${BisonTarget}_OUTPUT_HEADER) - MESSAGE(SEND_ERROR "Bison target `${BisonTarget}' does not exists.") - ENDIF() - - SET_SOURCE_FILES_PROPERTIES(${GPERF_${GperfTarget}_OUTPUTS} - PROPERTIES OBJECT_DEPENDS ${BISON_${BisonTarget}_OUTPUT_HEADER}) - ENDMACRO(ADD_GPERF_BISON_DEPENDENCY) - #============================================================ - -ENDIF(GPERF_EXECUTABLE) - -INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GPERF REQUIRED_VARS GPERF_EXECUTABLE - VERSION_VAR GPERF_VERSION) - -# FindGPERF.cmake ends here -- 2.31.1