diff --git a/CMakeLists.txt b/CMakeLists.txt index 51a76d6..75c1c88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,16 +5,22 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -include(GNUInstallDirs) +set(PROJECT_VERSION 0.1.0) -include(cmake/mruby.cmake) -include(cmake/lightstorm.cmake) +set(PROJECT_DESCRIPTION "Minimalistic ahead-of-time Ruby compiler") +set(PROJECT_HOMEPAGE_URL "https://github.com/dragonruby/lightstorm") + +include(GNUInstallDirs) find_package(LLVM CONFIG REQUIRED) message("Using LLVM_CONFIG: ${LLVM_CONFIG}") find_package(MLIR CONFIG REQUIRED) message("Using MLIR_CONFIG: ${MLIR_CONFIG}") +include(cmake/mruby.cmake) +include(cmake/version.cmake) +include(cmake/lightstorm.cmake) + list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") list(APPEND CMAKE_MODULE_PATH "${MLIR_DIR}") include(AddLLVM) diff --git a/README.md b/README.md index 142cf7e..8db32da 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Simplified version of [Firestorm](https://www.youtube.com/watch?v=NfMX-dFMSr0) t ## Development Setup -You can either use a codespace or a [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers). For a local setup, follow the steps below. +You can either use a [codespace](https://docs.github.com/en/codespaces/getting-started/quickstart) or a [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers). For a local setup, follow the steps below. ### Install Dependencies diff --git a/cmake/mruby.cmake b/cmake/mruby.cmake index 467b791..154edf6 100644 --- a/cmake/mruby.cmake +++ b/cmake/mruby.cmake @@ -4,6 +4,15 @@ set(MRUBY_BINARY "${MRUBY_DIR}/bin/mruby") set(MRBC_BINARY "${MRUBY_DIR}/bin/mrbc") set(MRUBY_STATIC "${MRUBY_DIR}/build/host/lib/libmruby.a") +file(READ ${MRUBY_DIR}/include/mruby/version.h mruby_version_h) + +string(REGEX MATCH "MRUBY_RELEASE_MAJOR ([0-9]*)" _ ${mruby_version_h}) +set(MRUBY_RELEASE_MAJOR ${CMAKE_MATCH_1}) +string(REGEX MATCH "MRUBY_RELEASE_MINOR ([0-9]*)" _ ${mruby_version_h}) +set(MRUBY_RELEASE_MINOR ${CMAKE_MATCH_1}) +string(REGEX MATCH "MRUBY_RELEASE_TEENY ([0-9]*)" _ ${mruby_version_h}) +set(MRUBY_RELEASE_TEENY ${CMAKE_MATCH_1}) + ExternalProject_Add( mruby SOURCE_DIR ${MRUBY_DIR} diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000..68832e0 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,23 @@ +execute_process( + COMMAND git log -1 --format=%h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process( + COMMAND date "+%d %b %Y" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE) + +set(MRUBY_VERSION + ${MRUBY_RELEASE_MAJOR}.${MRUBY_RELEASE_MINOR}.${MRUBY_RELEASE_TEENY}) + +configure_file(${CMAKE_SOURCE_DIR}/lib/version.cpp + ${CMAKE_BINARY_DIR}/lib/version.cpp @ONLY) + +add_library(lightstorm_version ${CMAKE_BINARY_DIR}/lib/version.cpp) +target_include_directories(lightstorm_version + PRIVATE ${CMAKE_SOURCE_DIR}/include) +target_include_directories(lightstorm_version SYSTEM + PRIVATE ${LLVM_INCLUDE_DIRS}) diff --git a/include/lightstorm/version.h b/include/lightstorm/version.h new file mode 100644 index 0000000..4ec672d --- /dev/null +++ b/include/lightstorm/version.h @@ -0,0 +1,9 @@ +#pragma once + +namespace llvm { +class raw_ostream; +} + +namespace lightstorm { +void print_version_information(llvm::raw_ostream &out); +} // namespace lightstorm diff --git a/lib/version.cpp b/lib/version.cpp new file mode 100644 index 0000000..37c89e5 --- /dev/null +++ b/lib/version.cpp @@ -0,0 +1,38 @@ +#include "lightstorm/version.h" + +#include + +namespace lightstorm { + +static const char *version_string() { + return "@PROJECT_VERSION@"; +} +static const char *commit_string() { + return "@GIT_COMMIT@"; +} +static const char *build_date_string() { + return "@BUILD_DATE@"; +} +static const char *description_string() { + return "@PROJECT_DESCRIPTION@"; +} +static const char *homepage_string() { + return "@PROJECT_HOMEPAGE_URL@"; +} +static const char *llvm_version_string() { + return "@LLVM_VERSION@"; +} +static const char *mruby_version_string() { + return "@MRUBY_VERSION@"; +} + +void print_version_information(llvm::raw_ostream &out) { + out << "Lightstorm: " << description_string() << "\n"; + out << "Home: " << homepage_string() << "\n"; + out << "Version: " << version_string() << " (LLVM " << llvm_version_string() << ", mruby " + << mruby_version_string() << ")" << "\n"; + out << "Commit: " << commit_string() << "\n"; + out << "Date: " << build_date_string() << "\n"; +} + +} // namespace lightstorm diff --git a/tests/end2end/CMakeLists.txt b/tests/end2end/CMakeLists.txt index 5185f42..d9e5735 100644 --- a/tests/end2end/CMakeLists.txt +++ b/tests/end2end/CMakeLists.txt @@ -2,7 +2,7 @@ function(add_end2end_test dir) set(host_ruby ${CMAKE_CURRENT_LIST_DIR}/${dir}/host.rb) set(lightstorm_ruby ${CMAKE_CURRENT_LIST_DIR}/${dir}/lightstorm.rb) set(host_c ${CMAKE_CURRENT_BINARY_DIR}/${dir}/host.c) - set(lightstorm_c ${CMAKE_CURRENT_BINARY_DIR}/${dir}/lighstorm.c) + set(lightstorm_c ${CMAKE_CURRENT_BINARY_DIR}/${dir}/lightstorm.c) set(target_name end2end_test_${dir}.exe) add_custom_command( OUTPUT ${lightstorm_c} @@ -11,7 +11,7 @@ function(add_end2end_test dir) DEPENDS ${lightstorm_ruby} lightstorm) add_custom_command( OUTPUT ${host_c} - COMMAND $ -Blighstorm_host -o ${host_c} + COMMAND $ -Blightstorm_host -o ${host_c} ${host_ruby} DEPENDS ${host_ruby}) add_executable(${target_name} end2end_test_main.c ${host_c} ${lightstorm_c}) diff --git a/tests/end2end/end2end_test_main.c b/tests/end2end/end2end_test_main.c index 454ccc5..f23711c 100644 --- a/tests/end2end/end2end_test_main.c +++ b/tests/end2end/end2end_test_main.c @@ -3,7 +3,7 @@ #include mrb_value lightstorm_top(mrb_state *mrb, mrb_value self); -extern const uint8_t lighstorm_host[]; +extern const uint8_t lightstorm_host[]; int main() { mrb_state *mrb = mrb_open(); @@ -13,7 +13,7 @@ int main() { mrb_value self = mrb_top_self(mrb); mrb->c->ci->stack[0] = self; lightstorm_top(mrb, self); - mrb_load_irep(mrb, lighstorm_host); + mrb_load_irep(mrb, lightstorm_host); mrb_close(mrb); return 0; } diff --git a/tools/lightstorm/CMakeLists.txt b/tools/lightstorm/CMakeLists.txt index 0c73a94..b8268a0 100644 --- a/tools/lightstorm/CMakeLists.txt +++ b/tools/lightstorm/CMakeLists.txt @@ -1,7 +1,8 @@ add_executable(lightstorm lightstorm.cpp) target_link_libraries( - lightstorm PRIVATE lightstorm_compiler lightstorm_conversion - lightstorm_optimizations rite_dialect LLVMOption) + lightstorm + PRIVATE lightstorm_compiler lightstorm_conversion lightstorm_optimizations + rite_dialect LLVMOption lightstorm_version) target_compile_options(lightstorm PRIVATE -fno-rtti -fno-exceptions) target_include_directories( lightstorm PRIVATE ${CMAKE_SOURCE_DIR}/include ${LLVM_INCLUDE_DIRS} diff --git a/tools/lightstorm/lightstorm.cpp b/tools/lightstorm/lightstorm.cpp index 61239e0..f0e9bdb 100644 --- a/tools/lightstorm/lightstorm.cpp +++ b/tools/lightstorm/lightstorm.cpp @@ -13,6 +13,7 @@ #include "lightstorm/conversion/conversion.h" #include "lightstorm/dialect/rite.h" #include "lightstorm/optimizations/optimizations.h" +#include "lightstorm/version.h" llvm::cl::OptionCategory LightstormCategory("lightstorm"); @@ -41,6 +42,7 @@ llvm::cl::opt NoOpt("no-opt", llvm::cl::Optional, llvm::cl::desc("Disable int main(int argc, char **argv) { llvm::llvm_shutdown_obj shutdownGuard; + llvm::cl::SetVersionPrinter(lightstorm::print_version_information); llvm::cl::HideUnrelatedOptions(LightstormCategory); llvm::cl::ParseCommandLineOptions(argc, argv);