-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathCMakeLists.txt
140 lines (120 loc) · 4.88 KB
/
CMakeLists.txt
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
cmake_minimum_required(VERSION 3.0)
project(NGS)
# TOOD: check how not to use hard coded include and lib directories.
# Do something like pkg_check_modules(LIBFFI libffi REQUIRED) but for all libraries?
include(CheckFunctionExists)
include(CheckIncludeFile)
include(FindPkgConfig)
include(ExternalProject)
# -D_DARWIN_C_SOURCE - SIGWINCH and friends on MacOS
# -D_XOPEN_SOURCE - strptime on Linux
# -D_DEFAULT_SOURCE - MAP_ANONYMOUS on Linux
add_definitions(-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE=1 -D_DEFAULT_SOURCE=1 -D_BSD_SOURCE)
# This is workaround for boehm GC library bug or NGS usage of it
# which cases sporadic SIGSEGV and other issues after fork() in child process.
# Use test-gc.ngs to determine if you can remove this setting (test on MacOS and Linux).
add_definitions(-DNGS_STUPID_MALLOC_AFTER_FORK)
pkg_check_modules(LIBFFI libffi REQUIRED)
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBFFI_INCLUDE_DIRS} /usr/local/include /opt/homebrew/include)
link_directories(/usr/local/lib /opt/homebrew/lib)
add_executable(ngs
version.h
ngs.c
syntax.include syntax.auto.h
pcre_constants.include errno.include
obj.c vm.c compile.c debug.c ast.c malloc.c decompile.c
stdlib.ngs.h
)
# peg/leg - start
find_program(LEG leg)
IF(LEG)
message(STATUS "leg program found, will use installed one")
ELSE()
message(STATUS "leg program not found, will download and build it")
ExternalProject_Add(
leg
URL https://www.piumarta.com/software/peg/peg-0.1.18.tar.gz
URL_HASH SHA1=2390bcf91299aa61c5fa93895151ffeb988357a5
CONFIGURE_COMMAND ""
BUILD_COMMAND make
BUILD_IN_SOURCE true
INSTALL_COMMAND ""
)
ExternalProject_Get_property(leg SOURCE_DIR)
SET(LEG "${SOURCE_DIR}/leg")
add_dependencies(ngs leg)
ENDIF()
# peg/leg - end
check_function_exists(fmemopen FMEMOPEN)
IF(NOT FMEMOPEN)
target_sources(ngs PRIVATE fmemopen.c)
ENDIF()
check_include_file(execinfo.h EXECINFO_H)
IF(EXECINFO_H)
add_definitions(-DHAVE_EXECINFO_H)
ENDIF()
check_include_file(sys/poll.h POLL_H)
IF(POLL_H)
add_definitions(-DHAVE_POLL_H)
ENDIF()
find_program(SED NAMES gsed sed) # gsed - MacOS, sed - all the rest
find_file(PCRE_H pcre.h)
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/syntax.include
COMMAND
cat ${CMAKE_CURRENT_SOURCE_DIR}/syntax.leg |
${SED} -f ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-input.sed |
${LEG} |
${SED} 's/<stdin>/syntax.leg/' |
${SED} -f ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-output.sed |
awk -f ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-output.awk
>${CMAKE_CURRENT_BINARY_DIR}/syntax.include
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/syntax.leg
${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-input.sed
${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-output.sed
${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/patch-leg-output.awk
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/syntax.auto.h
COMMAND cat ${CMAKE_CURRENT_BINARY_DIR}/syntax.include | ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/make-syntax-auto.sh ${SED} >${CMAKE_CURRENT_BINARY_DIR}/syntax.auto.h
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/syntax.include
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcre_constants.include
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/make-pcre-constants.sh ${PCRE_H} >${CMAKE_CURRENT_BINARY_DIR}/pcre_constants.include
)
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/errno.include
COMMAND
${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/make-errno-include.sh ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/include_errno.c >${CMAKE_CURRENT_BINARY_DIR}/errno.include
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/include_errno.c
)
add_custom_command(
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stdlib.ngs.h
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/bin2c.sh ${SED} lib/stdlib.ngs >${CMAKE_CURRENT_BINARY_DIR}/stdlib.ngs.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/stdlib.ngs
)
target_link_libraries(ngs m pthread gc ffi dl json-c pcre)
add_custom_target(man ALL WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc COMMAND make man DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/doc/*.1.md)
install(FILES "${PROJECT_BINARY_DIR}/ngs" DESTINATION bin)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/ngs DESTINATION bin)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/ DESTINATION lib/ngs)
install(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/
DESTINATION bin FILES_MATCHING PATTERN "*.ngs"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_WRITE WORLD_EXECUTE
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION doc/ngs)
if(APPLE)
set(MAN_DIR share/man/man1)
else()
set(MAN_DIR man/man1)
endif()
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${MAN_DIR} FILES_MATCHING PATTERN "*.1")
enable_testing()
add_test(all bash -c "${CMAKE_CURRENT_BINARY_DIR}/ngs ${CMAKE_CURRENT_SOURCE_DIR}/test.ngs")