Skip to content

Merge pull request #5303 from NREL/5302_390_final_release_notes #273

Merge pull request #5303 from NREL/5302_390_final_release_notes

Merge pull request #5303 from NREL/5302_390_final_release_notes #273

Workflow file for this run

name: buildCSharpSDK
on:
push:
branches: [ master, CSharp ]
# Sequence of patterns matched against refs/tags
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
pull_request:
branches: [ master ]
env:
BUILD_TYPE: Release
jobs:
build-csharp:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
# fail-fast: Default is true, switch to false to allow one platform to fail and still run others
fail-fast: false
matrix:
name: [Ubuntu, macOS, macOS_arm64, Windows64, Windows32]
include:
- name: Ubuntu
os: ubuntu-22.04
- name: macOS
os: macos-13
- name: macOS_arm64
os: macos-14
- name: Windows64
os: windows-latest
- name: Windows32
os: windows-latest
steps:
- uses: actions/checkout@v4
# # If you need to rebuild for a specific branch or tag **after** you fixed the workflow and you have no other changes or only a few you can download from github
# with:
# ref: v3.8.0
#
# - name: download patched CMakeLists.txt
# shell: bash
# run: |
# rm CMakeLists.txt
# aria2c https://raw.githubusercontent.com/NREL/OpenStudio/CSharp/CMakeLists.txt
#
# # Alternatively, if you have made lots of changes, just use this
# - name: Soft reset to v3.8.0
# shell: bash
# run: |
# git fetch --all
# git reset --soft v3.8.0
- uses: actions/setup-python@v5
with:
python-version: 3.12 # only for conan, version doesn't matter much
- name: Install Conan
shell: bash
run: |
begin_group() { echo -e "::group::\033[93m$1\033[0m"; }
set -x
begin_group "Install conan 2"
python --version
pip install 'conan>2'
conan --version
echo -e "::endgroup::"
begin_group "Default profile"
if [ "$RUNNER_OS" == "Windows" ]; then
DIR_SEP="\\"
else
DIR_SEP="/"
fi
echo DIR_SEP=$DIR_SEP >> $GITHUB_ENV
export CONAN_USER_HOME="${{ github.workspace }}${DIR_SEP}conan-cache"
echo CONAN_USER_HOME="$CONAN_USER_HOME" >> $GITHUB_ENV
export CONAN_HOME="$CONAN_USER_HOME${DIR_SEP}.conan2"
echo CONAN_HOME="$CONAN_HOME" >> $GITHUB_ENV
export CONAN_PROFILE_DEFAULT="$CONAN_HOME${DIR_SEP}profiles${DIR_SEP}default"
echo CONAN_PROFILE_DEFAULT="$CONAN_PROFILE_DEFAULT" >> $GITHUB_ENV
conan profile detect --force --name default
cat $CONAN_PROFILE_DEFAULT
# Mac has the FreeBSD flavor of sed and MUST take a backup suffix...
sed -i.bak 's/cppstd=.*$/cppstd=20/g' $CONAN_PROFILE_DEFAULT
sed -i.bak 's/build_type=.*$/build_type=${{ env.BUILD_TYPE }}/g' $CONAN_PROFILE_DEFAULT
# Windows only
sed -i.bak 's/compiler.runtime_type=.*$/compiler.runtime_type=${{ env.BUILD_TYPE }}/g' $CONAN_PROFILE_DEFAULT
rm -Rf $CONAN_PROFILE_DEFAULT.bak || true
conan profile show
echo -e "::endgroup::"
begin_group "Global.conf"
echo "core:non_interactive = True" >> $CONAN_HOME/global.conf
echo "core.download:parallel = {{os.cpu_count() - 2}}" >> $CONAN_HOME/global.conf
echo "core.sources:download_cache = $CONAN_USER_HOME/.conan-download-cache" >> $CONAN_HOME/global.conf
cat $CONAN_HOME/global.conf
echo -e "::endgroup::"
begin_group "Remotes"
conan remote add --force nrel-v2 https://conan.openstudio.net/artifactory/api/conan/conan-v2
conan remote list
echo -e "::endgroup::"
- name: Configure CMake & build (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
begin_group() { echo -e "::group::\033[93m$1\033[0m"; }
set -x
begin_group "Install ninja"
if [ "$RUNNER_OS" == "macOS" ]; then
brew install ninja
export CC=clang
export CMAKE_OSX_ARCHITECTURES=x86_64
else
sudo apt update && sudo apt install -y -qq ninja-build
fi
echo -e "::endgroup::"
begin_group "Conan install"
if [ "$RUNNER_OS" == "macOS" ]; then
# Avoid "builtin __has_nothrow_assign is deprecated; use __is_nothrow_assignable instead" in boost/1.79 with recent clang
conan install . --output-folder=./build --build=missing -c tools.cmake.cmaketoolchain:generator=Ninja -s compiler.cppstd=20 -s build_type=${{ env.BUILD_TYPE }} -o with_testing=False -o with_benchmark=False -o with_ruby=False -o with_python=False -o with_csharp=True -c tools.build:cxxflags="['-D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']"
else
conan install . --output-folder=./build --build=missing -c tools.cmake.cmaketoolchain:generator=Ninja -s compiler.cppstd=20 -s build_type=${{ env.BUILD_TYPE }} -o with_testing=False -o with_benchmark=False -o with_ruby=False -o with_python=False -o with_csharp=True
fi
echo -e "::endgroup::"
begin_group "CMake Configure"
cmake --preset conan-release \
-DBUILD_CSHARP_BINDINGS:BOOL=ON -DBUILD_NUGET_PACKAGE:BOOL=OFF \
-DBUILD_TESTING:BOOL=OFF -DBUILD_RUBY_BINDINGS:BOOL=OFF -DBUILD_PYTHON_BINDINGS:BOOL=OFF -DBUILD_CLI:BOOL=OFF
echo -e "::endgroup::"
begin_group "Build"
cmake --build --preset conan-release
echo -e "::endgroup::"
- name: Compile Windows 64
if: matrix.name == 'Windows64'
shell: cmd
run: |
echo "::group::Conan Install"
conan install . --output-folder=./build --build=missing -c tools.cmake.cmaketoolchain:generator="Visual Studio 17 2022" -s compiler.cppstd=20 -s build_type=${{ env.BUILD_TYPE }} -o with_testing=False -o with_benchmark=False -o with_ruby=False -o with_python=False -o with_csharp=True
echo "::engroup::"
cmake --list-presets
echo "::group::CMake Configure"
call ./build/conanbuild.bat
cmake --preset conan-default ^
-DBUILD_CSHARP_BINDINGS:BOOL=ON -DBUILD_NUGET_PACKAGE:BOOL=OFF ^
-DBUILD_TESTING:BOOL=OFF -DBUILD_RUBY_BINDINGS:BOOL=OFF -DBUILD_PYTHON_BINDINGS:BOOL=OFF -DBUILD_CLI:BOOL=OFF
echo "::engroup::"
echo "::group::Build"
cmake --build --preset conan-release
echo "::engroup::"
- name: Install Dotnet x86
if: matrix.name == 'Windows32'
run: |
Invoke-WebRequest 'https://dotnetcli.azureedge.net/dotnet/Runtime/7.0.1/dotnet-runtime-7.0.1-win-x86.exe' -OutFile './dotnet-runtime-7.0.1-win-x86.exe'
./dotnet-runtime-7.0.1-win-x86.exe /install /quiet /norestart
dotnet --info
- name: Compile Windows 32
if: matrix.name == 'Windows32'
shell: cmd
run: |
echo "::group::Conan Install"
conan install . --output-folder=./build --build=missing -c tools.cmake.cmaketoolchain:generator="Visual Studio 17 2022" -s compiler.cppstd=20 -s build_type=${{ env.BUILD_TYPE }} -o with_testing=False -o with_benchmark=False -o with_ruby=False -o with_python=False -o with_csharp=True -s:b arch=x86_64 -s:h arch=x86
echo "::engroup::"
echo "::group::CMake Configure"
call ./build/conanbuild.bat
cmake --preset conan-default ^
-DBUILD_CSHARP_BINDINGS:BOOL=ON -DBUILD_NUGET_PACKAGE:BOOL=OFF ^
-DBUILD_TESTING:BOOL=OFF -DBUILD_RUBY_BINDINGS:BOOL=OFF -DBUILD_PYTHON_BINDINGS:BOOL=OFF -DBUILD_CLI:BOOL=OFF
echo "::engroup::"
echo "::group::Build"
cmake --build --preset conan-release
echo "::engroup::"
- name: build nuget for Windows
if: runner.os == 'Windows'
run: |
dotnet pack ./build/csharp_wrapper/OpenStudio.csproj -o ./build/Products/csharp/Release/ -v normal
- name: build nuget for Linux
if: runner.os == 'Linux'
run: |
cp ./csharp/*.targets ./build/Products
ls ./build/Products
dotnet pack ./build/csharp_wrapper/OpenStudio.csproj -o ./build/Products/csharp/Release/ -v normal
- name: Fix dylib and build nuget for Mac
if: runner.os == 'macOS'
run: |
sudo install_name_tool -add_rpath "@loader_path/." ./build/Products/libopenstudio_csharp.dylib
sudo install_name_tool -delete_rpath "${{ github.workspace }}/build/Products" ./build/Products/libopenstudio_csharp.dylib
sudo install_name_tool -add_rpath "@loader_path/." ./build/Products/libopenstudio_model_csharp.dylib
sudo install_name_tool -delete_rpath "${{ github.workspace }}/build/Products" ./build/Products/libopenstudio_model_csharp.dylib
sudo install_name_tool -add_rpath "@loader_path/." ./build/Products/libopenstudio_translators_csharp.dylib
sudo install_name_tool -delete_rpath "${{ github.workspace }}/build/Products" ./build/Products/libopenstudio_translators_csharp.dylib
cp ./csharp/*.targets ./build/Products
ls ./build/Products
dotnet pack ./build/csharp_wrapper/OpenStudio.csproj -o ./build/Products/csharp/Release/ -v normal
- name: list files
run: |
echo "Listing the top directory=========================================="
ls
echo "Listing ./build/=========================================="
ls ./build/
echo "Listing ./build/Products/=========================================="
ls -R ./build/Products
- name: Zip Build/Source Artifact
run: |
7z a CSharp_${{ matrix.name }}.zip ./build/Products/csharp/Release/*.nupkg
7z a CSharp_${{ matrix.name }}_Src.zip ./build/csharp_wrapper/generated_sources ./build/csharp_wrapper/OpenStudio.csproj
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: CSharp_${{ matrix.name }}
path: CSharp_${{ matrix.name }}.zip
- name: Upload artifact generated_sources
uses: actions/upload-artifact@v4
with:
name: CSharp_${{ matrix.name }}_Src
path: CSharp_${{ matrix.name }}_Src.zip
- name: Upload artifact (if failed)
if: failure()
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}_Failed
path: |
./build/csharp_wrapper/
./build/Products/
Test_Windows:
name: "Test x86 and x64 nuget packages for windows"
runs-on: windows-latest
timeout-minutes: 20
needs: build-csharp
steps:
- uses: actions/checkout@v4
- name: Download CSharp_Windows32
uses: actions/download-artifact@v4
with:
name: CSharp_Windows32
- name: Download CSharp_Windows64
uses: actions/download-artifact@v4
with:
name: CSharp_Windows64
- name: unzip artifacts
run: |
Expand-Archive CSharp_Windows32.zip -DestinationPath x86
Expand-Archive CSharp_Windows64.zip -DestinationPath x64
Expand-Archive x86\*.nupkg -DestinationPath x86\package
Expand-Archive x64\*.nupkg -DestinationPath x64\package
ls -R
- name: merge x86 into x64
run: |
cp x64\package x64x86 -r
mv x64x86\lib x64x86\build
mkdir x64x86\build\netstandard2.0\x64
mkdir x64x86\build\net45\x64
mkdir x64x86\build\netstandard2.0\x86
mkdir x64x86\build\net45\x86
mv x64x86\build\netstandard2.0\*.dll x64x86\build\netstandard2.0\x64
mv x64x86\build\net45\*.dll x64x86\build\net45\x64
mv x86\package\lib\netstandard2.0\* x64x86\build\netstandard2.0\x86
mv x86\package\lib\net45\* x64x86\build\net45\x86
cp csharp\OpenStudio.targets x64x86\build\netstandard2.0\
cp csharp\OpenStudio.targets x64x86\build\net45\
cd x64x86
ls -R
- name: make a new nupkg for Windows
run: |
$VERSION = (Get-Item x64x86\build\netstandard2.0\x64\OpenStudio.dll).VersionInfo.FileVersion
echo $VERSION
Compress-Archive -U -Path x64x86\* -DestinationPath OpenStudio.$VERSION.nupkg
cp *.nupkg x64x86\OpenStudio.nupkg
ls
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: CSharp_Windows_x64x86
path: x64x86\OpenStudio.nupkg
- name: Install Dotnet x86
run: |
Invoke-WebRequest 'https://dotnetcli.azureedge.net/dotnet/Runtime/7.0.1/dotnet-runtime-7.0.1-win-x86.exe' -OutFile './dotnet-runtime-7.0.1-win-x86.exe'
./dotnet-runtime-7.0.1-win-x86.exe /install /quiet /norestart
dotnet --info
- name: Tests on Windows
run: |
$VERSION = (Get-Item x64x86\build\netstandard2.0\x64\OpenStudio.dll).VersionInfo.FileVersion
echo $VERSION
cp *.nupkg csharp/examples/OpenStudio.Tests/
cd csharp/examples/OpenStudio.Tests/
ls
dotnet remove OpenStudio.Tests.csproj package OpenStudio
dotnet remove OpenStudio.Tests.x86.csproj package OpenStudio
dotnet restore OpenStudio.Tests.csproj
dotnet restore OpenStudio.Tests.x86.csproj
dotnet add OpenStudio.Tests.csproj package OpenStudio -s "." -v $VERSION
dotnet add OpenStudio.Tests.x86.csproj package OpenStudio -s "." -v $VERSION
dotnet test OpenStudio.Tests.csproj --arch x64
dotnet clean OpenStudio.Tests.csproj
dotnet test OpenStudio.Tests.x86.csproj --arch x86
Test_Mac_ubuntu:
name: "Test 64-bit nuget packages for macos and ubuntu"
runs-on: ${{ matrix.os }}
strategy:
# fail-fast: Default is true, switch to false to allow one platform to fail and still run others
fail-fast: false
matrix:
name: [Ubuntu, macOS, macOS_arm64]
include:
- name: Ubuntu
os: ubuntu-latest
arch: x64
- name: macOS
os: macos-13
arch: x64
- name: macOS_arm64
os: macos-14
arch: arm64
timeout-minutes: 20
needs: build-csharp
steps:
- uses: actions/checkout@v4
- name: Download nuget
uses: actions/download-artifact@v4
with:
name: CSharp_${{ matrix.name }}
- name: unzip artifacts
run: |
7z e CSharp_${{ matrix.name }}.zip -o./nuget
ls nuget csharp/*
- name: Tests
run: |
cd csharp/examples/OpenStudio.Tests/
dotnet remove OpenStudio.Tests.csproj package OpenStudio
dotnet restore OpenStudio.Tests.csproj
dotnet add OpenStudio.Tests.csproj package OpenStudio -s "./../../../nuget"
dotnet clean OpenStudio.Tests.csproj
dotnet test OpenStudio.Tests.csproj --arch ${{ matrix.arch }} /p:Platform="${{ matrix.arch }}"