From 11490038a1255811300f8aa8d30b54b17c824ddc Mon Sep 17 00:00:00 2001 From: Schrijvers Luc Date: Wed, 29 May 2024 13:00:59 +0200 Subject: [PATCH] Add KF6 frameworks, kpty6 (#10523) --- kde-frameworks/kpty/kpty6-6.2.0.recipe | 87 ++++ .../kpty/patches/kpty-6.2.0.patchset | 388 ++++++++++++++++++ 2 files changed, 475 insertions(+) create mode 100644 kde-frameworks/kpty/kpty6-6.2.0.recipe create mode 100644 kde-frameworks/kpty/patches/kpty-6.2.0.patchset diff --git a/kde-frameworks/kpty/kpty6-6.2.0.recipe b/kde-frameworks/kpty/kpty6-6.2.0.recipe new file mode 100644 index 000000000..0feb85a3c --- /dev/null +++ b/kde-frameworks/kpty/kpty6-6.2.0.recipe @@ -0,0 +1,87 @@ +SUMMARY="Interfacing with pseudo terminal devices" +DESCRIPTION="This library provides primitives to interface with pseudo terminal \ +devices as well as a KProcess derived class for running child processes and \ +communicating with them using a pty.." +HOMEPAGE="https://invent.kde.org/frameworks/kpty" +COPYRIGHT="2010-2024 KDE Organisation" +LICENSE="GNU LGPL v2" +REVISION="1" +SOURCE_URI="https://download.kde.org/stable/frameworks/${portVersion%.*}/kpty-${portVersion}.tar.xz" +CHECKSUM_SHA256="f7683e8b5cd5dbbd4257e8d5acd26e58685a3bc3f161dc0fe10f53a075240264" +SOURCE_DIR="kpty-$portVersion" +PATCHES="kpty-$portVersion.patchset" + +ARCHITECTURES="all !x86_gcc2" +SECONDARY_ARCHITECTURES="x86" + +PROVIDES=" + kpty6$secondaryArchSuffix = $portVersion + lib:libKF6Pty$secondaryArchSuffix = $portVersion compat >= 5 + " +REQUIRES=" + haiku$secondaryArchSuffix + lib:libKF6ConfigGui$secondaryArchSuffix + lib:libKF6CoreAddons$secondaryArchSuffix + lib:libKF6I18n$secondaryArchSuffix + lib:libKF6WidgetsAddons$secondaryArchSuffix + lib:libQt6Core$secondaryArchSuffix + lib:libQt6Gui$secondaryArchSuffix + lib:libQt6Xml$secondaryArchSuffix + " + +PROVIDES_devel=" + kpty6${secondaryArchSuffix}_devel = $portVersion + devel:libKF6Pty$secondaryArchSuffix = $portVersion compat >= 5 + " +REQUIRES_devel=" + kpty6$secondaryArchSuffix == $portVersion base + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + extra_cmake_modules$secondaryArchSuffix >= $portVersion + qt6_tools${secondaryArchSuffix}_devel + devel:libKF6ConfigGui$secondaryArchSuffix == $portVersion + devel:libKF6CoreAddons$secondaryArchSuffix == $portVersion + devel:libKF6I18n$secondaryArchSuffix == $portVersion + devel:libKF6WidgetsAddons$secondaryArchSuffix == $portVersion + devel:libQt6Core$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + cmd:cmake + cmd:dot + cmd:doxygen >= 1.9 + cmd:g++$secondaryArchSuffix + cmd:make + " + +BUILD() +{ + cmake -Bbuild -S. $cmakeDirArgs \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS=-D_BSD_SOURCE \ + -DECM_DIR=/system/data/cmake/Modules/ECM/cmake \ + -DBUILD_QCH=ON \ + -DBUILD_TESTING=OFF + make -Cbuild $jobArgs +} + +INSTALL() +{ + make -Cbuild install + + prepareInstalledDevelLib \ + libKF6Pty + + packageEntries devel \ + $developDir \ + $dataDir/doc \ + $libDir/cmake +} + +TEST() +{ + # 0% tests passed, 1 tests failed out of 1 + export LIBRARY_PATH="$sourceDir/build/bin${LIBRARY_PATH:+:$LIBRARY_PATH}" + make -Cbuild test +} diff --git a/kde-frameworks/kpty/patches/kpty-6.2.0.patchset b/kde-frameworks/kpty/patches/kpty-6.2.0.patchset new file mode 100644 index 000000000..1bd8064ee --- /dev/null +++ b/kde-frameworks/kpty/patches/kpty-6.2.0.patchset @@ -0,0 +1,388 @@ +From d95c902015cb386bcbe175a6b8b803efe8bc0393 Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Mon, 1 Nov 2021 09:20:04 +1000 +Subject: Use bsd openpty for haiku + + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 2735eef..97fcdf3 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -8,7 +8,7 @@ set_target_properties(KF6Pty PROPERTIES + ) + + target_sources(KF6Pty PRIVATE +- kpty.cpp ++ kpty_haiku.cpp + kptydevice.cpp + kptydevice.h + kpty.h +@@ -42,7 +42,8 @@ target_link_libraries(KF6Pty PUBLIC Qt6::Core + KF6::CoreAddons # KProcess + PRIVATE + ${UTIL_LIBRARY} +- KF6::I18n) ++ KF6::I18n ++ bsd) + + target_include_directories(KF6Pty PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) + if(UTEMPTER_FOUND) +@@ -93,7 +94,7 @@ endif() + + ########### next target ############### + +-if (NOT HAVE_OPENPTY) ++if (NOT HAVE_OPENPTY AND NOT HAIKU) + add_executable(kgrantpty kgrantpty.c) + ecm_mark_nongui_executable(kgrantpty) + install(TARGETS kgrantpty DESTINATION ${KDE_INSTALL_LIBEXECDIR_KF}) +diff --git a/src/kpty_haiku.cpp b/src/kpty_haiku.cpp +new file mode 100644 +index 0000000..7acd36d +--- /dev/null ++++ b/src/kpty_haiku.cpp +@@ -0,0 +1,266 @@ ++#include "kpty_p.h" ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if HAVE_PTY_H ++# include ++#endif ++ ++#if HAVE_LIBUTIL_H ++# include ++#elif HAVE_UTIL_H ++# include ++#endif ++ ++extern "C" { ++#include ++#if HAVE_TERMIO_H ++# include ++#endif ++} ++ ++#if HAVE_TCGETATTR ++# define _tcgetattr(fd, ttmode) tcgetattr(fd, ttmode) ++#endif ++ ++#if HAVE_TCSETATTR ++# define _tcsetattr(fd, ttmode) tcsetattr(fd, TCSANOW, ttmode) ++#endif ++ ++#include ++ ++#include ++ ++#ifndef PATH_MAX ++# ifdef MAXPATHLEN ++# define PATH_MAX MAXPATHLEN ++# else ++# define PATH_MAX 1024 ++# endif ++#endif ++ ++KPtyPrivate::KPtyPrivate(KPty *parent) : ++ masterFd(-1), slaveFd(-1), ownMaster(true), q_ptr(parent) ++{ ++} ++ ++KPtyPrivate::~KPtyPrivate() ++{ ++} ++ ++KPty::KPty() : ++ d_ptr(new KPtyPrivate(this)) ++{ ++} ++ ++KPty::KPty(KPtyPrivate *d) : ++ d_ptr(d) ++{ ++ d_ptr->q_ptr = this; ++} ++ ++KPty::~KPty() ++{ ++ close(); ++} ++ ++bool KPty::open() ++{ ++ Q_D(KPty); ++ ++ if (d->masterFd >= 0) { ++ return true; ++ } ++ ++ d->ownMaster = true; ++ ++ QByteArray ptyName; ++ ++ char ptsn[PATH_MAX]; ++ if (::openpty(&d->masterFd, &d->slaveFd, ptsn, nullptr, nullptr)) { ++ d->masterFd = -1; ++ d->slaveFd = -1; ++ qCWarning(KPTY_LOG) << "Can't open a pseudo teletype"; ++ return false; ++ } ++ d->ttyName = ptsn; ++ ++ fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); ++ fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); ++ ++ setEcho(true); ++ ++ return true; ++} ++ ++bool KPty::open(int fd) ++{ ++ Q_D(KPty); ++ ++ if (d->masterFd >= 0) { ++ qCWarning(KPTY_LOG) << "Attempting to open an already open pty"; ++ return false; ++ } ++ ++ d->ownMaster = false; ++ ++ char *ptsn = ptsname(fd); ++ if (ptsn) { ++ d->ttyName = ptsn; ++ } else { ++ qCWarning(KPTY_LOG) << "Failed to determine pty slave device for fd" << fd; ++ return false; ++ } ++ ++ d->masterFd = fd; ++ if (!openSlave()) { ++ d->masterFd = -1; ++ return false; ++ } ++ ++ setEcho(true); ++ ++ return true; ++} ++ ++void KPty::closeSlave() ++{ ++ Q_D(KPty); ++ ++ if (d->slaveFd < 0) { ++ return; ++ } ++ ::close(d->slaveFd); ++ d->slaveFd = -1; ++} ++ ++bool KPty::openSlave() ++{ ++ Q_D(KPty); ++ ++ if (d->slaveFd >= 0) { ++ return true; ++ } ++ if (d->masterFd < 0) { ++ qCWarning(KPTY_LOG) << "Attempting to open pty slave while master is closed"; ++ return false; ++ } ++ d->slaveFd = QT_OPEN(d->ttyName.data(), QT_OPEN_RDWR | O_NOCTTY); ++ if (d->slaveFd < 0) { ++ qCWarning(KPTY_LOG) << "Can't open slave pseudo teletype"; ++ return false; ++ } ++ fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); ++ return true; ++} ++ ++void KPty::close() ++{ ++ Q_D(KPty); ++ ++ if (d->masterFd < 0) { ++ return; ++ } ++ closeSlave(); ++ if (d->ownMaster) { ++ ::close(d->masterFd); ++ } ++ d->masterFd = -1; ++} ++ ++void KPty::setCTty() ++{ ++ Q_D(KPty); ++ ++ setsid(); ++ ++ ioctl(d->slaveFd, TIOCSCTTY, 0); ++ ++ int pgrp = getpid(); ++ tcsetpgrp(d->slaveFd, pgrp); ++} ++ ++void KPty::login(const char *user, const char *remotehost) ++{ ++} ++ ++void KPty::logout() ++{ ++} ++ ++bool KPty::tcGetAttr(struct ::termios *ttmode) const ++{ ++ Q_D(const KPty); ++ ++ return _tcgetattr(d->masterFd, ttmode) == 0; ++} ++ ++bool KPty::tcSetAttr(struct ::termios *ttmode) ++{ ++ Q_D(KPty); ++ ++ return _tcsetattr(d->masterFd, ttmode) == 0; ++} ++ ++bool KPty::setWinSize(int lines, int columns) ++{ ++ Q_D(KPty); ++ ++ struct winsize winSize; ++ memset(&winSize, 0, sizeof(winSize)); ++ winSize.ws_row = (unsigned short)lines; ++ winSize.ws_col = (unsigned short)columns; ++ return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; ++} ++ ++bool KPty::setEcho(bool echo) ++{ ++ struct ::termios ttmode; ++ if (!tcGetAttr(&ttmode)) { ++ return false; ++ } ++ if (!echo) { ++ ttmode.c_lflag &= ~ECHO; ++ } else { ++ ttmode.c_lflag |= ECHO; ++ } ++ return tcSetAttr(&ttmode); ++} ++ ++const char *KPty::ttyName() const ++{ ++ Q_D(const KPty); ++ ++ return d->ttyName.data(); ++} ++ ++int KPty::masterFd() const ++{ ++ Q_D(const KPty); ++ ++ return d->masterFd; ++} ++ ++int KPty::slaveFd() const ++{ ++ Q_D(const KPty); ++ ++ return d->slaveFd; ++} +-- +2.43.2 + + +From 61a213f5b0c717a5b5ea19d1015b9b88476c876a Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Sun, 3 Mar 2024 22:25:16 +1000 +Subject: Add missing functions + + +diff --git a/src/kpty_haiku.cpp b/src/kpty_haiku.cpp +index 7acd36d..79422e0 100644 +--- a/src/kpty_haiku.cpp ++++ b/src/kpty_haiku.cpp +@@ -219,17 +219,23 @@ bool KPty::tcSetAttr(struct ::termios *ttmode) + return _tcsetattr(d->masterFd, ttmode) == 0; + } + +-bool KPty::setWinSize(int lines, int columns) ++bool KPty::setWinSize(int lines, int columns, int height, int width) + { + Q_D(KPty); + + struct winsize winSize; +- memset(&winSize, 0, sizeof(winSize)); + winSize.ws_row = (unsigned short)lines; + winSize.ws_col = (unsigned short)columns; ++ winSize.ws_ypixel = (unsigned short)height; ++ winSize.ws_xpixel = (unsigned short)width; + return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; + } + ++bool KPty::setWinSize(int lines, int columns) ++{ ++ return setWinSize(lines, columns, 0, 0); ++} ++ + bool KPty::setEcho(bool echo) + { + struct ::termios ttmode; +@@ -264,3 +270,11 @@ int KPty::slaveFd() const + + return d->slaveFd; + } ++ ++void KPty::setCTtyEnabled(bool enable) ++{ ++ Q_D(KPty); ++ ++ d->withCTty = enable; ++} ++ +-- +2.43.2 + + +From 020071b1e3bb260e423a3f1e31826fb605056aa2 Mon Sep 17 00:00:00 2001 +From: Schrijvers Luc +Date: Wed, 6 Mar 2024 20:33:13 +0100 +Subject: Q_PID is deprecated in Qt6 + + +diff --git a/src/kpty_haiku.cpp b/src/kpty_haiku.cpp +index 79422e0..1e2b731 100644 +--- a/src/kpty_haiku.cpp ++++ b/src/kpty_haiku.cpp +@@ -46,7 +46,7 @@ extern "C" { + + #include + +-#include ++// #include + + #ifndef PATH_MAX + # ifdef MAXPATHLEN +-- +2.43.2 +