From 148cf9ef268cb18715f8260cce5ee477d2f8c32f Mon Sep 17 00:00:00 2001 From: Steffen Zimmermann Date: Fri, 25 Mar 2022 11:42:18 +0100 Subject: [PATCH 01/13] fix unused-local-typedefs warning (#517) clang complains about the line: include/etl/algorithm.h:298:66: error: typedef 'value_type' locally defined but not used [-Werror=unused-local-typedefs] typedef typename etl::iterator_traits::value_type value_type; --- include/etl/algorithm.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index 0ede5bdb..9cc55941 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -295,8 +295,6 @@ namespace etl typename etl::enable_if::value, void>::type reverse(TIterator b, TIterator e) { - typedef typename etl::iterator_traits::value_type value_type; - if (b != e) { while (b < --e) From eb49582837b9d37193c1b9830f5cf0d05659b977 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 26 Mar 2022 18:30:33 +0000 Subject: [PATCH 02/13] Small optimisations for computing indexes for queues & cyclic_value. --- include/etl/circular_buffer.h | 42 ++++++++++++++++++++++++++++----- include/etl/cyclic_value.h | 4 ++-- include/etl/queue.h | 4 ++-- include/etl/queue_lockable.h | 2 +- include/etl/queue_mpmc_mutex.h | 2 +- include/etl/queue_spsc_atomic.h | 2 +- include/etl/queue_spsc_isr.h | 2 +- include/etl/queue_spsc_locked.h | 2 +- 8 files changed, 45 insertions(+), 15 deletions(-) diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index f042f621..42abcc61 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -95,7 +95,15 @@ namespace etl //************************************************************************* bool full() const { - return (in + 1U) % BUFFER_SIZE == out; + size_t i = in; + + ++i; + if (i == BUFFER_SIZE) ETL_UNLIKELY + { + i = 0U; + } + + return i == out; } //************************************************************************* @@ -126,6 +134,26 @@ namespace etl { } + //************************************************************************* + void increment_in() + { + ++in; + if (in == BUFFER_SIZE) ETL_UNLIKELY + { + in = 0U; + } + } + + //************************************************************************* + void increment_out() + { + ++out; + if (out == BUFFER_SIZE) ETL_UNLIKELY + { + out = 0U; + } + } + const size_type BUFFER_SIZE; size_type in; ///< Index to the next write. size_type out; ///< Index to the next read. @@ -835,14 +863,14 @@ namespace etl void push(const_reference item) { ::new (&pbuffer[in]) T(item); - in = (in + 1U) % BUFFER_SIZE; + increment_in(); // Did we catch up with the 'out' index? if (in == out) { // Forget about the oldest one. pbuffer[out].~T(); - out = (out + 1U) % BUFFER_SIZE; + this->increment_out(); } else { @@ -859,14 +887,14 @@ namespace etl void push(rvalue_reference item) { ::new (&pbuffer[in]) T(etl::move(item)); - in = (in + 1U) % BUFFER_SIZE; + increment_in(); // Did we catch up with the 'out' index? if (in == out) { // Forget about the oldest item. pbuffer[out].~T(); - out = (out + 1U) % BUFFER_SIZE; + increment_out(); } else { @@ -895,7 +923,7 @@ namespace etl { ETL_ASSERT(!empty(), ETL_ERROR(circular_buffer_empty)); pbuffer[out].~T(); - out = (out + 1U) % BUFFER_SIZE; + increment_out(); ETL_DECREMENT_DEBUG_COUNT } @@ -1013,6 +1041,8 @@ namespace etl } } + + pointer pbuffer; private: diff --git a/include/etl/cyclic_value.h b/include/etl/cyclic_value.h index 000b40ed..2c08f357 100644 --- a/include/etl/cyclic_value.h +++ b/include/etl/cyclic_value.h @@ -172,7 +172,7 @@ namespace etl //************************************************************************* cyclic_value& operator ++() { - if (value >= LAST) + if (value >= LAST) ETL_UNLIKELY { value = FIRST; } @@ -201,7 +201,7 @@ namespace etl //************************************************************************* cyclic_value& operator --() { - if (value <= FIRST) + if (value <= FIRST) ETL_UNLIKELY { value = LAST; } diff --git a/include/etl/queue.h b/include/etl/queue.h index cc498b88..b9eb00b9 100644 --- a/include/etl/queue.h +++ b/include/etl/queue.h @@ -187,7 +187,7 @@ namespace etl //************************************************************************* void add_in() { - if (++in == CAPACITY) + if (++in == CAPACITY) ETL_UNLIKELY { in = 0; } @@ -201,7 +201,7 @@ namespace etl //************************************************************************* void del_out() { - if (++out == CAPACITY) + if (++out == CAPACITY) ETL_UNLIKELY { out = 0; } diff --git a/include/etl/queue_lockable.h b/include/etl/queue_lockable.h index db795a7a..02ac59a8 100644 --- a/include/etl/queue_lockable.h +++ b/include/etl/queue_lockable.h @@ -185,7 +185,7 @@ namespace etl { ++index; - if (index == maximum) + if (index == maximum) ETL_UNLIKELY { index = 0; } diff --git a/include/etl/queue_mpmc_mutex.h b/include/etl/queue_mpmc_mutex.h index 16b2cc45..9b27179d 100644 --- a/include/etl/queue_mpmc_mutex.h +++ b/include/etl/queue_mpmc_mutex.h @@ -89,7 +89,7 @@ namespace etl { ++index; - if (index == maximum) + if (index == maximum) ETL_UNLIKELY { index = 0; } diff --git a/include/etl/queue_spsc_atomic.h b/include/etl/queue_spsc_atomic.h index 574e048c..c4dc9056 100644 --- a/include/etl/queue_spsc_atomic.h +++ b/include/etl/queue_spsc_atomic.h @@ -141,7 +141,7 @@ namespace etl { ++index; - if (index == maximum) + if (index == maximum) ETL_UNLIKELY { index = 0; } diff --git a/include/etl/queue_spsc_isr.h b/include/etl/queue_spsc_isr.h index 3e93fa8b..071ce2ee 100644 --- a/include/etl/queue_spsc_isr.h +++ b/include/etl/queue_spsc_isr.h @@ -421,7 +421,7 @@ namespace etl { ++index; - if (index == maximum) + if (index == maximum) ETL_UNLIKELY { index = 0; } diff --git a/include/etl/queue_spsc_locked.h b/include/etl/queue_spsc_locked.h index 185f64a6..facddeb5 100644 --- a/include/etl/queue_spsc_locked.h +++ b/include/etl/queue_spsc_locked.h @@ -118,7 +118,7 @@ namespace etl { ++index; - if (index == maximum) + if (index == maximum) ETL_UNLIKELY { index = 0; } From 3f1c640eff491fa709ac29cf665dc3989fb4bfed Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 1 Apr 2022 11:55:32 +0200 Subject: [PATCH 03/13] cplusplus traits is now 'long' --- include/etl/platform.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/etl/platform.h b/include/etl/platform.h index ac67fdd3..15eb018e 100644 --- a/include/etl/platform.h +++ b/include/etl/platform.h @@ -377,7 +377,7 @@ namespace etl static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1); static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1); static ETL_CONSTANT bool is_debug_build = (ETL_IS_DEBUG_BUILD == 1); - static ETL_CONSTANT int cplusplus = __cplusplus; + static ETL_CONSTANT long cplusplus = __cplusplus; } } From 10da3ac9e587aef9d09204c3891917ce1d4dddbc Mon Sep 17 00:00:00 2001 From: Robin Mueller <31589589+robamu@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:11:40 +0200 Subject: [PATCH 04/13] CMake install instructions (#527) * add installation steps for CMake * cmake install steps * small tweaks Co-authored-by: Cleanroom Laptop L15 --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 95a24b5b..be6f452a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Embedded Template Library (ETL) [![Build status](https://ci.appveyor.com/api/projects/status/b7jgecv7unqjw4u0/branch/master?svg=true)](https://ci.appveyor.com/project/jwellbelove/etl/branch/master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3c14cd918ccf40008d0bcd7b083d5946)](https://www.codacy.com/manual/jwellbelove/etl?utm_source=github.com&utm_medium=referral&utm_content=ETLCPP/etl&utm_campaign=Badge_Grade) -**Motivation** +## Motivation C++ is a great language to use for embedded applications and templates are a powerful aspect. The standard library can offer a great deal of well tested functionality, but there are some parts of the standard library that do not fit well with deterministic behaviour and limited resource requirements. These limitations usually preclude the use of dynamically allocated memory and containers with open ended sizes. @@ -21,7 +21,7 @@ What is needed is a template library where the user can declare the size, or max This is what the ETL attempts to achieve. -**Summary** +## Summary The ETL is not designed to completely replace the STL, but complement it. Its design objective covers three areas. @@ -35,7 +35,7 @@ It contains a set of containers, algorithms and utilities, some of which emulate There is no dynamic memory allocation. The library makes no use of the heap. All of the containers have a fixed capacity allowing all memory allocation to be determined at compile time. The library is intended for any compiler that supports C++ 03. -**Main features:** +## Main features - Cross platform. This library is not specific to any processor type. - No dynamic memory allocation @@ -62,6 +62,58 @@ I am especially interested in people who are using Keil, IAR, Green Hills, TI Co See (https://www.etlcpp.com) for up-to-date information. -**Arduino library:** +## Installing this library + +You can find the setup steps [here](https://www.etlcpp.com/setup.html). + +### CMake + +One way to use this library is to drop it somewhere in your project directory +and then make the library available by using `add_subdirectory` + +```cmake +add_subdirectory(etl) +add_executable(foo main.cpp) +target_link_libraries(foo PRIVATE etl) +``` + +If you want to install this library with CMake, you can perform the following steps + +```sh +git clone https://github.com/ETLCPP/etl.git +git checkout +cmake -B build . +sudo cmake --install build/ +``` + +After the library has been installed, you can use [find_package](https://cmake.org/cmake/help/latest/command/find_package.html) to use the library. +Replace `` with your desired major version: + +```cmake +find_package(etl ) +add_executable(foo main.cpp) +target_link_libraries(foo PRIVATE etl) +``` + + +Alternatively you can use [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html), replacing `` with the version to +install based on a git tag: + +```sh +Include(FetchContent) + +FetchContent_Declare( + etl + GIT_REPOSITORY https://github.com/ETLCPP/etl + GIT_TAG +) + +FetchContent_MakeAvailable(etl) + +add_executable(foo main.cpp) +target_link_libraries(foo PRIVATE etl) +``` + +## Arduino library The content of this repo is available as a library in the Arduino IDE (search for the "Embedded Template Library" in the IDE library manager). The Arduino library repository is available at ```https://github.com/ETLCPP/etl-arduino```, see there for more details. From 1399c0d0d9c146c405097b4ae8c580735eb0a0b9 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 1 Apr 2022 12:22:00 +0200 Subject: [PATCH 05/13] Work in progress Updates version.h --- arduino/create_arduino_library.py | 103 ---------------- scripts/update_release.py | 198 ++++++++++++++++++++++++++++++ test/vs2019/etl.vcxproj | 6 +- test/vs2019/etl.vcxproj.filters | 21 +++- version.txt | 1 + 5 files changed, 222 insertions(+), 107 deletions(-) delete mode 100644 arduino/create_arduino_library.py create mode 100644 scripts/update_release.py create mode 100644 version.txt diff --git a/arduino/create_arduino_library.py b/arduino/create_arduino_library.py deleted file mode 100644 index fc0ee203..00000000 --- a/arduino/create_arduino_library.py +++ /dev/null @@ -1,103 +0,0 @@ - -import shutil -import os - -# Assumes this folder structure. -# Folder Variable -# --------------------------------------- -# etl etl_dir -# arduino arduino_dir -# include include_dir -# etl-arduino etl_arduino_dir -# src etl_arduino_src_dir - -print('') -print('Copy ETL files to the etl-arduino repository') -print('') - -# Get the current path of the script -arduino_dir = os.path.dirname(__file__) -print('arduino_dir = ', arduino_dir) - -# Get the root folder of the ETL -etl_dir = os.path.dirname(arduino_dir) -print('etl_dir = ', etl_dir) - -# Get the ETL repository folder -include_dir = os.path.join(etl_dir, 'include') -print('include_dir = ', include_dir) - -# Get the ETL arduino_examples folder -arduino_examples_dir = os.path.join(arduino_dir, 'examples') -print('examples_dir = ', arduino_examples_dir) - -# Get the root folder of both repositories -common_dir = os.path.dirname(etl_dir) -print('common_dir = ', common_dir) - -# Get the ETL Arduino repository folder -etl_arduino_dir = os.path.join(common_dir, 'etl-arduino') -print('etl_arduino_dir = ', etl_arduino_dir) - -# Get the ETL Arduino src repository folder -etl_arduino_src_dir = os.path.join(etl_arduino_dir, 'src') -print('etl_arduino_src_dir = ', etl_arduino_src_dir) - -# Get the ETL Arduino examples repository folder -etl_arduino_examples_dir = os.path.join(etl_arduino_dir, 'examples') -print('etl_arduino_examples_dir = ', etl_arduino_examples_dir) - -print('') - -# Copy the library properties -src_filename = 'library-arduino.properties' -dst_filename = 'library.properties' -source = os.path.join(arduino_dir, src_filename) -destination = os.path.join(etl_arduino_dir, dst_filename) -print('Copy the library properties') -print(' From :', source) -print(' To :', destination) -shutil.copyfile(source, destination) - -print('') - -# Copy the library json -src_filename = 'library-arduino.json' -dst_filename = 'library.json' -source = os.path.join(arduino_dir, src_filename) -destination = os.path.join(etl_arduino_dir, dst_filename) -print('Copy the library json') -print(' From :', source) -print(' To :', destination) -shutil.copyfile(source, destination) - -print('') - -# Copy the Arduino ETL header -filename = 'Embedded_Template_Library.h' -source = os.path.join(arduino_dir, filename) -destination = os.path.join(etl_arduino_src_dir, filename) -print('Copy the Arduino ETL header') -print(' From :', source) -print(' To :', destination) -shutil.copyfile(source, destination) - -print('') - -# Copy the ETL headers -source = include_dir -destination = etl_arduino_src_dir -print('Copy the ETL headers') -print(' From :', source) -print(' To :', destination) -shutil.copytree(source, destination, dirs_exist_ok = True) - -print('') - -# Copy the ETL arduino_examples -source = arduino_examples_dir -destination = etl_arduino_examples_dir -print('Copy the ETL Arduino examples') -print(' From :', source) -print(' To :', destination) -shutil.copytree(source, destination, dirs_exist_ok = True) diff --git a/scripts/update_release.py b/scripts/update_release.py new file mode 100644 index 00000000..09af3384 --- /dev/null +++ b/scripts/update_release.py @@ -0,0 +1,198 @@ + +import shutil +import os + +# Get the current path of the script +script_dir = os.path.dirname(os.path.abspath(__file__)) + +# Get the root folder of the ETL +etl_dir = os.path.abspath(os.path.join(script_dir, os.pardir)) + +# Get the ETL repository folder +include_dir = os.path.join(etl_dir, 'include') + +# Get the ETL headers folder +headers_dir = os.path.join(include_dir, 'etl') + +# Get the Arduino folder +arduino_dir = os.path.join(etl_dir, 'arduino') + +# Get the ETL arduino_examples folder +arduino_examples_dir = os.path.join(arduino_dir, 'examples') + +# Get the root folder of both repositories +common_dir = os.path.abspath(os.path.join(etl_dir, os.pardir)) + +# Get the ETL Arduino repository folder +etl_arduino_dir = os.path.join(common_dir, 'etl-arduino') + +# Get the ETL Arduino src repository folder +etl_arduino_src_dir = os.path.join(etl_arduino_dir, 'src') + +# Get the ETL Arduino examples repository folder +etl_arduino_examples_dir = os.path.join(etl_arduino_dir, 'examples') + +major_version = '' +minor_version = '' +patch_version = '' + +#------------------------------------------------------------------------------ +# Assumes this folder structure. +# Folder Variable +# --------------------------------------- +# etl etl_dir +# arduino arduino_dir +# include include_dir +# etl-arduino etl_arduino_dir +# src etl_arduino_src_dir +def create_arduino_variant(): + print('') + print('Copy ETL files to the etl-arduino repository') + print('') + + print('script_dir = ', script_dir) + print('etl_dir = ', etl_dir) + print('include_dir = ', include_dir) + print('headers_dir = ', headers_dir) + print('arduino_dir = ', arduino_dir) + print('examples_dir = ', arduino_examples_dir) + print('common_dir = ', common_dir) + print('etl_arduino_dir = ', etl_arduino_dir) + print('etl_arduino_src_dir = ', etl_arduino_src_dir) + print('etl_arduino_examples_dir = ', etl_arduino_examples_dir) + + print('') + + # Copy the library properties + src_filename = 'library-arduino.properties' + dst_filename = 'library.properties' + source = os.path.join(arduino_dir, src_filename) + destination = os.path.join(etl_arduino_dir, dst_filename) + print('Copy the library properties') + print(' From :', source) + print(' To :', destination) + shutil.copyfile(source, destination) + + print('') + + # Copy the library json + src_filename = 'library-arduino.json' + dst_filename = 'library.json' + source = os.path.join(arduino_dir, src_filename) + destination = os.path.join(etl_arduino_dir, dst_filename) + print('Copy the library json') + print(' From :', source) + print(' To :', destination) + shutil.copyfile(source, destination) + + print('') + + # Copy the Arduino ETL header + filename = 'Embedded_Template_Library.h' + source = os.path.join(arduino_dir, filename) + destination = os.path.join(etl_arduino_src_dir, filename) + print('Copy the Arduino ETL header') + print(' From :', source) + print(' To :', destination) + shutil.copyfile(source, destination) + + print('') + + # Copy the ETL headers + source = include_dir + destination = etl_arduino_src_dir + print('Copy the ETL headers') + print(' From :', source) + print(' To :', destination) + shutil.copytree(source, destination, dirs_exist_ok = True) + + print('') + + # Copy the ETL arduino_examples + source = arduino_examples_dir + destination = etl_arduino_examples_dir + print('Copy the ETL Arduino examples') + print(' From :', source) + print(' To :', destination) + shutil.copytree(source, destination, dirs_exist_ok = True) + +#------------------------------------------------------------------------------ +def get_version(): + version_file = os.path.join(etl_dir, 'version.txt') + print('') + print('version_file = ', version_file) + + with open(version_file) as f: + version = f.read() + + elements = version.split('.', 3) + + return elements[0], elements[1], elements[2] + +#------------------------------------------------------------------------------ +def create_version_h(): + print('') + print('Creating version.h') + + version_h = os.path.join(headers_dir, 'version.h') + + with open(version_h) as f: + text = f.readlines() + + search_major = '#define ETL_VERSION_MAJOR ' + search_minor = '#define ETL_VERSION_MINOR ' + search_patch = '#define ETL_VERSION_PATCH ' + + length_major = len(search_major) + length_minor = len(search_minor) + length_patch = len(search_patch) + + for i in range(len(text) - 1): + + index = text[i].find(search_major) + if index != -1: + text[i] = text[i][index:length_major] + major_version + print(text[i]) + + index = text[i].find(search_minor) + if index != -1: + text[i] = text[i][index:length_minor] + minor_version + print(text[i]) + + index = text[i].find(search_patch) + if index != -1: + text[i] = text[i][index:length_patch] + patch_version + print(text[i]) + +#------------------------------------------------------------------------------ +def create_library_json(): + print('') + print('Creating library.json') + +#------------------------------------------------------------------------------ +def create_library_properties(): + print('') + print('Creating library.properties') + +#------------------------------------------------------------------------------ +def update_versions(): + print('') + print('Update Versions') + print('') + + global major_version + global minor_version + global patch_version + + major_version, minor_version, patch_version = get_version() + + print("Version = %s.%s.%s" % ( major_version, minor_version, patch_version )) + + create_version_h() + create_library_json() + create_library_properties() + +#------------------------------------------------------------------------------ +if __name__ == "__main__": + create_arduino_variant() + update_versions() diff --git a/test/vs2019/etl.vcxproj b/test/vs2019/etl.vcxproj index 73c02c23..e747cbba 100644 --- a/test/vs2019/etl.vcxproj +++ b/test/vs2019/etl.vcxproj @@ -11499,6 +11499,9 @@ + + + @@ -11515,7 +11518,7 @@ - + @@ -11524,6 +11527,7 @@ + diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 19ea4063..a2842ade 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -193,6 +193,9 @@ {107d7e33-580f-4dc5-be11-a4b2076c2c10} + + {4ee68175-3bc2-4d30-b8bf-be7261124979} + @@ -3289,9 +3292,6 @@ Resource Files\CI\CircleCI - - Resource Files\CMake - Resource Files\CI\Appveyor @@ -3334,6 +3334,18 @@ Resource Files\Arduino + + Resource Files\CMake + + + Resource Files\CMake + + + Resource Files\CMake + + + Resource Files\Scripts + @@ -3363,6 +3375,9 @@ Tests\Test Support + + Resource Files + diff --git a/version.txt b/version.txt new file mode 100644 index 00000000..99eae3a0 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +20.27.1 \ No newline at end of file From ef537056e7c7e57891ae5aeddf40b8f63da66967 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 3 Apr 2022 12:09:50 +0200 Subject: [PATCH 06/13] Script to update version numbers --- arduino/library-arduino.json | 2 +- arduino/library-arduino.properties | 2 +- library.json | 2 +- library.properties | 2 +- scripts/update_release.py | 61 +++++++++++++++++++++++------- version.txt | 2 +- 6 files changed, 52 insertions(+), 19 deletions(-) diff --git a/arduino/library-arduino.json b/arduino/library-arduino.json index 49517278..1798ead5 100644 --- a/arduino/library-arduino.json +++ b/arduino/library-arduino.json @@ -1,6 +1,6 @@ { "name": "Embedded Template Library - Arduino", - "version": "20.27.1", + "version": "20.27.2", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/arduino/library-arduino.properties b/arduino/library-arduino.properties index 41cd6c40..227f2137 100644 --- a/arduino/library-arduino.properties +++ b/arduino/library-arduino.properties @@ -1,5 +1,5 @@ name=Embedded Template Library - Arduino -version=20.27.1 +version=20.27.2 author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/library.json b/library.json index 1e2433e2..67f96961 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "Embedded Template Library", - "version": "20.27.1", + "version": "20.27.2", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/library.properties b/library.properties index f0910604..d8a8267d 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Embedded Template Library -version=20.27.1 +version=20.27.2 author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/scripts/update_release.py b/scripts/update_release.py index 09af3384..18a2ffce 100644 --- a/scripts/update_release.py +++ b/scripts/update_release.py @@ -127,10 +127,10 @@ def get_version(): elements = version.split('.', 3) - return elements[0], elements[1], elements[2] + return version, elements[0], elements[1], elements[2] #------------------------------------------------------------------------------ -def create_version_h(): +def update_version_h(): print('') print('Creating version.h') @@ -162,37 +162,70 @@ def create_version_h(): index = text[i].find(search_patch) if index != -1: text[i] = text[i][index:length_patch] + patch_version - print(text[i]) #------------------------------------------------------------------------------ -def create_library_json(): +def update_library_json(filename): print('') - print('Creating library.json') + print('Creating %s' % filename) + + with open(filename) as f: + text = f.read().splitlines() + + search = 'version' + + for i in range(len(text) - 1): + index = text[i].find(search) + if index != -1: + text[i] = ' \"version\": \"' + full_version + '\",' + + with open(filename, 'w') as f: + for line in text: + f.write(line) + f.write('\n') #------------------------------------------------------------------------------ -def create_library_properties(): +def update_library_properties(filename): print('') - print('Creating library.properties') + print('Creating %s' % filename) + + with open(filename, 'r') as f: + text = f.read().splitlines() + + search = 'version' + + for i in range(len(text) - 1): + index = text[i].find(search) + if index != -1: + text[i] = 'version=' + full_version + + with open(filename, 'w') as f: + for line in text: + f.write(line) + f.write('\n') #------------------------------------------------------------------------------ def update_versions(): print('') print('Update Versions') - print('') + global full_version global major_version global minor_version global patch_version - major_version, minor_version, patch_version = get_version() + full_version, major_version, minor_version, patch_version = get_version() - print("Version = %s.%s.%s" % ( major_version, minor_version, patch_version )) + print("Version = %s.%s.%s" % (major_version, minor_version, patch_version )) - create_version_h() - create_library_json() - create_library_properties() + update_version_h() + + update_library_json(os.path.join(etl_dir, 'library.json')) + update_library_json(os.path.join(arduino_dir, 'library-arduino.json')) + + update_library_properties(os.path.join(etl_dir, 'library.properties')) + update_library_properties(os.path.join(arduino_dir, 'library-arduino.properties')) #------------------------------------------------------------------------------ if __name__ == "__main__": - create_arduino_variant() update_versions() + create_arduino_variant() diff --git a/version.txt b/version.txt index 99eae3a0..a39410f2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -20.27.1 \ No newline at end of file +20.27.2 \ No newline at end of file From fbffca3b4c2238e08fea4120e18cc6e4ba89e675 Mon Sep 17 00:00:00 2001 From: Robin Mueller <31589589+robamu@users.noreply.github.com> Date: Wed, 30 Mar 2022 16:37:02 +0200 Subject: [PATCH 07/13] Update cmake & meson version handling (#522) * updated the version handling - Introduces a new version.txt file - This file is parsed by CMake to determine the current version * assign version in project call * use version variable * Meson update 1. Minor fix for GCC build 2. Use external version file which can be used by CMake as well * get version from git tag now * ci/cd broke.. * maybe this solves the error * updated workflow files * one last test * remove git describe call --- .github/workflows/clang.yml | 6 + .github/workflows/gcc.yml | 3 + .github/workflows/vs2019.yml | 3 + .gitignore | 3 + .gitlab-ci.yml | 1 + CMakeLists.txt | 7 +- cmake/GetGitRevisionDescription.cmake | 284 +++++++++++++++++++++++ cmake/GetGitRevisionDescription.cmake.in | 43 ++++ cmake/helpers.cmake | 31 +++ meson.build | 4 +- test/meson.build | 2 +- version.txt | 2 +- 12 files changed, 384 insertions(+), 5 deletions(-) create mode 100644 cmake/GetGitRevisionDescription.cmake create mode 100644 cmake/GetGitRevisionDescription.cmake.in create mode 100644 cmake/helpers.cmake diff --git a/.github/workflows/clang.yml b/.github/workflows/clang.yml index f58da7c1..82a55500 100644 --- a/.github/workflows/clang.yml +++ b/.github/workflows/clang.yml @@ -22,6 +22,7 @@ jobs: sudo apt-get install -y "clang-9" "lldb-9" "lld-9" "clang-format-9" export CC=clang-9 export CXX=clang++-9 + git fetch --tags cmake -D BUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ clang --version make @@ -41,6 +42,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -DBUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ gcc --version make @@ -64,6 +66,7 @@ jobs: sudo apt-get install -y "clang-9" "lldb-9" "lld-9" "clang-format-9" export CC=clang-9 export CXX=clang++-9 + git fetch --tags cmake -D BUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON ./ clang --version make @@ -85,6 +88,7 @@ jobs: run: | export CC=clang export CXX=clang++ + git fetch --tags cmake -D BUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ clang --version make @@ -106,6 +110,7 @@ jobs: run: | export CC=clang export CXX=clang++ + git fetch --tags cmake -D BUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ clang --version make @@ -127,6 +132,7 @@ jobs: run: | export CC=clang export CXX=clang++ + git fetch --tags cmake -D BUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON ./ clang --version make diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml index 04e382bf..ecdec709 100644 --- a/.github/workflows/gcc.yml +++ b/.github/workflows/gcc.yml @@ -18,6 +18,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ gcc --version make @@ -37,6 +38,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -DBUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ gcc --version make @@ -56,6 +58,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON ./ gcc --version make diff --git a/.github/workflows/vs2019.yml b/.github/workflows/vs2019.yml index f552b09d..8e6f0501 100644 --- a/.github/workflows/vs2019.yml +++ b/.github/workflows/vs2019.yml @@ -21,6 +21,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -G "Visual Studio 16 2019" -AWin32 -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ MSBuild.exe -version MSBuild.exe .\etl.sln @@ -42,6 +43,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -G "Visual Studio 16 2019" -AWin32 -DBUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=OFF ./ MSBuild.exe -version MSBuild.exe .\etl.sln @@ -64,6 +66,7 @@ jobs: - name: Build run: | + git fetch --tags cmake -G "Visual Studio 16 2019" -AWin32 -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON ./ MSBuild.exe -version MSBuild.exe .\etl.sln diff --git a/.gitignore b/.gitignore index 7c35f2b8..4ca9b695 100644 --- a/.gitignore +++ b/.gitignore @@ -211,6 +211,8 @@ $RECYCLE.BIN/ ## Python ############# +/venv + *.py[cod] # Packages @@ -222,6 +224,7 @@ eggs/ parts/ var/ sdist/ + develop-eggs/ .installed.cfg diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 580aa237..c638be28 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,6 +11,7 @@ stages: Build ETL: stage: build script: + - git fetch --tags - cmake -DBUILD_TESTS=ON ./ - make artifacts: diff --git a/CMakeLists.txt b/CMakeLists.txt index bf77d3f7..4c6c26b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,12 @@ # The Embedded Template Library (https://www.etlcpp.com/) ####################################################################### cmake_minimum_required(VERSION 3.5.0) -project(etl) + +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/helpers.cmake) + +determine_version_with_git() + +project(etl VERSION ${ETL_VERSION}) option(BUILD_TESTS "Build unit tests" OFF) option(NO_STL "No STL" OFF) diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake new file mode 100644 index 00000000..4fbd90db --- /dev/null +++ b/cmake/GetGitRevisionDescription.cmake @@ -0,0 +1,284 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_describe_working_tree( [ ...]) +# +# Returns the results of git describe on the working tree (--dirty option), +# and adjusting the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# git_local_changes() +# +# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. +# Uses the return code of "git diff-index --quiet HEAD --". +# Does not regard untracked files. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2020 Ryan Pavlik +# http://academic.cleardefinition.com +# +# Copyright 2009-2013, Iowa State University. +# Copyright 2013-2020, Ryan Pavlik +# Copyright 2013-2020, Contributors +# SPDX-License-Identifier: BSL-1.0 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +# Function _git_find_closest_git_dir finds the next closest .git directory +# that is part of any directory in the path defined by _start_dir. +# The result is returned in the parent scope variable whose name is passed +# as variable _git_dir_var. If no .git directory can be found, the +# function returns an empty string via _git_dir_var. +# +# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and +# neither foo nor bar contain a file/directory .git. This wil return +# C:/bla/.git +# +function(_git_find_closest_git_dir _start_dir _git_dir_var) + set(cur_dir "${_start_dir}") + set(git_dir "${_start_dir}/.git") + while(NOT EXISTS "${git_dir}") + # .git dir not found, search parent directories + set(git_previous_parent "${cur_dir}") + get_filename_component(cur_dir "${cur_dir}" DIRECTORY) + if(cur_dir STREQUAL git_previous_parent) + # We have reached the root directory, we are not in git + set(${_git_dir_var} + "" + PARENT_SCOPE) + return() + endif() + set(git_dir "${cur_dir}/.git") + endwhile() + set(${_git_dir_var} + "${git_dir}" + PARENT_SCOPE) +endfunction() + +function(get_git_head_revision _refspecvar _hashvar) + _git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR) + + if("${ARGN}" STREQUAL "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR") + set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR TRUE) + else() + set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR FALSE) + endif() + if(NOT "${GIT_DIR}" STREQUAL "") + file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}" + "${GIT_DIR}") + if("${_relative_to_source_dir}" MATCHES "[.][.]" AND NOT ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR) + # We've gone above the CMake root dir. + set(GIT_DIR "") + endif() + endif() + if("${GIT_DIR}" STREQUAL "") + set(${_refspecvar} + "GITDIR-NOTFOUND" + PARENT_SCOPE) + set(${_hashvar} + "GITDIR-NOTFOUND" + PARENT_SCOPE) + return() + endif() + + # Check if the current source dir is a git submodule or a worktree. + # In both cases .git is a file instead of a directory. + # + if(NOT IS_DIRECTORY ${GIT_DIR}) + # The following git command will return a non empty string that + # points to the super project working tree if the current + # source dir is inside a git submodule. + # Otherwise the command will return an empty string. + # + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse + --show-superproject-working-tree + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + OUTPUT_VARIABLE out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT "${out}" STREQUAL "") + # If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE + ${submodule}) + string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} + ABSOLUTE) + set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") + else() + # GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree + file(READ ${GIT_DIR} worktree_ref) + # The .git directory contains a path to the worktree information directory + # inside the parent git repo of the worktree. + # + string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir + ${worktree_ref}) + string(STRIP ${git_worktree_dir} git_worktree_dir) + _git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR) + set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD") + endif() + else() + set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${HEAD_SOURCE_FILE}") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} + "${HEAD_REF}" + PARENT_SCOPE) + set(${_hashvar} + "${HEAD_HASH}" + PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} + "GIT-NOTFOUND" + PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} + "HEAD-HASH-NOTFOUND" + PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} + "${out}" + PARENT_SCOPE) +endfunction() + +function(git_describe_working_tree _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + if(NOT GIT_FOUND) + set(${_var} + "GIT-NOTFOUND" + PARENT_SCOPE) + return() + endif() + + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --dirty ${ARGN} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} + "${out}" + PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} + "${out}" + PARENT_SCOPE) +endfunction() + +function(git_local_changes _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} + "GIT-NOTFOUND" + PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} + "HEAD-HASH-NOTFOUND" + PARENT_SCOPE) + return() + endif() + + execute_process( + COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD -- + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(res EQUAL 0) + set(${_var} + "CLEAN" + PARENT_SCOPE) + else() + set(${_var} + "DIRTY" + PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in new file mode 100644 index 00000000..116efc4e --- /dev/null +++ b/cmake/GetGitRevisionDescription.cmake.in @@ -0,0 +1,43 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright 2009-2012, Iowa State University +# Copyright 2011-2015, Contributors +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +# SPDX-License-Identifier: BSL-1.0 + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/cmake/helpers.cmake b/cmake/helpers.cmake new file mode 100644 index 00000000..eaa0aec4 --- /dev/null +++ b/cmake/helpers.cmake @@ -0,0 +1,31 @@ +function(determine_version VER_FILE_NAME) + file(READ ${VER_FILE_NAME} ETL_VERSION_RAW) + # Remove trailing whitespaces and/or newline + string(STRIP ${ETL_VERSION_RAW} ETL_VERSION) + set(ETL_VERSION ${ETL_VERSION} CACHE STRING + "ETL version determined from version.txt" + ) + message(STATUS "Determined ETL version ${ETL_VERSION} from version.txt file") +endfunction() + +function(determine_version_with_git) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/GetGitRevisionDescription.cmake) + git_describe(VERSION) + string(FIND ${VERSION} "-" VALID_VERSION) + if(VALID_VERSION EQUAL -1) + message(WARNING "Version string ${VERSION} retrieved with git describe is invalid") + return() + endif() + message(STATUS ${VERSION}) + # Parse the version information into pieces. + string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}") + string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION}") + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION}") + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.[0-9]+(.*)" "\\1" VERSION_SHA1 "${VERSION}") + set(ETL_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") + + set(ETL_VERSION ${ETL_VERSION} CACHE STRING + "ETL version determined from version.txt" + ) + message(STATUS "Determined ETL version ${ETL_VERSION} from the git tag") +endfunction() diff --git a/meson.build b/meson.build index 51b0127e..6bd1c8c1 100644 --- a/meson.build +++ b/meson.build @@ -7,8 +7,8 @@ project('etl', # plain options affect `native: false` targets. 'cpp_std=c++17', 'build.cpp_std=c++17', ], - meson_version: '>=0.54.0', - version: '20.27.1' + meson_version: '>=0.57.0', + version: files('version.txt') ) compile_args = [] diff --git a/test/meson.build b/test/meson.build index 14daaa36..28681704 100644 --- a/test/meson.build +++ b/test/meson.build @@ -250,7 +250,7 @@ elif endif if meson.get_compiler('cpp').get_id() == 'gcc' - etl_test_sources += files('test/test_atomic_gcc_sync.cpp') + etl_test_sources += files('test_atomic_gcc_sync.cpp') compile_args += '-fexceptions' endif diff --git a/version.txt b/version.txt index a39410f2..c0859b34 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -20.27.2 \ No newline at end of file +20.27.2 From 39156c918b46ffa20e5c58b6109845d6eb4566cb Mon Sep 17 00:00:00 2001 From: Robin Mueller <31589589+robamu@users.noreply.github.com> Date: Tue, 5 Apr 2022 11:47:11 +0200 Subject: [PATCH 08/13] Extended CMake installation handling (#523) * updated the version handling - Introduces a new version.txt file - This file is parsed by CMake to determine the current version * assign version in project call * use version variable * Meson update 1. Minor fix for GCC build 2. Use external version file which can be used by CMake as well * get version from git tag now * ci/cd broke.. * maybe this solves the error * updated workflow files * one last test * remove git describe call * extended CMake installation handling * only write version file if possible * read version.txt as fallback * missing version.txt arg --- CMakeLists.txt | 36 ++++++++++++++++++++++++++++++++---- cmake/etlConfig.cmake.in | 4 ++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 cmake/etlConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c6c26b2..30396eef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,16 +16,44 @@ add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} SYSTEM INTERFACE $ - $ + $ ) target_link_libraries(${PROJECT_NAME} INTERFACE) # only install if top level project if(${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME}) - install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Config) - install(EXPORT ${PROJECT_NAME}Config DESTINATION lib/cmake/${PROJECT_NAME}) - install(DIRECTORY include/${PROJECT_NAME} DESTINATION include) + # Steps here based on excellent guide: https://dominikberner.ch/cmake-interface-lib/ + # Which also details all steps + include(CMakePackageConfigHelpers) + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + if(ETL_VERSION) + # Generate the package configuration files using CMake provided macros + write_basic_package_version_file( + "${PROJECT_NAME}ConfigVersion.cmake" + COMPATIBILITY SameMajorVersion + ) + endif() + configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION + ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) + + # Install target file, then package configuration files, and finally the headers + install(EXPORT ${PROJECT_NAME}Targets + FILE ${PROJECT_NAME}Targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) + install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) + install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/etl DESTINATION include) endif() if (BUILD_TESTS) diff --git a/cmake/etlConfig.cmake.in b/cmake/etlConfig.cmake.in new file mode 100644 index 00000000..9c15f36a --- /dev/null +++ b/cmake/etlConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +check_required_components("@PROJECT_NAME@") From ce93358e9587e2fc26a5e43160e9ec09c445f4d2 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 8 Apr 2022 09:35:37 +0200 Subject: [PATCH 09/13] Lastest release script version --- arduino/library-arduino.json | 3 ++- arduino/library-arduino.properties | 1 + include/etl/version.h | 4 +++- library.json | 3 ++- library.properties | 1 + scripts/update_release.py | 8 +++++++- test/test_etl_traits.cpp | 11 ++++++++++- 7 files changed, 26 insertions(+), 5 deletions(-) diff --git a/arduino/library-arduino.json b/arduino/library-arduino.json index 1798ead5..6a28cfc3 100644 --- a/arduino/library-arduino.json +++ b/arduino/library-arduino.json @@ -1,6 +1,7 @@ { "name": "Embedded Template Library - Arduino", - "version": "20.27.2", + "version": "20.27.2 +", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/arduino/library-arduino.properties b/arduino/library-arduino.properties index 227f2137..cbc8aa5f 100644 --- a/arduino/library-arduino.properties +++ b/arduino/library-arduino.properties @@ -1,5 +1,6 @@ name=Embedded Template Library - Arduino version=20.27.2 + author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/include/etl/version.h b/include/etl/version.h index 585c5ac8..0a393319 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -39,7 +39,9 @@ SOFTWARE. #define ETL_VERSION_MAJOR 20 #define ETL_VERSION_MINOR 27 -#define ETL_VERSION_PATCH 1 +#define ETL_VERSION_PATCH 2 + + #define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) "." ETL_STRINGIFY(ETL_VERSION_MINOR) "." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_W ETL_STRINGIFY(ETL_VERSION_MAJOR) L"." ETL_STRINGIFY(ETL_VERSION_MINOR) L"." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_U16 ETL_STRINGIFY(ETL_VERSION_MAJOR) u"." ETL_STRINGIFY(ETL_VERSION_MINOR) u"." ETL_STRINGIFY(ETL_VERSION_PATCH) diff --git a/library.json b/library.json index 67f96961..8ef2d059 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,7 @@ { "name": "Embedded Template Library", - "version": "20.27.2", + "version": "20.27.2 +", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/library.properties b/library.properties index d8a8267d..4f9b9921 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,6 @@ name=Embedded Template Library version=20.27.2 + author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/scripts/update_release.py b/scripts/update_release.py index 18a2ffce..3e95cd8d 100644 --- a/scripts/update_release.py +++ b/scripts/update_release.py @@ -137,7 +137,7 @@ def update_version_h(): version_h = os.path.join(headers_dir, 'version.h') with open(version_h) as f: - text = f.readlines() + text = f.read().splitlines() search_major = '#define ETL_VERSION_MAJOR ' search_minor = '#define ETL_VERSION_MINOR ' @@ -162,6 +162,12 @@ def update_version_h(): index = text[i].find(search_patch) if index != -1: text[i] = text[i][index:length_patch] + patch_version + print(text[i]) + + with open(version_h, 'w') as f: + for line in text: + f.write(line) + f.write('\n') #------------------------------------------------------------------------------ def update_library_json(filename): diff --git a/test/test_etl_traits.cpp b/test/test_etl_traits.cpp index ea2dfb50..ea3347b4 100644 --- a/test/test_etl_traits.cpp +++ b/test/test_etl_traits.cpp @@ -31,7 +31,8 @@ SOFTWARE. #include "unit_test_framework.h" #include "etl/platform.h" - +#include "etl/version.h" +#include "etl/char_traits.h" namespace { SUITE(test_etl_traits) @@ -70,6 +71,14 @@ namespace CHECK_EQUAL((ETL_HAS_MUTABLE_ARRAY_VIEW == 1), etl::traits::has_mutable_array_view); CHECK_EQUAL((ETL_IS_DEBUG_BUILD == 1), etl::traits::is_debug_build); CHECK_EQUAL(__cplusplus, etl::traits::cplusplus); + CHECK_EQUAL(ETL_VERSION_MAJOR, etl::traits::version_major); + CHECK_EQUAL(ETL_VERSION_MINOR, etl::traits::version_minor); + CHECK_EQUAL(ETL_VERSION_PATCH, etl::traits::version_patch); + CHECK_EQUAL(ETL_VERSION_VALUE, etl::traits::version); + CHECK_ARRAY_EQUAL(ETL_VERSION, etl::traits::version_string, etl::strlen(ETL_VERSION)); + CHECK_ARRAY_EQUAL(ETL_VERSION, etl::traits::version_wstring, etl::strlen(ETL_VERSION_W)); + CHECK_ARRAY_EQUAL(ETL_VERSION, etl::traits::version_u16string, etl::strlen(ETL_VERSION_U16)); + CHECK_ARRAY_EQUAL(ETL_VERSION, etl::traits::version_u32string, etl::strlen(ETL_VERSION_U32)); } }; } From 3b66ced782f13e213e082c5a18e7c0e5f070a35b Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 8 Apr 2022 18:08:53 +0200 Subject: [PATCH 10/13] #530 etl::nth_type not implemented correctly --- include/etl/nth_type.h | 28 ++++++-------------- include/etl/version.h | 16 ++++++++++++ test/CMakeLists.txt | 1 + test/test_nth_type.cpp | 46 +++++++++++++++++++++++++++++++++ test/vs2019/etl.vcxproj | 1 + test/vs2019/etl.vcxproj.filters | 3 +++ 6 files changed, 75 insertions(+), 20 deletions(-) create mode 100644 test/test_nth_type.cpp diff --git a/include/etl/nth_type.h b/include/etl/nth_type.h index c4811b74..395ed5f9 100644 --- a/include/etl/nth_type.h +++ b/include/etl/nth_type.h @@ -34,28 +34,16 @@ SOFTWARE. namespace etl { #if ETL_USING_CPP11 - //*************************************************************************** - // nth_type - //*************************************************************************** - namespace private_nth_type - { - template - struct nth_type_helper - { - using type = typename nth_type_helper::type; - }; - - template - struct nth_type_helper - { - using type = T1; - }; - } - - template + template struct nth_type { - using type = typename private_nth_type::nth_type_helper::type; + using type = typename nth_type::type; + }; + + template + struct nth_type<0U, T1, TRest...> + { + using type = T1; }; template diff --git a/include/etl/version.h b/include/etl/version.h index 0a393319..c11734a4 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -31,6 +31,7 @@ SOFTWARE. #ifndef ETL_VERSION_INCLUDED #define ETL_VERSION_INCLUDED +#include "platform.h" #include "macros.h" ///\defgroup version version @@ -48,5 +49,20 @@ SOFTWARE. #define ETL_VERSION_U32 ETL_STRINGIFY(ETL_VERSION_MAJOR) U"." ETL_STRINGIFY(ETL_VERSION_MINOR) U"." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_VALUE ((ETL_VERSION_MAJOR * 10000) + (ETL_VERSION_MINOR * 100) + ETL_VERSION_PATCH) +namespace etl +{ + namespace traits + { + static ETL_CONSTANT long version = ETL_VERSION_VALUE; + static ETL_CONSTANT long version_major = ETL_VERSION_MAJOR; + static ETL_CONSTANT long version_minor = ETL_VERSION_MINOR; + static ETL_CONSTANT long version_patch = ETL_VERSION_PATCH; + static ETL_CONSTANT const char* version_string = ETL_VERSION; + static ETL_CONSTANT const wchar_t* version_wstring = ETL_VERSION_W; + static ETL_CONSTANT const char16_t* version_u16string = ETL_VERSION_U16; + static ETL_CONSTANT const char32_t* version_u32string = ETL_VERSION_U32; + } +} + #endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b2d0ec93..d8c7af95 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -185,6 +185,7 @@ set(TEST_SOURCE_FILES test_multi_range.cpp test_multi_vector.cpp test_murmur3.cpp + test_nth_type.cpp test_numeric.cpp test_observer.cpp test_optional.cpp diff --git a/test/test_nth_type.cpp b/test/test_nth_type.cpp new file mode 100644 index 00000000..07a4853e --- /dev/null +++ b/test/test_nth_type.cpp @@ -0,0 +1,46 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2022 jwellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include "unit_test_framework.h" + +#include "etl/nth_type.h" +#include + +namespace +{ + SUITE(test_nth_type) + { + //************************************************************************* + TEST(test_nth_type) + { + CHECK((std::is_same_v, int>)); + CHECK((std::is_same_v, long>)); + CHECK((std::is_same_v, double>)); + } + } +} diff --git a/test/vs2019/etl.vcxproj b/test/vs2019/etl.vcxproj index e747cbba..76a9d753 100644 --- a/test/vs2019/etl.vcxproj +++ b/test/vs2019/etl.vcxproj @@ -11299,6 +11299,7 @@ + false diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index a2842ade..6530ebcb 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -3239,6 +3239,9 @@ UnitTest++\Source Files\Win32 + + Tests\Types + From dbfeee2c2a20e01b06ec98df923595ba7aa8fa76 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 8 Apr 2022 18:17:19 +0200 Subject: [PATCH 11/13] Reverted to originals --- library.json | 3 +-- library.properties | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/library.json b/library.json index 8ef2d059..67f96961 100644 --- a/library.json +++ b/library.json @@ -1,7 +1,6 @@ { "name": "Embedded Template Library", - "version": "20.27.2 -", + "version": "20.27.2", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/library.properties b/library.properties index 4f9b9921..d8a8267d 100644 --- a/library.properties +++ b/library.properties @@ -1,6 +1,5 @@ name=Embedded Template Library version=20.27.2 - author= John Wellbelove maintainer=John Wellbelove license=MIT From 958bc84e18d6d9d6d5a8e54e48cc592c2ae773e9 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 9 Apr 2022 13:32:07 +0200 Subject: [PATCH 12/13] Lastest release script version --- arduino/library-arduino.json | 21 +++++++++++++++++++-- arduino/library-arduino.properties | 1 - scripts/update_release.py | 6 +++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/arduino/library-arduino.json b/arduino/library-arduino.json index 6a28cfc3..c4ec1c5a 100644 --- a/arduino/library-arduino.json +++ b/arduino/library-arduino.json @@ -1,7 +1,6 @@ { "name": "Embedded Template Library - Arduino", - "version": "20.27.2 -", + "version": "20.27.2", "authors": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" @@ -17,6 +16,24 @@ "build": { "includeDir": "include" }, + "export": { + "include": [ + "include", + "examples", + "LICENSE", + "README.md" + ], + "exclude": [ + "include/etl/experimental", + "include/etl/deprecated", + "**/__vm", + "**/.vs", + "**/*.filters", + "**/*.log", + "**/*.tmp" + ] + }, "platforms": "*", "frameworks": "*" } + diff --git a/arduino/library-arduino.properties b/arduino/library-arduino.properties index cbc8aa5f..227f2137 100644 --- a/arduino/library-arduino.properties +++ b/arduino/library-arduino.properties @@ -1,6 +1,5 @@ name=Embedded Template Library - Arduino version=20.27.2 - author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/scripts/update_release.py b/scripts/update_release.py index 3e95cd8d..9a56418c 100644 --- a/scripts/update_release.py +++ b/scripts/update_release.py @@ -123,11 +123,11 @@ def get_version(): print('version_file = ', version_file) with open(version_file) as f: - version = f.read() + version = f.read().splitlines() - elements = version.split('.', 3) + elements = version[0].split('.', 3) - return version, elements[0], elements[1], elements[2] + return version[0], elements[0], elements[1], elements[2] #------------------------------------------------------------------------------ def update_version_h(): From f68b3d77960fb68e9c755b51613d5821343b2589 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 9 Apr 2022 13:32:07 +0200 Subject: [PATCH 13/13] Lastest release script version --- include/etl/char_traits.h | 2 +- include/etl/version.h | 21 +++++++++++++-------- test/vs2019/etl.vcxproj | 1 - test/vs2019/etl.vcxproj.filters | 3 --- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/etl/char_traits.h b/include/etl/char_traits.h index 09c0ec8a..960abd29 100644 --- a/include/etl/char_traits.h +++ b/include/etl/char_traits.h @@ -44,7 +44,7 @@ SOFTWARE. //***************************************************************************** // Define the large character types if necessary. -#if (ETL_NO_LARGE_CHAR_SUPPORT) +#if ETL_NO_LARGE_CHAR_SUPPORT #if ETL_USING_8BIT_TYPES typedef int8_t char8_t; #endif diff --git a/include/etl/version.h b/include/etl/version.h index c11734a4..21cb51e9 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -53,14 +53,19 @@ namespace etl { namespace traits { - static ETL_CONSTANT long version = ETL_VERSION_VALUE; - static ETL_CONSTANT long version_major = ETL_VERSION_MAJOR; - static ETL_CONSTANT long version_minor = ETL_VERSION_MINOR; - static ETL_CONSTANT long version_patch = ETL_VERSION_PATCH; - static ETL_CONSTANT const char* version_string = ETL_VERSION; - static ETL_CONSTANT const wchar_t* version_wstring = ETL_VERSION_W; - static ETL_CONSTANT const char16_t* version_u16string = ETL_VERSION_U16; - static ETL_CONSTANT const char32_t* version_u32string = ETL_VERSION_U32; + static ETL_CONSTANT long version = ETL_VERSION_VALUE; + static ETL_CONSTANT long version_major = ETL_VERSION_MAJOR; + static ETL_CONSTANT long version_minor = ETL_VERSION_MINOR; + static ETL_CONSTANT long version_patch = ETL_VERSION_PATCH; +#if ETL_USING_CPP11 + static constexpr const char* version_string = ETL_VERSION; + static constexpr const wchar_t* version_wstring = ETL_VERSION_W; + static constexpr const char16_t* version_u16string = ETL_VERSION_U16; + static constexpr const char32_t* version_u32string = ETL_VERSION_U32; +#else + static const char* version_string = ETL_VERSION; + static const wchar_t* version_wstring = ETL_VERSION_W; +#endif } } diff --git a/test/vs2019/etl.vcxproj b/test/vs2019/etl.vcxproj index 76a9d753..5165aa69 100644 --- a/test/vs2019/etl.vcxproj +++ b/test/vs2019/etl.vcxproj @@ -11497,7 +11497,6 @@ - diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 6530ebcb..282937dc 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -3334,9 +3334,6 @@ Resource Files\Arduino - - Resource Files\Arduino - Resource Files\CMake