-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathBuildLuaJIT.cmake
More file actions
139 lines (121 loc) · 5.5 KB
/
BuildLuaJIT.cmake
File metadata and controls
139 lines (121 loc) · 5.5 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
macro(build_luajit LJ_VERSION)
set(LJ_SOURCE_DIR ${PROJECT_BINARY_DIR}/luajit-${LJ_VERSION}/source)
set(LJ_BINARY_DIR ${PROJECT_BINARY_DIR}/luajit-${LJ_VERSION}/work)
set(CFLAGS ${CMAKE_C_FLAGS})
if (ENABLE_LUA_ASSERT)
set(CFLAGS "${CFLAGS} -DLUA_USE_ASSERT")
endif (ENABLE_LUA_ASSERT)
if (ENABLE_LUA_APICHECK)
set(CFLAGS "${CFLAGS} -DLUA_USE_APICHECK")
endif (ENABLE_LUA_APICHECK)
set(CFLAGS "${CFLAGS} -fsanitize=fuzzer-no-link")
set(LDFLAGS "-fsanitize=fuzzer-no-link")
set(LUAJIT_BASEDIR ${PROJECT_SOURCE_DIR}/patches/)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CFLAGS "${CFLAGS} ${CMAKE_C_FLAGS_DEBUG}")
set(LDFLAGS "${LDFLAGS} ${CMAKE_C_FLAGS_DEBUG}")
endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
if (ENABLE_LUAJIT_RANDOM_RA)
set(CFLAGS "${CFLAGS} -DLUAJIT_RANDOM_RA")
endif (ENABLE_LUAJIT_RANDOM_RA)
if (ENABLE_ASAN)
set(CFLAGS "${CFLAGS} -fsanitize=address")
set(CFLAGS "${CFLAGS} -DLUAJIT_USE_ASAN")
set(CFLAGS "${CFLAGS} -DLUAJIT_USE_SYSMALLOC=1")
set(LDFLAGS "${LDFLAGS} -fsanitize=address")
endif (ENABLE_ASAN)
if (ENABLE_UBSAN)
string(JOIN "," NO_SANITIZE_FLAGS
# Misaligned pseudo-pointers are used to determine
# internal variable names inside the `for` cycle.
alignment
# Not interested in float cast overflow errors. These
# overflows are handled by special checks after
# `lj_num2int()`, etc.
float-cast-overflow
# NULL checking is disabled because this is not a UB
# and raises lots of false-positive fails.
null
# Not interested in checking arithmetic with NULL.
pointer-overflow
# Shifts of negative numbers are widely used in
# parsing ULEB, cdata arithmetic, vmevent hash
# calculation, etc.
shift-base
)
# GCC has no "function" UB check.
if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU")
string(JOIN "," NO_SANITIZE_FLAGS
${NO_SANITIZE_FLAGS}
# Not interested in function type mismatch errors.
function
)
endif()
# Enable UndefinedBehaviorSanitizer support.
# This flag enables all supported options (the
# documentation on site is not correct about that moment,
# unfortunately) except float-divide-by-zero. Floating
# point division by zero behaviour is defined without
# -ffast-math and uses the IEEE 754 standard on which all
# NaN tagging is based.
set(UBSAN_FLAGS "-fsanitize=undefined")
set(UBSAN_FLAGS "-fno-sanitize-recover=undefined")
# XXX: To get nicer stack traces in error messages.
set(UBSAN_FLAGS "-fno-omit-frame-pointer")
set(UBSAN_FLAGS "-fno-sanitize=${NO_SANITIZE_FLAGS}")
set(CFLAGS "${CFLAGS} -DLUAJIT_USE_UBSAN")
set(CFLAGS "${CFLAGS} ${UBSAN_FLAGS}")
set(LDFLAGS "${LDFLAGS} ${UBSAN_FLAGS}")
endif (ENABLE_UBSAN)
if (ENABLE_COV)
set(CFLAGS "${CFLAGS} -fprofile-instr-generate -fprofile-arcs -fcoverage-mapping -ftest-coverage")
set(LDFLAGS "${LDFLAGS} -fprofile-instr-generate -fprofile-arcs -fcoverage-mapping -ftest-coverage")
endif (ENABLE_COV)
if(ENABLE_LAPI_TESTS)
# "relocation R_X86_64_PC32 against symbol `lua_isnumber'
# can not be used when making a shared object; recompile
# with -fPIC".
set(CFLAGS "${CFLAGS} -fPIC")
# CMake option LUAJIT_FRIENDLY_MODE in luzer requires
# LUAJIT_ENABLE_CHECKHOOK.
set(CFLAGS "${CFLAGS} -DLUAJIT_ENABLE_CHECKHOOK")
set(LDFLAGS "${LDFLAGS} -lstdc++")
endif()
include(ExternalProject)
set(LUA_LIBRARY ${LJ_SOURCE_DIR}/src/libluajit.a)
set(LUA_EXECUTABLE ${LJ_SOURCE_DIR}/src/luajit)
ExternalProject_Add(patched-luajit-${LJ_VERSION}
GIT_REPOSITORY https://github.com/LuaJIT/LuaJIT
GIT_TAG ${LJ_VERSION}
GIT_PROGRESS TRUE
GIT_SHALLOW FALSE
GIT_REMOTE_UPDATE_STRATEGY REBASE
SOURCE_DIR ${LJ_SOURCE_DIR}
BINARY_DIR ${LJ_BINARY_DIR}/luajit-${LJ_VERSION}
DOWNLOAD_DIR ${LJ_BINARY_DIR}
TMP_DIR ${LJ_BINARY_DIR}/tmp
STAMP_DIR ${LJ_BINARY_DIR}/stamp
PATCH_COMMAND git reset --hard && cd <SOURCE_DIR> &&
patch -p1 -i ${LUAJIT_BASEDIR}/luajit-v2.1.patch &&
patch -p1 -i ${LUAJIT_BASEDIR}/luajit-dmalloc-asan_instr-v2.1.patch
CONFIGURE_COMMAND ""
BUILD_COMMAND cd <SOURCE_DIR> && make -j CC=${CMAKE_C_COMPILER}
CFLAGS=${CFLAGS}
LDFLAGS=${LDFLAGS}
HOST_CFLAGS=-fno-sanitize=undefined
LF_PATH=${LibFuzzerObjDir}
-C src
INSTALL_COMMAND ""
BUILD_BYPRODUCTS ${LUA_LIBRARY} ${LUA_EXECUTABLE}
)
add_library(bundled-liblua STATIC IMPORTED GLOBAL)
set_target_properties(bundled-liblua PROPERTIES
IMPORTED_LOCATION ${LUA_LIBRARY})
add_dependencies(bundled-liblua patched-luajit-${LJ_VERSION})
set(LUA_LIBRARIES bundled-liblua)
set(LUA_INCLUDE_DIR ${LJ_SOURCE_DIR}/src/)
set(LUA_VERSION_STRING "LuaJIT ${LJ_VERSION}")
set(LUA_SOURCE_DIR ${LJ_SOURCE_DIR})
unset(LJ_SOURCE_DIR)
unset(LJ_BINARY_DIR)
endmacro(build_luajit)