forked from zhaojh329/lua-ffi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
237 lines (206 loc) · 8.29 KB
/
CMakeLists.txt
File metadata and controls
237 lines (206 loc) · 8.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
if(WIN32)
# ------------------------------------------------------------------------------
# CMake for lua-ffi
# ------------------------------------------------------------------------------
# Setup with Visual Studio 17 2022 generator for x64
# ------------------------------------------------------------------------------
# Visual Studio is a mutlti-configuration generator
# https://stackoverflow.com/questions/24460486/
#
# Basic instructions for out-of-source build
# ------------------------------------------
# mkdir build64 && cd build64
# cmake .. -G "Visual Studio 17 2022" -A x64 -DLUA_HINTS=C:/Temp/ONELUAPRO_BOOTSTRAP -DCMAKE_INSTALL_PREFIX=C:\Apps\OneLuaPro-5.4.7.2-x64 -DCMAKE_PREFIX_PATH=C:/Temp/ONELUAPRO_BOOTSTRAP
# cmake --build . --config Release
# cmake --install . --config Release
#
# Available architectures (-A ...) are: Win32, x64, ARM, ARM64
# ------------------------------------------------------------------------------
# General definitions
cmake_minimum_required(VERSION 3.23 FATAL_ERROR)
# ------------------------------------------------------------------------------
# find liblua installation and version info
if(NOT LUA_HINTS)
if(WIN32)
set(LUA_HINTS "c:/Apps")
endif()
endif()
find_package(liblua REQUIRED CONFIG HINTS ${LUA_HINTS})
if(liblua_FOUND)
message(STATUS "liblua version : ${liblua_VERSION}")
message(STATUS "liblua install prefix : ${LIBLUA_INSTALLDIR}")
message(STATUS "liblua include dir : ${LIBLUA_INCLUDEDIR}")
message(STATUS "liblua lib dir : ${LIBLUA_LIBDIR}")
else()
message(FATAL_ERROR "Unable to find liblua version ${liblua_VERSION}.")
endif()
# Note: liblua_VERSION is set by find_package() directly. LIBLUA_INSTALLDIR,
# LIBLUA_INCLUDEDIR and LIBLUA_LIBDIR are set by libluaConfigVersion.cmake in
# <prefix>/share/cmake/liblua.
# ------------------------------------------------------------------------------
# Installation prefix directory - automatically set from find_package()
# Needs to be defined before project definition statement - for whatever reason
if(NOT CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX ${LIBLUA_INSTALLDIR})
endif()
# ------------------------------------------------------------------------------
# Project defintion
project(lua-ffi LANGUAGES C)
# ------------------------------------------------------------------------------
# Other settings
set(CMAKE_VERBOSE_MAKEFILE ON)
# Version settings
set(LUA_FFI_VERSION_MAJOR 1)
set(LUA_FFI_VERSION_MINOR 1)
set(LUA_FFI_VERSION_PATCH 0)
# ------------------------------------------------------------------------------
# Setup GNU-alike installatin directories
include (GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(INSTALL_LIBDIR
${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
set(INSTALL_BINDIR
${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for executables")
set(INSTALL_INCLUDEDIR
${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for header files")
set(INSTALL_DOCDIR
${CMAKE_INSTALL_DOCDIR} CACHE PATH "Installation directory for documentation")
set(INSTALL_MANDIR
${CMAKE_INSTALL_MANDIR} CACHE PATH "Installation directory for manpages")
set(INSTALL_DATAROOTDIR
${CMAKE_INSTALL_DATAROOTDIR} CACHE PATH "Installation directory for data")
# Lua-specific installation dirs
set(INSTALL_TOP_CDIR
${INSTALL_LIBDIR}/lua/${liblua_VERSION_MAJOR}.${liblua_VERSION_MINOR})
set(INSTALL_TOP_LDIR
${INSTALL_DATAROOTDIR}/lua/${liblua_VERSION_MAJOR}.${liblua_VERSION_MINOR})
# ------------------------------------------------------------------------------
# Report to user
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "C compiler flags: ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
# ------------------------------------------------------------------------------
# lua-ffi DLL
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
find_package(dlfcn-win32 CONFIG REQUIRED)
# requires ailability of winflexbison, as cmake's flex_target() does not exist
# in MSVC build tools
set(FLEX_FILES
"${CMAKE_CURRENT_BINARY_DIR}/lex.h"
"${CMAKE_CURRENT_BINARY_DIR}/lex.c"
)
add_custom_command(OUTPUT ${FLEX_FILES}
COMMAND ${LUA_HINTS}/bin/win_flex.exe --wincompat -o ${CMAKE_CURRENT_BINARY_DIR}/lex.c
--header-file=${CMAKE_CURRENT_BINARY_DIR}/lex.h ${CMAKE_CURRENT_SOURCE_DIR}/lex.l
COMMAND ${CMAKE_COMMAND} -E touch ${FLEX_FILES}
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/lex.l"
COMMENT "Generating lex.c and lex.h"
)
add_custom_target(do_flex DEPENDS ${FLEX_FILES})
add_library(lua-ffi MODULE)
add_dependencies(lua-ffi do_flex)
# setup lua include directory
target_include_directories(lua-ffi PRIVATE ${LIBLUA_INCLUDEDIR}
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
# requires static build of libffi
target_compile_definitions(lua-ffi PRIVATE
_WINDLL _WIN32 _CRT_SECURE_NO_WARNINGS FFI_STATIC_BUILD _CRT_NONSTDC_NO_DEPRECATE
)
target_link_directories(lua-ffi PRIVATE ${LIBLUA_LIBDIR})
target_link_libraries(lua-ffi PRIVATE liblua libffi ws2_32 dlfcn-win32::dl)
set_target_properties(lua-ffi PROPERTIES OUTPUT_NAME ffi PREFIX "")
# plattform-independend sources
target_sources(lua-ffi PRIVATE helper.h token.h ffi.c ${CMAKE_CURRENT_BINARY_DIR}/lex.c
${CMAKE_CURRENT_BINARY_DIR}/lex.h)
# Install
install(TARGETS lua-ffi
RUNTIME DESTINATION ${INSTALL_TOP_CDIR}
LIBRARY DESTINATION ${INSTALL_TOP_CDIR}
)
# Docs and Tests
install(
FILES USAGE.html
DESTINATION ${INSTALL_DOCDIR}
COMPONENT doc
)
install(
FILES tests/wintest.lua
DESTINATION ${INSTALL_DOCDIR}/tests
COMPONENT doc
)
# ------------------------------------------------------------------------------
# Keep original CMakeLists.txt untouched
else()
cmake_minimum_required(VERSION 3.5)
project(lua-ffi C)
include(FindPkgConfig)
# Version settings
set(LUA_FFI_VERSION_MAJOR 1)
set(LUA_FFI_VERSION_MINOR 1)
set(LUA_FFI_VERSION_PATCH 0)
# Define options for selecting Lua versions
option(USE_LUA51 "Force select Lua5.1")
option(USE_LUA52 "Force select Lua5.2")
option(USE_LUA53 "Force select Lua5.3")
option(USE_LUA54 "Force select Lua5.4")
# Helper function to find and include Lua
function(find_and_include_lua version)
pkg_search_module(LUA lua-${version})
if (LUA_FOUND)
include_directories(${LUA_INCLUDE_DIRS})
else()
message(FATAL_ERROR "Liblua${version} is required.")
endif()
endfunction()
if (LUA_INCLUDE_DIR)
include_directories(${LUA_INCLUDE_DIR})
else()
# Check which Lua version to use
if(USE_LUA51)
find_and_include_lua(5.1)
set(LUA_VERSION_MAJOR 5)
set(LUA_VERSION_MINOR 1)
elseif(USE_LUA52)
find_and_include_lua(5.2)
set(LUA_VERSION_MAJOR 5)
set(LUA_VERSION_MINOR 2)
elseif(USE_LUA53)
find_and_include_lua(5.3)
set(LUA_VERSION_MAJOR 5)
set(LUA_VERSION_MINOR 3)
elseif(USE_LUA54)
find_and_include_lua(5.4)
set(LUA_VERSION_MAJOR 5)
set(LUA_VERSION_MINOR 4)
else()
find_package(Lua REQUIRED)
include_directories(${LUA_INCLUDE_DIR})
endif()
endif()
find_package(FLEX REQUIRED)
pkg_search_module(LIBFFI libffi)
if (NOT LIBFFI_FOUND)
message(FATAL_ERROR "libffi is required.")
endif()
add_compile_options(-D_GNU_SOURCE -DLUA_USE_LINUX -Os -Wall -Werror --std=gnu99 -fno-strict-aliasing)
# configure a header file to pass some of the CMake settings to the source code
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
include_directories(${LIBFFI_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
if (NOT LUA_INSTALL_PREFIX)
if (LUA_VERSION_MAJOR AND LUA_VERSION_MINOR)
set(LUA_INSTALL_PREFIX lib/lua/${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR})
else()
set(LUA_INSTALL_PREFIX lib/lua)
endif()
endif()
flex_target(cparser lex.l ${CMAKE_CURRENT_BINARY_DIR}/lex.c
DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/lex.h)
add_library(lffi MODULE ffi.c ${CMAKE_CURRENT_BINARY_DIR}/lex.c)
target_link_libraries(lffi PRIVATE ${LIBFFI_LIBRARIES})
set_target_properties(lffi PROPERTIES OUTPUT_NAME ffi PREFIX "")
install(
TARGETS lffi
DESTINATION ${LUA_INSTALL_PREFIX}
)
endif()