summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--CMakeLists.txt3
-rw-r--r--cmake/FindRE2C.cmake137
-rw-r--r--cmake/README.md3
m---------third_party/CMakeXFind0
5 files changed, 141 insertions, 5 deletions
diff --git a/.gitmodules b/.gitmodules
index 55067ee9..c6d99e5f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,9 +10,6 @@
[submodule "third_party/squirrel"]
path = third_party/squirrel
url = https://github.com/albertodemichelis/squirrel/
-[submodule "third_party/CMakeXFind"]
- path = third_party/CMakeXFind
- url = https://github.com/julp/CMakeXFind
[submodule "third_party/ply"]
path = third_party/ply
url = https://github.com/dabeaz/ply
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 49ef1a7f..862f1e07 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -173,8 +173,7 @@ if (COMPILER_IS_CLANG OR COMPILER_IS_GNU)
)
endif ()
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
- ${SEXPR_WASM_SOURCE_DIR}/third_party/CMakeXFind)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${SEXPR_WASM_SOURCE_DIR}/cmake)
find_package(RE2C 0.13)
if (RUN_RE2C AND RE2C_EXECUTABLE)
set(WASM_AST_LEXER_C ${SEXPR_WASM_SOURCE_DIR}/src/wasm-ast-lexer.c)
diff --git a/cmake/FindRE2C.cmake b/cmake/FindRE2C.cmake
new file mode 100644
index 00000000..46db7a32
--- /dev/null
+++ b/cmake/FindRE2C.cmake
@@ -0,0 +1,137 @@
+#
+# This module is designed to find/handle re2c binary
+#
+# Requirement:
+# CMake >= 2.8.3 (for new version of find_package_handle_standard_args)
+#
+# The following variables will be defined for your use:
+# - RE2C_EXECUTABLE : re2c (binary) location
+# - RE2C_VERSION : complete version of re2c (x.y.z)
+# - RE2C_MAJOR_VERSION : major version of re2c
+# - RE2C_MINOR_VERSION : minor version of re2c
+# - RE2C_PATCH_VERSION : patch version of re2c
+#
+# The following macro is provided:
+# RE2C_TARGET
+#
+# Prototype:
+# RE2C_TARGET([NAME <target>] [INPUT <input>] [OUTPUT <output>] [OPTIONS <options>] [DEPENDS <list of files>])
+#
+# Argument details:
+# - NAME <target> (mandatory): cmake target name to build the lexer
+# - INPUT <input> (mandatory): the input file to give to re2c
+# - OUTPUT <output> (mandatory): the output file generated by re2c
+# - OPTIONS <options> (optionnal): command line options to pass to re2c
+# - DEPENDS <file1> ... <file2> (optionnal): a list of files the lexer depends on
+#
+# How to use:
+# 1) Copy this file in the root of your project source directory
+# 2) Then, tell CMake to search this non-standard module in your project directory by adding to your CMakeLists.txt:
+# set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
+# 3) Finally call find_package(RE2C) once
+#
+# Here is a complete sample to build an executable:
+#
+# set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
+#
+# find_package(RE2C REQUIRED) # Note: name is case sensitive
+#
+# RE2C_TARGET(NAME foo INPUT foo.re2c OUPUT foo.c OPTIONS "-b" DEPENDS foo.h)
+#
+# add_executable(foo foo.c)
+#
+
+
+#=============================================================================
+# Copyright (c) 2015, julp
+#
+# Distributed under the OSI-approved BSD License
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#=============================================================================
+
+cmake_minimum_required(VERSION 2.8.3)
+
+########## Private ##########
+if(NOT DEFINED RE2C_PUBLIC_VAR_NS)
+ set(RE2C_PUBLIC_VAR_NS "RE2C")
+endif(NOT DEFINED RE2C_PUBLIC_VAR_NS)
+if(NOT DEFINED RE2C_PRIVATE_VAR_NS)
+ set(RE2C_PRIVATE_VAR_NS "_${RE2C_PUBLIC_VAR_NS}")
+endif(NOT DEFINED RE2C_PRIVATE_VAR_NS)
+
+function(re2c_debug _VARNAME)
+ if(${RE2C_PUBLIC_VAR_NS}_DEBUG)
+ if(DEFINED ${RE2C_PUBLIC_VAR_NS}_${_VARNAME})
+ message("${RE2C_PUBLIC_VAR_NS}_${_VARNAME} = ${${RE2C_PUBLIC_VAR_NS}_${_VARNAME}}")
+ else(DEFINED ${RE2C_PUBLIC_VAR_NS}_${_VARNAME})
+ message("${RE2C_PUBLIC_VAR_NS}_${_VARNAME} = <UNDEFINED>")
+ endif(DEFINED ${RE2C_PUBLIC_VAR_NS}_${_VARNAME})
+ endif(${RE2C_PUBLIC_VAR_NS}_DEBUG)
+endfunction(re2c_debug)
+
+########## Public ##########
+
+find_program(${RE2C_PUBLIC_VAR_NS}_EXECUTABLE re2c)
+if(${RE2C_PUBLIC_VAR_NS}_EXECUTABLE)
+ execute_process(COMMAND ${${RE2C_PUBLIC_VAR_NS}_EXECUTABLE} --vernum OUTPUT_VARIABLE ${RE2C_PRIVATE_VAR_NS}_RAW_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+ math(EXPR RE2C_MAJOR_VERSION "${${RE2C_PRIVATE_VAR_NS}_RAW_VERSION} / 100000")
+ math(EXPR RE2C_MINOR_VERSION "(${${RE2C_PRIVATE_VAR_NS}_RAW_VERSION} - ${${RE2C_PUBLIC_VAR_NS}_MAJOR_VERSION} * 100000) / 100")
+ math(EXPR RE2C_PATCH_VERSION "${${RE2C_PRIVATE_VAR_NS}_RAW_VERSION} - ${${RE2C_PUBLIC_VAR_NS}_MAJOR_VERSION} * 100000 - ${${RE2C_PUBLIC_VAR_NS}_MINOR_VERSION} * 100")
+ set(RE2C_VERSION "${${RE2C_PUBLIC_VAR_NS}_MAJOR_VERSION}.${${RE2C_PUBLIC_VAR_NS}_MINOR_VERSION}.${${RE2C_PUBLIC_VAR_NS}_PATCH_VERSION}")
+
+ include(CMakeParseArguments)
+ macro(RE2C_TARGET)
+ cmake_parse_arguments(PARSED_ARGS "" "NAME;INPUT;OUTPUT;OPTIONS" "DEPENDS" ${ARGN})
+
+ if(NOT PARSED_ARGS_OUTPUT)
+ message(FATAL_ERROR "RE2C_TARGET expect an output filename")
+ endif(NOT PARSED_ARGS_OUTPUT)
+ if(NOT PARSED_ARGS_INPUT)
+ message(FATAL_ERROR "RE2C_TARGET expect an input filename")
+ endif(NOT PARSED_ARGS_INPUT)
+ if(NOT PARSED_ARGS_NAME)
+ message(FATAL_ERROR "RE2C_TARGET expect a target name")
+ endif(NOT PARSED_ARGS_NAME)
+ # TODO:
+ # - get_filename_component(PARSED_ARGS_INPUT ${PARSED_ARGS_INPUT} ABSOLUTE)
+ # - get_filename_component(PARSED_ARGS_OUTPUT ${PARSED_ARGS_OUTPUT} ABSOLUTE)
+ # ?
+ add_custom_command(
+ OUTPUT ${PARSED_ARGS_OUTPUT}
+ COMMAND ${${RE2C_PUBLIC_VAR_NS}_EXECUTABLE} ${PARSED_ARGS_OPTIONS} -o ${PARSED_ARGS_OUTPUT} ${PARSED_ARGS_INPUT}
+ DEPENDS ${PARSED_ARGS_INPUT} ${PARSED_ARGS_DEPENDS}
+ COMMENT "[RE2C][${PARSED_ARGS_NAME}] Building lexer with re2c ${${RE2C_PUBLIC_VAR_NS}_VERSION}"
+ )
+ add_custom_target(
+ ${PARSED_ARGS_NAME}
+ SOURCES ${PARSED_ARGS_INPUT}
+ DEPENDS ${PARSED_ARGS_OUTPUT}
+ )
+ endmacro(RE2C_TARGET)
+
+ include(FindPackageHandleStandardArgs)
+ if(${RE2C_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${RE2C_PUBLIC_VAR_NS}_FIND_QUIETLY)
+ find_package_handle_standard_args(
+ ${RE2C_PUBLIC_VAR_NS}
+ REQUIRED_VARS ${RE2C_PUBLIC_VAR_NS}_EXECUTABLE
+ VERSION_VAR ${RE2C_PUBLIC_VAR_NS}_VERSION
+ )
+ else(${RE2C_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${RE2C_PUBLIC_VAR_NS}_FIND_QUIETLY)
+ find_package_handle_standard_args(${RE2C_PUBLIC_VAR_NS} "re2c not found" ${RE2C_PUBLIC_VAR_NS}_EXECUTABLE)
+ endif(${RE2C_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${RE2C_PUBLIC_VAR_NS}_FIND_QUIETLY)
+endif(${RE2C_PUBLIC_VAR_NS}_EXECUTABLE)
+
+# IN (args)
+re2c_debug("FIND_REQUIRED")
+re2c_debug("FIND_QUIETLY")
+re2c_debug("FIND_VERSION")
+# OUT
+# Linking
+re2c_debug("EXECUTABLE")
+# Version
+re2c_debug("MAJOR_VERSION")
+re2c_debug("MINOR_VERSION")
+re2c_debug("PATCH_VERSION")
+re2c_debug("VERSION")
diff --git a/cmake/README.md b/cmake/README.md
new file mode 100644
index 00000000..ee8057f1
--- /dev/null
+++ b/cmake/README.md
@@ -0,0 +1,3 @@
+FindRE2C.cmake is copied from the [CMakeXFind
+repository](https://github.com/julp/CMakeXFind). This makes it more convenient
+to build for users who can't/won't run `git submodule update --init`.
diff --git a/third_party/CMakeXFind b/third_party/CMakeXFind
deleted file mode 160000
-Subproject a7dc4ccd525f5661dcb540ade7e936959465fb3