-
-
Notifications
You must be signed in to change notification settings - Fork 1k
/
Copy pathCMakeLists.txt
137 lines (112 loc) · 5.42 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
include(ShogunUtils)
# Meta dependencies
FIND_PACKAGE(PLY REQUIRED)
IF(NOT PLY_FOUND)
message(FATAL_ERROR "Python module ply required for meta examples. Install or set BUILD_META_EXAMPLES=OFF")
ENDIF()
SET_SOURCE_FILES_PROPERTIES(${CTAGS_FILE} PROPERTIES GENERATED 1)
# get list of meta examples that can be built
INCLUDE(FindMetaExamples)
find_meta_examples()
# get parser and target languages needed to build the meta examples
SET(GENERATOR_DEPENDENCIES)
LIST(APPEND GENERATOR_DEPENDENCIES ${CMAKE_SOURCE_DIR}/examples/meta/generator/generate.py)
LIST(APPEND GENERATOR_DEPENDENCIES ${CMAKE_SOURCE_DIR}/examples/meta/generator/parse.py)
LIST(APPEND GENERATOR_DEPENDENCIES ${CMAKE_SOURCE_DIR}/examples/meta/generator/translate.py)
FILE(GLOB TARGET_LANGUAGES ${CMAKE_SOURCE_DIR}/examples/meta/generator/targets/*.json)
LIST(APPEND GENERATOR_DEPENDENCIES ${TARGET_LANGUAGES})
# parser generation
set(GENERATED_PARSER_FILES)
LIST(APPEND GENERATED_PARSER_FILES ${CMAKE_CURRENT_BINARY_DIR}/parser_files/parsetab.py)
LIST(APPEND GENERATED_PARSER_FILES ${CMAKE_CURRENT_BINARY_DIR}/parser_files/lextab.py)
add_custom_command(
OUTPUT ${GENERATED_PARSER_FILES}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/generator/parse.py
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/parser_files
COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/parse.py
--parser_files_dir ${CMAKE_CURRENT_BINARY_DIR}/parser_files
--only_generate_parser_files)
add_custom_target(parse_lex_files ALL DEPENDS ${GENERATED_PARSER_FILES})
# list of interfaces for which we dont generate meta examples
SET(DISABLED_INTERFACES INTERFACE_PERL)
# handle the data path
IF (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/data)
# copy data symlink to cmake binary dir so that we can execute meta examples in there
CREATE_DATA_SYMLINK(${CMAKE_CURRENT_SOURCE_DIR}/data ${CMAKE_CURRENT_BINARY_DIR}/data)
ENDIF()
SET(SHOGUN_DATA ${CMAKE_CURRENT_BINARY_DIR}/data)
# translate the meta examples to the target languages using the .sg.in files
# first cmake will do variable substitution on @SHOGUN_DATA@ and generate .sg files
FOREACH(META_EXAMPLE_IN ${META_EXAMPLES})
GET_META_EXAMPLE_VARS(${META_EXAMPLE_IN} EXAMPLE_NAME EXAMPLE_REL_DIR EXAMPLE_NAME_WITH_DIR)
SET(BASENAME ${EXAMPLE_REL_DIR}/${EXAMPLE_NAME})
SET(META_EXAMPLE ${CMAKE_CURRENT_BINARY_DIR}/src/${BASENAME}.sg)
configure_file(${META_EXAMPLE_IN} ${META_EXAMPLE} @ONLY)
# assume a structure <target_language>/<category>/listing.sg
SET(EXAMPLE_LISTINGS)
LIST(APPEND EXAMPLE_LISTINGS ${CMAKE_CURRENT_BINARY_DIR}/cpp/${BASENAME}.cpp)
# FIXME
# Hack to avoid generation of scala meta examples dependencies that will
# not be generated by generate.py script (since there is no scala.json)
LIST(REMOVE_ITEM AVAILABLE_INTERFACES INTERFACE_SCALA)
FOREACH(interface ${AVAILABLE_INTERFACES})
list(FIND DISABLED_INTERFACES ${interface} disabled)
if (${disabled} STREQUAL "-1")
GET_INTERFACE_VARS(${interface} DIRECTORY EXTENSION)
LIST(APPEND EXAMPLE_LISTINGS ${CMAKE_CURRENT_BINARY_DIR}/${DIRECTORY}/${BASENAME}.${EXTENSION})
endif()
ENDFOREACH()
LIST(APPEND AVAILABLE_INTERFACES INTERFACE_SCALA)
# Set generate.py flags
SET(GENERATOR_FLAGS
-i ${META_EXAMPLE}
-o ${CMAKE_CURRENT_BINARY_DIR}
-t ${CMAKE_CURRENT_SOURCE_DIR}/generator/targets
-g ${CTAGS_FILE}
--parser_files_dir=${CMAKE_CURRENT_BINARY_DIR}/parser_files)
# Enable variable storing only if we have enabled testing
IF(ENABLE_TESTING)
LIST(APPEND GENERATOR_FLAGS --store-vars)
ENDIF()
# Run example generation script
SET(TEMP ${CMAKE_CURRENT_BINARY_DIR}/python/${EXAMPLE_REL_DIR}/${EXAMPLE_NAME}.py)
add_custom_command(OUTPUT ${EXAMPLE_LISTINGS}
COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/generator/generate.py ${GENERATOR_FLAGS}
COMMENT "Generating example ${EXAMPLE_NAME_WITH_DIR}"
DEPENDS ctags ${META_EXAMPLE_IN} ${GENERATOR_DEPENDENCIES}
parse_lex_files)
LIST(APPEND TRANSLATED_META_EXAMPLES ${EXAMPLE_LISTINGS})
ENDFOREACH()
SET_SOURCE_FILES_PROPERTIES(${TRANSLATED_META_EXAMPLES} PROPERTIES GENERATED TRUE)
add_custom_target(meta_examples ALL
DEPENDS ${TRANSLATED_META_EXAMPLES})
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/cpp
DESTINATION share/shogun/examples
COMPONENT ${DIRECTORY}-examples
FILES_MATCHING PATTERN "*.cpp"
PATTERN "CMakeFiles*" EXCLUDE
)
# c++
IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cpp AND NOT ${DISABLE_META_CPP})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/cpp)
ENDIF()
########### test all the enabled interfaces & install their files to examples
# temporarily disabled. While the interface fully works, the new API does not
# there is a potential bug in swig that needs fixing first
# see https://github.com/shogun-toolbox/shogun/issues/4177
LIST(APPEND DISABLED_INTERFACES INTERFACE_RUBY)
FOREACH(interface ${AVAILABLE_INTERFACES})
list(FIND DISABLED_INTERFACES ${interface} disabled)
if (${interface} AND ${disabled} STREQUAL "-1")
GET_INTERFACE_VARS(${interface} DIRECTORY EXTENSION)
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${DIRECTORY}
DESTINATION share/shogun/examples
COMPONENT ${DIRECTORY}-examples
FILES_MATCHING PATTERN "*.${EXTENSION}"
PATTERN "CMakeFiles*" EXCLUDE
)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${DIRECTORY})
endif()
ENDFOREACH()