From 5a46e61bee58e9170f00b3c1404f6ca78aabcf82 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 22 Mar 2026 13:34:09 -0700 Subject: [PATCH] cmake: fix Windows build support On Windows, shared libraries (DLLs) require an import library (.lib) for linking, and the DLL itself is placed in bin/ rather than lib/ by the Zig build. The CMake wrapper was missing IMPORTED_IMPLIB on the shared imported target, causing link failures, and assumed the shared library was always in lib/. Add GHOSTTY_VT_IMPLIB for the import library name, set IMPORTED_IMPLIB on the ghostty-vt target, and fix the shared library path to use bin/ on Windows. Install the DLL and PDB to bin/ and the import library to lib/ following standard Windows conventions. Apply the same fixes to ghostty-vt-config.cmake.in for the find_package path. --- .github/workflows/test.yml | 25 +++++++++++++++++++++++++ CMakeLists.txt | 21 +++++++++++++++++---- dist/cmake/ghostty-vt-config.cmake.in | 15 +++++++++++++-- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05d788e5e..deca513c8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -87,6 +87,7 @@ jobs: - build-dist - build-examples-zig - build-examples-cmake + - build-examples-cmake-windows - build-cmake - build-flatpak - build-libghostty-vt @@ -263,6 +264,30 @@ jobs: nix develop -c cmake -B build -DFETCHCONTENT_SOURCE_DIR_GHOSTTY=${{ github.workspace }} nix develop -c cmake --build build + build-examples-cmake-windows: + strategy: + fail-fast: false + matrix: + dir: ${{ fromJSON(needs.list-examples.outputs.cmake) }} + name: Example ${{ matrix.dir }} (Windows) + runs-on: windows-2025 + continue-on-error: true + timeout-minutes: 45 + needs: [test, list-examples] + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Install zig + uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2.2.1 + + - name: Build Example + shell: pwsh + run: | + cd example/${{ matrix.dir }} + cmake -B build -DFETCHCONTENT_SOURCE_DIR_GHOSTTY=${{ github.workspace }} + cmake --build build + build-cmake: runs-on: namespace-profile-ghostty-sm needs: test diff --git a/CMakeLists.txt b/CMakeLists.txt index cfa2677fe..27864a88d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,13 +81,18 @@ if(APPLE) elseif(WIN32) set(GHOSTTY_VT_LIBNAME "ghostty-vt.dll") set(GHOSTTY_VT_REALNAME "ghostty-vt.dll") + set(GHOSTTY_VT_IMPLIB "ghostty-vt.lib") else() set(GHOSTTY_VT_LIBNAME "${CMAKE_SHARED_LIBRARY_PREFIX}ghostty-vt${CMAKE_SHARED_LIBRARY_SUFFIX}") set(GHOSTTY_VT_SONAME "${CMAKE_SHARED_LIBRARY_PREFIX}ghostty-vt${CMAKE_SHARED_LIBRARY_SUFFIX}.0") set(GHOSTTY_VT_REALNAME "${CMAKE_SHARED_LIBRARY_PREFIX}ghostty-vt${CMAKE_SHARED_LIBRARY_SUFFIX}.0.1.0") endif() -set(GHOSTTY_VT_SHARED_LIBRARY "${ZIG_OUT_DIR}/lib/${GHOSTTY_VT_REALNAME}") +if(WIN32) + set(GHOSTTY_VT_SHARED_LIBRARY "${ZIG_OUT_DIR}/bin/${GHOSTTY_VT_REALNAME}") +else() + set(GHOSTTY_VT_SHARED_LIBRARY "${ZIG_OUT_DIR}/lib/${GHOSTTY_VT_REALNAME}") +endif() # Static library name. set(GHOSTTY_VT_STATIC_REALNAME "${CMAKE_STATIC_LIBRARY_PREFIX}ghostty-vt${CMAKE_STATIC_LIBRARY_SUFFIX}") @@ -122,7 +127,11 @@ if(APPLE) set_target_properties(ghostty-vt PROPERTIES IMPORTED_SONAME "@rpath/${GHOSTTY_VT_SONAME}" ) -elseif(NOT WIN32) +elseif(WIN32) + set_target_properties(ghostty-vt PROPERTIES + IMPORTED_IMPLIB "${ZIG_OUT_DIR}/lib/${GHOSTTY_VT_IMPLIB}" + ) +else() set_target_properties(ghostty-vt PROPERTIES IMPORTED_SONAME "${GHOSTTY_VT_SONAME}" ) @@ -152,8 +161,12 @@ add_dependencies(ghostty-vt-static zig_build_lib_vt) include(GNUInstallDirs) # Install shared library -install(FILES "${GHOSTTY_VT_SHARED_LIBRARY}" TYPE LIB) -if(NOT WIN32) +if(WIN32) + # On Windows, install the DLL and PDB to bin/ and the import library to lib/ + install(FILES "${GHOSTTY_VT_SHARED_LIBRARY}" "${ZIG_OUT_DIR}/bin/ghostty-vt.pdb" TYPE BIN) + install(FILES "${ZIG_OUT_DIR}/lib/${GHOSTTY_VT_IMPLIB}" TYPE LIB) +else() + install(FILES "${GHOSTTY_VT_SHARED_LIBRARY}" TYPE LIB) # Install symlinks install(CODE " execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink diff --git a/dist/cmake/ghostty-vt-config.cmake.in b/dist/cmake/ghostty-vt-config.cmake.in index 9e1d65f6c..4d97a525c 100644 --- a/dist/cmake/ghostty-vt-config.cmake.in +++ b/dist/cmake/ghostty-vt-config.cmake.in @@ -8,10 +8,17 @@ set(_ghostty_vt_libdir "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_LIBDIR@") if(NOT TARGET ghostty-vt::ghostty-vt) add_library(ghostty-vt::ghostty-vt SHARED IMPORTED) + if(WIN32) + set(_ghostty_vt_shared_location "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_BINDIR@/@GHOSTTY_VT_REALNAME@") + else() + set(_ghostty_vt_shared_location "${_ghostty_vt_libdir}/@GHOSTTY_VT_REALNAME@") + endif() + set_target_properties(ghostty-vt::ghostty-vt PROPERTIES - IMPORTED_LOCATION "${_ghostty_vt_libdir}/@GHOSTTY_VT_REALNAME@" + IMPORTED_LOCATION "${_ghostty_vt_shared_location}" INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_INCLUDEDIR@" ) + unset(_ghostty_vt_shared_location) if(APPLE) set_target_properties(ghostty-vt::ghostty-vt PROPERTIES @@ -22,7 +29,11 @@ if(NOT TARGET ghostty-vt::ghostty-vt) set_property(TARGET ghostty-vt::ghostty-vt APPEND PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-rpath,${_ghostty_vt_libdir}" ) - elseif(NOT WIN32) + elseif(WIN32) + set_target_properties(ghostty-vt::ghostty-vt PROPERTIES + IMPORTED_IMPLIB "${_ghostty_vt_libdir}/@GHOSTTY_VT_IMPLIB@" + ) + else() set_target_properties(ghostty-vt::ghostty-vt PROPERTIES IMPORTED_SONAME "@GHOSTTY_VT_SONAME@" )