mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-04-06 07:38:21 +00:00
build: add CMake support for libghostty-vt
Add a top-level CMakeLists.txt that wraps `zig build lib-vt` so that CMake-based downstream projects can consume libghostty-vt without needing to interact with the Zig build system directly. A custom command triggers the zig build during `cmake --build`, and the resulting shared library is exposed as an IMPORTED target. Downstream projects can pull in the library via FetchContent, which fetches the source and builds it as part of their own CMake build, or via find_package after a manual install step. The package config template in dist/cmake/ sets up the ghostty-vt::ghostty-vt target with proper include paths and macOS rpath handling. A c-vt-cmake example demonstrates the FetchContent workflow, creating a terminal, writing VT sequences, and formatting the output as plain text. CI is updated to auto-discover and build CMake-based examples alongside the existing Zig-based ones.
This commit is contained in:
1
example/.gitignore
vendored
1
example/.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
dist/
|
||||
node_modules/
|
||||
example.wasm*
|
||||
build/
|
||||
|
||||
12
example/c-vt-cmake/CMakeLists.txt
Normal file
12
example/c-vt-cmake/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
cmake_minimum_required(VERSION 3.19)
|
||||
project(c-vt-cmake LANGUAGES C)
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(ghostty
|
||||
GIT_REPOSITORY https://github.com/ghostty-org/ghostty.git
|
||||
GIT_TAG main
|
||||
)
|
||||
FetchContent_MakeAvailable(ghostty)
|
||||
|
||||
add_executable(c_vt_cmake src/main.c)
|
||||
target_link_libraries(c_vt_cmake PRIVATE ghostty-vt)
|
||||
21
example/c-vt-cmake/README.md
Normal file
21
example/c-vt-cmake/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# c-vt-cmake
|
||||
|
||||
Demonstrates consuming libghostty-vt from a CMake project using
|
||||
`FetchContent`. Creates a terminal, writes VT sequences into it, and
|
||||
formats the screen contents as plain text.
|
||||
|
||||
## Building
|
||||
|
||||
```shell-session
|
||||
cd example/c-vt-cmake
|
||||
cmake -B build
|
||||
cmake --build build
|
||||
./build/c_vt_cmake
|
||||
```
|
||||
|
||||
To build against a local checkout instead of fetching from GitHub:
|
||||
|
||||
```shell-session
|
||||
cmake -B build -DFETCHCONTENT_SOURCE_DIR_GHOSTTY=../..
|
||||
cmake --build build
|
||||
```
|
||||
52
example/c-vt-cmake/src/main.c
Normal file
52
example/c-vt-cmake/src/main.c
Normal file
@@ -0,0 +1,52 @@
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ghostty/vt.h>
|
||||
|
||||
int main() {
|
||||
// Create a terminal with a small grid
|
||||
GhosttyTerminal terminal;
|
||||
GhosttyTerminalOptions opts = {
|
||||
.cols = 80,
|
||||
.rows = 24,
|
||||
.max_scrollback = 0,
|
||||
};
|
||||
GhosttyResult result = ghostty_terminal_new(NULL, &terminal, opts);
|
||||
assert(result == GHOSTTY_SUCCESS);
|
||||
|
||||
// Write some VT-encoded content into the terminal
|
||||
const char *commands[] = {
|
||||
"Hello from a \033[1mCMake\033[0m-built program!\r\n",
|
||||
"Line 2: \033[4munderlined\033[0m text\r\n",
|
||||
"Line 3: \033[31mred\033[0m \033[32mgreen\033[0m \033[34mblue\033[0m\r\n",
|
||||
};
|
||||
for (size_t i = 0; i < sizeof(commands) / sizeof(commands[0]); i++) {
|
||||
ghostty_terminal_vt_write(terminal, (const uint8_t *)commands[i],
|
||||
strlen(commands[i]));
|
||||
}
|
||||
|
||||
// Format the terminal contents as plain text
|
||||
GhosttyFormatterTerminalOptions fmt_opts =
|
||||
GHOSTTY_INIT_SIZED(GhosttyFormatterTerminalOptions);
|
||||
fmt_opts.emit = GHOSTTY_FORMATTER_FORMAT_PLAIN;
|
||||
fmt_opts.trim = true;
|
||||
|
||||
GhosttyFormatter formatter;
|
||||
result = ghostty_formatter_terminal_new(NULL, &formatter, terminal, fmt_opts);
|
||||
assert(result == GHOSTTY_SUCCESS);
|
||||
|
||||
uint8_t *buf = NULL;
|
||||
size_t len = 0;
|
||||
result = ghostty_formatter_format_alloc(formatter, NULL, &buf, &len);
|
||||
assert(result == GHOSTTY_SUCCESS);
|
||||
|
||||
printf("Plain text (%zu bytes):\n", len);
|
||||
fwrite(buf, 1, len, stdout);
|
||||
printf("\n");
|
||||
|
||||
free(buf);
|
||||
ghostty_formatter_free(formatter);
|
||||
ghostty_terminal_free(terminal);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user