Author: Michael Buch Date: 2024-05-29T16:20:42+01:00 New Revision: fe82a3da36196157c0caa1ef2505186782f750d1
URL: https://github.com/llvm/llvm-project/commit/fe82a3da36196157c0caa1ef2505186782f750d1 DIFF: https://github.com/llvm/llvm-project/commit/fe82a3da36196157c0caa1ef2505186782f750d1.diff LOG: Revert "[Support] Remove terminfo dependency (#92865)" This reverts commit 6bf450c7a60fa62c642e39836566da94bb9bbc91. It breaks LLDB CI: https://green.lab.llvm.org/job/llvm.org/view/LLDB/job/as-lldb-cmake/4762/execution/node/97/log/ ``` /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wdocumentation -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -Wno-deprecated-declarations -Wno-unknown-pragmas -Wno-strict-aliasing -Wno-deprecated-register -Wno-vla-extension -O3 -DNDEBUG -arch arm64 -isysroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk -mmacosx-version-min=14.1 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -Wl,-dead_strip -Wl,-no_warn_duplicate_libraries tools/lldb/unittests/Editline/CMakeFiles/EditlineTests.dir/EditlineTest.cpp.o -o tools/lldb/unittests/Editline/EditlineTests lib/libLLVMSupport.a lib/libllvm_gtest_main.a lib/libllvm_gtest.a lib/liblldbHost.a lib/liblldbUtility.a lib/libLLVMTestingSupport.a /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/lib/libxml2.tbd /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/lib/libedit.tbd lib/liblldbHostMacOSXObjCXX.a lib/liblldbUtility.a -framework Foundation -framework CoreFoundation -framework CoreServices -framework Security lib/libLLVMObject.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMCore.a lib/libLLVMRemarks.a lib/libLLVMBitstreamReader.a lib/libLLVMMCParser.a lib/libLLVMMC.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMTextAPI.a lib/libLLVMBinaryFormat.a lib/libLLVMTargetParser.a lib/libllvm_gtest.a lib/libLLVMSupport.a -lm /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/lib/libz.tbd /opt/homebrew/lib/libzstd.dylib lib/libLLVMDemangle.a -lpthread && cd /Users/ec2-user/jenkins/workspace/llvm.org/as-lldb-cmake/lldb-build/tools/lldb/unittests/Editline && /opt/homebrew/Cellar/cmake/3.28.3/bin/cmake -E make_directory /Users/ec2-user/jenkins/workspace/llvm.org/as-lldb-cmake/lldb-build/tools/lldb/unittests/Editline/./Inputs ld: Undefined symbols: _setupterm, referenced from: lldb_private::Editline::Editline(char const*, __sFILE*, __sFILE*, __sFILE*, std::__1::recursive_mutex&) in liblldbHost.a[35](Editline.cpp.o) clang: error: linker command failed with exit code 1 (use -v to see invocation) ``` Added: llvm/cmake/modules/FindTerminfo.cmake llvm/utils/gn/build/libs/terminfo/BUILD.gn llvm/utils/gn/build/libs/terminfo/enable.gni Modified: clang/cmake/caches/Fuchsia-stage2.cmake clang/cmake/caches/Fuchsia.cmake clang/cmake/caches/VectorEngine.cmake clang/utils/analyzer/entrypoint.py compiler-rt/cmake/config-ix.cmake compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh compiler-rt/lib/xray/tests/CMakeLists.txt lldb/docs/resources/build.rst lldb/source/Core/CMakeLists.txt llvm/CMakeLists.txt llvm/cmake/config-ix.cmake llvm/cmake/modules/LLVMConfig.cmake.in llvm/docs/ReleaseNotes.rst llvm/include/llvm/Config/config.h.cmake llvm/lib/Support/CMakeLists.txt llvm/lib/Support/Unix/Process.inc llvm/utils/gn/README.rst llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn llvm/utils/gn/secondary/llvm/tools/llvm-config/BUILD.gn utils/bazel/.bazelrc utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h utils/bazel/llvm_configs/config.h.cmake Removed: ################################################################################ diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index 66e764968e85ce..d5546e20873b3c 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -19,6 +19,7 @@ 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 "") diff --git a/clang/cmake/caches/Fuchsia.cmake b/clang/cmake/caches/Fuchsia.cmake index 4d3af3ad3f4031..30a3b9116a461f 100644 --- a/clang/cmake/caches/Fuchsia.cmake +++ b/clang/cmake/caches/Fuchsia.cmake @@ -12,6 +12,7 @@ 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 "") @@ -33,6 +34,7 @@ set(_FUCHSIA_BOOTSTRAP_PASSTHROUGH LibXml2_ROOT LLVM_ENABLE_CURL LLVM_ENABLE_HTTPLIB + LLVM_ENABLE_TERMINFO LLVM_ENABLE_LIBEDIT CURL_ROOT OpenSSL_ROOT @@ -45,6 +47,11 @@ set(_FUCHSIA_BOOTSTRAP_PASSTHROUGH CURSES_LIBRARIES PANEL_LIBRARIES + # Deprecated + Terminfo_ROOT + + Terminfo_LIBRARIES + # Deprecated LibEdit_ROOT diff --git a/clang/cmake/caches/VectorEngine.cmake b/clang/cmake/caches/VectorEngine.cmake index b429fb0997d7a0..2f968a21cc407e 100644 --- a/clang/cmake/caches/VectorEngine.cmake +++ b/clang/cmake/caches/VectorEngine.cmake @@ -13,7 +13,9 @@ # ninja # -# Disable ZLIB, and ZSTD for VE since there is no pre-compiled libraries. +# Disable TERMINFO, ZLIB, and ZSTD for VE since there is no pre-compiled +# libraries. +set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "") set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "") set(LLVM_ENABLE_ZSTD OFF CACHE BOOL "") diff --git a/clang/utils/analyzer/entrypoint.py b/clang/utils/analyzer/entrypoint.py index 4deb42db0a0b1f..ff877060bad69e 100644 --- a/clang/utils/analyzer/entrypoint.py +++ b/clang/utils/analyzer/entrypoint.py @@ -54,7 +54,7 @@ def is_cmake_needed(): "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 ' - "-DCLANG_ENABLE_ARCMT=OFF " + "-DLLVM_ENABLE_TERMINFO=OFF -DCLANG_ENABLE_ARCMT=OFF " "-DCLANG_ENABLE_STATIC_ANALYZER=ON" ) diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index bddaa37579fd7b..42edbe15edafb5 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -182,6 +182,21 @@ 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) diff --git a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh b/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh index b4702339db59cc..005bd6d584c593 100755 --- a/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh +++ b/compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh @@ -139,6 +139,7 @@ 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 diff --git a/compiler-rt/lib/xray/tests/CMakeLists.txt b/compiler-rt/lib/xray/tests/CMakeLists.txt index 4c7e92b6ecc3d2..0a428b9a30b18b 100644 --- a/compiler-rt/lib/xray/tests/CMakeLists.txt +++ b/compiler-rt/lib/xray/tests/CMakeLists.txt @@ -54,6 +54,11 @@ 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}) diff --git a/lldb/docs/resources/build.rst b/lldb/docs/resources/build.rst index 33b6a6f79def4b..09d3d15a940836 100644 --- a/lldb/docs/resources/build.rst +++ b/lldb/docs/resources/build.rst @@ -477,6 +477,7 @@ 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) diff --git a/lldb/source/Core/CMakeLists.txt b/lldb/source/Core/CMakeLists.txt index dbc620b91b1ed1..471fd9c1a33e59 100644 --- a/lldb/source/Core/CMakeLists.txt +++ b/lldb/source/Core/CMakeLists.txt @@ -11,6 +11,9 @@ 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() diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 64898ab09772f4..cbf4db60a6e185 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -539,6 +539,8 @@ 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) diff --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake index 0aae13e30f2ab4..7d2a49337e1e86 100644 --- a/llvm/cmake/config-ix.cmake +++ b/llvm/cmake/config-ix.cmake @@ -240,11 +240,21 @@ 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) diff --git a/llvm/cmake/modules/FindTerminfo.cmake b/llvm/cmake/modules/FindTerminfo.cmake new file mode 100644 index 00000000000000..163af669706771 --- /dev/null +++ b/llvm/cmake/modules/FindTerminfo.cmake @@ -0,0 +1,55 @@ +# 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() diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in index 7e1501a89354c8..397bd5815b64e9 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -60,6 +60,11 @@ 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@) diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index c7c2c2825f58b9..1e1ccb495c3669 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -63,10 +63,6 @@ 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 ------------------- diff --git a/llvm/include/llvm/Config/config.h.cmake b/llvm/include/llvm/Config/config.h.cmake index ff30741c8f360a..977c182e9d2b0d 100644 --- a/llvm/include/llvm/Config/config.h.cmake +++ b/llvm/include/llvm/Config/config.h.cmake @@ -209,6 +209,9 @@ /* 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} diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index be4badc09efa58..03e888958a0711 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -56,6 +56,9 @@ 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) ) @@ -322,6 +325,14 @@ 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}") diff --git a/llvm/lib/Support/Unix/Process.inc b/llvm/lib/Support/Unix/Process.inc index 84b10ff5d1d08a..ae90924cae1b9b 100644 --- a/llvm/lib/Support/Unix/Process.inc +++ b/llvm/lib/Support/Unix/Process.inc @@ -341,9 +341,17 @@ unsigned Process::StandardErrColumns() { return getColumns(); } -static bool terminalHasColors() { - // Check if the current terminal is one of terminals that are known to support - // ANSI color escape codes. +#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() { if (const char *TermStr = std::getenv("TERM")) { return StringSwitch<bool>(TermStr) .Case("ansi", true) @@ -360,10 +368,54 @@ static bool terminalHasColors() { 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(); + return FileDescriptorIsDisplayed(fd) && terminalHasColors(fd); } bool Process::StandardOutHasColors() { diff --git a/llvm/utils/gn/README.rst b/llvm/utils/gn/README.rst index 52d03be533e55e..9ca545061099d8 100644 --- a/llvm/utils/gn/README.rst +++ b/llvm/utils/gn/README.rst @@ -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_zlib`` is toggled, only the 3 files caring about that setting +``llvm_enable_terminfo`` 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 diff --git a/llvm/utils/gn/build/libs/terminfo/BUILD.gn b/llvm/utils/gn/build/libs/terminfo/BUILD.gn new file mode 100644 index 00000000000000..10003d61c4df91 --- /dev/null +++ b/llvm/utils/gn/build/libs/terminfo/BUILD.gn @@ -0,0 +1,12 @@ +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" ] + } +} diff --git a/llvm/utils/gn/build/libs/terminfo/enable.gni b/llvm/utils/gn/build/libs/terminfo/enable.gni new file mode 100644 index 00000000000000..79ea2b601857ff --- /dev/null +++ b/llvm/utils/gn/build/libs/terminfo/enable.gni @@ -0,0 +1,4 @@ +declare_args() { + # Whether to link against terminfo. + llvm_enable_terminfo = false +} diff --git a/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn b/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn index d8266fee05014b..2da26d102e7723 100644 --- a/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn @@ -10,6 +10,7 @@ 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") @@ -293,6 +294,12 @@ 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 { diff --git a/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn index 7728455499bf3d..941d448b3367c1 100644 --- a/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn @@ -6,6 +6,7 @@ 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", ] diff --git a/llvm/utils/gn/secondary/llvm/tools/llvm-config/BUILD.gn b/llvm/utils/gn/secondary/llvm/tools/llvm-config/BUILD.gn index 711e4e3b431511..bf50cd0fce46bd 100644 --- a/llvm/utils/gn/secondary/llvm/tools/llvm-config/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/tools/llvm-config/BUILD.gn @@ -1,6 +1,7 @@ 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") @@ -35,7 +36,7 @@ write_cmake_config("BuildVariables.inc") { lib = "" } - # Windows doesn't use any of libxml2, zlib by default. + # Windows doesn't use any of libxml2, terminfo, zlib by default. # Make GN not warn about these variables being unused. not_needed([ "l", @@ -62,6 +63,9 @@ 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}" } diff --git a/utils/bazel/.bazelrc b/utils/bazel/.bazelrc index 09111bcdc834ec..5a6d1889076afa 100644 --- a/utils/bazel/.bazelrc +++ b/utils/bazel/.bazelrc @@ -51,6 +51,9 @@ 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 diff --git a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h index a4fb47d677ab15..e9385f45c5e5cd 100644 --- a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h +++ b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h @@ -222,6 +222,9 @@ /* 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 diff --git a/utils/bazel/llvm_configs/config.h.cmake b/utils/bazel/llvm_configs/config.h.cmake index ff30741c8f360a..977c182e9d2b0d 100644 --- a/utils/bazel/llvm_configs/config.h.cmake +++ b/utils/bazel/llvm_configs/config.h.cmake @@ -209,6 +209,9 @@ /* 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} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits