kitty terminal now requires linux_base-rl9?

Since a few weeks, the newest kitty-0.49.2 available in packages started requiring linux_base-rl9 and linux-slang.
This was not the case before and I didn't have the linuxulator enabled.
This dependency was added in the jump from 0.48 to 0.49 kitty versions, does anyone know why is linux now necessary?
Is kitty now compiled as a linux binary?
 
I'm using kitty myself (currently pkg-lock(8)ed version kitty-0.48.2_3, because of linux dependencies). As far as I can tell, graphics/linux-slang (which pulls in emulators/linux-rl9, is only necessary when using custom shaders:

https://sw.kovidgoyal.net/kitty/build/ .
Build from source
...
Dependencies

These dependencies are needed when building against system libraries only.

Run-time dependencies:
...
shader-slang (needed only if you use custom shaders)

Why TF does a terminal emulator need a package to make shader language easier?
It seems for visual effects : https://sw.kovidgoyal.net/kitty/custom-shaders/

Quote:
Cursor trails:

Motion Blur - Make the cursor trail glide smoothly, like a fast moving object caught on camera.

Blaze - Set your cursor on fire as it moves around

Lightning - Make your cursor shoot lightning as it moves around (Seriously?)

Wait, it gets better: Water - Pretend you are cool enough to code underwater.

Animated backgrounds: Inside The Matrix, Northern Lights, Fireworks, etc. /Quote

Those are truly very necessary features for sure in a terminal emulator.

Someone should open a PR or contact the kitty maintainer and ask for a port configure option. Maybe I do it. The option should be disabled by default.
 
It's a hard build requirement now for kitty to build these shaders however only a soft depend not required if you're not using them.

I think the package should only make it a build requirement and leave it to the user to install the extra bits if they want these features.

I've since moved to foot until this is changed.

However, it would be nice if there was a FreeBSD native port of slang. I think it's in the works but nothing public?
 
The unfortunate fact is that there already is conflicting devel/libslang2 (and maybe japanese/libslang, too) that are "Routines for rapid alpha-numeric terminal applications development" with graphics/linux-slang.

I think this (these) conflict(s) should be avoided by graphics/linux-slang side, which is far newer, by installing conflicting files (comparing pkg-plist of each ports, with devel/libslang2, /usr/local/include/slang.h and /usr/local/lib/libslang.so) with different names, or installing into dedicated directory as many others does.

This kind of unwanted conflicts can be seen between shells/fd and sysutils/fd, which the latter is uncomparably newer and disallows me to try anything depending on the latter. (Deinstalling the former cannot be my option, as I'm heavily using it everyday!)
 
When I picked up the quarterly update (on 15.1), it failed half-way through complaining about there being no linux64 support in the kernel. I loaded the module and the upgrade completed. I've not seen this behaviour before, it seems at best a rough edge. The error didn't come with advice to kldload the module.

Why TF does a terminal emulator need a package to make shader language easier?
You could say the same thing about GPU support.
 
I've not seen this behaviour before, it seems at best a rough edge. The error didn't come with advice to kldload the module.
It's been like that for as long as I can remember. Any of the linux-* packages that depend on the Linux emulation layer will give you that message if the kernel module isn't loaded.
 
The ports tree has been updated. There is an option SHADERS now, which defaults to off and pulls in slang only as a run time dependency when on. So as long as you use pkg (not ports) and don't turn that option on you won't get linux-rl9.

The build dependency is still hard on slang and sland doesn't have a FreeBSD binary. I am not convinced. Will look into it later.
 
Yeah, but it is still required at compile time.

The maintainer mentioned:
Nicola Vitale
freebsd_committer
freebsd_triage
2026-10-13 15:00:13 UTC Comment 1
... It is impossible to compile the port without shader-slang. I can only make it a build dependency.

I, for my part, have no objection. I'm using packages from official repositories.
 
The maintainer mentioned:


I, for my part, have no objections. I'm using packages from official repositories.

Instinctively I don't quite buy that the upstream kitty suddenly requires it between minor versions. But as I said I didn't have an opportunity to look into it.

In any case the root of the problem is that there is no FreeBSD version of slang.
 
Yeah, this is unfortunate, it has been my daily driver for years but will have to pass on it for the time being.

So, seeing as how most apps that work on both will eventually be getting pigeon-holed into linux only, what's is even the equivalent native terminal that has comparable features?
Not huge on using a lot of them on kitty, but did find a lot handy. What other(s) have the same functionality and features?
 
x11/terminology - however it is very far from perfect (there are couple rendering bugs, can't detach tabs... are the things that come to my mind). Opening tab in current working directory is not working (yesterday my best effort patch got merged to upstream, however I won't be able to enjoy fruits of my about as my sysctl settings will prevent it from working)
 
x11/alacritty - don't remember much about it, will have to test it again
Edit: seams to not have support for tabs :(
I used to run alacritty in the past as main terminal, but not that often anymore. Tab support is available but "macOS exclusive" (alacritty(5)). Last time I checked (last year or so), for other platforms, the developers suggested open tabs from a running tmux session in alacritty. This requires some configuration of tmux and the shell so that it displays how I want it.

kitty and x11/terminator show them as I want: with minimal configuration, show path, show open files by application, show man page titles (see tabs at the bottom of images):

I'll have a look at wezterm.

terminator:
terminator-tabs.png

kitty:
kitty-tabs.png
 
I built slang compiler from source and it worked as much to build kitty
if anyone wants to build a port out of it here is what i've done

Code:
git clone --recursive https://github.com/shader-slang/slang.git
cd slang

cmake -S . -B build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DSLANG_ENABLE_PREBUILT_BINARIES=OFF \
  -DSLANG_ENABLE_GFX=OFF \
  -DSLANG_ENABLE_SLANG_RHI=OFF \
  -DSLANG_ENABLE_SLANGD=OFF \
  -DSLANG_ENABLE_SLANGI=OFF \
  -DSLANG_ENABLE_TESTS=OFF \
  -DSLANG_ENABLE_EXAMPLES=OFF \
  -DSLANG_ENABLE_DXIL=OFF \
  -DSLANG_ENABLE_CUDA=OFF \
  -DSLANG_ENABLE_OPTIX=OFF \
  -DSLANG_ENABLE_NVAPI=OFF \
  -DSLANG_SLANG_LLVM_FLAVOR=DISABLE

apply patch
cmake --build build -j$(sysctl -n hw.ncpu)
Diff:
diff --git a/include/slang.h b/include/slang.h
index 368046d08..77225ce93 100644
--- a/include/slang.h
+++ b/include/slang.h
@@ -98,7 +98,7 @@ Most applications should not need to touch this section.
         #define SLANG_WIN32 1
     #elif defined(__ANDROID__)
         #define SLANG_ANDROID 1
-    #elif defined(__linux__) || defined(__CYGWIN__) /* note: __ANDROID__ implies __linux__ */
+    #elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) /* note: __ANDROID__ implies __linux__ */
         #define SLANG_LINUX 1
     #elif defined(__APPLE__)
         #include "TargetConditionals.h"
@@ -548,7 +548,7 @@ SLANG_COMPILE_TIME_ASSERT((SLANG_PTR_IS_64 ? 8 : 4) == sizeof(void*));
 #endif

 // Backtrace
-#if SLANG_LINUX_FAMILY
+#if SLANG_LINUX_FAMILY && !defined(__FreeBSD__)
     #include <features.h> // for __GLIBC__ define, if using GNU libc
     #if defined(__GLIBC__) || (__ANDROID_API__ >= 33)
         #define SLANG_HAS_BACKTRACE 1
diff --git a/prelude/slang-cpp-prelude.h b/prelude/slang-cpp-prelude.h
index aedc821a5..b0df204d8 100644
--- a/prelude/slang-cpp-prelude.h
+++ b/prelude/slang-cpp-prelude.h
@@ -142,7 +142,7 @@ Operating system defines, see http://sourceforge.net/p/predef/wiki/OperatingSyst
 #define SLANG_WIN32 1
 #elif defined(__ANDROID__)
 #define SLANG_ANDROID 1
-#elif defined(__linux__) || defined(__CYGWIN__) /* note: __ANDROID__ implies __linux__ */
+#elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__)/* note: __ANDROID__ implies __linux__ */
 #define SLANG_LINUX 1
 #elif defined(__APPLE__) && !defined(SLANG_LLVM)
 #include "TargetConditionals.h"
diff --git a/source/core/slang-io.cpp b/source/core/slang-io.cpp
index 3c214ad1f..a8351eb73 100644
--- a/source/core/slang-io.cpp
+++ b/source/core/slang-io.cpp
@@ -22,7 +22,7 @@
 // clang-format on
 #endif

-#if defined(__linux__) || defined(__CYGWIN__) || SLANG_APPLE_FAMILY || SLANG_WASM
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) || SLANG_APPLE_FAMILY || SLANG_WASM
 #include <fcntl.h>
 #include <unistd.h>
 // For Path::find
@@ -42,6 +42,13 @@
 #include <stdio.h>
 #include <stdlib.h>

+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <dlfcn.h>
+#include <limits.h>
+#endif
+
 namespace Slang
 {

@@ -1011,7 +1018,17 @@ static SlangResult _calcExectuablePath(char* outPath, size_t* ioSize)
     return SLANG_E_BUFFER_TOO_SMALL;
 #elif SLANG_LINUX_FAMILY

-#if defined(__linux__) || defined(__CYGWIN__)
+#if defined(__FreeBSD__)
+
+    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
+    size_t len = bufferSize;
+
+    if (len < PATH_MAX)
+         return SLANG_E_BUFFER_TOO_SMALL;
+    if (sysctl(mib, 4, outPath, &len, nullptr, 0) == 0)
+        return SLANG_OK;
+    return SLANG_FAIL;
+#elif  defined(__linux__) || defined(__CYGWIN__)
     // https://linux.die.net/man/2/readlink
     // Mark last byte with 0, so can check overrun
     ssize_t resSize = ::readlink("/proc/self/exe", outPath, bufferSize);
diff --git a/source/core/slang-platform.cpp b/source/core/slang-platform.cpp
index c975738d7..2c4ea4283 100644
--- a/source/core/slang-platform.cpp
+++ b/source/core/slang-platform.cpp
@@ -282,7 +282,7 @@ SLANG_COMPILE_TIME_ASSERT(E_OUTOFMEMORY == SLANG_E_OUT_OF_MEMORY);
 #else // _WIN32
 /* static */ SlangResult PlatformUtil::getInstancePath([[maybe_unused]] StringBuilder& out)
 {
-#if defined(__linux__) || defined(__CYGWIN__)
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__)
     char path[PATH_MAX];
     ssize_t len = readlink("/proc/self/exe", path, sizeof(path) - 1);
     if (len == -1)
diff --git a/source/core/slang-stream.cpp b/source/core/slang-stream.cpp
index d6cfcad45..7362e749b 100644
--- a/source/core/slang-stream.cpp
+++ b/source/core/slang-stream.cpp
@@ -8,6 +8,16 @@
 #include <stdio.h>
 #include <thread>

+#if defined(__FreeBSD__)
+#define fpos64_t  fpos_t
+#define fgetpos64 fgetpos
+#define fsetpos64 fsetpos
+#define fseeko64  fseeko
+#define ftello64  ftello
+#define fopen64   fopen
+#define off64_t   off_t
+#endif
+
 namespace Slang
 {

diff --git a/source/core/unix/slang-unix-process.cpp b/source/core/unix/slang-unix-process.cpp
index dfc463ac9..73c1b8ea6 100644
--- a/source/core/unix/slang-unix-process.cpp
+++ b/source/core/unix/slang-unix-process.cpp
@@ -21,7 +21,11 @@
 #include <time.h>
 #include <unistd.h>

+#if defined(__FreeBSD__)
+extern char** environ __attribute__((weak));
+#else
 extern char** environ;
+#endif

 namespace Slang
 {
i never installed it just added build/Release/bin into $PATH
then remove the linux-slang dep from kitty's port Makefile and build/install
if you want to install the slang compiler there is a symlink name collision like
Code:
[titus@utmbox ~/builds/slang]$ ls -l build/Release/lib/libslang.so
lrwxr-xr-x  1 titus titus 30 Oct 15 13:29 build/Release/lib/libslang.so -> libslang-compiler.so.0.2026.19
[titus@utmbox ~/builds/slang]$ ls -l /usr/local/lib/libslang.so
lrwxr-xr-x  1 root wheel 13 Sep 21  2025 /usr/local/lib/libslang.so -> libslang.so.2
that needs to be dealt with

everything was done on 14.5-R
[titus@utmbox ~/builds/slang]$ du -sh .
4.2G .
lol
 
Okay, I tried. The default build process does indeed not complete without slang in the newest version. I also learned enough about kitty that I don't want to have anything to do with it.
May I ask want are your concerns? I use it for some of its features like ligatures, underlines and undercurls, panes and tabs, and good font rendering, but also think it's too powerful with the kitten plugin system (remote control...).
 
May I ask want are your concerns? I use it for some of its features like ligatures, underlines and undercurls, panes and tabs, and good font rendering, but also think it's too powerful with the kitten plugin system (remote control...).
Mostly that the developers are pricks. I don't use software when i dislike the developers.
 
Back
Top