From aff3e0864d1d24f4c74ba4bd2da32861e02d227f Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Sun, 20 Dec 2020 23:12:31 +0100 Subject: [PATCH] Refactor CMakeLists.txt This allows ANTLR to be compiled locally instead of globally. This prevents bugs when emscripten is/isn't used. --- CMakeLists.txt | 177 +++++++++++++-------- src/CMakeLists.txt | 114 ------------- src/translator/graph_planar/CMakeLists.txt | 2 + src/translator/math/CMakeLists.txt | 1 + src/translator/sequence/CMakeLists.txt | 1 + tools/CMakeLists.txt | 63 ++++++++ tools/antlr/download_and_patch.sh | 15 -- tools/download_and_patch.sh | 9 ++ 8 files changed, 185 insertions(+), 197 deletions(-) delete mode 100644 src/CMakeLists.txt create mode 100644 tools/CMakeLists.txt delete mode 100755 tools/antlr/download_and_patch.sh create mode 100755 tools/download_and_patch.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 7926ec6..244703f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,73 +1,13 @@ cmake_minimum_required (VERSION 3.11) -project(Diagon) +project(Diagon LANGUAGES C CXX) -# ┌─────────────────────────────────────────────────┐ -# │ Print Information about the compilation system │ -# └─────────────────────────────────────────────────┘ -if(CMAKE_CXX_COMPILER MATCHES "/em\\+\\+(-[a-zA-Z0-9.])?$") - set(Web true) -else() - set(Web false) -endif() -message("┌── Diagon configuration ───────────────────────") -message("│ - Build type : " ${CMAKE_BUILD_TYPE}) -message("│ - C compiler: ${CMAKE_C_COMPILER}") -message("│ - C++ compiler: ${CMAKE_CXX_COMPILER}") -message("│ - System: " ${CMAKE_SYSTEM_NAME} ) -message("│ - Use Web : " ${Web}) -message("└────────────────────────────────────────────────") +include(FetchContent) -# ┌─────────────────────────────────────────────────┐ -# │ ANTLR │ -# └─────────────────────────────────────────────────┘ -execute_process( - COMMAND bash download_and_patch.sh - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tools/antlr -) - -SET(WITH_LIBCXX OFF CACHE BOOL "") -add_subdirectory(${CMAKE_SOURCE_DIR}/tools/antlr/antlr4/runtime/Cpp/ EXCLUDE_FROM_ALL) -include_directories(${CMAKE_SOURCE_DIR}/tools/antlr/antlr4/runtime/Cpp/runtime/src) - -# Function -# ANTLR() -# -# Description: -# Take an ANTLR file and produce a CMake rule to generate the corresponding -# C++ files. -# -# Notes: -# The ANTLR file path must be relative to ${CMAKE_CURRENT_SOURCE_DIR} -# -# Example: -# ANTLR(Grammar.g4) -function(ANTLR source) - get_filename_component(source_filename ${CMAKE_CURRENT_SOURCE_DIR}/${source} NAME_WE) - get_filename_component(source_src_dir ${CMAKE_CURRENT_SOURCE_DIR}/${source} DIRECTORY) - get_filename_component(source_gen_dir ${CMAKE_CURRENT_BINARY_DIR}/${source} DIRECTORY) - add_custom_command( - OUTPUT - ${source_gen_dir}/${source_filename}Lexer.cpp - ${source_gen_dir}/${source_filename}Parser.cpp - ${source_gen_dir}/${source_filename}Lexer.h - ${source_gen_dir}/${source_filename}Parser.h - COMMAND - java - ARGS - -jar ${CMAKE_SOURCE_DIR}/tools/antlr/antlr.jar - -Dlanguage=Cpp - -no-listener - -no-visitor - -o ${source_gen_dir} - ${source_src_dir}/${source_filename}.g4 - MAIN_DEPENDENCY - ${source_src_dir}/${source_filename}.g4 - ) -endfunction() +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tools) function(target_set_common target) set_property(TARGET ${target} PROPERTY CXX_STANDARD 17) - if (Web) + if (EMSCRIPTEN) # Nothing elseif (MSVC) target_compile_options(${target} PRIVATE "/wd4244") @@ -76,16 +16,19 @@ function(target_set_common target) target_compile_options(${target} PRIVATE "/wd4305") else() target_compile_options(${target} PRIVATE "-Wall") - #target_compile_options(${target} PRIVATE "-Werror") target_compile_options(${target} PRIVATE "-Wno-sign-compare") target_compile_options(${target} PRIVATE "-Wno-attributes") endif() endfunction() +# Include source files and the generated files +include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) + +set(test_directory ${CMAKE_CURRENT_SOURCE_DIR}/test) + #------------------------------------------------------------------------------- - -add_subdirectory(src) - +# Environment variable available in C++ source #------------------------------------------------------------------------------- execute_process( @@ -98,6 +41,104 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/environment.h.in + ${CMAKE_CURRENT_BINARY_DIR}/src/environment.h +) + +#------------------------------------------------------------------------------- + +add_library(diagon_base STATIC + src/translator/Translator.cpp + src/translator/Translator.h +) + +add_subdirectory(src/screen) +add_subdirectory(src/translator/frame) +add_subdirectory(src/translator/grammar) +add_subdirectory(src/translator/graph_dag) +add_subdirectory(src/translator/graph_planar) +add_subdirectory(src/translator/math) +add_subdirectory(src/translator/sequence) +add_subdirectory(src/translator/table) +add_subdirectory(src/translator/tree) + +add_library(diagon_lib STATIC + src/translator/Factory.cpp + src/translator/Factory.h +) + +target_link_libraries(diagon_lib + PRIVATE diagon_base + PRIVATE translator_frame + PRIVATE translator_grammar + PRIVATE translator_graph_dag + PRIVATE translator_graph_planar + PRIVATE translator_math + PRIVATE translator_sequence + PRIVATE translator_table + PRIVATE translator_tree + PRIVATE antlr4_static + PRIVATE screen +) +target_set_common(diagon_lib) + +if (EMSCRIPTEN) + # Emscripten options + string(APPEND CMAKE_CXX_FLAGS " -Os") + string(APPEND CMAKE_CXX_FLAGS " -s WASM=1") + string(APPEND CMAKE_CXX_FLAGS " --closure 1") + string(APPEND CMAKE_CXX_FLAGS " -s DISABLE_EXCEPTION_CATCHING=0") + string(APPEND CMAKE_CXX_FLAGS " -s EXPORTED_FUNCTIONS='[\"_translate\", \"_main\", \"_API\"]'") + string(APPEND CMAKE_CXX_FLAGS " -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\"]'") + + option(ADD_GOOGLE_ANALYTICS "Build the static library" ON) + if (ADD_GOOGLE_ANALYTICS) + file(READ + ${CMAKE_CURRENT_SOURCE_DIR}/src/http/google-analytics.html + google-analytics) + endif(ADD_GOOGLE_ANALYTICS) + + foreach(file + "style.css" + "index.html" + "run_web_server.sh") + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/http/${file} + ${CMAKE_CURRENT_BINARY_DIR}/${file} + ) + endforeach(file) + + add_executable(diagon src/main_webassembly.cpp) + target_link_libraries(diagon PRIVATE diagon_lib) + target_set_common(diagon) + + FetchContent_Declare(json + GIT_REPOSITORY https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent + GIT_TAG v3.9.1) + + FetchContent_GetProperties(json) + if(NOT json_POPULATED) + FetchContent_Populate(json) + add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) + endif() + + target_link_libraries(diagon PRIVATE nlohmann_json::nlohmann_json) + +else() + target_link_libraries(diagon_lib PRIVATE -static-libstdc++) + target_link_libraries(diagon_lib PRIVATE stdc++fs) + + add_executable(diagon src/main.cpp) + target_link_libraries(diagon PRIVATE diagon_lib) + install(TARGETS diagon RUNTIME DESTINATION "bin") + target_set_common(diagon) + + add_executable(input_output_test src/input_output_test.cpp) + target_link_libraries(input_output_test diagon_lib) + target_set_common(input_output_test) +endif() + set(CPACK_GENERATOR "DEB") set(CPACK_PACKAGE_NAME "diagon") set(CPACK_PACKAGE_VENDOR "Arthur Sonzogni") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 6ed3714..0000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Include source files and the generated files -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -#------------------------------------------------------------------------------- -# Environment variable available in C++ source -#------------------------------------------------------------------------------- - -set(test_directory ${CMAKE_SOURCE_DIR}/test) -execute_process( - COMMAND - git rev-list --count HEAD - WORKING_DIRECTORY - ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE - git_version - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/environment.h.in - ${CMAKE_CURRENT_BINARY_DIR}/environment.h -) - -#------------------------------------------------------------------------------- - -add_library(diagon_base STATIC - translator/Translator.cpp - translator/Translator.h -) - -add_subdirectory(screen) -add_subdirectory(translator/frame) -add_subdirectory(translator/grammar) -add_subdirectory(translator/graph_dag) -add_subdirectory(translator/graph_planar) -add_subdirectory(translator/math) -add_subdirectory(translator/sequence) -add_subdirectory(translator/table) -add_subdirectory(translator/tree) - -add_library(diagon_lib STATIC - translator/Factory.cpp - translator/Factory.h -) - -target_link_libraries(diagon_lib PRIVATE diagon_base) -target_link_libraries(diagon_lib PRIVATE translator_frame) -target_link_libraries(diagon_lib PRIVATE translator_grammar) -target_link_libraries(diagon_lib PRIVATE translator_graph_dag) -target_link_libraries(diagon_lib PRIVATE translator_graph_planar) -target_link_libraries(diagon_lib PRIVATE translator_math) -target_link_libraries(diagon_lib PRIVATE translator_sequence) -target_link_libraries(diagon_lib PRIVATE translator_table) -target_link_libraries(diagon_lib PRIVATE translator_tree) -target_link_libraries(diagon_lib PRIVATE antlr4_static) -target_link_libraries(diagon_lib PRIVATE screen) -target_set_common(diagon_lib) - -if (Web) - # Emscripten options - string(APPEND CMAKE_CXX_FLAGS " -Os") - string(APPEND CMAKE_CXX_FLAGS " -s WASM=1") - string(APPEND CMAKE_CXX_FLAGS " --closure 1") - string(APPEND CMAKE_CXX_FLAGS " -s DISABLE_EXCEPTION_CATCHING=0") - string(APPEND CMAKE_CXX_FLAGS " -s EXPORTED_FUNCTIONS='[\"_translate\", \"_main\", \"_API\"]'") - string(APPEND CMAKE_CXX_FLAGS " -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\"]'") - - option(ADD_GOOGLE_ANALYTICS "Build the static library" ON) - if (ADD_GOOGLE_ANALYTICS) - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/http/google-analytics.html google-analytics) - endif(ADD_GOOGLE_ANALYTICS) - - foreach(file - "style.css" - "index.html" - "run_web_server.sh") - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/http/${file} - ${CMAKE_CURRENT_BINARY_DIR}/${file} - ) - endforeach(file) - - add_executable(diagon main_webassembly.cpp) - target_link_libraries(diagon PRIVATE diagon_lib) - target_set_common(diagon) - - include(FetchContent) - - FetchContent_Declare(json - GIT_REPOSITORY https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent - GIT_TAG v3.9.1) - - FetchContent_GetProperties(json) - if(NOT json_POPULATED) - FetchContent_Populate(json) - add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) - endif() - - target_link_libraries(diagon PRIVATE nlohmann_json::nlohmann_json) - -else() - target_link_libraries(diagon_lib PRIVATE -static-libstdc++) - target_link_libraries(diagon_lib PRIVATE stdc++fs) - - add_executable(diagon main.cpp) - target_link_libraries(diagon PRIVATE diagon_lib) - install(TARGETS diagon RUNTIME DESTINATION "bin") - target_set_common(diagon) - - add_executable(input_output_test input_output_test.cpp) - target_link_libraries(input_output_test diagon_lib) - target_set_common(input_output_test) -endif() diff --git a/src/translator/graph_planar/CMakeLists.txt b/src/translator/graph_planar/CMakeLists.txt index 432cc51..fb98619 100644 --- a/src/translator/graph_planar/CMakeLists.txt +++ b/src/translator/graph_planar/CMakeLists.txt @@ -9,4 +9,6 @@ if (MSVC) else() target_compile_options(translator_graph_planar PRIVATE "-Wno-attributes") endif() + target_link_libraries(translator_graph_planar PRIVATE diagon_base) +target_link_libraries(translator_graph_planar PRIVATE antlr4_static) diff --git a/src/translator/math/CMakeLists.txt b/src/translator/math/CMakeLists.txt index 461226e..762df2f 100644 --- a/src/translator/math/CMakeLists.txt +++ b/src/translator/math/CMakeLists.txt @@ -7,3 +7,4 @@ add_library(translator_math STATIC ) set_property(TARGET translator_math PROPERTY CXX_STANDARD 17) target_link_libraries(translator_math PRIVATE diagon_base) +target_link_libraries(translator_math PRIVATE antlr4_static) diff --git a/src/translator/sequence/CMakeLists.txt b/src/translator/sequence/CMakeLists.txt index d4c6fcb..d42a160 100644 --- a/src/translator/sequence/CMakeLists.txt +++ b/src/translator/sequence/CMakeLists.txt @@ -10,3 +10,4 @@ add_library(translator_sequence STATIC ) target_set_common(translator_sequence) target_link_libraries(translator_sequence PRIVATE diagon_base) +target_link_libraries(translator_sequence PRIVATE antlr4_static) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..8ce2455 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,63 @@ +set(DIAGON_TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "") + +# ┌─────────────────────────────────────────────────┐ +# │ ANTLR │ +# └─────────────────────────────────────────────────┘ +execute_process( + COMMAND bash download_and_patch.sh + WORKING_DIRECTORY ${DIAGON_TOOLS_DIR} +) + +FetchContent_Declare(antlr + GIT_REPOSITORY https://github.com/antlr/antlr4 + GIT_TAG 4.8) + +FetchContent_GetProperties(antlr) +if(NOT json_POPULATED) + FetchContent_Populate(antlr) + SET(WITH_LIBCXX OFF CACHE BOOL "") + add_subdirectory( + ${antlr_SOURCE_DIR}/runtime/Cpp + ${antlr_BINARY_DIR} + EXCLUDE_FROM_ALL) + target_include_directories(antlr4_static + PUBLIC ${antlr_SOURCE_DIR}/runtime/Cpp/runtime/src + ) +endif() + +# Function +# ANTLR() +# +# Description: +# Take an ANTLR file and produce a CMake rule to generate the corresponding +# C++ files. +# +# Notes: +# The ANTLR file path must be relative to ${CMAKE_CURRENT_SOURCE_DIR} +# +# Example: +# ANTLR(Grammar.g4) +function(ANTLR source) + get_filename_component(source_filename ${CMAKE_CURRENT_SOURCE_DIR}/${source} NAME_WE) + get_filename_component(source_src_dir ${CMAKE_CURRENT_SOURCE_DIR}/${source} DIRECTORY) + get_filename_component(source_gen_dir ${CMAKE_CURRENT_BINARY_DIR}/${source} DIRECTORY) + add_custom_command( + OUTPUT + ${source_gen_dir}/${source_filename}Lexer.cpp + ${source_gen_dir}/${source_filename}Parser.cpp + ${source_gen_dir}/${source_filename}Lexer.h + ${source_gen_dir}/${source_filename}Parser.h + COMMAND + java + ARGS + -jar ${DIAGON_TOOLS_DIR}/antlr.jar + -Dlanguage=Cpp + -no-listener + -no-visitor + -o ${source_gen_dir} + ${source_src_dir}/${source_filename}.g4 + MAIN_DEPENDENCY + ${source_src_dir}/${source_filename}.g4 + ) +endfunction() + diff --git a/tools/antlr/download_and_patch.sh b/tools/antlr/download_and_patch.sh deleted file mode 100755 index ae96b24..0000000 --- a/tools/antlr/download_and_patch.sh +++ /dev/null @@ -1,15 +0,0 @@ -cd "$(dirname "$0")" -top=$(pwd) - -if [ -d cpp_runtime ] -then - exit -fi - -mkdir -p cpp_runtime - -## Download the ANTLR executable. -curl http://www.antlr.org/download/antlr-4.8-complete.jar -L -o antlr.jar - -## Download the C++ runtime. -git clone --depth 1 https://github.com/antlr/antlr4 -b 4.8 diff --git a/tools/download_and_patch.sh b/tools/download_and_patch.sh new file mode 100755 index 0000000..dbf989f --- /dev/null +++ b/tools/download_and_patch.sh @@ -0,0 +1,9 @@ +cd "$(dirname "$0")" +top=$(pwd) + +if [[ -f "antlr.jar" ]] +then + exit +else + curl http://www.antlr.org/download/antlr-4.8-complete.jar -L -o antlr.jar +fi