diff options
author | Konstantin Podsvirov <konstantin@podsvirov.pro> | 2018-01-27 11:39:02 +0300 |
---|---|---|
committer | Konstantin Podsvirov <konstantin@podsvirov.pro> | 2018-01-29 18:24:10 +0300 |
commit | 108de08b4283b7cbc522e4de9604d785349bad03 (patch) | |
tree | 3db0841212120b32eb0baf919cab6155ab4c5d6e | |
parent | 1a25592250954f460a811805f5537d7d1198294b (diff) | |
download | colm-108de08b4283b7cbc522e4de9604d785349bad03.tar.gz |
Add CMake project
Now implemented:
- Bootstrap `colm` program from sources;
- Install target `colm::coml` and `colm::libcolm`
via CMake's `colm` package.
Shadow build support via CMake.
Tested with MSYS2 and MinGW-w64 on Windows and with GCC on Linux.
Detected issue when sizeof(word_t) < sizeof(void*).
-rw-r--r-- | .gitignore | 6 | ||||
-rw-r--r-- | CMakeLists.txt | 11 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | src/.gitignore | 6 | ||||
-rw-r--r-- | src/CMakeLists.txt | 173 | ||||
-rw-r--r-- | src/bytecode.c | 6 | ||||
-rw-r--r-- | src/colm-config.cmake.in | 3 | ||||
-rw-r--r-- | src/config.h.cmake.in | 14 | ||||
-rw-r--r-- | src/defs.h.cmake.in | 8 | ||||
-rw-r--r-- | src/program.c | 2 | ||||
-rw-r--r-- | src/version.h.cmake.in | 9 |
11 files changed, 239 insertions, 0 deletions
@@ -16,3 +16,9 @@ /test-driver /build /m4 + +/CMakeCache.txt +/CMakeFiles +/cmake_install.cmake +/install_manifest.txt +/*.user diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..89bc5c68 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.0) + +project(colm + VERSION 0.13.0.5 + LANGUAGES C CXX) +set(PROJECT_PUBDATE "May 2017") + +set(${PROJECT_NAME}_MAKE_INSTALL ON CACHE BOOL + "Set to OFF to disable install rules (default is ON)") + +add_subdirectory(src) diff --git a/configure.ac b/configure.ac index 43e9f0af..ac545939 100644 --- a/configure.ac +++ b/configure.ac @@ -32,6 +32,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_SUBST(PUBDATE) AC_CONFIG_HEADER([src/config.h src/defs.h]) +AC_CHECK_HEADERS([sys/mman.h sys/wait.h unistd.h]) dnl Choose a default for the build_manual var. If the dist file is present in dnl the root then default to no, otherwise go for it. diff --git a/src/.gitignore b/src/.gitignore index 484e10c4..6220fa52 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -32,3 +32,9 @@ /gen /libprog.a + +/CMakeFiles +/cmake_install.cmake +/*-config.cmake +/*-config-version.cmake +/*.exe diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..e24f6df0 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,173 @@ +# Check type size +include(CheckTypeSize) +check_type_size("long" SIZEOF_LONG) +check_type_size("unsigned long" SIZEOF_ULONG) + +if(SIZEOF_ULONG LESS CMAKE_SIZEOF_VOID_P) + message(FATAL_ERROR "Check CodeVect::insertTree implementation, because sizeof(word_t) < sizeof(void*)!") +endif() + +# Check system headers +include(CheckIncludeFile) +check_include_file(sys/mman.h HAVE_SYS_MMAN_H) +check_include_file(sys/wait.h HAVE_SYS_WAIT_H) +check_include_file(unistd.h HAVE_UNISTD_H) + +# Prepare settings +string(TOLOWER ${PROJECT_NAME} _PACKAGE_NAME) +if("${CMAKE_BUILD_TYPE}" MATCHES "[Dd][Ee][Bb]") + set(DEBUG 1) +endif() +set(VERSION "${PROJECT_VERSION}") +set(PUBDATE "${PROJECT_PUBDATE}") + +set(common_COMPILE_DEFINITIONS PREFIX="${CMAKE_INSTALL_PREFIX}") + +# Generate headers +configure_file(version.h.cmake.in version.h @ONLY) +configure_file(config.h.cmake.in config.h @ONLY) +configure_file(defs.h.cmake.in defs.h @ONLY) +configure_file(colm-config.cmake.in ${_PACKAGE_NAME}-config.cmake @ONLY) + +# Runtime headers +set(RUNTIME_HDR + bytecode.h debug.h pool.h input.h + pdarun.h map.h type.h tree.h struct.h program.h colm.h internal.h) + +# Buildtime headers stub +foreach(_hdr ${RUNTIME_HDR} rtvector.h) + file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/colm/${_hdr}" + CONTENT "#include \"${CMAKE_CURRENT_LIST_DIR}/${_hdr}\"\n") +endforeach() +foreach(_hdr config.h defs.h) + file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/colm/${_hdr}" + CONTENT "#include \"../../${_hdr}\"\n") + list(APPEND RUNTIME_HDR "${CMAKE_CURRENT_BINARY_DIR}/${_hdr}") +endforeach() + +# Other CMake modules +include(GNUInstallDirs) + +# libcolm + +add_library(libcolm + map.c pdarun.c list.c input.c debug.c + codevect.c pool.c string.c tree.c iter.c + bytecode.c program.c struct.c commit.c + print.c) + +target_include_directories(libcolm + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) + +set_target_properties(libcolm PROPERTIES + OUTPUT_NAME colm) + +# libprog + +add_library(libprog + buffer.h bytecode.h colm.h debug.h dotgen.h fsmcodegen.h fsmgraph.h + input.h keyops.h map.h compiler.h + parsetree.h pcheck.h pdacodegen.h pdagraph.h pdarun.h pool.h redbuild.h + redfsm.h rtvector.h tree.h global.h colm.h parser.h cstring.h + internal.h + resolve.cc lookup.cc synthesis.cc parsetree.cc + fsmstate.cc fsmbase.cc fsmattach.cc fsmmin.cc + fsmgraph.cc pdagraph.cc pdabuild.cc pdacodegen.cc fsmcodegen.cc + redfsm.cc fsmexec.cc redbuild.cc closure.cc fsmap.cc + dotgen.cc pcheck.cc ctinput.cc declare.cc codegen.cc + exports.cc compiler.cc parser.cc reduce.cc) + +target_include_directories(libprog + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/../aapl> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>) + +set_target_properties(libprog PROPERTIES + OUTPUT_NAME prog) + +# bootstrap0 + +add_executable(bootstrap0 + consinit.cc consinit.h main.cc) + +target_link_libraries(bootstrap0 libprog libcolm) + +set_property(TARGET bootstrap0 APPEND PROPERTY + COMPILE_DEFINITIONS CONS_INIT ${common_COMPILE_DEFINITIONS}) + +set_property(TARGET bootstrap0 APPEND PROPERTY + COMPILE_FLAGS -fpermissive) + +# bootstrap1 + +make_directory("${CMAKE_CURRENT_BINARY_DIR}/gen") + +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gen/parse1.c" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if1.h" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if1.cc" + COMMAND bootstrap0 + ARGS -c -o parse1.c -e if1.h -x if1.cc + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/gen") + +add_executable(bootstrap1 + loadinit.h loadinit.cc main.cc + "${CMAKE_CURRENT_BINARY_DIR}/gen/parse1.c" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if1.cc") + +target_link_libraries(bootstrap1 libprog libcolm) + +set_property(TARGET bootstrap1 APPEND PROPERTY + COMPILE_DEFINITIONS LOAD_INIT ${common_COMPILE_DEFINITIONS}) + +# colm + +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gen/parse2.c" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if2.h" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if2.cc" + COMMAND bootstrap1 + ARGS -c -o parse2.c -e if2.h -x if2.cc "${CMAKE_CURRENT_LIST_DIR}/colm.lm" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/gen") + +add_executable(colm + loadcolm.h loadcolm.cc main.cc + "${CMAKE_CURRENT_BINARY_DIR}/gen/parse2.c" + "${CMAKE_CURRENT_BINARY_DIR}/gen/if2.cc") + +target_link_libraries(colm libprog libcolm) + +set_property(TARGET colm APPEND PROPERTY + COMPILE_DEFINITIONS LOAD_COLM ${common_COMPILE_DEFINITIONS}) + +if(${PROJECT_NAME}_MAKE_INSTALL) + if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR) + set(CMAKE_INSTALL_CMAKEDIR + "${CMAKE_INSTALL_LIBDIR}/cmake/${_PACKAGE_NAME}" + CACHE STRING "CMake packages") + endif() + install(FILES ${RUNTIME_HDR} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/colm") + install(TARGETS libcolm colm + EXPORT ${_PACKAGE_NAME}-targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") + install(EXPORT ${_PACKAGE_NAME}-targets + NAMESPACE ${_PACKAGE_NAME}:: + DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${_PACKAGE_NAME}-config-version.cmake" + VERSION ${${PROJECT_NAME}_VERSION} + COMPATIBILITY AnyNewerVersion) + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${_PACKAGE_NAME}-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${_PACKAGE_NAME}-config-version.cmake" + DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") +endif() diff --git a/src/bytecode.c b/src/bytecode.c index 0aea71ef..c08e71aa 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -23,7 +23,9 @@ #include <colm/bytecode.h> #include <sys/types.h> +#if defined(HAVE_SYS_WAIT_H) #include <sys/wait.h> +#endif #include <assert.h> #include <string.h> #include <stdbool.h> @@ -3740,9 +3742,13 @@ again: free( cmd0 ); +#if defined(HAVE_SYS_WAIT_H) if ( WIFSIGNALED( res ) ) raise( WTERMSIG( res ) ); res = WEXITSTATUS( res ); +#else + // WARNING: Check result +#endif colm_tree_downref( prg, sp, (tree_t*)cmd ); diff --git a/src/colm-config.cmake.in b/src/colm-config.cmake.in new file mode 100644 index 00000000..7e3b8f27 --- /dev/null +++ b/src/colm-config.cmake.in @@ -0,0 +1,3 @@ +# @_PACKAGE_NAME@-config.cmake Generated from colm-config.cmake.in by cmake + +include("${CMAKE_CURRENT_LIST_DIR}/@_PACKAGE_NAME@-targets.cmake") diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in new file mode 100644 index 00000000..455cffe7 --- /dev/null +++ b/src/config.h.cmake.in @@ -0,0 +1,14 @@ +/* config.h Generated from config.h.cmake.in by cmake */ + +#ifndef _COLM_CONFIG_H +#define _COLM_CONFIG_H + +#cmakedefine DEBUG 1 + +#cmakedefine HAVE_SYS_MMAN_H 1 +#cmakedefine HAVE_SYS_WAIT_H 1 +#cmakedefine HAVE_UNISTD_H 1 + +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ + +#endif /* _COLM_CONFIG_H */ diff --git a/src/defs.h.cmake.in b/src/defs.h.cmake.in new file mode 100644 index 00000000..8d89d8b2 --- /dev/null +++ b/src/defs.h.cmake.in @@ -0,0 +1,8 @@ +/* defs.h Generated from defs.h.cmake.in by cmake */ + +#ifndef _COLM_DEFS_H +#define _COLM_DEFS_H + +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ + +#endif /* _COLM_DEFS_H */ diff --git a/src/program.c b/src/program.c index 1fabf479..3412b142 100644 --- a/src/program.c +++ b/src/program.c @@ -20,7 +20,9 @@ * SOFTWARE. */ +#if defined(HAVE_SYS_MMAN_H) #include <sys/mman.h> +#endif #include <string.h> #include <assert.h> #include <stdlib.h> diff --git a/src/version.h.cmake.in b/src/version.h.cmake.in new file mode 100644 index 00000000..3e4c310f --- /dev/null +++ b/src/version.h.cmake.in @@ -0,0 +1,9 @@ +/* version.h Generated from version.h.cmake.in by cmake */ + +#ifndef _COLM_VERSION_H +#define _COLM_VERSION_H + +#cmakedefine VERSION "@VERSION@" +#cmakedefine PUBDATE "@PUBDATE@" + +#endif /* _COLM_VERSION_H */ |