Merge branch 'development'

This commit is contained in:
John Wellbelove 2022-04-09 21:39:26 +02:00
commit 36b1f094e2
35 changed files with 840 additions and 160 deletions

View File

@ -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

View File

@ -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

View File

@ -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

3
.gitignore vendored
View File

@ -211,6 +211,8 @@ $RECYCLE.BIN/
## Python
#############
/venv
*.py[cod]
# Packages
@ -222,6 +224,7 @@ eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg

View File

@ -11,6 +11,7 @@ stages:
Build ETL:
stage: build
script:
- git fetch --tags
- cmake -DBUILD_TESTS=ON ./
- make
artifacts:

View File

@ -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)
@ -11,16 +16,44 @@ add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} SYSTEM INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
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)

View File

@ -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)

View File

@ -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"
@ -16,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": "*"
}

View File

@ -1,5 +1,5 @@
name=Embedded Template Library - Arduino
version=20.27.1
version=20.27.2
author= John Wellbelove <john.wellbelove@etlcpp.com>
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
license=MIT

View File

@ -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(<refspecvar> <hashvar> [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR])
#
# Returns the refspec and sha hash of the current head revision
#
# git_describe(<var> [<additional arguments to 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(<var> [<additional arguments to git describe> ...])
#
# 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(<var> [<additional arguments to git describe> ...])
#
# 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(<var>)
#
# 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 <ryan.pavlik@gmail.com> <abiryan@ryand.net>
# 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()

View File

@ -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 <rpavlik@iastate.edu> <abiryan@ryand.net>
# 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()

4
cmake/etlConfig.cmake.in Normal file
View File

@ -0,0 +1,4 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
check_required_components("@PROJECT_NAME@")

31
cmake/helpers.cmake Normal file
View File

@ -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()

View File

@ -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

View File

@ -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:

View File

@ -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;
}

View File

@ -34,28 +34,16 @@ SOFTWARE.
namespace etl
{
#if ETL_USING_CPP11
//***************************************************************************
// nth_type
//***************************************************************************
namespace private_nth_type
{
template <size_t N, typename T1, typename... TRest>
struct nth_type_helper
{
using type = typename nth_type_helper<N - 1U, TRest...>::type;
};
template <size_t N, typename T1>
struct nth_type_helper<N, T1>
{
using type = T1;
};
}
template <size_t N, typename... TTypes>
template <size_t N, typename T1, typename... TRest>
struct nth_type
{
using type = typename private_nth_type::nth_type_helper<N, TTypes...>::type;
using type = typename nth_type<N - 1U, TRest...>::type;
};
template <typename T1, typename... TRest>
struct nth_type<0U, T1, TRest...>
{
using type = T1;
};
template <size_t N, typename... TTypes>

View File

@ -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;
}

View File

@ -185,7 +185,7 @@ namespace etl
{
++index;
if (index == maximum)
if (index == maximum) ETL_UNLIKELY
{
index = 0;
}

View File

@ -89,7 +89,7 @@ namespace etl
{
++index;
if (index == maximum)
if (index == maximum) ETL_UNLIKELY
{
index = 0;
}

View File

@ -141,7 +141,7 @@ namespace etl
{
++index;
if (index == maximum)
if (index == maximum) ETL_UNLIKELY
{
index = 0;
}

View File

@ -421,7 +421,7 @@ namespace etl
{
++index;
if (index == maximum)
if (index == maximum) ETL_UNLIKELY
{
index = 0;
}

View File

@ -118,7 +118,7 @@ namespace etl
{
++index;
if (index == maximum)
if (index == maximum) ETL_UNLIKELY
{
index = 0;
}

View File

@ -31,6 +31,7 @@ SOFTWARE.
#ifndef ETL_VERSION_INCLUDED
#define ETL_VERSION_INCLUDED
#include "platform.h"
#include "macros.h"
///\defgroup version version
@ -39,12 +40,34 @@ 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)
#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;
#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
}
}
#endif

View File

@ -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"

View File

@ -1,5 +1,5 @@
name=Embedded Template Library
version=20.27.1
version=20.27.2
author= John Wellbelove <john.wellbelove@etlcpp.com>
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
license=MIT

View File

@ -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 = []

237
scripts/update_release.py Normal file
View File

@ -0,0 +1,237 @@
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().splitlines()
elements = version[0].split('.', 3)
return version[0], elements[0], elements[1], elements[2]
#------------------------------------------------------------------------------
def update_version_h():
print('')
print('Creating version.h')
version_h = os.path.join(headers_dir, 'version.h')
with open(version_h) as f:
text = f.read().splitlines()
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])
with open(version_h, 'w') as f:
for line in text:
f.write(line)
f.write('\n')
#------------------------------------------------------------------------------
def update_library_json(filename):
print('')
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 update_library_properties(filename):
print('')
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')
global full_version
global major_version
global minor_version
global patch_version
full_version, major_version, minor_version, patch_version = get_version()
print("Version = %s.%s.%s" % (major_version, minor_version, patch_version ))
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__":
update_versions()
create_arduino_variant()

View File

@ -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

View File

@ -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

View File

@ -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));
}
};
}

46
test/test_nth_type.cpp Normal file
View File

@ -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 <type_traits>
namespace
{
SUITE(test_nth_type)
{
//*************************************************************************
TEST(test_nth_type)
{
CHECK((std::is_same_v<etl::nth_type_t<0, int, long, double>, int>));
CHECK((std::is_same_v<etl::nth_type_t<1, int, long, double>, long>));
CHECK((std::is_same_v<etl::nth_type_t<2, int, long, double>, double>));
}
}
}

View File

@ -11299,6 +11299,7 @@
<ClCompile Include="..\test_multi_span.cpp" />
<ClCompile Include="..\test_multi_vector.cpp" />
<ClCompile Include="..\test_murmur3.cpp" />
<ClCompile Include="..\test_nth_type.cpp" />
<ClCompile Include="..\test_numeric.cpp" />
<ClCompile Include="..\test_observer.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
@ -11496,9 +11497,11 @@
<None Include="..\..\.gitignore" />
<None Include="..\..\.gitmodules" />
<None Include="..\..\appveyor.yml" />
<None Include="..\..\arduino\create_arduino_library.py" />
<None Include="..\..\arduino\library-arduino.json" />
<None Include="..\..\arduino\library-arduino.properties" />
<None Include="..\..\cmake\GetGitRevisionDescription.cmake" />
<None Include="..\..\cmake\GetGitRevisionDescription.cmake.in" />
<None Include="..\..\cmake\helpers.cmake" />
<None Include="..\..\etl.pspimage" />
<None Include="..\..\etl.xar" />
<None Include="..\..\include\etl\generators\generate.bat" />
@ -11515,7 +11518,7 @@
<None Include="..\..\library.properties" />
<None Include="..\..\meson.build" />
<None Include="..\..\README.md" />
<None Include="..\cmake\unit-test_external_project.cmake" />
<None Include="..\..\scripts\update_release.py" />
<None Include="..\runsanitychecks.sh" />
<None Include="..\runtests.sh" />
<None Include="cpp.hint" />
@ -11524,6 +11527,7 @@
<Text Include="..\..\CMakeLists.txt" />
<Text Include="..\..\support\Release notes.txt" />
<Text Include="..\..\todo.txt" />
<Text Include="..\..\version.txt" />
<Text Include="..\CMakeLists.txt" />
<Text Include="..\sanity-check\c++03\CMakeLists.txt" />
<Text Include="..\sanity-check\c++11\CMakeLists.txt" />

View File

@ -193,6 +193,9 @@
<Filter Include="UnitTest++\Source Files\Win32">
<UniqueIdentifier>{107d7e33-580f-4dc5-be11-a4b2076c2c10}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files\Scripts">
<UniqueIdentifier>{4ee68175-3bc2-4d30-b8bf-be7261124979}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\include\etl\enum_type.h">
@ -3236,6 +3239,9 @@
<ClCompile Include="..\unittest++\Win32\TimeHelpers.cpp">
<Filter>UnitTest++\Source Files\Win32</Filter>
</ClCompile>
<ClCompile Include="..\test_nth_type.cpp">
<Filter>Tests\Types</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\..\library.properties">
@ -3289,9 +3295,6 @@
<None Include="..\..\.circleci\config.yml">
<Filter>Resource Files\CI\CircleCI</Filter>
</None>
<None Include="..\cmake\unit-test_external_project.cmake">
<Filter>Resource Files\CMake</Filter>
</None>
<None Include="..\..\appveyor.yml">
<Filter>Resource Files\CI\Appveyor</Filter>
</None>
@ -3331,8 +3334,17 @@
<None Include="..\..\arduino\library-arduino.properties">
<Filter>Resource Files\Arduino</Filter>
</None>
<None Include="..\..\arduino\create_arduino_library.py">
<Filter>Resource Files\Arduino</Filter>
<None Include="..\..\cmake\GetGitRevisionDescription.cmake">
<Filter>Resource Files\CMake</Filter>
</None>
<None Include="..\..\cmake\GetGitRevisionDescription.cmake.in">
<Filter>Resource Files\CMake</Filter>
</None>
<None Include="..\..\cmake\helpers.cmake">
<Filter>Resource Files\CMake</Filter>
</None>
<None Include="..\..\scripts\update_release.py">
<Filter>Resource Files\Scripts</Filter>
</None>
</ItemGroup>
<ItemGroup>
@ -3363,6 +3375,9 @@
<Text Include="..\CMakeLists.txt">
<Filter>Tests\Test Support</Filter>
</Text>
<Text Include="..\..\version.txt">
<Filter>Resource Files</Filter>
</Text>
</ItemGroup>
<ItemGroup>
<Image Include="..\..\etl.ico">

1
version.txt Normal file
View File

@ -0,0 +1 @@
20.27.2