diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d112d1..6e96b95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.5 FATAL_ERROR) set(CMAKE_POLICY_VERSION_MINIMUM 3.5) -project(fakelua CXX) +project(fakelua VERSION 2.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 23) @@ -14,6 +14,11 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) +# RPATH configuration +set(CMAKE_MACOSX_RPATH ON) +set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(ENV{FAKELUA_HOME} "${CMAKE_CURRENT_SOURCE_DIR}/") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unused-local-typedefs -Wno-unused-function -DNDEBUG -g3 -ggdb3 -fPIC") @@ -79,3 +84,49 @@ option(BUILD_FUZZ "Build fuzz targets (requires clang)" OFF) if (BUILD_FUZZ) add_subdirectory(fuzz) endif () + +# ── Installation & CMake Package Export ── +install(FILES include/fakelua.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install(FILES include/fakelua.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fakelua +) + +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/fakeluaConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/fakeluaConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/fakeluaConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/fakelua" + PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR +) + +install(EXPORT fakeluaTargets + FILE fakeluaTargets.cmake + NAMESPACE fakelua:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/fakelua" +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/fakeluaConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/fakeluaConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/fakelua" +) + +# pkg-config support +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/fakelua.pc.in" + "${CMAKE_CURRENT_BINARY_DIR}/fakelua.pc" + @ONLY +) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/fakelua.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" +) + diff --git a/README.md b/README.md index b42a7f3..ac8748d 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,52 @@ ctest --test-dir build -V - `--repeat`: Repeat call count (for performance measurement) - `--debug`: Enable debug mode (default `false`; when `true`, outputs generated C source / richer diagnostics) +### Installation & CMake Integration + +#### Install to System + +```bash +# Build +cmake -S . -B build +cmake --build build --parallel + +# Install (default prefix: /usr/local) +sudo cmake --install build +# or: cd build && sudo make install +``` + +#### Using FakeLua in Other CMake Projects + +After installing to your system, other CMake projects can discover and link FakeLua using standard `find_package`: + +```cmake +cmake_minimum_required(VERSION 3.20) +project(my_project CXX) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Discover FakeLua package +find_package(fakelua REQUIRED) + +add_executable(my_project main.cpp) + +# Link against fakelua (automatically sets up include directories and link flags) +target_link_libraries(my_project PRIVATE fakelua::fakelua) +# Alternatively, the unqualified alias is also supported: +# target_link_libraries(my_project PRIVATE fakelua) +``` + +In your C++ code: + +```cpp +#include "fakelua.h" +// or +#include +``` + +FakeLua also installs `fakelua.pc` for `pkg-config` consumers. + ## Performance Benchmarks Comparing Lua 5.4, FakeLua TCC, FakeLua GCC across 11 algorithms (Release `-O3` mode): diff --git a/README.zh.md b/README.zh.md index c992263..e1e1d9a 100644 --- a/README.zh.md +++ b/README.zh.md @@ -238,6 +238,52 @@ ctest --test-dir build -V - `--repeat`:重复调用次数(用于性能测量) - `--debug`:是否启用调试模式(默认 `false`,若为 `true` 则输出生成的 C 源码 / 更详细诊断) +### 安装与 CMake 集成 + +#### 安装到系统 + +```bash +# 编译 +cmake -S . -B build +cmake --build build --parallel + +# 安装(默认前缀:/usr/local) +sudo cmake --install build +# 或:cd build && sudo make install +``` + +#### 在其他 CMake 项目中使用 + +安装到系统后,其他 CMake 项目可以通过标准的 `find_package` 引入并链接 FakeLua: + +```cmake +cmake_minimum_required(VERSION 3.20) +project(my_project CXX) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# 查找 FakeLua +find_package(fakelua REQUIRED) + +add_executable(my_project main.cpp) + +# 链接 fakelua(自动引入头文件路径和链接参数) +target_link_libraries(my_project PRIVATE fakelua::fakelua) +# 同时兼容不带命名空间的别名写法: +# target_link_libraries(my_project PRIVATE fakelua) +``` + +在 C++ 代码中引用头文件: + +```cpp +#include "fakelua.h" +// 或者使用带目录前缀的形式: +// #include +``` + +FakeLua 还会同时安装 `fakelua.pc`,支持通过 `pkg-config` 使用。 + ## 性能基准 对比 Lua 5.4、FakeLua TCC、FakeLua GCC,覆盖 Fibonacci、GCD、快速幂、线性求和、冒泡排序、筛质数等 11 类算法(Release `-O3` 模式): diff --git a/cmake/fakelua.pc.in b/cmake/fakelua.pc.in new file mode 100644 index 0000000..3f11a43 --- /dev/null +++ b/cmake/fakelua.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: fakelua +Description: A lightweight and fast embedded Lua-compatible engine +Version: @PROJECT_VERSION@ +Libs: -L${libdir} -lfakelua +Cflags: -I${includedir} diff --git a/cmake/fakeluaConfig.cmake.in b/cmake/fakeluaConfig.cmake.in new file mode 100644 index 0000000..b8cd4b0 --- /dev/null +++ b/cmake/fakeluaConfig.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/fakeluaTargets.cmake") + +# Provide an unqualified alias `fakelua` for compatibility with projects using target_link_libraries(... fakelua) +if(TARGET fakelua::fakelua AND NOT TARGET fakelua) + add_library(fakelua ALIAS fakelua::fakelua) +endif() + +check_required_components(fakelua) diff --git a/cmd/CMakeLists.txt b/cmd/CMakeLists.txt index fa0132d..9c002e4 100644 --- a/cmd/CMakeLists.txt +++ b/cmd/CMakeLists.txt @@ -7,12 +7,13 @@ CPMAddPackage( NAME gflags GITHUB_REPOSITORY gflags/gflags GIT_TAG v2.2.2 + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" - "INSTALL_HEADERS ON" - "INSTALL_SHARED_LIBS ON" - "INSTALL_STATIC_LIBS ON" - "REGISTER_INSTALL_PREFIX ON" + "INSTALL_HEADERS OFF" + "INSTALL_SHARED_LIBS OFF" + "INSTALL_STATIC_LIBS OFF" + "REGISTER_INSTALL_PREFIX OFF" "BUILD_TESTING OFF" ) @@ -31,3 +32,11 @@ ENDIF () add_executable(flua ${LUA_SRC_LIST}) target_link_libraries(flua PRIVATE fakelua gflags::gflags) + +set_target_properties(flua PROPERTIES + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" +) + +install(TARGETS flua + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e5f5997..afc7c1e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -188,6 +188,7 @@ CPMAddPackage( GITHUB_REPOSITORY lz4/lz4 GIT_TAG v1.9.4 SOURCE_SUBDIR build/cmake + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" "CMAKE_POSITION_INDEPENDENT_CODE ON" @@ -204,6 +205,7 @@ CPMAddPackage( NAME zlib GITHUB_REPOSITORY madler/zlib GIT_TAG v1.3.1 + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" "CMAKE_POSITION_INDEPENDENT_CODE ON" @@ -220,6 +222,7 @@ CPMAddPackage( GITHUB_REPOSITORY facebook/zstd GIT_TAG v1.5.6 SOURCE_SUBDIR build/cmake + EXCLUDE_FROM_ALL YES OPTIONS "ZSTD_BUILD_SHARED_LIB OFF" "ZSTD_BUILD_PROGRAMS OFF" @@ -241,6 +244,7 @@ CPMAddPackage( NAME yaml_cpp GITHUB_REPOSITORY jbeder/yaml-cpp GIT_TAG 0.8.0 + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" "CMAKE_POSITION_INDEPENDENT_CODE ON" @@ -259,6 +263,7 @@ CPMAddPackage( NAME pugixml GITHUB_REPOSITORY zeux/pugixml GIT_TAG v1.14 + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" "CMAKE_POSITION_INDEPENDENT_CODE ON" @@ -273,6 +278,7 @@ CPMAddPackage( NAME tomlplusplus GITHUB_REPOSITORY marzer/tomlplusplus GIT_TAG v3.4.0 + EXCLUDE_FROM_ALL YES OPTIONS "BUILD_SHARED_LIBS OFF" "CMAKE_POSITION_INDEPENDENT_CODE ON" @@ -304,6 +310,7 @@ CPMAddPackage( NAME libevent GITHUB_REPOSITORY libevent/libevent GIT_TAG release-2.1.12-stable + EXCLUDE_FROM_ALL YES OPTIONS "EVENT__LIBRARY_TYPE STATIC" "EVENT__DISABLE_BENCHMARK ON" @@ -332,6 +339,7 @@ CPMAddPackage( NAME hiredis GITHUB_REPOSITORY redis/hiredis GIT_TAG v1.2.0 + EXCLUDE_FROM_ALL YES OPTIONS "DISABLE_TESTS ON" "ENABLE_SSL OFF" @@ -362,6 +370,7 @@ CPMAddPackage( NAME mariadb_connector_c GITHUB_REPOSITORY mariadb-corporation/mariadb-connector-c GIT_TAG v3.3.11 + EXCLUDE_FROM_ALL YES OPTIONS "WITH_SSL OPENSSL" "WITH_UNIT_TESTS OFF" @@ -412,6 +421,7 @@ CPMAddPackage( NAME boost GITHUB_REPOSITORY boostorg/boost GIT_TAG boost-1.90.0 + EXCLUDE_FROM_ALL YES # 注意分隔符是空格:这个版本的 CPM 用第一个空格切 key/value,写成 KEY=VALUE 会被 # 当成一个名叫 "KEY=VALUE" 的变量并赋值 ON,也就是彻底的空操作。 OPTIONS @@ -488,3 +498,23 @@ if (WIN32) endif() target_link_libraries(fakelua PRIVATE ${TARGET_LIB}) + +target_include_directories(fakelua PUBLIC + $ + $ + $ +) + +set_target_properties(fakelua PROPERTIES + VERSION 2.0.0 + SOVERSION 2 + INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" +) + +install(TARGETS fakelua + EXPORT fakeluaTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +)