From bf02ce8a3187f4da6f3fd6f457af58ae16230494 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 16 Jun 2021 14:14:52 +1000 Subject: [PATCH 1/4] Build for urdfdom 1 and 2 --- recipe/meta.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 5b95e8b..0bdbfe0 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -13,7 +13,7 @@ source: - disable_gui.patch build: - number: 0 + number: 1 run_exports: - {{ pin_subpackage(name, max_pin='x.x') }} @@ -40,7 +40,7 @@ requirements: - lz4-c - octomap - tinyxml2 - - urdfdom + - urdfdom {{ urdfdom }} - freeglut # [win] run: From 86f7aaa6fdbe3afb3b9bbb3598bc6da677ca4427 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 16 Jun 2021 14:15:34 +1000 Subject: [PATCH 2/4] Create conda_build_config.yaml --- recipe/conda_build_config.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 recipe/conda_build_config.yaml diff --git a/recipe/conda_build_config.yaml b/recipe/conda_build_config.yaml new file mode 100644 index 0000000..1ede617 --- /dev/null +++ b/recipe/conda_build_config.yaml @@ -0,0 +1,3 @@ +urdfdom: + - 1 + - 2 From e4154c5f9994369ae867907261ab61b416bd6f56 Mon Sep 17 00:00:00 2001 From: conda-forge-linter Date: Wed, 16 Jun 2021 04:17:28 +0000 Subject: [PATCH 3/4] MNT: Re-rendered with conda-build 3.21.4, conda-smithy 3.10.3, and conda-forge-pinning 2021.06.15.19.42.39 --- .azure-pipelines/azure-pipelines-linux.yml | 10 +++- .azure-pipelines/azure-pipelines-osx.yml | 7 ++- .azure-pipelines/azure-pipelines-win.yml | 7 ++- ...{linux_64_.yaml => linux_64_urdfdom1.yaml} | 2 + .ci_support/linux_64_urdfdom2.yaml | 38 +++++++++++++ ...ch64_.yaml => linux_aarch64_urdfdom1.yaml} | 2 + .ci_support/linux_aarch64_urdfdom2.yaml | 40 ++++++++++++++ ...64le_.yaml => linux_ppc64le_urdfdom1.yaml} | 2 + .ci_support/linux_ppc64le_urdfdom2.yaml | 36 ++++++++++++ .../{osx_64_.yaml => osx_64_urdfdom1.yaml} | 2 + .ci_support/osx_64_urdfdom2.yaml | 36 ++++++++++++ .../{win_64_.yaml => win_64_urdfdom1.yaml} | 2 + .ci_support/win_64_urdfdom2.yaml | 29 ++++++++++ .drone.yml | 35 +++++++++++- .scripts/run_docker_build.sh | 6 +- .scripts/run_osx_build.sh | 21 +++++-- .travis.yml | 8 ++- README.md | 55 +++++++++++++++---- build-locally.py | 27 ++++++++- 19 files changed, 333 insertions(+), 32 deletions(-) rename .ci_support/{linux_64_.yaml => linux_64_urdfdom1.yaml} (97%) create mode 100644 .ci_support/linux_64_urdfdom2.yaml rename .ci_support/{linux_aarch64_.yaml => linux_aarch64_urdfdom1.yaml} (97%) create mode 100644 .ci_support/linux_aarch64_urdfdom2.yaml rename .ci_support/{linux_ppc64le_.yaml => linux_ppc64le_urdfdom1.yaml} (97%) create mode 100644 .ci_support/linux_ppc64le_urdfdom2.yaml rename .ci_support/{osx_64_.yaml => osx_64_urdfdom1.yaml} (97%) create mode 100644 .ci_support/osx_64_urdfdom2.yaml rename .ci_support/{win_64_.yaml => win_64_urdfdom1.yaml} (95%) create mode 100644 .ci_support/win_64_urdfdom2.yaml diff --git a/.azure-pipelines/azure-pipelines-linux.yml b/.azure-pipelines/azure-pipelines-linux.yml index adce9a5..1f07d3c 100755 --- a/.azure-pipelines/azure-pipelines-linux.yml +++ b/.azure-pipelines/azure-pipelines-linux.yml @@ -5,11 +5,15 @@ jobs: - job: linux pool: - vmImage: ubuntu-16.04 + vmImage: ubuntu-latest strategy: matrix: - linux_64_: - CONFIG: linux_64_ + linux_64_urdfdom1: + CONFIG: linux_64_urdfdom1 + UPLOAD_PACKAGES: 'True' + DOCKER_IMAGE: quay.io/condaforge/linux-anvil-comp7 + linux_64_urdfdom2: + CONFIG: linux_64_urdfdom2 UPLOAD_PACKAGES: 'True' DOCKER_IMAGE: quay.io/condaforge/linux-anvil-comp7 timeoutInMinutes: 360 diff --git a/.azure-pipelines/azure-pipelines-osx.yml b/.azure-pipelines/azure-pipelines-osx.yml index 0c89240..e21c791 100755 --- a/.azure-pipelines/azure-pipelines-osx.yml +++ b/.azure-pipelines/azure-pipelines-osx.yml @@ -8,8 +8,11 @@ jobs: vmImage: macOS-10.15 strategy: matrix: - osx_64_: - CONFIG: osx_64_ + osx_64_urdfdom1: + CONFIG: osx_64_urdfdom1 + UPLOAD_PACKAGES: 'True' + osx_64_urdfdom2: + CONFIG: osx_64_urdfdom2 UPLOAD_PACKAGES: 'True' timeoutInMinutes: 360 diff --git a/.azure-pipelines/azure-pipelines-win.yml b/.azure-pipelines/azure-pipelines-win.yml index 1fd8ea1..e0ab774 100755 --- a/.azure-pipelines/azure-pipelines-win.yml +++ b/.azure-pipelines/azure-pipelines-win.yml @@ -8,8 +8,11 @@ jobs: vmImage: vs2017-win2016 strategy: matrix: - win_64_: - CONFIG: win_64_ + win_64_urdfdom1: + CONFIG: win_64_urdfdom1 + UPLOAD_PACKAGES: 'True' + win_64_urdfdom2: + CONFIG: win_64_urdfdom2 UPLOAD_PACKAGES: 'True' timeoutInMinutes: 360 variables: diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_urdfdom1.yaml similarity index 97% rename from .ci_support/linux_64_.yaml rename to .ci_support/linux_64_urdfdom1.yaml index a3f1526..03f84c3 100644 --- a/.ci_support/linux_64_.yaml +++ b/.ci_support/linux_64_urdfdom1.yaml @@ -29,6 +29,8 @@ pin_run_as_build: max_pin: x.x.x target_platform: - linux-64 +urdfdom: +- '1' zip_keys: - - c_compiler_version - cxx_compiler_version diff --git a/.ci_support/linux_64_urdfdom2.yaml b/.ci_support/linux_64_urdfdom2.yaml new file mode 100644 index 0000000..3decceb --- /dev/null +++ b/.ci_support/linux_64_urdfdom2.yaml @@ -0,0 +1,38 @@ +boost_cpp: +- 1.74.0 +c_compiler: +- gcc +c_compiler_version: +- '9' +cdt_name: +- cos6 +channel_sources: +- conda-forge,defaults +channel_targets: +- conda-forge main +cxx_compiler: +- gxx +cxx_compiler_version: +- '9' +docker_image: +- quay.io/condaforge/linux-anvil-comp7 +flann: +- 1.9.1 +lz4_c: +- 1.9.3 +pin_run_as_build: + boost-cpp: + max_pin: x.x.x + flann: + max_pin: x.x.x + lz4-c: + max_pin: x.x.x +target_platform: +- linux-64 +urdfdom: +- '2' +zip_keys: +- - c_compiler_version + - cxx_compiler_version +- - cdt_name + - docker_image diff --git a/.ci_support/linux_aarch64_.yaml b/.ci_support/linux_aarch64_urdfdom1.yaml similarity index 97% rename from .ci_support/linux_aarch64_.yaml rename to .ci_support/linux_aarch64_urdfdom1.yaml index 2059449..ef3045c 100644 --- a/.ci_support/linux_aarch64_.yaml +++ b/.ci_support/linux_aarch64_urdfdom1.yaml @@ -33,6 +33,8 @@ pin_run_as_build: max_pin: x.x.x target_platform: - linux-aarch64 +urdfdom: +- '1' zip_keys: - - c_compiler_version - cxx_compiler_version diff --git a/.ci_support/linux_aarch64_urdfdom2.yaml b/.ci_support/linux_aarch64_urdfdom2.yaml new file mode 100644 index 0000000..aeaaf1d --- /dev/null +++ b/.ci_support/linux_aarch64_urdfdom2.yaml @@ -0,0 +1,40 @@ +BUILD: +- aarch64-conda_cos7-linux-gnu +boost_cpp: +- 1.74.0 +c_compiler: +- gcc +c_compiler_version: +- '9' +cdt_arch: +- aarch64 +cdt_name: +- cos7 +channel_sources: +- conda-forge +channel_targets: +- conda-forge main +cxx_compiler: +- gxx +cxx_compiler_version: +- '9' +docker_image: +- quay.io/condaforge/linux-anvil-aarch64 +flann: +- 1.9.1 +lz4_c: +- 1.9.3 +pin_run_as_build: + boost-cpp: + max_pin: x.x.x + flann: + max_pin: x.x.x + lz4-c: + max_pin: x.x.x +target_platform: +- linux-aarch64 +urdfdom: +- '2' +zip_keys: +- - c_compiler_version + - cxx_compiler_version diff --git a/.ci_support/linux_ppc64le_.yaml b/.ci_support/linux_ppc64le_urdfdom1.yaml similarity index 97% rename from .ci_support/linux_ppc64le_.yaml rename to .ci_support/linux_ppc64le_urdfdom1.yaml index 1b3b5cf..bb5605a 100644 --- a/.ci_support/linux_ppc64le_.yaml +++ b/.ci_support/linux_ppc64le_urdfdom1.yaml @@ -29,6 +29,8 @@ pin_run_as_build: max_pin: x.x.x target_platform: - linux-ppc64le +urdfdom: +- '1' zip_keys: - - c_compiler_version - cxx_compiler_version diff --git a/.ci_support/linux_ppc64le_urdfdom2.yaml b/.ci_support/linux_ppc64le_urdfdom2.yaml new file mode 100644 index 0000000..246b472 --- /dev/null +++ b/.ci_support/linux_ppc64le_urdfdom2.yaml @@ -0,0 +1,36 @@ +boost_cpp: +- 1.74.0 +c_compiler: +- gcc +c_compiler_version: +- '9' +cdt_name: +- cos7 +channel_sources: +- conda-forge,defaults +channel_targets: +- conda-forge main +cxx_compiler: +- gxx +cxx_compiler_version: +- '9' +docker_image: +- quay.io/condaforge/linux-anvil-ppc64le +flann: +- 1.9.1 +lz4_c: +- 1.9.3 +pin_run_as_build: + boost-cpp: + max_pin: x.x.x + flann: + max_pin: x.x.x + lz4-c: + max_pin: x.x.x +target_platform: +- linux-ppc64le +urdfdom: +- '2' +zip_keys: +- - c_compiler_version + - cxx_compiler_version diff --git a/.ci_support/osx_64_.yaml b/.ci_support/osx_64_urdfdom1.yaml similarity index 97% rename from .ci_support/osx_64_.yaml rename to .ci_support/osx_64_urdfdom1.yaml index c5e2a45..f5d5045 100644 --- a/.ci_support/osx_64_.yaml +++ b/.ci_support/osx_64_urdfdom1.yaml @@ -29,6 +29,8 @@ pin_run_as_build: max_pin: x.x.x target_platform: - osx-64 +urdfdom: +- '1' zip_keys: - - c_compiler_version - cxx_compiler_version diff --git a/.ci_support/osx_64_urdfdom2.yaml b/.ci_support/osx_64_urdfdom2.yaml new file mode 100644 index 0000000..9303b02 --- /dev/null +++ b/.ci_support/osx_64_urdfdom2.yaml @@ -0,0 +1,36 @@ +MACOSX_DEPLOYMENT_TARGET: +- '10.9' +boost_cpp: +- 1.74.0 +c_compiler: +- clang +c_compiler_version: +- '11' +channel_sources: +- conda-forge,defaults +channel_targets: +- conda-forge main +cxx_compiler: +- clangxx +cxx_compiler_version: +- '11' +flann: +- 1.9.1 +lz4_c: +- 1.9.3 +macos_machine: +- x86_64-apple-darwin13.4.0 +pin_run_as_build: + boost-cpp: + max_pin: x.x.x + flann: + max_pin: x.x.x + lz4-c: + max_pin: x.x.x +target_platform: +- osx-64 +urdfdom: +- '2' +zip_keys: +- - c_compiler_version + - cxx_compiler_version diff --git a/.ci_support/win_64_.yaml b/.ci_support/win_64_urdfdom1.yaml similarity index 95% rename from .ci_support/win_64_.yaml rename to .ci_support/win_64_urdfdom1.yaml index ce71f2f..36541cb 100644 --- a/.ci_support/win_64_.yaml +++ b/.ci_support/win_64_urdfdom1.yaml @@ -25,3 +25,5 @@ pin_run_as_build: max_pin: x.x.x target_platform: - win-64 +urdfdom: +- '1' diff --git a/.ci_support/win_64_urdfdom2.yaml b/.ci_support/win_64_urdfdom2.yaml new file mode 100644 index 0000000..c2d9b53 --- /dev/null +++ b/.ci_support/win_64_urdfdom2.yaml @@ -0,0 +1,29 @@ +boost_cpp: +- 1.74.0 +c_compiler: +- vs2017 +channel_sources: +- conda-forge,defaults +channel_targets: +- conda-forge main +cxx_compiler: +- vs2017 +flann: +- 1.9.1 +lz4_c: +- 1.9.3 +perl: +- 5.26.2 +pin_run_as_build: + boost-cpp: + max_pin: x.x.x + flann: + max_pin: x.x.x + lz4-c: + max_pin: x.x.x + perl: + max_pin: x.x.x +target_platform: +- win-64 +urdfdom: +- '2' diff --git a/.drone.yml b/.drone.yml index af15091..0a792de 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,6 +1,6 @@ --- kind: pipeline -name: linux_aarch64_ +name: linux_aarch64_urdfdom1 platform: os: linux @@ -10,7 +10,38 @@ steps: - name: Install and build image: quay.io/condaforge/linux-anvil-aarch64 environment: - CONFIG: linux_aarch64_ + CONFIG: linux_aarch64_urdfdom1 + UPLOAD_PACKAGES: True + PLATFORM: linux-aarch64 + BINSTAR_TOKEN: + from_secret: BINSTAR_TOKEN + FEEDSTOCK_TOKEN: + from_secret: FEEDSTOCK_TOKEN + STAGING_BINSTAR_TOKEN: + from_secret: STAGING_BINSTAR_TOKEN + commands: + - export FEEDSTOCK_ROOT="$DRONE_WORKSPACE" + - export RECIPE_ROOT="$FEEDSTOCK_ROOT/recipe" + - export CI=drone + - export GIT_BRANCH="$DRONE_BRANCH" + - export FEEDSTOCK_NAME=$(basename ${DRONE_REPO_NAME}) + - sed -i '$ichown -R conda:conda "$FEEDSTOCK_ROOT"' /opt/docker/bin/entrypoint + - /opt/docker/bin/entrypoint $FEEDSTOCK_ROOT/.scripts/build_steps.sh + - echo "Done building" + +--- +kind: pipeline +name: linux_aarch64_urdfdom2 + +platform: + os: linux + arch: arm64 + +steps: +- name: Install and build + image: quay.io/condaforge/linux-anvil-aarch64 + environment: + CONFIG: linux_aarch64_urdfdom2 UPLOAD_PACKAGES: True PLATFORM: linux-aarch64 BINSTAR_TOKEN: diff --git a/.scripts/run_docker_build.sh b/.scripts/run_docker_build.sh index 44ad3ce..244ccd1 100755 --- a/.scripts/run_docker_build.sh +++ b/.scripts/run_docker_build.sh @@ -52,11 +52,11 @@ if [ -z "${DOCKER_IMAGE}" ]; then echo "WARNING: DOCKER_IMAGE variable not set and shyaml not installed. Trying to parse with coreutils" DOCKER_IMAGE=$(cat .ci_support/${CONFIG}.yaml | grep '^docker_image:$' -A 1 | tail -n 1 | cut -b 3-) if [ "${DOCKER_IMAGE}" = "" ]; then - echo "No docker_image entry found in ${CONFIG}. Falling back to condaforge/linux-anvil-comp7" - DOCKER_IMAGE="condaforge/linux-anvil-comp7" + echo "No docker_image entry found in ${CONFIG}. Falling back to quay.io/condaforge/linux-anvil-comp7" + DOCKER_IMAGE="quay.io/condaforge/linux-anvil-comp7" fi else - DOCKER_IMAGE="$(cat "${FEEDSTOCK_ROOT}/.ci_support/${CONFIG}.yaml" | shyaml get-value docker_image.0 condaforge/linux-anvil-comp7 )" + DOCKER_IMAGE="$(cat "${FEEDSTOCK_ROOT}/.ci_support/${CONFIG}.yaml" | shyaml get-value docker_image.0 quay.io/condaforge/linux-anvil-comp7 )" fi fi diff --git a/.scripts/run_osx_build.sh b/.scripts/run_osx_build.sh index 39436ec..96d0278 100755 --- a/.scripts/run_osx_build.sh +++ b/.scripts/run_osx_build.sh @@ -4,12 +4,14 @@ source .scripts/logging_utils.sh set -xe +MINIFORGE_HOME=${MINIFORGE_HOME:-${HOME}/miniforge3} + ( startgroup "Installing a fresh version of Miniforge" ) 2> /dev/null MINIFORGE_URL="https://github.com/conda-forge/miniforge/releases/latest/download" MINIFORGE_FILE="Miniforge3-MacOSX-x86_64.sh" curl -L -O "${MINIFORGE_URL}/${MINIFORGE_FILE}" -bash $MINIFORGE_FILE -b +bash $MINIFORGE_FILE -b -p ${MINIFORGE_HOME} ( endgroup "Installing a fresh version of Miniforge" ) 2> /dev/null @@ -17,7 +19,7 @@ bash $MINIFORGE_FILE -b BUILD_CMD=build -source ${HOME}/miniforge3/etc/profile.d/conda.sh +source ${MINIFORGE_HOME}/etc/profile.d/conda.sh conda activate base echo -e "\n\nInstalling conda-forge-ci-setup=3 and conda-build." @@ -27,11 +29,18 @@ conda install -n base --quiet --yes "conda-forge-ci-setup=3" conda-build pip ${G echo -e "\n\nSetting up the condarc and mangling the compiler." setup_conda_rc ./ ./recipe ./.ci_support/${CONFIG}.yaml -mangle_compiler ./ ./recipe .ci_support/${CONFIG}.yaml -echo -e "\n\nMangling homebrew in the CI to avoid conflicts." -/usr/bin/sudo mangle_homebrew -/usr/bin/sudo -k +if [[ "${CI:-}" != "" ]]; then + mangle_compiler ./ ./recipe .ci_support/${CONFIG}.yaml +fi + +if [[ "${CI:-}" != "" ]]; then + echo -e "\n\nMangling homebrew in the CI to avoid conflicts." + /usr/bin/sudo mangle_homebrew + /usr/bin/sudo -k +else + echo -e "\n\nNot mangling homebrew as we are not running in CI" +fi echo -e "\n\nRunning the build setup script." source run_conda_forge_build_setup diff --git a/.travis.yml b/.travis.yml index 6a7591a..23ef8a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,9 +7,15 @@ language: generic matrix: include: - - env: CONFIG=linux_ppc64le_ UPLOAD_PACKAGES=True PLATFORM=linux-ppc64le DOCKER_IMAGE=quay.io/condaforge/linux-anvil-ppc64le + - env: CONFIG=linux_ppc64le_urdfdom1 UPLOAD_PACKAGES=True PLATFORM=linux-ppc64le DOCKER_IMAGE=quay.io/condaforge/linux-anvil-ppc64le os: linux arch: ppc64le + dist: focal + + - env: CONFIG=linux_ppc64le_urdfdom2 UPLOAD_PACKAGES=True PLATFORM=linux-ppc64le DOCKER_IMAGE=quay.io/condaforge/linux-anvil-ppc64le + os: linux + arch: ppc64le + dist: focal script: - export CI=travis diff --git a/README.md b/README.md index 88007c8..4112959 100644 --- a/README.md +++ b/README.md @@ -45,38 +45,73 @@ Current build status - + - + - + - + - + + + + + + + + + + + + + + + + diff --git a/build-locally.py b/build-locally.py index 3453cfe..00eeb34 100755 --- a/build-locally.py +++ b/build-locally.py @@ -7,6 +7,7 @@ import glob import subprocess from argparse import ArgumentParser +import platform def setup_environment(ns): @@ -16,6 +17,10 @@ def setup_environment(ns): os.environ["BUILD_WITH_CONDA_DEBUG"] = "1" if ns.output_id: os.environ["BUILD_OUTPUT_ID"] = ns.output_id + if "MINIFORGE_HOME" not in os.environ: + os.environ["MINIFORGE_HOME"] = os.path.join( + os.path.dirname(__file__), "miniforge3" + ) def run_docker_build(ns): @@ -23,6 +28,11 @@ def run_docker_build(ns): subprocess.check_call([script]) +def run_osx_build(ns): + script = ".scripts/run_osx_build.sh" + subprocess.check_call([script]) + + def verify_config(ns): valid_configs = { os.path.basename(f)[:-5] for f in glob.glob(".ci_support/*.yaml") @@ -46,10 +56,16 @@ def verify_config(ns): else: raise ValueError("config " + ns.config + " is not valid") # Remove the following, as implemented - if not ns.config.startswith("linux"): + if ns.config.startswith("win"): raise ValueError( - f"only Linux configs currently supported, got {ns.config}" + f"only Linux/macOS configs currently supported, got {ns.config}" ) + elif ns.config.startswith("osx") and platform.system() == "Darwin": + if "OSX_SDK_DIR" not in os.environ: + raise RuntimeError( + "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=/opt'" + "to download the SDK automatically to '/opt/MacOSX.sdk'" + ) def main(args=None): @@ -68,7 +84,12 @@ def main(args=None): verify_config(ns) setup_environment(ns) - run_docker_build(ns) + if ns.config.startswith("linux") or ( + ns.config.startswith("osx") and platform.system() == "Linux" + ): + run_docker_build(ns) + elif ns.config.startswith("osx"): + run_osx_build(ns) if __name__ == "__main__": From 135bd0bb33c4bb6d961c05ce7f6139e4df5d0566 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 16 Jun 2021 14:29:24 +1000 Subject: [PATCH 4/4] Fixup shasum --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 0bdbfe0..0fe5792 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -7,7 +7,7 @@ package: source: - url: https://github.com/dartsim/dart/archive/v{{ version }}.tar.gz - sha256: bd65b600e0983a5bdc0788d90dff0ba8fba8494d3f4af590ba1e81f44323eb4e + sha256: bf19cdef8e28dbc4059dcbb11997576d6e1d825791bd756e8272d2ddc5b147ce patches: - disable_imgui.patch - disable_gui.patch
VariantStatus
linux_64linux_64_urdfdom1 - variant + variant
linux_aarch64linux_64_urdfdom2 - variant + variant
linux_ppc64lelinux_aarch64_urdfdom1 - variant + variant
osx_64linux_aarch64_urdfdom2 - variant + variant
win_64linux_ppc64le_urdfdom1 - variant + variant + +
linux_ppc64le_urdfdom2 + + variant + +
osx_64_urdfdom1 + + variant + +
osx_64_urdfdom2 + + variant + +
win_64_urdfdom1 + + variant + +
win_64_urdfdom2 + + variant