--- /dev/null
+From 17a35476a7eb4f8974c983b4887bbdef27e96375 Mon Sep 17 00:00:00 2001
+Date: Fri, 10 Oct 2025 15:48:31 +0200
+Subject: [PATCH] feat: Update CMake to use PkgConfig for Lua discovery
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Refactor the CMake build system to leverage PkgConfig for
+locating Lua libraries and headers, improving compatibility and
+simplifying the build process.
+
+- Removed the custom cmake/Modules/FindLua5X.cmake module.
+- Updated CMakeLists.txt to use find_package(PkgConfig) and
+ pkg_check_modules(LUA REQUIRED lua).
+- Changed CMAKE_MINIMUM_REQUIRED to version 3.10.
+- Replaced INCLUDE_DIRECTORIES with TARGET_INCLUDE_DIRECTORIES
+ for cmod_ev.
+- Modified lua_ev.c, lua_ev.h, obj_lua_ev.c, and watcher_lua_ev.c
+ to make version, traceback, obj_index, and push_objs functions
+ non-static, allowing them to be properly linked and used after
+ the CMake changes.
+- Adjusted assertions in watcher_lua_ev.c for clarity and
+ consistency.
+
+Fixes: https://github.com/brimworks/lua-ev/issues/24
+---
+ CMakeLists.txt | 11 ++++++---
+ cmake/Modules/FindLua5X.cmake | 46 -----------------------------------
+ lua_ev.c | 4 +--
+ lua_ev.h | 8 +++---
+ obj_lua_ev.c | 4 +--
+ watcher_lua_ev.c | 11 +++------
+ 6 files changed, 18 insertions(+), 66 deletions(-)
+ delete mode 100644 cmake/Modules/FindLua5X.cmake
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -7,8 +7,8 @@
+ # Please note that the package source code is licensed under its own
+ # license.
+
++CMAKE_MINIMUM_REQUIRED (VERSION 3.10)
+ PROJECT(lua-ev C)
+-CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
+
+ # Basic configurations
+ SET(INSTALL_CMOD share/lua/cmod CACHE PATH "Directory to install Lua binary modules (configure lua via LUA_CPATH)")
+@@ -16,6 +16,11 @@ CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
+
+ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")
+
++# Find lua using PkgConfig
++find_package(PkgConfig REQUIRED)
++pkg_check_modules(LUA REQUIRED lua)
++# / Find lua using PkgConfig
++
+ # Find libev
+ FIND_LIBRARY (LIBEV_LIBRARY NAMES ev)
+ FIND_PATH (LIBEV_INCLUDE_DIR ev.h
+@@ -25,17 +30,15 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_S
+ FIND_PACKAGE_HANDLE_STANDARD_ARGS(libev DEFAULT_MSG LIBEV_LIBRARY LIBEV_INCLUDE_DIR)
+ # / Find libarchive
+
+-# Find lua
+- FIND_PACKAGE(Lua5X REQUIRED)
+ # / Find lua
+
+ # Define how to build ev.so:
+- INCLUDE_DIRECTORIES(${LIBEV_INCLUDE_DIR} ${LUA_INCLUDE_DIR})
+ ADD_LIBRARY(cmod_ev MODULE
+ lua_ev.c
+ )
+ SET_TARGET_PROPERTIES(cmod_ev PROPERTIES PREFIX "")
+ SET_TARGET_PROPERTIES(cmod_ev PROPERTIES OUTPUT_NAME ev)
++ TARGET_INCLUDE_DIRECTORIES(cmod_ev PRIVATE ${LIBEV_INCLUDE_DIR} ${LUA_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(cmod_ev ${LUA_LIBRARIES} ${LIBEV_LIBRARY})
+ # / build ev.so
+
+--- a/cmake/Modules/FindLua5X.cmake
++++ /dev/null
+@@ -1,46 +0,0 @@
+-
+-find_path(LUA_INCLUDE_DIR lua.h
+- HINTS
+- $ENV{LUA_DIR}
+- PATH_SUFFIXES include include/lua include/lua53 include/lua5.3 include/lua52 include/lua5.2 include/lua51 include/lua5.1
+- PATHS
+- ~/Library/Frameworks
+- /Library/Frameworks
+- /usr/local
+- /usr
+- /sw
+- /opt/local
+- /opt/csw
+- /opt
+-)
+-
+-find_library(LUA_LIBRARY
+- NAMES lua lua53 lua5.3 lua52 lua5.2 lua-5.2 lua51 lua5.1 luajit-5.1 luajit51 luajit5.1
+- HINTS
+- $ENV{LUA_DIR}
+- PATH_SUFFIXES lib64 lib
+- PATHS
+- ~/Library/Frameworks
+- /Library/Frameworks
+- /usr/local
+- /usr
+- /sw
+- /opt/local
+- /opt/csw
+- /opt
+-)
+-
+-if(LUA_LIBRARY)
+- if(UNIX AND NOT APPLE)
+- find_library(LUA_MATH_LIBRARY m)
+- set( LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}" CACHE STRING "Lua Libraries")
+- else(UNIX AND NOT APPLE)
+- set( LUA_LIBRARIES "${LUA_LIBRARY}" CACHE STRING "Lua Libraries")
+- endif(UNIX AND NOT APPLE)
+-endif(LUA_LIBRARY)
+-
+-include(FindPackageHandleStandardArgs)
+-
+-find_package_handle_standard_args(Lua5X DEFAULT_MSG LUA_LIBRARIES LUA_INCLUDE_DIR)
+-
+-mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARIES LUA_LIBRARY LUA_MATH_LIBRARY)
+--- a/lua_ev.c
++++ b/lua_ev.c
+@@ -131,7 +131,7 @@ LUALIB_API int luaopen_ev(lua_State *L)
+ *
+ * [+2, -0, -]
+ */
+-static int version(lua_State *L) {
++int version(lua_State *L) {
+ lua_pushnumber(L, ev_version_major());
+ lua_pushnumber(L, ev_version_minor());
+ return 2;
+@@ -141,7 +141,7 @@ static int version(lua_State *L) {
+ * Taken from lua.c out of the lua source distribution. Use this
+ * function when doing lua_pcall().
+ */
+-static int traceback(lua_State *L) {
++int traceback(lua_State *L) {
+ if ( !lua_isstring(L, 1) ) return 1;
+
+ lua_getglobal(L, "debug");
+--- a/lua_ev.h
++++ b/lua_ev.h
+@@ -100,8 +100,8 @@
+ /**
+ * Generic functions:
+ */
+-static int version(lua_State *L);
+-static int traceback(lua_State *L);
++int version(lua_State *L);
++int traceback(lua_State *L);
+
+ /**
+ * Loop functions:
+@@ -131,9 +131,9 @@ static void create_obj_regi
+ static int obj_count(lua_State *L);
+ static void* obj_new(lua_State* L, size_t size, const char* tname);
+ static int obj_newindex(lua_State *L);
+-static int obj_index(lua_State *L);
++int obj_index(lua_State *L);
+
+-static int push_objs(lua_State* L, void** objs);
++int push_objs(lua_State* L, void** objs);
+
+ /**
+ * Watcher functions:
+--- a/obj_lua_ev.c
++++ b/obj_lua_ev.c
+@@ -96,7 +96,7 @@ static int obj_newindex(lua_State *L) {
+ *
+ * [-0, +1, ?]
+ */
+-static int obj_index(lua_State *L) {
++int obj_index(lua_State *L) {
+ if ( lua_getmetatable(L, 1) ) {
+ lua_pushvalue(L, 2);
+ lua_gettable(L, -2);
+@@ -139,7 +139,7 @@ static void register_obj(lua_State*L, in
+ *
+ * [-0, +objs_len, m]
+ */
+-static int push_objs(lua_State* L, void** objs) {
++int push_objs(lua_State* L, void** objs) {
+ int obj_count = 0;
+ int registry_i;
+ void** cur;
+--- a/watcher_lua_ev.c
++++ b/watcher_lua_ev.c
+@@ -132,14 +132,9 @@ static void* watcher_new(lua_State* L, s
+ static void watcher_cb(struct ev_loop *loop, void *watcher, int revents) {
+ lua_State* L = ev_userdata(loop);
+ void* objs[3] = { loop, watcher, NULL };
+- int result;
+-
+- lua_pushcfunction(L, traceback);
+-
+- result = lua_checkstack(L, 5);
+- assert(result != 0 /* able to allocate enough space on lua stack */);
+- result = push_objs(L, objs);
+- assert(result == 2 /* pushed two objects on the lua stack */);
++ (void)objs;
++ assert(lua_checkstack(L, 5) != 0 /* able to allocate enough space on lua stack */);
++ assert(push_objs(L, objs) == 2 /* pushed two objects on the lua stack */);
+ assert(!lua_isnil(L, -2) /* the loop obj was resolved */);
+ assert(!lua_isnil(L, -1) /* the watcher obj was resolved */);
+