diff --git a/.github/workflows/ci-bonsai-daily.yml b/.github/workflows/ci-bonsai-daily.yml index da81386186..467d4df43e 100644 --- a/.github/workflows/ci-bonsai-daily.yml +++ b/.github/workflows/ci-bonsai-daily.yml @@ -72,7 +72,7 @@ jobs: python-version: '3.11' - name: Get current version id: version - run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT + run: echo "version=$(sed -E 's/[[:alpha:]]+[0-9]+$//' VERSION)" >> $GITHUB_OUTPUT - name: Compile run: | cd src/bonsai && make dist PLATFORM=${{ matrix.config.short_name }} PYVERSION=${{ matrix.pyver }} diff --git a/.github/workflows/ci-ifcopenshell-conda-daily.yml b/.github/workflows/ci-ifcopenshell-conda-daily.yml index 0e5bd4cbce..93e9f5506f 100644 --- a/.github/workflows/ci-ifcopenshell-conda-daily.yml +++ b/.github/workflows/ci-ifcopenshell-conda-daily.yml @@ -27,7 +27,9 @@ jobs: - name: Get current version id: version - run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT + # Strip any trailing prerelease label and number; the dated alpha + # suffix is added below. + run: echo "version=$(sed -E 's/[[:alpha:]]+[0-9]+$//' VERSION)" >> $GITHUB_OUTPUT - name: Get current date id: date diff --git a/.github/workflows/ci-ifcsverchok-daily.yml b/.github/workflows/ci-ifcsverchok-daily.yml index d5a3653d3d..b369cf61b9 100644 --- a/.github/workflows/ci-ifcsverchok-daily.yml +++ b/.github/workflows/ci-ifcsverchok-daily.yml @@ -32,7 +32,7 @@ jobs: python-version: '3.11' - name: Get current version id: version - run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT + run: echo "version=$(sed -E 's/[[:alpha:]]+[0-9]+$//' VERSION)" >> $GITHUB_OUTPUT - name: Get current date id: date run: echo "date=$(date +'%y%m%d')" >> $GITHUB_OUTPUT diff --git a/VERSION b/VERSION index 7fc2521fd7..d43e192601 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.6 +0.9.0alpha0 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e12030b876..0b240ce0c8 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -36,6 +36,14 @@ file(READ "../VERSION" "RELEASE_VERSION_") string(STRIP "${RELEASE_VERSION_}" RELEASE_VERSION) message(STATUS "Detected version '${RELEASE_VERSION}'") +# CMake's project(VERSION) only accepts numeric components. Keep the complete +# release identifier for build information, but use its numeric release part +# for PROJECT_VERSION, SOVERSION, and generated CMake package metadata. +string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" PROJECT_VERSION_NUMERIC "${RELEASE_VERSION}") +if(NOT PROJECT_VERSION_NUMERIC) + message(FATAL_ERROR "VERSION must start with a numeric major.minor.patch version: '${RELEASE_VERSION}'") +endif() + add_definitions(-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR) if(POLICY CMP0141) # 3.25+ @@ -55,9 +63,15 @@ endif() # Include utility macros and functions include(utilities.cmake) -# use extra version to make pre-release using eg semver +# Use a SemVer-compatible spelling for CPack artifact names. A trailing +# alphabetic label and number is separated from the numeric version by a +# hyphen: for example, 0.9.0alpha0 becomes 0.9.0-alpha0. if(NOT DEFINED EXTRA_VERSION) - set(EXTRA_VERSION "-alpha.3") + if(RELEASE_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+([A-Za-z]+)([0-9]+)$") + set(EXTRA_VERSION "-${CMAKE_MATCH_1}${CMAKE_MATCH_2}") + else() + set(EXTRA_VERSION "") + endif() endif() option(MINIMAL_BUILD "The build is to make a minimal version of IFC converter from OCCT into IFC." OFF) @@ -119,7 +133,7 @@ option(WITH_ZSTD "Use Zstd compression in RocksDB writes" OFF) option(USERSPACE_PYTHON_PREFIX "Installs IfcPython for the current user only instead of system-wide." OFF) option(USE_DEBUG_PYTHON "Use debug binaries when building Debug IfcPython on Windows." OFF) option(ADD_COMMIT_SHA "Add commit sha and branch in version number, requires git" OFF) -option(VERSION_OVERRIDE "Override the version defined in buildinfo.cpp with the file VERSION in the repository root" OFF) +option(VERSION_OVERRIDE "Use VERSION as the branch label when commit information is embedded" OFF) set( PYTHON_MODULE_INSTALL_DIR @@ -127,15 +141,7 @@ set( "Directory to install IfcPython package to. By default package is installed in found Python's site-packages." ) -if (VERSION_OVERRIDE) - file(READ "../VERSION" "RELEASE_VERSION_") - string(STRIP "${RELEASE_VERSION_}" RELEASE_VERSION) - message(STATUS "Detected version '${RELEASE_VERSION}'") -else() - set(RELEASE_VERSION "0.8.0") -endif() - -project(IfcOpenShell VERSION ${RELEASE_VERSION}) +project(IfcOpenShell VERSION ${PROJECT_VERSION_NUMERIC}) # Make sure CMake modules in this project are found first list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) diff --git a/src/bonsai/Makefile b/src/bonsai/Makefile index 6708457baa..e3cdfdfb7f 100644 --- a/src/bonsai/Makefile +++ b/src/bonsai/Makefile @@ -42,10 +42,12 @@ endif IS_STABLE:=FALSE VERSION:=$(shell cat ../../VERSION) -VERSION_MAJOR:=$(shell cat '../../VERSION' | cut -d '.' -f 1) -VERSION_MINOR:=$(shell cat '../../VERSION' | cut -d '.' -f 2) -VERSION_PATCH:=$(shell cat '../../VERSION' | cut -d '.' -f 3) +VERSION_BASE:=$(shell sed -E 's/[[:alpha:]]+[0-9]+$$//' ../../VERSION) +VERSION_PYTHON:=$(shell sed 's/alpha/a/' ../../VERSION) +VERSION_SEMVER:=$(shell sed -E 's/([[:alpha:]]+)([0-9]+)$$/-\\1\\2/' ../../VERSION) VERSION_DATE:=$(shell date '+%y%m%d') +VERSION_DAILY:=$(VERSION_BASE)a$(VERSION_DATE) +VERSION_SEMVER_DAILY:=$(VERSION_BASE)-alpha$(VERSION_DATE) LAST_COMMIT_HASH:=$(shell git rev-parse HEAD) LAST_COMMIT_DATE:=$(shell git show -s --format=%cI) LAST_GIT_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD) @@ -260,14 +262,14 @@ endif cp pyproject.toml build/ ifeq ($(IS_STABLE), TRUE) - $(SED) "s/0.0.0/$(VERSION)/" build/bonsai/blender_manifest.toml - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/pyproject.toml + $(SED) "s/0.0.0/$(VERSION_SEMVER)/" build/bonsai/blender_manifest.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/pyproject.toml else - $(SED) "s/0.0.0/$(VERSION)-alpha$(VERSION_DATE)/" build/bonsai/blender_manifest.toml + $(SED) "s/0.0.0/$(VERSION_SEMVER_DAILY)/" build/bonsai/blender_manifest.toml $(SED) "s/8888888/$(LAST_COMMIT_HASH)/" build/bonsai/__init__.py $(SED) "s/9999999/$(LAST_COMMIT_DATE)/" build/bonsai/__init__.py $(SED) "s/7777777/$(LAST_GIT_BRANCH)/" build/bonsai/__init__.py - $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/pyproject.toml endif # Blender 5.1+ requires Python 3.13. @@ -279,9 +281,9 @@ endif # Provides bonsai Add-on functionality ifeq ($(IS_STABLE), TRUE) - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/pyproject.toml else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)a$(VERSION_DATE)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/pyproject.toml endif cd build && . env/$(VENV_ACTIVATE) && $(PYTHON) -m build cp build/dist/*.whl build/wheels/ @@ -315,9 +317,9 @@ endif rm -rf build/bonsai/libs/ ifeq ($(IS_STABLE), TRUE) - cd build && zip -r bonsai_$(PYVERSION)-$(VERSION)-$(BLENDER_PLATFORM).zip ./bonsai + cd build && zip -r bonsai_$(PYVERSION)-$(VERSION_SEMVER)-$(BLENDER_PLATFORM).zip ./bonsai else - cd build && zip -r bonsai_$(PYVERSION)-$(VERSION)-alpha$(VERSION_DATE)-$(BLENDER_PLATFORM).zip ./bonsai + cd build && zip -r bonsai_$(PYVERSION)-$(VERSION_SEMVER_DAILY)-$(BLENDER_PLATFORM).zip ./bonsai endif mv build/bonsai*.zip dist/ diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 92a9d2665f..5d67bed82b 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1756,6 +1756,7 @@ class Blender(bonsai.core.tool.Blender): repo_path = repo.working_tree_dir assert repo_path version_ = (Path(repo_path) / "VERSION").read_text().strip() + version_ = re.sub(r"[A-Za-z]+\d+$", "", version_) commit_date = bonsai.get_last_commit_date() assert commit_date commit_date = datetime.fromisoformat(commit_date) diff --git a/src/bonsai/docs/guides/development/maintenance.rst b/src/bonsai/docs/guides/development/maintenance.rst index d9eda2267f..ecf5fe6c7d 100644 --- a/src/bonsai/docs/guides/development/maintenance.rst +++ b/src/bonsai/docs/guides/development/maintenance.rst @@ -76,6 +76,10 @@ Release Notes: - Typically all packages are released at once using the same version schema +- ``VERSION`` uses Python/PEP 440-compatible spelling. For example, an alpha + release may be ``0.9.0alpha0`` (canonicalized to ``0.9.0a0``); build scripts + derive numeric-only and SemVer forms such as ``0.9.0`` and + ``0.9.0-alpha0`` where required. - The ``README.md`` badges can serve as a visual reference for what versions have been released - Corrective Release (if needed after a standard release): diff --git a/src/common.mk b/src/common.mk index cbc251fbe2..fea35539ff 100644 --- a/src/common.mk +++ b/src/common.mk @@ -3,7 +3,10 @@ IS_STABLE:=FALSE PYTHON:=python3 PIP:=pip3 VERSION:=$(shell cat ../../VERSION) +VERSION_BASE:=$(shell sed -E 's/[[:alpha:]]+[0-9]+$$//' ../../VERSION) +VERSION_PYTHON:=$(shell sed 's/alpha/a/' ../../VERSION) VERSION_DATE:=$(shell date '+%y%m%d') +VERSION_DAILY:=$(VERSION_BASE)a$(VERSION_DATE) SED:=sed -i VENV_BIN:=bin @@ -30,18 +33,18 @@ dist: cp pyproject.toml build/ if [ -f README.md ]; then cp README.md build/; fi ifeq ($(IS_STABLE), TRUE) - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/pyproject.toml ifdef IS_MODULE - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/$(PACKAGE_NAME) + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/$(PACKAGE_NAME) else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/$(PACKAGE_NAME)/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/$(PACKAGE_NAME)/__init__.py endif else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)a$(VERSION_DATE)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/pyproject.toml ifdef IS_MODULE - $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' build/$(PACKAGE_NAME) + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/$(PACKAGE_NAME) else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' build/$(PACKAGE_NAME)/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/$(PACKAGE_NAME)/__init__.py endif endif cd build && $(PYTHON) -m venv env && . env/$(VENV_ACTIVATE) && $(PIP) install build diff --git a/src/ifcopenshell-python/Makefile b/src/ifcopenshell-python/Makefile index ae999f272c..2b25fac23f 100644 --- a/src/ifcopenshell-python/Makefile +++ b/src/ifcopenshell-python/Makefile @@ -1,7 +1,10 @@ SHELL := sh IS_STABLE:=FALSE VERSION:=$(shell cat ../../VERSION) +VERSION_BASE:=$(shell sed -E 's/[[:alpha:]]+[0-9]+$$//' ../../VERSION) +VERSION_PYTHON:=$(shell sed 's/alpha/a/' ../../VERSION) VERSION_DATE:=$(shell date '+%y%m%d') +VERSION_DAILY:=$(VERSION_BASE)a$(VERSION_DATE) PYVERSION:=py311 PLATFORM:=linux64 @@ -138,19 +141,19 @@ endif cp ../../README.md build/ cp pyproject.toml build/ ifeq ($(IS_STABLE), TRUE) - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/pyproject.toml - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' build/ifcopenshell/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' build/ifcopenshell/__init__.py else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)a$(VERSION_DATE)"/' build/pyproject.toml - $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' build/ifcopenshell/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' build/ifcopenshell/__init__.py endif cd build && $(PYTHON) -m venv env && . env/$(VENV_ACTIVATE) && $(PIP) install build cd build && . env/$(VENV_ACTIVATE) && $(PYTHON) -m build ifeq ($(IS_STABLE), TRUE) - mv build/dist/ifcopenshell-*.whl dist/ifcopenshell-$(VERSION)-$(PYVERSION)-none-$(PLATFORMTAG).whl + mv build/dist/ifcopenshell-*.whl dist/ifcopenshell-$(VERSION_PYTHON)-$(PYVERSION)-none-$(PLATFORMTAG).whl else - cp build/dist/ifcopenshell-*.whl dist/ifcopenshell-$(VERSION)a$(VERSION_DATE)-$(PYVERSION)-none-$(PLATFORMTAG).whl + cp build/dist/ifcopenshell-*.whl dist/ifcopenshell-$(VERSION_DAILY)-$(PYVERSION)-none-$(PLATFORMTAG).whl endif rm -rf build diff --git a/src/ifcsverchok/Makefile b/src/ifcsverchok/Makefile index bc9dbcac8f..bfc759db6a 100644 --- a/src/ifcsverchok/Makefile +++ b/src/ifcsverchok/Makefile @@ -19,9 +19,10 @@ VERSION:=`date '+%y%m%d'` IS_STABLE:=FALSE VERSION:=$(shell cat ../../VERSION) -VERSION_MAJOR:=$(shell cat '../../VERSION' | cut -d '.' -f 1) -VERSION_MINOR:=$(shell cat '../../VERSION' | cut -d '.' -f 2) -VERSION_PATCH:=$(shell cat '../../VERSION' | cut -d '.' -f 3) +VERSION_BASE:=$(shell sed -E 's/[[:alpha:]]+[0-9]+$$//' ../../VERSION) +VERSION_MAJOR:=$(shell echo '$(VERSION_BASE)' | cut -d '.' -f 1) +VERSION_MINOR:=$(shell echo '$(VERSION_BASE)' | cut -d '.' -f 2) +VERSION_PATCH:=$(shell echo '$(VERSION_BASE)' | cut -d '.' -f 3) VERSION_DATE:=$(shell date '+%y%m%d') SED:=sed -i @@ -40,7 +41,7 @@ ifeq ($(IS_STABLE), TRUE) cd dist && zip -r ifcsverchok-$(VERSION).zip ./* else cd dist/ifcsverchok && $(SED) "s/0, 0, 0/$(VERSION_MAJOR), $(VERSION_MINOR), $(VERSION_PATCH), $(VERSION_DATE)/" __init__.py - cd dist && zip -r ifcsverchok-$(VERSION).$(VERSION_DATE).zip ./* + cd dist && zip -r ifcsverchok-$(VERSION_BASE).$(VERSION_DATE).zip ./* endif rm -rf dist/ifcsverchok diff --git a/src/ifctester/Makefile b/src/ifctester/Makefile index 71ecbd48d7..8649384bf2 100644 --- a/src/ifctester/Makefile +++ b/src/ifctester/Makefile @@ -94,11 +94,11 @@ webapp-stage-ifctester-wheel: cp pyproject.toml $(WEBAPP_IFCTESTER_BUILD_DIR)/ cp README.md $(WEBAPP_IFCTESTER_BUILD_DIR)/ ifeq ($(IS_STABLE), TRUE) - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml - $(SED) 's/version = "0.0.0"/version = "$(VERSION)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_PYTHON)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py else - $(SED) 's/version = "0.0.0"/version = "$(VERSION)a$(VERSION_DATE)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml - $(SED) 's/version = "0.0.0"/version = "$(VERSION)-alpha$(VERSION_DATE)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/pyproject.toml + $(SED) 's/version = "0.0.0"/version = "$(VERSION_DAILY)"/' $(WEBAPP_IFCTESTER_BUILD_DIR)/$(PACKAGE_NAME)/__init__.py endif cd $(WEBAPP_IFCTESTER_BUILD_DIR) && $(PYTHON) -m venv env --system-site-packages && . env/$(VENV_ACTIVATE) && python -m pip install build && python -m build --wheel --no-isolation mkdir -p $(WEBAPP_GENERATED_DIR)