Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)

Expand All @@ -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")
Expand Down Expand Up @@ -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"
)

46 changes: 46 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/fakelua.h>
```

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):
Expand Down
46 changes: 46 additions & 0 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.h>
```

FakeLua 还会同时安装 `fakelua.pc`,支持通过 `pkg-config` 使用。

## 性能基准

对比 Lua 5.4、FakeLua TCC、FakeLua GCC,覆盖 Fibonacci、GCD、快速幂、线性求和、冒泡排序、筛质数等 11 类算法(Release `-O3` 模式):
Expand Down
10 changes: 10 additions & 0 deletions cmake/fakelua.pc.in
Original file line number Diff line number Diff line change
@@ -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}
10 changes: 10 additions & 0 deletions cmake/fakeluaConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -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)
17 changes: 13 additions & 4 deletions cmd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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}
)
30 changes: 30 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -488,3 +498,23 @@ if (WIN32)
endif()

target_link_libraries(fakelua PRIVATE ${TARGET_LIB})

target_include_directories(fakelua PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/fakelua>
)

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}
)
Loading