Reapply "[Support] Remove terminfo dependency (#92865)" (#93889)

This reverts commit fe82a3da36196157c0caa1ef2505186782f750d1.

This broke LLDB on MacOS due to a missing symbol during linking.

The fix has been applied in c6c08eee37bada190bd1aa4593c88a5e2c8cdaac.

Original commit message:

The terminfo dependency introduces a significant nonhermeticity into the
build. It doesn't respect `--no-undefined-version` meaning that it's not
a dependency that can be built with Clang 17+. This forces maintainers
of source-based distributions to implement patches or ignore linker
errors.

Remove it to reduce the closure size and improve portability of
LLVM-based tools. Users can still use command line arguments to toggle
color support expliticly.

Fixes #75490
Closes #53294 #23355
This commit is contained in:
Aaron Siddhartha Mondal 2024-05-31 01:29:00 +02:00 committed by GitHub
parent d4ff9615a1
commit 852aaf5407
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 12 additions and 218 deletions

View File

@ -19,7 +19,6 @@ set(LLVM_ENABLE_LLD ON CACHE BOOL "")
set(LLVM_ENABLE_LTO ON CACHE BOOL "")
set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
set(LLVM_ENABLE_PLUGINS OFF CACHE BOOL "")
set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "")
set(LLVM_ENABLE_UNWIND_TABLES OFF CACHE BOOL "")
set(LLVM_ENABLE_Z3_SOLVER OFF CACHE BOOL "")
set(LLVM_ENABLE_ZLIB ON CACHE BOOL "")

View File

@ -12,7 +12,6 @@ set(LLVM_ENABLE_DIA_SDK OFF CACHE BOOL "")
set(LLVM_ENABLE_LIBEDIT OFF CACHE BOOL "")
set(LLVM_ENABLE_LIBXML2 OFF CACHE BOOL "")
set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "")
set(LLVM_ENABLE_UNWIND_TABLES OFF CACHE BOOL "")
set(LLVM_ENABLE_Z3_SOLVER OFF CACHE BOOL "")
set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "")
@ -34,7 +33,6 @@ set(_FUCHSIA_BOOTSTRAP_PASSTHROUGH
LibXml2_ROOT
LLVM_ENABLE_CURL
LLVM_ENABLE_HTTPLIB
LLVM_ENABLE_TERMINFO
LLVM_ENABLE_LIBEDIT
CURL_ROOT
OpenSSL_ROOT
@ -47,11 +45,6 @@ set(_FUCHSIA_BOOTSTRAP_PASSTHROUGH
CURSES_LIBRARIES
PANEL_LIBRARIES
# Deprecated
Terminfo_ROOT
Terminfo_LIBRARIES
# Deprecated
LibEdit_ROOT

View File

@ -13,9 +13,7 @@
# ninja
#
# Disable TERMINFO, ZLIB, and ZSTD for VE since there is no pre-compiled
# libraries.
set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "")
# Disable ZLIB, and ZSTD for VE since there is no pre-compiled libraries.
set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "")
set(LLVM_ENABLE_ZSTD OFF CACHE BOOL "")

View File

@ -54,7 +54,7 @@ CMAKE_COMMAND = (
"cmake -G Ninja -DCMAKE_BUILD_TYPE=Release "
"-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 "
'-DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_BUILD_RUNTIME=OFF '
"-DLLVM_ENABLE_TERMINFO=OFF -DCLANG_ENABLE_ARCMT=OFF "
"-DCLANG_ENABLE_ARCMT=OFF "
"-DCLANG_ENABLE_STATIC_ANALYZER=ON"
)

View File

@ -182,21 +182,6 @@ check_library_exists(m pow "" COMPILER_RT_HAS_LIBM)
check_library_exists(pthread pthread_create "" COMPILER_RT_HAS_LIBPTHREAD)
check_library_exists(execinfo backtrace "" COMPILER_RT_HAS_LIBEXECINFO)
# Look for terminfo library, used in unittests that depend on LLVMSupport.
if(LLVM_ENABLE_TERMINFO STREQUAL FORCE_ON)
set(MAYBE_REQUIRED REQUIRED)
else()
set(MAYBE_REQUIRED)
endif()
if(LLVM_ENABLE_TERMINFO)
find_library(COMPILER_RT_TERMINFO_LIB NAMES terminfo tinfo curses ncurses ncursesw ${MAYBE_REQUIRED})
endif()
if(COMPILER_RT_TERMINFO_LIB)
set(LLVM_ENABLE_TERMINFO 1)
else()
set(LLVM_ENABLE_TERMINFO 0)
endif()
if (ANDROID AND COMPILER_RT_HAS_LIBDL)
# Android's libstdc++ has a dependency on libdl.
list(APPEND CMAKE_REQUIRED_LIBRARIES dl)

View File

@ -139,7 +139,6 @@ if [[ ! -f ${LLVM_BUILD}/build.ninja ]]; then
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_ENABLE_ZLIB=ON \
-DLLVM_ENABLE_ZSTD=OFF \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_THREADS=OFF \
$LLVM_SRC
fi

View File

@ -54,11 +54,6 @@ set(XRAY_UNITTEST_LINK_FLAGS
${COMPILER_RT_CXX_LINK_LIBS})
if (NOT APPLE)
# Needed by LLVMSupport.
append_list_if(
LLVM_ENABLE_TERMINFO
-l${COMPILER_RT_TERMINFO_LIB} XRAY_UNITTEST_LINK_FLAGS)
# We add the library directories one at a time in our CFLAGS.
foreach (DIR ${LLVM_LIBRARY_DIR})
list(APPEND XRAY_UNITTEST_LINK_FLAGS -L${DIR})

View File

@ -477,7 +477,6 @@ further by passing the appropriate cmake options, such as:
-DLLDB_ENABLE_PYTHON=0
-DLLDB_ENABLE_LIBEDIT=0
-DLLDB_ENABLE_CURSES=0
-DLLVM_ENABLE_TERMINFO=0
(see :ref:`Optional Dependencies` for more)

View File

@ -11,9 +11,6 @@ set(LLDB_LIBEDIT_LIBS)
if (LLDB_ENABLE_CURSES)
list(APPEND LLDB_CURSES_LIBS ${PANEL_LIBRARIES} ${CURSES_LIBRARIES})
if(LLVM_ENABLE_TERMINFO)
list(APPEND LLDB_CURSES_LIBS ${Terminfo_LIBRARIES})
endif()
if (LLVM_BUILD_STATIC)
list(APPEND LLDB_CURSES_LIBS gpm)
endif()

View File

@ -539,8 +539,6 @@ set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should sear
set(LLVM_TARGET_ARCH "host"
CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)

View File

@ -240,21 +240,11 @@ if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
else()
set(HAVE_LIBEDIT 0)
endif()
if(LLVM_ENABLE_TERMINFO)
if(LLVM_ENABLE_TERMINFO STREQUAL FORCE_ON)
find_package(Terminfo REQUIRED)
else()
find_package(Terminfo)
endif()
set(LLVM_ENABLE_TERMINFO "${Terminfo_FOUND}")
endif()
else()
set(HAVE_LIBEDIT 0)
set(LLVM_ENABLE_TERMINFO 0)
endif()
else()
set(HAVE_LIBEDIT 0)
set(LLVM_ENABLE_TERMINFO 0)
endif()
if(LLVM_HAS_LOGF128)

View File

@ -1,55 +0,0 @@
# Attempts to discover terminfo library with a linkable setupterm function.
#
# Example usage:
#
# find_package(Terminfo)
#
# If successful, the following variables will be defined:
# Terminfo_FOUND
# Terminfo_LIBRARIES
#
# Additionally, the following import target will be defined:
# Terminfo::terminfo
find_library(Terminfo_LIBRARIES NAMES terminfo tinfo curses ncurses ncursesw)
if(Terminfo_LIBRARIES)
include(CMakePushCheckState)
cmake_push_check_state()
list(APPEND CMAKE_REQUIRED_LIBRARIES ${Terminfo_LIBRARIES})
set(Terminfo_LINKABLE_SRC [=[
#ifdef __cplusplus
extern "C" {
#endif
int setupterm(char *term, int filedes, int *errret);
#ifdef __cplusplus
}
#endif
int main(void) { return setupterm(0, 0, 0); }
]=])
if(DEFINED CMAKE_C_COMPILER)
include(CheckCSourceCompiles)
check_c_source_compiles("${Terminfo_LINKABLE_SRC}" Terminfo_LINKABLE)
else()
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("${Terminfo_LINKABLE_SRC}" Terminfo_LINKABLE)
endif()
cmake_pop_check_state()
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Terminfo
FOUND_VAR
Terminfo_FOUND
REQUIRED_VARS
Terminfo_LIBRARIES
Terminfo_LINKABLE)
mark_as_advanced(Terminfo_LIBRARIES
Terminfo_LINKABLE)
if(Terminfo_FOUND)
if(NOT TARGET Terminfo::terminfo)
add_library(Terminfo::terminfo UNKNOWN IMPORTED)
set_target_properties(Terminfo::terminfo PROPERTIES IMPORTED_LOCATION "${Terminfo_LIBRARIES}")
endif()
endif()

View File

@ -60,11 +60,6 @@ if(LLVM_ENABLE_LIBEDIT)
find_package(LibEdit)
endif()
set(LLVM_ENABLE_TERMINFO @LLVM_ENABLE_TERMINFO@)
if(LLVM_ENABLE_TERMINFO)
find_package(Terminfo)
endif()
set(LLVM_ENABLE_THREADS @LLVM_ENABLE_THREADS@)
set(LLVM_ENABLE_UNWIND_TABLES @LLVM_ENABLE_UNWIND_TABLES@)

View File

@ -63,6 +63,10 @@ Changes to LLVM infrastructure
Changes to building LLVM
------------------------
- The ``LLVM_ENABLE_TERMINFO`` flag has been removed. LLVM no longer depends on
terminfo and now always uses the ``TERM`` environment variable for color
support autodetection.
Changes to TableGen
-------------------

View File

@ -209,9 +209,6 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H}
/* Define if the setupterm() function is supported this platform. */
#cmakedefine LLVM_ENABLE_TERMINFO ${LLVM_ENABLE_TERMINFO}
/* Define to 1 if you have the <termios.h> header file. */
#cmakedefine HAVE_TERMIOS_H ${HAVE_TERMIOS_H}

View File

@ -56,9 +56,6 @@ elseif( CMAKE_HOST_UNIX )
STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
set(system_libs ${system_libs} ${Backtrace_LIBFILE})
endif()
if( LLVM_ENABLE_TERMINFO )
set(imported_libs ${imported_libs} Terminfo::terminfo)
endif()
set(system_libs ${system_libs} ${LLVM_ATOMIC_LIB})
set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
if( UNIX AND NOT (BEOS OR HAIKU) )
@ -325,14 +322,6 @@ if(LLVM_ENABLE_ZSTD)
set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
endif()
if(LLVM_ENABLE_TERMINFO)
if(NOT terminfo_library)
get_property(terminfo_library TARGET Terminfo::terminfo PROPERTY LOCATION)
endif()
get_library_name(${terminfo_library} terminfo_library)
set(llvm_system_libs ${llvm_system_libs} "${terminfo_library}")
endif()
set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")

View File

@ -341,17 +341,9 @@ unsigned Process::StandardErrColumns() {
return getColumns();
}
#ifdef LLVM_ENABLE_TERMINFO
// We manually declare these extern functions because finding the correct
// headers from various terminfo, curses, or other sources is harder than
// writing their specs down.
extern "C" int setupterm(char *term, int filedes, int *errret);
extern "C" struct term *set_curterm(struct term *termp);
extern "C" int del_curterm(struct term *termp);
extern "C" int tigetnum(char *capname);
#endif
bool checkTerminalEnvironmentForColors() {
static bool terminalHasColors() {
// Check if the current terminal is one of terminals that are known to support
// ANSI color escape codes.
if (const char *TermStr = std::getenv("TERM")) {
return StringSwitch<bool>(TermStr)
.Case("ansi", true)
@ -368,54 +360,10 @@ bool checkTerminalEnvironmentForColors() {
return false;
}
static bool terminalHasColors(int fd) {
#ifdef LLVM_ENABLE_TERMINFO
// First, acquire a global lock because these C routines are thread hostile.
static std::mutex TermColorMutex;
std::lock_guard<std::mutex> G(TermColorMutex);
struct term *previous_term = set_curterm(nullptr);
int errret = 0;
if (setupterm(nullptr, fd, &errret) != 0)
// Regardless of why, if we can't get terminfo, we shouldn't try to print
// colors.
return false;
// Test whether the terminal as set up supports color output. How to do this
// isn't entirely obvious. We can use the curses routine 'has_colors' but it
// would be nice to avoid a dependency on curses proper when we can make do
// with a minimal terminfo parsing library. Also, we don't really care whether
// the terminal supports the curses-specific color changing routines, merely
// if it will interpret ANSI color escape codes in a reasonable way. Thus, the
// strategy here is just to query the baseline colors capability and if it
// supports colors at all to assume it will translate the escape codes into
// whatever range of colors it does support. We can add more detailed tests
// here if users report them as necessary.
//
// The 'tigetnum' routine returns -2 or -1 on errors, and might return 0 if
// the terminfo says that no colors are supported.
int colors_ti = tigetnum(const_cast<char *>("colors"));
bool HasColors =
colors_ti >= 0 ? colors_ti : checkTerminalEnvironmentForColors();
// Now extract the structure allocated by setupterm and free its memory
// through a really silly dance.
struct term *termp = set_curterm(previous_term);
(void)del_curterm(termp); // Drop any errors here.
// Return true if we found a color capabilities for the current terminal.
return HasColors;
#else
// When the terminfo database is not available, check if the current terminal
// is one of terminals that are known to support ANSI color escape codes.
return checkTerminalEnvironmentForColors();
#endif
}
bool Process::FileDescriptorHasColors(int fd) {
// A file descriptor has colors if it is displayed and the terminal has
// colors.
return FileDescriptorIsDisplayed(fd) && terminalHasColors(fd);
return FileDescriptorIsDisplayed(fd) && terminalHasColors();
}
bool Process::StandardOutHasColors() {

View File

@ -131,7 +131,7 @@ configure is used for three classes of feature checks:
For the last two points, it would be nice if LLVM didn't have a single
``config.h`` header, but one header per toggle. That way, when e.g.
``llvm_enable_terminfo`` is toggled, only the 3 files caring about that setting
``llvm_enable_zlib`` is toggled, only the 3 files caring about that setting
would need to be rebuilt, instead of everything including ``config.h``.
GN doesn't believe in users setting arbitrary cflags from an environment

View File

@ -1,12 +0,0 @@
import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
config("terminfo_config") {
visibility = [ ":terminfo" ]
libs = [ "ncurses" ]
}
group("terminfo") {
if (llvm_enable_terminfo) {
public_configs = [ ":terminfo_config" ]
}
}

View File

@ -1,4 +0,0 @@
declare_args() {
# Whether to link against terminfo.
llvm_enable_terminfo = false
}

View File

@ -10,7 +10,6 @@ import("//llvm/utils/gn/build/buildflags.gni")
import("//llvm/utils/gn/build/libs/curl/enable.gni")
import("//llvm/utils/gn/build/libs/edit/enable.gni")
import("//llvm/utils/gn/build/libs/pthread/enable.gni")
import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
import("//llvm/utils/gn/build/libs/xar/enable.gni")
import("//llvm/utils/gn/build/libs/xml/enable.gni")
import("//llvm/utils/gn/build/libs/zlib/enable.gni")
@ -294,12 +293,6 @@ write_cmake_config("config") {
values += [ "HAVE_LIBEDIT=" ]
}
if (llvm_enable_terminfo) {
values += [ "LLVM_ENABLE_TERMINFO=1" ]
} else {
values += [ "LLVM_ENABLE_TERMINFO=" ]
}
if (llvm_enable_libxml2) {
values += [ "LLVM_ENABLE_LIBXML2=1" ]
} else {

View File

@ -6,7 +6,6 @@ static_library("Support") {
"//llvm/include/llvm/Support:write_vcsrevision",
"//llvm/lib/Demangle",
"//llvm/utils/gn/build/libs/pthread",
"//llvm/utils/gn/build/libs/terminfo",
"//llvm/utils/gn/build/libs/zlib",
]

View File

@ -1,7 +1,6 @@
import("//llvm/lib/Target/targets_string.gni")
import("//llvm/utils/gn/build/buildflags.gni")
import("//llvm/utils/gn/build/libs/pthread/enable.gni")
import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
import("//llvm/utils/gn/build/libs/xml/enable.gni")
import("//llvm/utils/gn/build/libs/zlib/enable.gni")
import("//llvm/utils/gn/build/write_cmake_config.gni")
@ -36,7 +35,7 @@ write_cmake_config("BuildVariables.inc") {
lib = ""
}
# Windows doesn't use any of libxml2, terminfo, zlib by default.
# Windows doesn't use any of libxml2, zlib by default.
# Make GN not warn about these variables being unused.
not_needed([
"l",
@ -63,9 +62,6 @@ write_cmake_config("BuildVariables.inc") {
if (llvm_enable_libxml2) {
system_libs += " ${l}xml2${lib}"
}
if (llvm_enable_terminfo) {
system_libs += " ${l}ncurses${lib}"
}
if (llvm_enable_zlib) {
system_libs += " ${l}z${lib}"
}

View File

@ -51,9 +51,6 @@ build --experimental_cc_shared_library
build:zlib_external --repo_env=BAZEL_LLVM_ZLIB_STRATEGY=external
build:zlib_system --repo_env=BAZEL_LLVM_ZLIB_STRATEGY=system
build:terminfo_external --repo_env=BAZEL_LLVM_TERMINFO_STRATEGY=external
build:terminfo_system --repo_env=BAZEL_LLVM_TERMINFO_STRATEGY=system
###############################################################################
# Options for "generic_clang" builds: these options should generally apply to
# builds using a Clang-based compiler, and default to the `clang` executable on

View File

@ -222,9 +222,6 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define if the setupterm() function is supported this platform. */
/* LLVM_ENABLE_TERMINFO defined in Bazel */
/* Define to 1 if you have the <termios.h> header file. */
#define HAVE_TERMIOS_H 1

View File

@ -209,9 +209,6 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H}
/* Define if the setupterm() function is supported this platform. */
#cmakedefine LLVM_ENABLE_TERMINFO ${LLVM_ENABLE_TERMINFO}
/* Define to 1 if you have the <termios.h> header file. */
#cmakedefine HAVE_TERMIOS_H ${HAVE_TERMIOS_H}