Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ebf5be87f6 | ||
|
|
0d34a1d538 | ||
|
|
9c696591dd | ||
|
|
bf843475ea | ||
|
|
e63f8fccee | ||
|
|
13e0bb1a11 | ||
|
|
e83e56b866 | ||
|
|
fab2420d37 | ||
|
|
6b8c080c36 |
No files matched your search
@@ -1,2 +0,0 @@
|
||||
# Try to tell GitHub how to handle .asc files
|
||||
*.asc linguist-language=Tcl
|
||||
@@ -1,260 +0,0 @@
|
||||
name: Prepare bext dependencies
|
||||
description: Restore a compatible bext production artifact or build the pinned revision.
|
||||
|
||||
inputs:
|
||||
platform-channel:
|
||||
description: Published bext platform channel.
|
||||
required: true
|
||||
source-dir:
|
||||
description: Absolute path to the BRL-CAD source tree.
|
||||
required: true
|
||||
output-dir:
|
||||
description: Absolute path where the bext dependency tree will be prepared.
|
||||
required: true
|
||||
build-type:
|
||||
description: BRL-CAD build configuration that will consume the dependency tree.
|
||||
required: false
|
||||
default: Release
|
||||
artifact-token:
|
||||
description: Token with Actions read access to BRL-CAD/bext.
|
||||
required: false
|
||||
|
||||
outputs:
|
||||
bext-sha:
|
||||
description: The bext revision in the prepared dependency tree.
|
||||
value: ${{ steps.result.outputs.bext-sha }}
|
||||
source:
|
||||
description: Whether preparation used a production artifact, cache, or local build.
|
||||
value: ${{ steps.result.outputs.source }}
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Resolve bext production artifact
|
||||
id: resolve
|
||||
shell: bash
|
||||
env:
|
||||
BEXT_BUILD_TYPE: ${{ inputs.build-type }}
|
||||
BEXT_CHANNEL: ${{ inputs.platform-channel }}
|
||||
BRLCAD_SOURCE_DIR: ${{ inputs.source-dir }}
|
||||
GH_TOKEN: ${{ inputs.artifact-token }}
|
||||
run: |
|
||||
set -uo pipefail
|
||||
source_dir="$BRLCAD_SOURCE_DIR"
|
||||
if command -v cygpath >/dev/null 2>&1; then
|
||||
source_dir="$(cygpath -u "$source_dir")"
|
||||
fi
|
||||
required_sha="$(awk -F'[()]' '/^[[:space:]]*brlcad_bext_init\([0-9a-fA-F]{40}\)/ { print tolower($2) }' "$source_dir/CMakeLists.txt")"
|
||||
if [[ ! "$required_sha" =~ ^[0-9a-f]{40}$ ]]; then
|
||||
echo "Expected exactly one brlcad_bext_init(<sha>) call in $source_dir/CMakeLists.txt" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
repository='BRL-CAD/bext'
|
||||
marker_name="bext-production-$required_sha"
|
||||
marker_info="$(gh api "repos/$repository/actions/artifacts?name=$marker_name&per_page=100" \
|
||||
--jq '[.artifacts[] | select(.expired == false and .name == "'"$marker_name"'")] | sort_by(.created_at) | last | select(. != null) | [.name, .workflow_run.id] | @tsv' 2>/dev/null)" || marker_info=''
|
||||
|
||||
selected_sha=''
|
||||
run_id=''
|
||||
if [[ -n "$marker_info" ]]; then
|
||||
selected_sha="$required_sha"
|
||||
IFS=$'\t' read -r _ run_id <<< "$marker_info"
|
||||
echo "Found complete bext production artifacts for pinned revision $required_sha."
|
||||
else
|
||||
marker_info="$(gh api "repos/$repository/actions/artifacts?per_page=100" \
|
||||
--jq '[.artifacts[] | select(.expired == false and (.name | test("^bext-production-[0-9a-f]{40}$")))] | sort_by(.created_at) | last | select(. != null) | [.name, .workflow_run.id] | @tsv' 2>/dev/null)" || marker_info=''
|
||||
if [[ -n "$marker_info" ]]; then
|
||||
IFS=$'\t' read -r latest_marker run_id <<< "$marker_info"
|
||||
selected_sha="${latest_marker#bext-production-}"
|
||||
comparison="$(gh api "repos/$repository/compare/$required_sha...$selected_sha" --jq '.status' 2>/dev/null)" || comparison=''
|
||||
if [[ "$comparison" == 'ahead' || "$comparison" == 'identical' ]]; then
|
||||
echo "::warning::Using newer successful bext revision $selected_sha instead of BRL-CAD's pinned revision $required_sha."
|
||||
else
|
||||
selected_sha=''
|
||||
run_id=''
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
artifact_ready=false
|
||||
artifact_name=''
|
||||
if [[ "$RUNNER_OS" == 'Windows' && "$BEXT_BUILD_TYPE" == 'Debug' ]]; then
|
||||
echo 'Windows Debug requires a Debug bext build; skipping Release production artifacts.'
|
||||
selected_sha=''
|
||||
run_id=''
|
||||
elif [[ -n "$selected_sha" ]]; then
|
||||
artifact_name="bext-$BEXT_CHANNEL-$selected_sha"
|
||||
artifact_count="$(gh api "repos/$repository/actions/runs/$run_id/artifacts?name=$artifact_name&per_page=100" \
|
||||
--jq '[.artifacts[] | select(.expired == false and .name == "'"$artifact_name"'")] | length' 2>/dev/null)" || artifact_count=0
|
||||
if [[ "$artifact_count" == '1' ]]; then
|
||||
artifact_ready=true
|
||||
else
|
||||
selected_sha=''
|
||||
run_id=''
|
||||
artifact_name=''
|
||||
fi
|
||||
fi
|
||||
|
||||
cache_schema=1
|
||||
image_version="${ImageVersion:-unknown}"
|
||||
runner_arch="${RUNNER_ARCH:-unknown}"
|
||||
fallback_cache_key="bext-$cache_schema-$BEXT_CHANNEL-$BEXT_BUILD_TYPE-$required_sha-$image_version-$runner_arch"
|
||||
production_cache_key="bext-$cache_schema-$BEXT_CHANNEL-Release-$selected_sha"
|
||||
if [[ "$artifact_ready" != 'true' ]]; then
|
||||
echo "No compatible production artifact is available; using the cache/build fallback for $required_sha."
|
||||
fi
|
||||
|
||||
echo "required-sha=$required_sha" >> "$GITHUB_OUTPUT"
|
||||
echo "selected-sha=$selected_sha" >> "$GITHUB_OUTPUT"
|
||||
echo "run-id=$run_id" >> "$GITHUB_OUTPUT"
|
||||
echo "artifact-name=$artifact_name" >> "$GITHUB_OUTPUT"
|
||||
echo "artifact-ready=$artifact_ready" >> "$GITHUB_OUTPUT"
|
||||
echo "production-cache-key=$production_cache_key" >> "$GITHUB_OUTPUT"
|
||||
echo "fallback-cache-key=$fallback_cache_key" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Restore production artifact cache
|
||||
if: steps.resolve.outputs.artifact-ready == 'true'
|
||||
id: production-cache
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ${{ inputs.output-dir }}
|
||||
key: ${{ steps.resolve.outputs.production-cache-key }}
|
||||
|
||||
- name: Download bext production artifact
|
||||
if: steps.resolve.outputs.artifact-ready == 'true' && steps.production-cache.outputs.cache-hit != 'true'
|
||||
id: download
|
||||
shell: bash
|
||||
env:
|
||||
ARTIFACT_NAME: ${{ steps.resolve.outputs.artifact-name }}
|
||||
BEXT_CHANNEL: ${{ inputs.platform-channel }}
|
||||
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
|
||||
BEXT_RUN_ID: ${{ steps.resolve.outputs.run-id }}
|
||||
GH_TOKEN: ${{ inputs.artifact-token }}
|
||||
run: |
|
||||
set -uo pipefail
|
||||
output_dir="$BEXT_OUTPUT_DIR"
|
||||
if command -v cygpath >/dev/null 2>&1; then
|
||||
output_dir="$(cygpath -u "$output_dir")"
|
||||
fi
|
||||
download_dir="$RUNNER_TEMP/bext-download-$BEXT_RUN_ID-$BEXT_CHANNEL"
|
||||
cmake -E rm -rf "$download_dir" "$output_dir"
|
||||
cmake -E make_directory "$download_dir" "$output_dir"
|
||||
|
||||
ready=false
|
||||
if gh run download "$BEXT_RUN_ID" --repo BRL-CAD/bext --name "$ARTIFACT_NAME" --dir "$download_dir"; then
|
||||
archive="$download_dir/bext-$BEXT_CHANNEL.tar.gz"
|
||||
if (cd "$output_dir" && cmake -E tar xzf "$archive") && \
|
||||
[[ -d "$output_dir/install" && -d "$output_dir/noinstall" && -f "$output_dir/bext-install-manifest.json" ]]; then
|
||||
ready=true
|
||||
fi
|
||||
fi
|
||||
cmake -E rm -rf "$download_dir"
|
||||
if [[ "$ready" != 'true' ]]; then
|
||||
cmake -E rm -rf "$output_dir"
|
||||
echo '::warning::Unable to download or validate the bext production artifact; using the pinned cache/build fallback.'
|
||||
fi
|
||||
echo "ready=$ready" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Restore fallback bext cache
|
||||
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true'
|
||||
id: fallback-cache
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ${{ inputs.output-dir }}
|
||||
key: ${{ steps.resolve.outputs.fallback-cache-key }}
|
||||
|
||||
- name: Build pinned bext revision
|
||||
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true' && steps.fallback-cache.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
env:
|
||||
BEXT_BUILD_TYPE: ${{ inputs.build-type }}
|
||||
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
|
||||
BEXT_SHA: ${{ steps.resolve.outputs.required-sha }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
output_dir="$BEXT_OUTPUT_DIR"
|
||||
if command -v cygpath >/dev/null 2>&1; then
|
||||
output_dir="$(cygpath -u "$output_dir")"
|
||||
fi
|
||||
source_dir="$RUNNER_TEMP/bext-src"
|
||||
build_dir="$RUNNER_TEMP/bext-build"
|
||||
cleanup() {
|
||||
cmake -E rm -rf "$source_dir" "$build_dir"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
cleanup
|
||||
cmake -E rm -rf "$output_dir"
|
||||
|
||||
git clone --filter=blob:none https://github.com/BRL-CAD/bext.git "$source_dir"
|
||||
git -C "$source_dir" -c advice.detachedHead=false checkout "$BEXT_SHA"
|
||||
configure_args=(-S "$source_dir" -B "$build_dir" -G Ninja -DENABLE_ALL=ON -DGIT_SHALLOW_CLONE=ON "-DCMAKE_BUILD_TYPE=$BEXT_BUILD_TYPE" "-DCMAKE_INSTALL_PREFIX=$output_dir")
|
||||
if [[ "$RUNNER_OS" == 'Windows' ]]; then
|
||||
configure_args+=(-DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe)
|
||||
elif [[ "$RUNNER_OS" == 'macOS' ]]; then
|
||||
export CC=clang
|
||||
export CXX=clang++
|
||||
fi
|
||||
cmake "${configure_args[@]}"
|
||||
cmake --build "$build_dir" --config "$BEXT_BUILD_TYPE" --parallel 2
|
||||
|
||||
- name: Validate bext dependency tree
|
||||
shell: bash
|
||||
env:
|
||||
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
output_dir="$BEXT_OUTPUT_DIR"
|
||||
if command -v cygpath >/dev/null 2>&1; then
|
||||
output_dir="$(cygpath -u "$output_dir")"
|
||||
fi
|
||||
[[ -d "$output_dir/install" && -d "$output_dir/noinstall" && -f "$output_dir/bext-install-manifest.json" ]]
|
||||
tool="$output_dir/noinstall/bin/strclear"
|
||||
if [[ "$RUNNER_OS" == 'Windows' ]]; then
|
||||
[[ -f "$tool.exe" ]]
|
||||
else
|
||||
[[ -x "$tool" ]]
|
||||
fi
|
||||
|
||||
- name: Save production artifact cache
|
||||
if: steps.download.outputs.ready == 'true'
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ${{ inputs.output-dir }}
|
||||
key: ${{ steps.resolve.outputs.production-cache-key }}
|
||||
|
||||
- name: Save fallback bext cache
|
||||
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true' && steps.fallback-cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ${{ inputs.output-dir }}
|
||||
key: ${{ steps.resolve.outputs.fallback-cache-key }}
|
||||
|
||||
- name: Report bext source
|
||||
id: result
|
||||
shell: bash
|
||||
env:
|
||||
ARTIFACT_READY: ${{ steps.resolve.outputs.artifact-ready }}
|
||||
ARTIFACT_SHA: ${{ steps.resolve.outputs.selected-sha }}
|
||||
DOWNLOAD_READY: ${{ steps.download.outputs.ready }}
|
||||
FALLBACK_CACHE_HIT: ${{ steps.fallback-cache.outputs.cache-hit }}
|
||||
PRODUCTION_CACHE_HIT: ${{ steps.production-cache.outputs.cache-hit }}
|
||||
REQUIRED_SHA: ${{ steps.resolve.outputs.required-sha }}
|
||||
run: |
|
||||
if [[ "$PRODUCTION_CACHE_HIT" == 'true' ]]; then
|
||||
source=production-cache
|
||||
elif [[ "$DOWNLOAD_READY" == 'true' ]]; then
|
||||
source=production-artifact
|
||||
elif [[ "$FALLBACK_CACHE_HIT" == 'true' ]]; then
|
||||
source=fallback-cache
|
||||
else
|
||||
source=local-build
|
||||
fi
|
||||
if [[ "$ARTIFACT_READY" == 'true' && ( "$PRODUCTION_CACHE_HIT" == 'true' || "$DOWNLOAD_READY" == 'true' ) ]]; then
|
||||
sha="$ARTIFACT_SHA"
|
||||
else
|
||||
sha="$REQUIRED_SHA"
|
||||
fi
|
||||
echo "source=$source" >> "$GITHUB_OUTPUT"
|
||||
echo "bext-sha=$sha" >> "$GITHUB_OUTPUT"
|
||||
echo "Prepared bext $sha from $source."
|
||||
@@ -1,637 +0,0 @@
|
||||
# BRL-CAD's primary distcheck target runs too long and does too much work to
|
||||
# be suitable as a CI target, even occasionally. To achieve essentially the
|
||||
# same result, we define individual jobs for each distcheck sub-target and
|
||||
# distribute them across five serial queues. To avoid the target list going
|
||||
# stale, this header is followed by jobs generated from the CMake logic.
|
||||
|
||||
name: Distcheck
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 3 * * 5'
|
||||
|
||||
jobs:
|
||||
bext:
|
||||
name: Prepare bext
|
||||
runs-on: ubuntu-24.04
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
distcheck-default_build_type:
|
||||
name: distcheck-default_build_type
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [bext]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-default_build_type
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-default_build_type -G Ninja -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-default_build_type --target distcheck-default_build_type
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-default_build_type/distcheck-default_build_type.log
|
||||
|
||||
distcheck-debug:
|
||||
name: distcheck-debug
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [bext]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-debug
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-debug --config Debug --target distcheck-debug
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-debug/distcheck-debug.log
|
||||
|
||||
distcheck-release:
|
||||
name: distcheck-release
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [bext]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-release
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-release --config Release --target distcheck-release
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-release/distcheck-release.log
|
||||
|
||||
distcheck-no_unity_debug:
|
||||
name: distcheck-no_unity_debug
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [bext]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_unity_debug
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_unity_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_UNITY_BUILD=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_unity_debug --config Debug --target distcheck-no_unity_debug
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_unity_debug/distcheck-no_unity_debug.log
|
||||
|
||||
distcheck-no_unity_release:
|
||||
name: distcheck-no_unity_release
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [bext]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_unity_release
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_unity_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_UNITY_BUILD=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_unity_release --config Release --target distcheck-no_unity_release
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_unity_release/distcheck-no_unity_release.log
|
||||
|
||||
distcheck-enableall_debug:
|
||||
name: distcheck-enableall_debug
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-default_build_type]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-enableall_debug
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-enableall_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DENABLE_ALL=ON -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-enableall_debug --config Debug --target distcheck-enableall_debug
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-enableall_debug/distcheck-enableall_debug.log
|
||||
|
||||
distcheck-enableall_release:
|
||||
name: distcheck-enableall_release
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-debug]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-enableall_release
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-enableall_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-enableall_release --config Release --target distcheck-enableall_release
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-enableall_release/distcheck-enableall_release.log
|
||||
|
||||
distcheck-prepared_debug:
|
||||
name: distcheck-prepared_debug
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-release]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-prepared_debug
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-prepared_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-prepared_debug --config Debug --target distcheck-prepared_debug
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-prepared_debug/distcheck-prepared_debug.log
|
||||
|
||||
distcheck-prepared_release:
|
||||
name: distcheck-prepared_release
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-no_unity_debug]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-prepared_release
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-prepared_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-prepared_release --config Release --target distcheck-prepared_release
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-prepared_release/distcheck-prepared_release.log
|
||||
|
||||
distcheck-no_tcl:
|
||||
name: distcheck-no_tcl
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-no_unity_release]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_tcl
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_tcl -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_TCL=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_tcl --config Debug --target distcheck-no_tcl
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_tcl/distcheck-no_tcl.log
|
||||
|
||||
distcheck-no_tk:
|
||||
name: distcheck-no_tk
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-enableall_debug]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_tk
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_tk -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_TK=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_tk --config Debug --target distcheck-no_tk
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_tk/distcheck-no_tk.log
|
||||
|
||||
distcheck-no_strict:
|
||||
name: distcheck-no_strict
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-enableall_release]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_strict
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_strict -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_STRICT=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_strict --config Debug --target distcheck-no_strict
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_strict/distcheck-no_strict.log
|
||||
|
||||
distcheck-no_object:
|
||||
name: distcheck-no_object
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-prepared_debug]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-no_object
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-no_object -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DUSE_OBJECT_LIBS=OFF
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-no_object --config Debug --target distcheck-no_object
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-no_object/distcheck-no_object.log
|
||||
|
||||
distcheck-odd_pathnames:
|
||||
name: distcheck-odd_pathnames
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-prepared_release]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-odd_pathnames
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-odd_pathnames -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-odd_pathnames --config Debug --target distcheck-odd_pathnames
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-odd_pathnames/distcheck-odd_pathnames.log
|
||||
|
||||
distcheck-in_src_dir:
|
||||
name: distcheck-in_src_dir
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [distcheck-no_tcl]
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
sudo apt-get install astyle re2c
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
- name: Directory setup
|
||||
run: cmake -E make_directory build_distcheck-in_src_dir
|
||||
- name: Configure
|
||||
run: cmake -S brlcad -B build_distcheck-in_src_dir -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
- name: Build
|
||||
run: cmake --build build_distcheck-in_src_dir --config Debug --target distcheck-in_src_dir
|
||||
- name: Log
|
||||
if: always()
|
||||
run: cat build_distcheck-in_src_dir/distcheck-in_src_dir.log
|
||||
@@ -1,85 +0,0 @@
|
||||
# The purpose of this particular test definition is to support on-demand
|
||||
# interactive command shells. We sometimes see problems that occur only in the
|
||||
# Github Runner environments, and in order to explore what is happening we need
|
||||
# an interactive prompt (the alternative is hours-per-cycle submit and test
|
||||
# loops, which doesn't scale at all.)
|
||||
#
|
||||
# Unlike the other BRL-CAD tests, this one is started manually from the Github
|
||||
# website. For more information see https://mxschmitt.github.io/action-tmate/
|
||||
#
|
||||
# The "recommended" way to use this action is for the dev to make a fork of
|
||||
# the repository, alter the configure and/or build logic below for their
|
||||
# particular use case (the example below is a libged-only build used to zero
|
||||
# in on a specific libged behavior) before running.
|
||||
|
||||
name: BRL-CAD Linux Interactive Debugging
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
debug_enabled:
|
||||
type: boolean
|
||||
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
|
||||
required: false
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
|
||||
linux:
|
||||
name: Ubuntu Latest GCC
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Setup - System
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils liblief-dev
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Cleanup (we want to avoid wasting disk space)
|
||||
sudo apt-get clean
|
||||
|
||||
- name: Setup - System Qt Build Requirements
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
sudo apt-get clean
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Build Directory setup
|
||||
run: |
|
||||
cmake -E make_directory ./build_linux
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake -S . -G Ninja -B build_linux -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_COMPONENTS=libged -DBRLCAD_EXTRADOCS=OFF
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_linux --config Release --target check
|
||||
|
||||
- name: Debugging - tmate session
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }}
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
|
||||
@@ -1,449 +0,0 @@
|
||||
# This file defines Continuous Integration (CI) tests for BRL-CAD using the
|
||||
# Github Actions framework that are executed each time a commit is pushed.
|
||||
# Currently it defines configurations for Windows, Linux and OSX.
|
||||
#
|
||||
# For more information about available platforms for testing, see:
|
||||
#
|
||||
# https://docs.github.com/en/free-pro-team@latest/actions/reference/specifications-for-github-hosted-runners
|
||||
#
|
||||
# The general rule when building in CI is to go more verbose in output settings
|
||||
# rather than less, since iterative debugging isn't practical. We also want to
|
||||
# avoid parallel building - while that will sometimes catch dependency issues,
|
||||
# it also makes the outputs far harder to interpret when there is a problem.
|
||||
# Better to do parallel build debugging in an environment were more interactive
|
||||
# and iterative debugging is available while preserving the readability of the
|
||||
# CI outputs for other issues.
|
||||
|
||||
name: Per-push
|
||||
|
||||
on:
|
||||
push:
|
||||
|
||||
jobs:
|
||||
|
||||
linux:
|
||||
name: Ubuntu GCC
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: github.event_name == 'push'
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
# Install system dependencies
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Directory setup
|
||||
run: |
|
||||
cmake -E make_directory ./build_linux
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake -S brlcad -B build_linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
id: build_parallel
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_linux --config Release --target check -j2
|
||||
cmake --build build_linux --config Release --target package -j2
|
||||
continue-on-error: true
|
||||
|
||||
- name: Build (serial for diagnostics)
|
||||
if: steps.build_parallel.outcome == 'failure'
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_linux --config Release --target check
|
||||
cmake --build build_linux --config Release --target package
|
||||
|
||||
# A full distcheck is too expensive for the runners, but we can run the
|
||||
# repository integrity check and make sure we can build source archives.
|
||||
archives:
|
||||
name: Source Archives
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [linux]
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: github.event_name == 'push'
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
# Install system dependencies - we do the full setup here, even though
|
||||
# source archives isn't intended to build the main BRL-CAD, in case
|
||||
# this check is the one where the bext dependency cache check gets a miss.
|
||||
# In that case, this check will have to build bext to proceed - and it will
|
||||
# need the bext environment set up to do so.
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake -E make_directory build_archives
|
||||
cmake -S brlcad -B build_archives -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
|
||||
cmake --build build_archives --config Release --target distcheck-source_archives
|
||||
|
||||
# A full bext build every time we push is too much, but we can exercise the
|
||||
# basic bext mechanisms and also the BRLCAD_COMPONENTS subbuild at the same
|
||||
# time if we do a local bext build of *just* the libbg subset of BRL-CAD. If
|
||||
# the COMPONENTS mechanism works as it should it won't trigger a full bext
|
||||
# build, and we'll only be compiling what libbg needs.
|
||||
componentbext:
|
||||
name: BRLCAD_COMPONENTS
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: github.event_name == 'push'
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
# Install system dependencies - we do the full setup here, even though
|
||||
# source archives isn't intended to build the main BRL-CAD, in case
|
||||
# this check is the one where the bext dependency cache check gets a miss.
|
||||
# In that case, this check will have to build bext to proceed - and it will
|
||||
# need the bext environment set up to do so.
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_components
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake -S brlcad -B build_components -DCMAKE_BUILD_TYPE=Release -DBRLCAD_COMPONENTS=libbg
|
||||
cmake --build build_components --config Release
|
||||
|
||||
windows:
|
||||
name: MSVC - Ninja
|
||||
runs-on: windows-2025
|
||||
strategy:
|
||||
fail-fast: true
|
||||
if: github.event_name == 'push'
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Add cl.exe to PATH
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
|
||||
- name: Add github workspace to path
|
||||
shell: pwsh
|
||||
run: Add-Content -Path $env:GITHUB_PATH -Value $env:GITHUB_WORKSPACE
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: windows-2025-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Build Directory setup
|
||||
run: cmake -E make_directory ./build_winninja
|
||||
|
||||
- name: Configure
|
||||
shell: powershell
|
||||
run: |
|
||||
cmake -S brlcad -B build_winninja -G Ninja -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -DBRLCAD_EXT_DIR=${{ runner.temp }}\bext_output -DCMAKE_BUILD_TYPE=Release -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
id: build_parallel
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
continue-on-error: true
|
||||
|
||||
- name: Build (serial for diagnostics)
|
||||
if: steps.build_parallel.outcome == 'failure'
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja -j1 -v
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
- name: Check
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja check -v
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
- name: Package
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja package
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
windows_std_tools:
|
||||
name: MSVC - Standard Tools
|
||||
needs: [windows]
|
||||
runs-on: windows-2025
|
||||
strategy:
|
||||
fail-fast: true
|
||||
if: github.event_name == 'push'
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Add cl.exe to PATH
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: windows-2025-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Build Directory setup
|
||||
run: |
|
||||
cmake -E make_directory ./build_winstd
|
||||
|
||||
- name: MSVC and Ninja diagnostics
|
||||
shell: cmd
|
||||
run: |
|
||||
where cmake
|
||||
where ninja
|
||||
where cl.exe
|
||||
where msbuild
|
||||
cmake --version
|
||||
cl.exe
|
||||
set INCLUDE
|
||||
set LIB
|
||||
set LIBPATH
|
||||
|
||||
- name: Configure
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=%RUNNER_TEMP%\bext_output -DBRLCAD_ENABLE_QT=ON -DBRLCAD_CONFIG_PROBE_DIAGNOSTICS=ON -DBRLCAD_PROBE_SNAPSHOT_FILE=%GITHUB_WORKSPACE%\build_winstd\parallel-probes.txt
|
||||
|
||||
- name: Configure probe diagnostics
|
||||
if: always()
|
||||
shell: pwsh
|
||||
run: |
|
||||
$build = Join-Path $env:GITHUB_WORKSPACE 'build_winstd'
|
||||
$diagnosticDir = Join-Path $build 'CMakeTmp/probe_diagnostics'
|
||||
if (Test-Path $diagnosticDir) {
|
||||
Get-ChildItem -Path $diagnosticDir -File | Sort-Object Name | ForEach-Object {
|
||||
Write-Host "`n===== $($_.FullName) ====="
|
||||
Get-Content -Path $_.FullName
|
||||
}
|
||||
} else {
|
||||
Write-Host "No parallel-probe diagnostic directory was created."
|
||||
}
|
||||
$cmakeError = Join-Path $build 'CMakeFiles/CMakeError.log'
|
||||
if (Test-Path $cmakeError) {
|
||||
Write-Host "`n===== $cmakeError ====="
|
||||
Get-Content -Path $cmakeError
|
||||
}
|
||||
$cache = Join-Path $build 'CMakeCache.txt'
|
||||
if (Test-Path $cache) {
|
||||
Write-Host "`n===== selected cache entries ====="
|
||||
Select-String -Path $cache -Pattern '^(HAVE_CONIO_H|BRLCAD_PROBE_USE_NINJA|BRLCAD_PROBE_NINJA_EXE|BRLCAD_PROBE_VCVARS|BRLCAD_PROBE_VCVARS_ARCH):' | ForEach-Object { $_.Line }
|
||||
}
|
||||
|
||||
- name: Rebuild conio probe verbosely
|
||||
if: always()
|
||||
shell: cmd
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if not exist build_winstd\CMakeTmp\INCLUDE_PROBE_build (
|
||||
echo INCLUDE_PROBE mini-project was not configured.
|
||||
exit /b 0
|
||||
)
|
||||
cmake --build build_winstd\CMakeTmp\INCLUDE_PROBE_build --config Release --target HAVE_CONIO_H --verbose
|
||||
|
||||
- name: Build
|
||||
id: build_parallel
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release -j2
|
||||
continue-on-error: true
|
||||
|
||||
- name: Build (serial for diagnostics)
|
||||
if: steps.build_parallel.outcome == 'failure'
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target mged
|
||||
|
||||
- name: Check
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target check -j2
|
||||
|
||||
- name: Package
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target package -j2
|
||||
|
||||
osx:
|
||||
name: macOS Clang
|
||||
needs: [linux]
|
||||
runs-on: macos-15
|
||||
strategy:
|
||||
fail-fast: true
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Install Xquartz
|
||||
run: |
|
||||
brew install xquartz --cask
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: macos-15-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Build Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_osx
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
export CC=clang
|
||||
export CXX=clang++
|
||||
cmake -S brlcad -B build_osx -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
id: build_parallel
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
make -j2
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
continue-on-error: true
|
||||
|
||||
- name: Build (serial for diagnostics)
|
||||
if: steps.build_parallel.outcome == 'failure'
|
||||
run: |
|
||||
make
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
|
||||
- name: Check
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
make check
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
make package
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
@@ -1,400 +0,0 @@
|
||||
# This file defines Continuous Integration (CI) tests for BRL-CAD using the
|
||||
# Github Actions framework. Currently it defines configurations for Windows,
|
||||
# Linux and OSX. These tests are run on a fixed schedule, rather than per
|
||||
# push, and will typically take longer to run.
|
||||
#
|
||||
# Tests here are intended to test more expensive integrations and longer
|
||||
# builds than the ones targeted at per-commit feedback. The tradeoff is
|
||||
# that a failure in these tests might be cause by any commit within a
|
||||
# 24 hour block of time, so the developer will need to track down the
|
||||
# specifics themselves.
|
||||
|
||||
name: Scheduled
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 3 * * *' # daily at 03:00 UTC
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
||||
linux_bext:
|
||||
name: Linux - BRL-CAD bext build
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
# Install system dependencies
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_linux
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake -S brlcad -B build_linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build + Check + Package
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_linux --config Release --target check
|
||||
cmake --build build_linux --config Release --target package
|
||||
|
||||
windows_bext:
|
||||
name: MSVC - Ninja - BRL-CAD bext build
|
||||
needs: [linux_bext]
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
if: ${{ !cancelled() }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Add cl.exe to PATH
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
|
||||
- name: Add github workspace to path
|
||||
shell: powershell
|
||||
run: Add-Content -Path $env:GITHUB_PATH -Value $env:GITHUB_WORKSPACE
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Build Directory setup
|
||||
run: cmake -E make_directory ./build_winninja
|
||||
|
||||
- name: Configure
|
||||
shell: powershell
|
||||
run: |
|
||||
cmake -S brlcad -B build_winninja -G Ninja -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja -j1 -v
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
- name: Check
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja check -v
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
- name: Package
|
||||
shell: powershell
|
||||
run: |
|
||||
ninja package
|
||||
working-directory: ${{ github.workspace }}/build_winninja
|
||||
|
||||
windows_std_tools_bext:
|
||||
name: MSVC - Standard Tools - BRL-CAD bext build
|
||||
needs: [windows_bext]
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
if: ${{ !cancelled() }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Add cl.exe to PATH
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
|
||||
- name: Add github workspace to path
|
||||
shell: cmd
|
||||
run: echo %GITHUB_WORKSPACE%>>"%GITHUB_PATH%"
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Build Directory setup
|
||||
run: |
|
||||
cmake -E make_directory ./build_winstd
|
||||
|
||||
- name: Configure
|
||||
shell: cmd
|
||||
run: |
|
||||
where cmake
|
||||
where ninja
|
||||
where cl.exe
|
||||
where msbuild
|
||||
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DCMAKE_BUILD_TYPE=Release -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target mged
|
||||
|
||||
- name: Check
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target check
|
||||
|
||||
- name: Package
|
||||
shell: cmd
|
||||
run: |
|
||||
cmake --build build_winstd --config Release --target package
|
||||
|
||||
osx_bext:
|
||||
name: macOS - BRL-CAD bext build
|
||||
needs: [linux_bext]
|
||||
runs-on: macos-15
|
||||
strategy:
|
||||
fail-fast: true
|
||||
if: ${{ !cancelled() }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Install Xquartz
|
||||
run: |
|
||||
brew install xquartz --cask
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Build Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_osx
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
export CC=clang
|
||||
export CXX=clang++
|
||||
cmake -S brlcad -B build_osx -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
make
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
|
||||
- name: Check
|
||||
run: |
|
||||
make check
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
make package
|
||||
working-directory: ${{ github.workspace }}/build_osx
|
||||
|
||||
linux_static:
|
||||
name: Clang Static Analyser
|
||||
needs: [linux_bext]
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
# Setup hint from https://github.com/darktable-org/rawspeed/blob/develop/.github/workflows/ci-static-analysis.yml
|
||||
- name: Clang Static Analyzer Setup
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install clang-18 clang-tools-18
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev # Cleanup
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_clangstatic
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
working-directory: ${{ github.workspace }}/brlcad
|
||||
|
||||
- name: Run Analyzer
|
||||
env:
|
||||
BRLCAD_EXT_DIR: ${{ runner.temp }}/bext_output
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:/usr/share/clang/scan-build-18/bin:/usr/share/clang/scan-build-18/libexec:$PATH
|
||||
cp $GITHUB_WORKSPACE/brlcad/misc/clang-static-analyzer-run.sh .
|
||||
./clang-static-analyzer-run.sh
|
||||
working-directory: ${{ github.workspace }}/brlcad/build_clangstatic
|
||||
|
||||
- name: Summary
|
||||
if: success() || failure()
|
||||
run: |
|
||||
sudo apt-get install html2text
|
||||
html2text scan-reports-all/*/index.html
|
||||
working-directory: ${{ github.workspace }}/brlcad/build_clangstatic
|
||||
|
||||
|
||||
# See https://app.codecov.io/gh/BRL-CAD/brlcad for analysis results
|
||||
linux_cov:
|
||||
name: LCOV Coverage testing
|
||||
needs: [linux_bext]
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
|
||||
steps:
|
||||
- name: Setup - CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Setup - System
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# Get the lcov tool and its dependencies
|
||||
sudo apt-get install lcov gdb
|
||||
# Install X/OpenGL dev pkgs
|
||||
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
|
||||
# Install tools
|
||||
sudo apt-get install astyle re2c xsltproc libxml2-utils
|
||||
# Install dependency dev pkgs
|
||||
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
|
||||
# Install XCB/OpenGL dev pkgs for Qt - see:
|
||||
# https://wiki.qt.io/Building_Qt_6_from_Git
|
||||
# https://doc.qt.io/qt-6/linux-requirements.html
|
||||
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||
sudo apt-get install libgl-dev
|
||||
sudo apt-get install libinput-dev
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: brlcad
|
||||
|
||||
- name: Prepare bext dependencies
|
||||
uses: ./brlcad/.github/actions/prepare-bext
|
||||
with:
|
||||
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
|
||||
source-dir: ${{ github.workspace }}/brlcad
|
||||
output-dir: ${{ runner.temp }}/bext_output
|
||||
build-type: Release
|
||||
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
|
||||
|
||||
- name: Directory setup
|
||||
run: |
|
||||
cmake -E make_directory build_lcov
|
||||
cmake -E make_directory $HOME/.cache
|
||||
cmake -E make_directory $HOME/.cache/BRL-CAD
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake -S brlcad -B build_lcov -DBRLCAD_ENABLE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
|
||||
|
||||
- name: Build
|
||||
id: build_parallel
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_lcov -j2
|
||||
continue-on-error: true
|
||||
|
||||
- name: Build (serial for diagnostics)
|
||||
if: steps.build_parallel.outcome == 'failure'
|
||||
run: |
|
||||
export PATH=$GITHUB_WORKSPACE:$PATH
|
||||
cmake --build build_lcov -j1
|
||||
|
||||
- name: Run Tests
|
||||
id: coverage_tests
|
||||
run: |
|
||||
find . -name '*.gcda' -exec rm {} \;
|
||||
cmake --build . --target check
|
||||
working-directory: ${{ github.workspace }}/build_lcov
|
||||
|
||||
- name: Diagnose failed annotation test
|
||||
if: failure() && steps.coverage_tests.outcome == 'failure'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
ctest -R '^rt_datum_annot_semantics$' -VV
|
||||
cat Testing/Temporary/LastTest.log
|
||||
if command -v gdb >/dev/null 2>&1; then
|
||||
gdb --quiet --batch \
|
||||
-ex 'set pagination off' \
|
||||
-ex run \
|
||||
-ex 'thread apply all bt full' \
|
||||
--args ./src/librt/tests/rt_datum_annot_semantics
|
||||
fi
|
||||
working-directory: ${{ github.workspace }}/build_lcov
|
||||
|
||||
- name: Capture Coverage
|
||||
run: |
|
||||
lcov --capture --directory . --output-file coverage.info
|
||||
lcov -r coverage.info \*\/bext_output\/\* > coverage-2.info
|
||||
lcov -r coverage-2.info \/usr\/\* > coverage_cad.info
|
||||
rm coverage-*.info
|
||||
mv coverage_cad.info ..
|
||||
working-directory: ${{ github.workspace }}/build_lcov
|
||||
|
||||
- name: Upload
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./coverage_cad.info
|
||||
|
||||
+27
-40
@@ -1,41 +1,28 @@
|
||||
# Common build directories used in the source tree
|
||||
/build*
|
||||
/.build*
|
||||
/*_build*
|
||||
/*-build*
|
||||
/out
|
||||
|
||||
# Temporary files
|
||||
# CVS default ignores begin
|
||||
tags
|
||||
TAGS
|
||||
.make.state
|
||||
.nse_depinfo
|
||||
*~
|
||||
\#*\#
|
||||
.\#*
|
||||
[._]*.s[a-v][a-z]
|
||||
[._]*.sw[a-p]
|
||||
[._]s[a-v][a-z]
|
||||
[._]sw[a-p]
|
||||
|
||||
# OS specific files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
|
||||
# CMake supports some configuration files to allow users a convenient way to pre-define
|
||||
# sets of configuration options:
|
||||
# https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html
|
||||
/CMakeUserPresets.json
|
||||
|
||||
# Visual Studio (note that CMakePresets.json is recommended instead of
|
||||
# CMakeSettings.json for Visual Studio going forward)
|
||||
# https://learn.microsoft.com/en-us/cpp/build/cmake-presets-vs
|
||||
# https://learn.microsoft.com/en-us/cpp/build/customize-cmake-settings
|
||||
/.vs
|
||||
.vscode
|
||||
/CMakeSettings.json
|
||||
|
||||
#Qt Creator
|
||||
CMakeLists.txt.user
|
||||
|
||||
# Misc
|
||||
.clang-format
|
||||
*__pycache__*
|
||||
|
||||
|
||||
\#*
|
||||
.#*
|
||||
,*
|
||||
_$*
|
||||
*$
|
||||
*.old
|
||||
*.bak
|
||||
*.BAK
|
||||
*.orig
|
||||
*.rej
|
||||
.del-*
|
||||
*.a
|
||||
*.olb
|
||||
*.o
|
||||
*.obj
|
||||
*.so
|
||||
*.exe
|
||||
*.Z
|
||||
*.elc
|
||||
*.ln
|
||||
core
|
||||
# CVS default ignores end
|
||||
@@ -1,32 +0,0 @@
|
||||
# Code Quality Standards
|
||||
|
||||
Write code as a senior engineer would for long-term maintenance. These are non-negotiable defaults, not suggestions to apply when asked.
|
||||
|
||||
## Principles
|
||||
|
||||
- **DRY.** Extract duplicate logic. Refactor. Once and only once.
|
||||
- **Minimize surprises.** Preserve existing style and conventions. Test when you can.
|
||||
- **No magic values.** Use named constants, enums, or configuration. Every literal needs justification.
|
||||
- **Minimize scope.** Prefer tightest scope that works - local variables, parameters, encapsulation. Broader scope needs justification.
|
||||
- **No dead code.** Delete commented-out code, unused variables, unreachable branches. Version control remembers.
|
||||
- **Comments explain why.** Document intent, constraints, and non-obvious decisions. Use "what" summaries only for complex or non-obvious algorithms. If routine code needs a comment to explain it, the code should be clearer.
|
||||
- **Clean up what you touch.** Improve code you are changing: rename unclear variables, extract functions, simplify conditionals. Do not mix unrelated cleanup with logic changes - separate concerns, separate commits.
|
||||
- **Handle errors deliberately.** Whether failing loudly or quietly, make it an intentional choice. No accidental swallowing.
|
||||
- **YAGNI.** Do not add speculative abstractions, unused parameters, or unplanned extension points. Build what is needed now. Refactor when requirements actually change.
|
||||
- **Perfection is when there is nothing left to take away.** Prefer reduction over addition, simpler is better. Too clever to debug easily is too clever.
|
||||
|
||||
## Before Finishing
|
||||
|
||||
Review your changes for code smells, duplicated logic, hardcoded values, overly broad scope, unclear names, missing error handling, unnecessary complexity, etc. Fix issues in the same pass - do not defer cleanup.
|
||||
|
||||
## Git
|
||||
|
||||
Never commit without permission (ask every time). Never push to remote. Never use `codex`, `chatgpt`, `openai`, `gemini`, `antigravity`, `copilot`, `claude`, `llm`, `ai`, or similar terms in branch names, tag names, commits, PRs, comments, and other metadata. Do not add generated-by notices or otherwise indicate authorship unless user explicitly requests. Do not include specific machine information - full file system paths, machine names, IP addresses, or other identifiable information in commit messages, code, comments or documentation.
|
||||
|
||||
## Repository Coding Conventions
|
||||
|
||||
The HACKING file in the root of the source tree defines coding conventions specific to BRL-CAD, including versions of common functions that are used in our code base instead of raw standard functions. Review this file before writing code so your changes and additions adhere to BRL-CAD standards.
|
||||
|
||||
BRL-CAD code should typically use our ZERO and EQUAL macros rather than raw floating-point equality comparisons to avoid Werror=float-equal compilation failures on expressions such as a == 0.0 (should be ZERO(a)) or b != c (should be !EQUAL(b, c)).
|
||||
|
||||
When completing a code change (not for intermediate iterations, but when preparing to hand back a finalized change) use our regress-repository and regress-licenses build targets to check that the result satisfies our internal checkers.
|
||||
@@ -1,621 +0,0 @@
|
||||
BRL-CAD Bugs
|
||||
============
|
||||
|
||||
Bugs should be reported to the bug tracker on the project website at
|
||||
http://sourceforge.net/tracker/?atid=640802&group_id=105292
|
||||
|
||||
The bugs and issues listed in here may or may not be the same as or
|
||||
related to the bugs reported to the bug tracker. In general, users
|
||||
should not look to this file for information regarding the status of
|
||||
bugs. Informal bug-related information that is intended for
|
||||
developers will generally be found here. This may include short term
|
||||
issues that are in active development as well as long term and
|
||||
on-going issues.
|
||||
|
||||
Recent Bugs
|
||||
-----------
|
||||
|
||||
* fbserv as well as -F option handling (e.g., -F0 or -F/dev/wgls) that
|
||||
is supported across myriad other tools appears to be broken on
|
||||
Windows in a git bash shell (problem is not seen in Command Prompt.)
|
||||
Something is concatenating EXEPATH and/or fbserv silently fails with
|
||||
return codes (e.g., when not specifying -F, only giving the port.)
|
||||
|
||||
* recursive bu_parallel() failure, tbd whether cpp11 or pthread impl,
|
||||
likely because IDs are exceeding MAX_PSW, causing mayhem and chaos.
|
||||
|
||||
* rtcheck_handler_cleanup() throws 'invalid handle specified' on Windows
|
||||
in closing of STDOUT (see FIXME comment). Does not affect normal running,
|
||||
but a debug build complains.
|
||||
|
||||
* very peculiar non-linear memory issue in rt when allocating a large
|
||||
flat hierarchy of objects. I have three combs, each with 10k
|
||||
members unioned. Each member is an rcc. Rendering with just one
|
||||
comb results in about 2GB usage. Two combs result in about 3.5GB
|
||||
usage. Three combs results in 18GB usage. Four is killed after
|
||||
24GB. Suspect there is some 32-bit issue once we exceed 4GB that is
|
||||
causing subsequent allocations to be bigger than necessary. Looking
|
||||
at allocation stack, rt_ct_get() appears to be allocating 10MB
|
||||
chunks.
|
||||
|
||||
[HARD] Superlinear growth (3 combs -> 18GB) points at an
|
||||
integer/overflow interaction deep in the space-partitioning cut
|
||||
allocator (rt_ct_get 10MB chunks), intertwined with bu memory.
|
||||
Painful to isolate and validate at scale.
|
||||
[FAN-OUT: poor -- one focused investigator with an allocator/profiler
|
||||
trace; not parallelizable.]
|
||||
|
||||
* rt from mged is not outputting overlap log messages or rt summary.
|
||||
Stops printing after opendb line. (Observed on Mac)
|
||||
|
||||
* mged running an rt with excessive overlaps ends up in a deadlock.
|
||||
Backtrace indicates write buffer is full, likely because no output
|
||||
is going to terminal. (Observed on Mac)
|
||||
|
||||
* Running"mged -c test.g" exits automatically on default prompt:
|
||||
...
|
||||
Create new database (y|n)[n]?
|
||||
Warning: no database is currently open!
|
||||
morrison@Miniagua .build %
|
||||
|
||||
* MGED crashes trying to open the repository file
|
||||
doc/docbook/resources/other/standard/xsl/images/important.tif
|
||||
It is mis-identified as a v4 .g file due to the file header's
|
||||
first character matching the v4 .g first character.
|
||||
|
||||
* MGED on Mac hides the main command window on File->Open when you
|
||||
cancel the open. Presumably the withdraw is somehow getting routed
|
||||
to the window and not just the open dialog.
|
||||
|
||||
* running pkgIndex and/or mkIndex during build appears to be randomly
|
||||
crashing on Mac using bundled libs
|
||||
|
||||
* Visual error when drawing using -S -m1 of a region with the same solid
|
||||
subtracted and then unioned.
|
||||
|
||||
make two boxes stacked on top of one another
|
||||
> r boxes.r u box - box1 u box1
|
||||
> e -S -m1 boxes.r
|
||||
box1 is not drawn
|
||||
|
||||
* raytracing a revolved sketch seems to work fine, but rtarea and gqa
|
||||
seem to be crashing on that same revolve. curiously, the brep
|
||||
revolve from the csgbrep proc-db has the same failure as well as the
|
||||
brep ehy.
|
||||
|
||||
* ogl display manager still crashes on attach in mged on Mac OS X 10.5
|
||||
|
||||
* running archer "" at least on windows results in a file type dialog
|
||||
and errors with "can't read "_conv_log": no such variable
|
||||
|
||||
* in mged, running the 'attach' command (confirmed issues with X and
|
||||
ogl), closing the window, and then issuing a 'draw' results in mged
|
||||
crashing.
|
||||
|
||||
* killtree / crashes
|
||||
|
||||
* object names with a / or \ in them make ls or underlying directory
|
||||
parsing logic display them incorrectly.
|
||||
|
||||
* search -exec results are inconsistent with search filtered
|
||||
results. for example, "search . -attr ..." returns A B C, but
|
||||
"search . -attr ... -exec attr show {} \;" results in attr show
|
||||
output for A B C as well as subtracted repetitions. For example,
|
||||
say A contains - B - C, then it will show output for A B C B C.
|
||||
|
||||
adding -bool u gets closer to consistent but still appears to repeat
|
||||
the last object
|
||||
|
||||
* fbclear -c appears to hang indefinitely inside pkg_bwaitfor,
|
||||
possible protocol mismatch or capability removed/changed in fbserv.
|
||||
|
||||
* apparently all four BRL-CAD Tutorial Series volumes are missing from
|
||||
our bibliography...
|
||||
|
||||
* mater -d information stored in the .g file doesn't survive a
|
||||
garbage collection operation.
|
||||
|
||||
|
||||
* fix checker.sh script and/or overlap GUI so that the latter will
|
||||
read the resulting overlap pairings file from the prior.
|
||||
alternatively, need to be able to run overlap check on server
|
||||
without GUI, so could implement an overlaps file output option to be
|
||||
run via mged -c.
|
||||
|
||||
* running 'put' on geometry that is already displayed results in a NaN
|
||||
view (at least View and Eye_pos parameters are non) despite geometry
|
||||
still being displayed. this causes 'rt' to fly into an infinite
|
||||
loop, presumably trying to increment rays from the eye position.
|
||||
|
||||
* creating an object with a slashes in the name (e.g., cp foo foo/R)
|
||||
results in an object that cannot be deleted/renamed. bad behavior
|
||||
presumably extends to any name with path separators.
|
||||
|
||||
* If we draw any form, then trace it using rt, then change of database
|
||||
(by clicking file>open and selecting another database), badness
|
||||
ensues. One report has quitting the rt window causing a segfault.
|
||||
Another (confirmed) hung mged (stuck/inf loop).
|
||||
|
||||
* annotation bugs:
|
||||
in sph1.s sph 0 0 0 10
|
||||
in ann1.s annot 0 0 0 test1 10 10 3 1
|
||||
in ann2.s annot 30 30 30 test2 40 40 3 1
|
||||
# ann2.s's label looks wrong, points at origin?
|
||||
in ann3.s annot 0 0 0 1 10 10 3 1
|
||||
# using numbers for a label results in no label
|
||||
|
||||
* rtedge with perspective is wrong. it fills in nearly entire faces,
|
||||
vertically in particular. it's worse on small sized renders, and
|
||||
gets better the larger the render size (indicating there's some
|
||||
neighbor distance coming into play that is not affected by
|
||||
max_dist). eoes not happen in non-perspective ray-traces.
|
||||
|
||||
* get_regions tcl command doesn't respond well to situations where
|
||||
child object names in combs have dashes (the "-" character) in
|
||||
names. It tries to interpret the dash as an argument delimiter.
|
||||
Looks like this may be only in situations where the "-" is the
|
||||
lead character and on Windows? Been hard to reproduce...
|
||||
|
||||
* dsp does not facetize correctly with zero elevation areas in the
|
||||
data - need robustness improvements
|
||||
|
||||
* dsp primitives specifying data using Windows style file paths
|
||||
don't work.
|
||||
|
||||
* attempting to create a dsp using a binary object caused a crash on
|
||||
Linux - need to figure out if this was caused by feeding it the wrong
|
||||
kind of binary object or some other error...
|
||||
|
||||
* screengrab on windows does not work
|
||||
|
||||
* Recursive submodel predictably goes infinite, need stack-based
|
||||
db_walk_tree(): mged> in submodel submodel submodel grid test.g
|
||||
|
||||
* ogl display manager and framebuffer are creating windows with
|
||||
transparent backgrounds (the glClear color is not being drawn) on
|
||||
Linux. Presumably a driver-related issue, alpha channel, or expose
|
||||
event issue. Inspecting further, it may be related to environments
|
||||
where shmget() fails (or is requested via /dev/oglp) and we get
|
||||
private memory -- looks like private memory is not initialized
|
||||
(observed on Mac 10.6, Windows, and Ubuntu Linux using 7.26).
|
||||
|
||||
* fblabel seems quite busted, at least talking to a /dev/X fbserv, in
|
||||
that it only draws the first character and eventually displays
|
||||
rem_read() failures when run in -d debug mode.
|
||||
|
||||
* rtedge doesn't refresh a /dev/X fbserv (presumably double-buffered)
|
||||
after doing an overlay render. it does draw, though, as confirmed
|
||||
by a forced fb-fb refresh.
|
||||
|
||||
* typing 'comb -f -r assembly_name' shuts down mged with the error:
|
||||
ERROR: bad pointer 0000000000B4CA50: s/b bu_external(x768dbbd0), was bu_vls(x89333bbb), file ..\..\..\brlcad_src\src\libbu\parse.c, line 2443"
|
||||
And on the mged command line:
|
||||
rt_db_cvt_to_external5 expecting non-NULL name parameter
|
||||
wdb_export((null)): solid export failure
|
||||
|
||||
* report of mged command history not working with the down arrow key
|
||||
in 7.25.0 (on Windows, unknown on other platforms). Up arrow works
|
||||
fine.
|
||||
|
||||
* wgl framebuffer is not lingering on windows (regardless of using
|
||||
wgll or default) when it should
|
||||
|
||||
* report of LIBBU not working when accessed by a multithreaded
|
||||
application on Windows. reportedly due to some problem with the
|
||||
debug memory queue.
|
||||
|
||||
* report of g-iges crashing (on Windows) when exporting a 1.2MB BoT
|
||||
mesh (presumably imported via stl-g). worked for smaller models.
|
||||
|
||||
* autoview [scale] isn't updating the wireframe when opening a
|
||||
database, drawing geometry, then running autoview. the status bar
|
||||
shows the scale change, but the graphics window remains unaffected
|
||||
unless you run "view size" to set it.
|
||||
|
||||
* overlay command reports an error when trying to load a file
|
||||
names edges.pl, but succeeds when the file is called patches.pl
|
||||
Need to see why edges.pl is not accepted.
|
||||
|
||||
* step-g crashing on mac with lazy symbol load failure missing:
|
||||
brlcad::SurfaceTree::SurfaceTree(ON_BrepFace*, bool, int)
|
||||
|
||||
* metaball tessellation enters either an infinite loop or an absurdly
|
||||
long tessellation process - observed on Linux 64 bit system - quick
|
||||
test:
|
||||
|
||||
rm -f metaball.g && mged -c metaball.g "make m.s metaball; facetize m.bot m.s"
|
||||
|
||||
* corruption/crash issue rendering terra.g without terra.dsp,
|
||||
possibly/probably parallel-related in libbn/noise.c's
|
||||
bn_noise_turb() function. gdb eventually catches a segfault in
|
||||
find_spec_wgt() loop with indications of corrupted memory. valgrind
|
||||
confirms corrupted memory (8 bytes) after a build_spec_table()
|
||||
realloc within find_spec_wgt() but it's not clear why. etbl
|
||||
book-keeping seems okay.. corrupted read consistently detected on
|
||||
spec_wgts = ep->spec_wgts line in bn_noise_turb(). observed on
|
||||
64-bit linux system:
|
||||
|
||||
rm -f terra.pix && valgrind bin/rt -o terra.pix -P1 -H3 -s1024 share/brlcad/7.21.0/db/terra.g all.g
|
||||
|
||||
[HARD] valgrind-confirmed 8-byte corruption after a build_spec_table()
|
||||
realloc in find_spec_wgt(), where "bookkeeping seems okay" -- i.e.,
|
||||
root cause is non-obvious. Classic hard-to-pin data race.
|
||||
[FAN-OUT: poor -- a single heisenbug needing one careful
|
||||
investigator, not parallel coverage.]
|
||||
|
||||
* mged 'joint' hold command isn't working. looks like the fp_names
|
||||
book-keeping is fuxored or the db_lookup is returning NULL (or isn't
|
||||
yet performed).
|
||||
|
||||
* encountered a crash during rtarea on a (default) facetized version
|
||||
of the hyp from the proc-db csgbrep tool.
|
||||
|
||||
* raytracing rhc crashes (inside malloc, so previous memory badness)
|
||||
with normal tolerance set to non-default value (e.g. tol norm 0.1);
|
||||
also fails (non-crash) if absolute tolerance is changed (e.g., tol
|
||||
abs 0.1)
|
||||
|
||||
* revolve raytracing seems to be busted.. at least with the example
|
||||
csgbrep revolve shape
|
||||
|
||||
* torus with a near zero inner diameter results in zero-length edges
|
||||
during tessellation.
|
||||
|
||||
* report that "keep" sometimes results in a .g file with unknown units;
|
||||
dbconcat also is reported to set the units to unknown if concatting
|
||||
a file with unknown units.
|
||||
|
||||
* infinite loop in rt_find_backing_dist() raytracing a BoT (without
|
||||
pieces) for bot_smooth (i.e., rt_bot_smooth()). encountered inf
|
||||
loop on a jetski fastgen model that was solid but unoriented, with
|
||||
about 8k faces. NOTE: possibly already have a fix for this bug
|
||||
pending review and testing. --CSM
|
||||
|
||||
* run make to create all primitives at the origin. there are raytrace
|
||||
differences, crashes, and overall bad behavior between default
|
||||
ungrouped "e *" view and adding all of those primitives to a single
|
||||
region. Script for creating all primitives via make command:
|
||||
|
||||
for i in `mged -c test.g make asdf asdf 2>&1 | awk '{print $12}' | sed 's/[<>|]/ /g'` ; do mged -c test.g make $i $i ; done
|
||||
mged -c test.g "g primitives *"
|
||||
mged -c test.g r primitives.r u primitives
|
||||
rt -a 35 -e 25 test.g primitives
|
||||
rt -a 35 -e 25 test.g primitives.r
|
||||
|
||||
* MGED on Mac OS X 10.6 mouse bindings fail to zoom in incrementally.
|
||||
Pan, zoom out, and interactive zoom work. Shift-grip bindings need
|
||||
to be verified.
|
||||
|
||||
* rt -i -s4096 -H16 -F/dev/null boolean-ops.g all
|
||||
|
||||
* compilation reportedly fails when building Tcl if the path to the
|
||||
source directory includes a space.
|
||||
|
||||
* mged/tcl "gets" command doesn't work if you run the "source" command
|
||||
to read in a script that uses gets on stdin. it just hangs until
|
||||
multiple sigint's are received.
|
||||
|
||||
* invoking mged from a system menu seems to be broken. reported by a
|
||||
reliable ArchLinux user. probably exhibits cross-platform on KDE,
|
||||
GNOME, or XFCE (but original environment is unknown). the bug is
|
||||
undoubtedly related to mged's interactive and stdin/stdout input
|
||||
detection where mged thinks it's being scripted (beginning on or
|
||||
about mged.c:1150)
|
||||
|
||||
* Report of copy/paste not working with Tk on Windows Vista - does
|
||||
work on Windows XP.
|
||||
|
||||
* Update/create .mgedrc results in bogus qray lines if a db is not
|
||||
open when the file is created.
|
||||
|
||||
* MGED doesn't initialize multipane view to the documented multipane
|
||||
defaults if you just open a db with multipane already enabled.
|
||||
|
||||
* Creating an 'extrude' via MGED gui crashes MGED.
|
||||
|
||||
* edcomb command seems to be busted similar to red, doesn't seem to do
|
||||
anything.
|
||||
|
||||
* Detailed BoT model ray trace image had incorrect background pixel
|
||||
values in framebuffer, off slightly by one.
|
||||
|
||||
* rt is consuming 100% CPU in fb_close() on a lingering ogl
|
||||
framebuffer waiting to close. needs to sleep or select for a while.
|
||||
|
||||
* /dev/oglb 'copy mode' fails to refresh the framebuffer
|
||||
|
||||
* X display manager (and probably others) will lock up mged if you Z/B
|
||||
while the wireframe is being actively drawn (in X_drawVList()).
|
||||
reproducible by cloning havoc a dozen or more times, getting
|
||||
sub-1sec fps, Z/B after rotating wireframe but before update
|
||||
finishes drawing.
|
||||
|
||||
* report of rt aborting randomly on 64-bit with camo shader.
|
||||
|
||||
* mged rrt command is not respecting the view size, just does
|
||||
something similar to autoview but even gets az/el wrong too.
|
||||
|
||||
* Windows mged build is not generating tclIndex files with all
|
||||
entries. notably the pattern_gui.tcl file is not getting included
|
||||
as well as a variety of others. see missing entries in
|
||||
tclscripts/mged/tclIndex for examples:
|
||||
https://sourceforge.net/tracker/?func=detail&atid=640802&aid=2923199&group_id=105292
|
||||
|
||||
* hyp tessellation routine creates bot that does not raytrace
|
||||
|
||||
* hyp used in a boolean with other objects (even unions) does not
|
||||
raytrace
|
||||
|
||||
* if you attach a display manager in tk-mged, kill the window, then
|
||||
quit, mged crashes on exit.
|
||||
|
||||
* mged segfaults when drawing lots of solids at once (e.g. draw *.s)
|
||||
|
||||
* mged command mode doesn't display the output of multiple
|
||||
semicolon-separated commands. Only the output of the very last mged
|
||||
command is displayed. Example:
|
||||
|
||||
mged -c moss.g "tops ; title"
|
||||
mged -c moss.g "puts OK ; tops ; puts OK2 ; title ; puts DONE"
|
||||
|
||||
Note that this is consistent with doing the same thing on the MGED
|
||||
Command Window's command prompt - if the above is a bug it is
|
||||
apparently not restricted to command/classic mode.
|
||||
|
||||
Further investigation suggests that this is a consequence of
|
||||
Tcl treating multiple commands in a single " " block as one command,
|
||||
insofar as capturing the output is concerned. It probably relates
|
||||
to situations where Tcl_SetResult is called where (in this case)
|
||||
Tcl_AppendResult would have been better, but it is not clear whether
|
||||
changing this result setting approach would cause other breakage.
|
||||
|
||||
* mged rotation halts after a few events and after zooming in/out at
|
||||
least once (Mac OS X 10.5)
|
||||
More info: This problem appears to be specific to a particular
|
||||
X11 version or versions - it has been observed with
|
||||
xorg-server-1.4.2-apple33 on 10.5. It does not occur with the
|
||||
community XQuartz 2.5.0 (xorg-server 1.7.6), nor does it occur
|
||||
when Tk 8.5.8 is compiled to use the Aqua backend. At least one other
|
||||
(possibly earlier) version of X11 from Apple on a 10.5 Mac did not
|
||||
exhibit bad rotate behavior. The problem is not specifically the
|
||||
zooming action - rather, the zoom triggers
|
||||
a Tk focus call on the display manager window (rather than the
|
||||
Tk parent window) and the problem manifests when focus is on the
|
||||
display manager window. mged classic mode, where there is no
|
||||
parent window, exhibits the bad rotate behavior immediately.
|
||||
|
||||
* infinite light sources close to objects result in unexpected/bad
|
||||
light behavior. example is a 1m sph light about 5m from a box about
|
||||
1k x 1k x 1k in size. setting make each light be red, green, and
|
||||
blue respectively, set to infinite (and fraction 10) and sides to
|
||||
the cube will render sides with a fixed color (green, blue) and top
|
||||
magenta. On one test with all lights at fraction 1.0 and only one
|
||||
inf, was getting interleaved partial flat/no color all around cube.
|
||||
|
||||
* fastgen plate mode bots are reporting invalid shotline segments.
|
||||
depending on whether you shoot from the front or back can result in
|
||||
bogus lists visible with nirt in mged, entirely missing the bot, or
|
||||
mismatched entry/exit/overlap segments.
|
||||
|
||||
* tab completion in classic/command mode sometimes doesn't work
|
||||
(presumably if mged can't find tcl resources). was finally able to
|
||||
reproduce this with the result given as:
|
||||
|
||||
invalid command name "bind"
|
||||
|
||||
* mged 'facetize -n' command is giving many errors:
|
||||
ERROR: color index out of range (-128 > 255)
|
||||
and it shouldn't. seems to be happening on 3-manifold surfaces but
|
||||
only for particular faces. looks like the painting algorithm that is
|
||||
being used is flawed (and an incomplete implementation).
|
||||
|
||||
* running 'keep' on too many objects (hundreds is causing a usage
|
||||
statement (and not doing the keep)
|
||||
|
||||
* fbserv is receiving image data very slowly if the framebuffer is a
|
||||
remote X24 interface. could reproduce on mac with the following:
|
||||
|
||||
fbserv -s1024 1 /dev/X &
|
||||
rt -F1 -s1024 db/moss.g all.g
|
||||
rt -F1 -i -s1024 db/moss.g all.g # 8x worse
|
||||
|
||||
* ls -A and/or e -A reportedly crashes on use, unverified
|
||||
|
||||
* File->Export seems to not work on Windows
|
||||
|
||||
* xpush fails to properly create a hierarchy killing existing objects
|
||||
resulting in dangling references. This may have been fixed by
|
||||
r69256, but a model that exposes the issue has to be tested to be
|
||||
sure.
|
||||
|
||||
* mged on Mac OS X will crash on an X11 call if compiled against
|
||||
system Tcl/Tk (at least on 10.4 linking against 8.4), see TODO
|
||||
|
||||
* the ray tracer fails to report LOS and sometimes even hits on a BoT
|
||||
that is marked as unoriented or is inverted (even though it
|
||||
sometimes will report the segments, just without LOS). this seems
|
||||
to happen for bots that are neither lh or rh (they're mixed) and
|
||||
causes the raytrace to fail if they're set to anything other than
|
||||
'no' for orientation. this affects rt, nirt, et al.
|
||||
|
||||
* g-vrml ignores bots that are created with dxf-g
|
||||
|
||||
* Mac OS X installer doesn't include the symbolic links, only
|
||||
including the versioned installation directory.
|
||||
|
||||
* Mouse cursor turns into a huge yellow-translucent arrow when running
|
||||
MGED through remote X11.
|
||||
|
||||
Running this fixes the bug: .id_0t config -cursor "xterm black"
|
||||
|
||||
* mged (on debian) is reporting this when the user presses tab:
|
||||
Error in bgerror: invalid command name "::swidgets::togglearrow"
|
||||
the second time they press tab, they get:
|
||||
Error in bgerror: window name "_secErrorDialog" already exists in parent
|
||||
|
||||
The problem was noticed on 7.12.4 and happens regardless of there
|
||||
being a db opened or not. The problem does not occur in classic
|
||||
mode.
|
||||
|
||||
* mged command window is showing up as an empty 0x0 dimensioned window
|
||||
on freebsd using xfce and metacity (single display, 1680x1050 res).
|
||||
dm shows up just fine.
|
||||
|
||||
* g2asc of a v4 is apparently writing out the wrong s_cgtypes and
|
||||
otherwise parsing v4 .g files incorrectly
|
||||
|
||||
* bump shader seems to be busted. only renders as flat by itself and
|
||||
stacked with phong it seems to ignore the uv settings.
|
||||
|
||||
* the graphics window does not acquire keybinding focus in mged on
|
||||
ubuntu linux. key events go to the command window even with the
|
||||
graphics window has focus.
|
||||
|
||||
* mged tab-completion doesn't work if the object names have spaces
|
||||
|
||||
* Open dialog in MGED seems rather busted for scrolling and selection
|
||||
(seems to be Mac OS X specific)
|
||||
|
||||
* turning on Framebuffer->Rectangle Area in mged disables the
|
||||
embedded framebuffer display on Mac OS X when you sweep a raytrace
|
||||
rectangle. sweeping still works if you leave it at All.
|
||||
|
||||
* invalid shaders result in an "Unable to locate where BRL-CAD ... is
|
||||
installed" message that refers to being unable to find a
|
||||
/lib/libSHADER.so file. Quite a bogus message and probably not
|
||||
something that should abort the ray-trace.
|
||||
|
||||
* rtedge seems to get stuck in a loop at the end of rendering, never
|
||||
terminates (unless you rtabort/kill the process); works with -P1
|
||||
|
||||
* nirt/query_ray reports intersection messages in triplicate if the
|
||||
shot routines miss but still print out messages
|
||||
|
||||
* mged's plot tool (the gui one, not the 'plot' command) outputs a
|
||||
plot file that has an erase as the last command, causing empty plots
|
||||
|
||||
* interactive mouse edits in mged can go haywire on Mac OS X with
|
||||
snap-to-grid enabled
|
||||
|
||||
* overlap tool in mged encourages very inefficient CSG operations
|
||||
(e.g. a simple bolt with an entire hull armor subtracted)
|
||||
|
||||
* permute (in mged) requires apply or save before 'new' vertex values
|
||||
will function properly as keypoints.
|
||||
|
||||
* facedef then move face undoes the facedef in mged
|
||||
|
||||
* dsp primitive is going into what seems to be an unbounded memory
|
||||
allocation loop during prep, inside dsp_layers().
|
||||
|
||||
* libfb cannot open a file descriptor when piping/redirecting output.
|
||||
|
||||
OK: rt -F/./dev/stdout moss.g all.g
|
||||
BAD: rt -F/./dev/stdout moss.g all.g > test.pix
|
||||
|
||||
* ray-tracers assume a seekable output stream. libfb reports numerous
|
||||
fseek errors and outputs slightly corrupted pix data.
|
||||
|
||||
OK: rt -o test.pix moss.g all.g && pix-png test.pix > test.png && rm -f test.pix
|
||||
BAD: rt -o /dev/stdout moss.g all.g | pix-png > test.png
|
||||
|
||||
* running any of the various mged commands (e.g. clicking the raytrace
|
||||
button many times quickly, or running rtarea on a large model) that
|
||||
output a lot of data will hang mged (idle cpu utilization).
|
||||
|
||||
* solids.sh regression test fails on Mac OS X with one pixel
|
||||
off-by-many on the edge of the middle ARB8 when using an optimized
|
||||
-O3 compile (-fno-unsafe-math-optimizations makes no difference)
|
||||
|
||||
* triangulation of some pipe in toyjeep.g fails (rather reliably) on
|
||||
some given bend. fails in nmg_triangulate model().
|
||||
|
||||
* debugbu 2 immediately reports a bu_vls_free() error.. apparently
|
||||
been a problem since 4.5 days. this occurs because
|
||||
bu_memdebug_add() is not called unless memory checking is enabled
|
||||
via bu_debug. so when bu_debug is set to 2 or 3, it ends up
|
||||
reporting errors during bu_free() for items that were allocated and
|
||||
were not yet being tracked.
|
||||
|
||||
* mged View menu says I and O are keybindings for zoom in/out -- they
|
||||
are apparently not.
|
||||
|
||||
* raytracers report the wrong amount of cumulative time (reports as
|
||||
0.0 seconds elapsed) on amd64 linux; most likely the same pthread
|
||||
accounting bug visited a couple years ago.
|
||||
|
||||
* Create menu.. create "part" boo hiss..
|
||||
|
||||
* fbed is looking for /usr/lib/vfont/nonie.r.12
|
||||
|
||||
* mged doesn't check if html_dir does not exist when searching for
|
||||
docs/browser.
|
||||
|
||||
* permute then translate doesn't refresh the graphics window
|
||||
permute 4378
|
||||
translate menus
|
||||
p 0 0 0
|
||||
p 0 0 0
|
||||
|
||||
* constrained axis translation bindings on OS X don't work
|
||||
object/matrix edit
|
||||
shift-alt mouse (left/mid/right for x/y/z respectively) should work
|
||||
|
||||
* the findfont directive in gv postscript is reporting font not found
|
||||
|
||||
* concave arbs give correct wireframe but do not raytrace correctly.
|
||||
|
||||
* mged's solid illuminate doesn't work when Lighting is turned on
|
||||
|
||||
* raytrace of zoomed images (e.g., -s64) doesn't work for if_X24
|
||||
framebuffers. zooming logic seems to be broken (was crashing in
|
||||
memcpy, but that was fixed) for at least -s96 and smaller:
|
||||
|
||||
./libtool --mode=execute gdb --args src/rt/rt -F/dev/X -P1 -s64 db/moss.g all.g
|
||||
|
||||
* g2asc exports attr lines but will not grok them on asc2g
|
||||
|
||||
* mged's matrix selection does not modify the correct matrix if there
|
||||
are multiply referenced non-unique paths (e.g. referencing the same
|
||||
object N times in a combination).
|
||||
|
||||
* facetize -t doesn't work (tnurb support)
|
||||
|
||||
* on os x, the -fast option results in an odd optimization/aliasing
|
||||
bug where rtip contents are lost in rt after returning from
|
||||
rt_gettrees().
|
||||
|
||||
* tra in console mode outputs a warning about mged_players
|
||||
|
||||
* mged primitive editor doesn't accept/apply values to disk for
|
||||
certain primitives (e.g. sph)
|
||||
|
||||
* enabling perspective mode horks shaded mode, also Z clipping
|
||||
shouldn't be required to get the shading.
|
||||
|
||||
* an underlay framebuffer does not underlay with shaded mode
|
||||
|
||||
* rtarea gives incorrect areas when using -H hypersample flag
|
||||
|
||||
* setting src/librt/db5_io.c's AVS_ADD off in db5_import_attributes
|
||||
causes bad things to happen and it really shouldn't.
|
||||
|
||||
* vrml exporter (and probably others) doesn't export primitives
|
||||
directly as one might expect like the ray-tracers, only regions.
|
||||
|
||||
* sketches extruded with non-square AB vectors results in inner sketch
|
||||
components not getting scaled properly.
|
||||
|
||||
* bot-bldxf fails in db_walk_tree(), interface may have changed
|
||||
|
||||
|
||||
---
|
||||
Bugs should be reported to the bug tracker on the project website at
|
||||
http://sourceforge.net/tracker/?atid=640802&group_id=105292
|
||||
|
||||
BUGS should be formatted to column 70 (M-q in emacs), no tabs.
|
||||
|
||||
// Local Variables:
|
||||
// mode: Text
|
||||
// fill-column: 70
|
||||
// End:
|
||||
@@ -1,87 +0,0 @@
|
||||
= BRL-CAD Interface Change Policy
|
||||
:toc: macro
|
||||
|
||||
toc::[]
|
||||
|
||||
== Scope
|
||||
|
||||
This policy defines how BRL-CAD public interfaces may change. Public
|
||||
interfaces include developer APIs, command-line interfaces, graphical
|
||||
interfaces, documented commands, installed headers, public macros,
|
||||
public types, and other behavior users reasonably rely on.
|
||||
|
||||
Renaming an application is not minimally impacting: an application
|
||||
name is the primary way users find and run the tool.
|
||||
|
||||
Every public interface change must be either minimally impacting or
|
||||
formally deprecated.
|
||||
|
||||
== Minimally Impacting
|
||||
|
||||
A minimally impacting change may be made at any time. A change is
|
||||
minimally impacting only when it can be represented by the documented
|
||||
rule language in
|
||||
link:doc/changes/minimally-impacting.rules[doc/changes/minimally-impacting.rules]
|
||||
and emitted by the generated update script.
|
||||
|
||||
If the rule language cannot express a change, either extend the rule
|
||||
language so the generated script can perform the update, or treat the
|
||||
change as formally deprecated.
|
||||
|
||||
Minimally impacting path includes:
|
||||
|
||||
* recently introduced interfaces that have not yet appeared unchanged
|
||||
in two releases;
|
||||
* appreciably broken interfaces that have been unusable for at least
|
||||
two releases and have no secondary utility;
|
||||
* elementary mechanical changes such as renames, parameter reordering,
|
||||
parameter removal, defaulted parameter insertion, equivalent
|
||||
interface substitutions, and header moves.
|
||||
|
||||
For function argument rewrites, BRL-CAD assumes callers are not
|
||||
relying on preprocessor-generated call syntax and are not passing
|
||||
nested function calls as arguments to the changed function. That
|
||||
assumption keeps generated substitutions deterministic and reviewable.
|
||||
|
||||
Rule syntax and generated update-script workflow are documented in
|
||||
link:doc/changes/README.adoc[doc/changes/README.adoc]. The generated
|
||||
build-tree rendering of minimally impacting changes is
|
||||
`doc/changes/minimally-impacting.adoc`.
|
||||
|
||||
== Formally Deprecated
|
||||
|
||||
Any public interface change that is not minimally impacting must
|
||||
follow the formal deprecation process.
|
||||
|
||||
During a major release, such as 7.x to 8.x, any public interface may
|
||||
change without advance notice. Major version changes imply interface
|
||||
incompatibility.
|
||||
|
||||
During a minor release, such as 7.44.x to 7.46.x, a public interface
|
||||
must be deprecated beforehand with advance notice in at least two
|
||||
minor releases and at least 90 days elapsed since the initial release
|
||||
announcement.
|
||||
|
||||
Public interfaces scheduled for change should be listed in
|
||||
link:doc/changes/deprecated.adoc[doc/changes/deprecated.adoc] and
|
||||
visibly marked in the source code. Appropriate markings include
|
||||
`DEPRECATED` declarations, preprocessor warnings, `@DEPRECATED`
|
||||
comments, runtime warnings when they do not disrupt valid usage, and
|
||||
documentation updates.
|
||||
|
||||
After a deprecation window has completed, removed or significantly
|
||||
changed interfaces are listed in
|
||||
link:doc/changes/obsoleted.adoc[doc/changes/obsoleted.adoc].
|
||||
|
||||
== Examples
|
||||
|
||||
Removing `rt_shootray()` after it has been published and documented in
|
||||
multiple releases is not minimally impacting unless a generated rule
|
||||
can update callers to an equivalent interface. Otherwise, it must be
|
||||
listed as deprecated, marked in the headers, announced in releases,
|
||||
and only later obsoleted.
|
||||
|
||||
Renaming `bu_log()` or adding a defaulted first argument can be
|
||||
minimally impacting if the change is listed in
|
||||
`minimally-impacting.rules` and the generated update script rewrites
|
||||
existing callers.
|
||||
-3446
File diff suppressed because it is too large.
Load diff
@@ -1,116 +0,0 @@
|
||||
BRL-CAD Copying and Distribution
|
||||
================================
|
||||
|
||||
BRL-CAD is Open Source software with copyright primarily held by the
|
||||
U.S. Government. The source code is controlled and maintained by a
|
||||
core team of Open Source developers working around the world. Those
|
||||
core developers operate under a meritocracy organizational structure
|
||||
adhering to developer guidelines outlined in the HACKING developer's
|
||||
guide and to the legal conventions and requirements outlined in this
|
||||
document.
|
||||
|
||||
As a unified work, BRL-CAD is made available under the terms of the
|
||||
GNU Lesser General Public License (LGPL) as published by the Free
|
||||
Software Foundation.
|
||||
|
||||
As distinctly organized and separate components, parts of BRL-CAD are
|
||||
made available under different licenses for different portions
|
||||
including the BSD license and files in the public domain. The Overview
|
||||
section describes how the various licenses apply to the different
|
||||
portions of BRL-CAD.
|
||||
|
||||
BRL-CAD is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this file. If you did not, please contact one of
|
||||
the BRL-CAD project administrators listed at the Github project
|
||||
site https://github.com/BRL-CAD/brlcad/ or listed in the AUTHORS file
|
||||
included as part of the distribution.
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
BRL-CAD consists primarily of libraries, applications, scripts,
|
||||
documentation, geometric models, images, data resources, and build
|
||||
infrastructure. The BRL-CAD libraries provide their headers in the
|
||||
include/ directory as well as all of the directories that begin with
|
||||
the prefix "lib" in the src/ directory (e.g. src/librt/). All of
|
||||
BRL-CAD's libraries, applications, and any content lacking a license
|
||||
specification are covered by the terms of the LGPL.
|
||||
|
||||
Most of BRL-CAD's build infrastructure including files required by
|
||||
the GNU Build System (such as the CMakeLists.txt files), a variety
|
||||
of scripts located in the misc/ and sh/ directories, and the testing
|
||||
infrastructure (scripts and resources) are provided either under
|
||||
the BSD license or are in the public domain. Similarly, most of
|
||||
the geometric models, images, and other data resources are also
|
||||
provided under the BSD license. Refer to each individual file for
|
||||
specific terms.
|
||||
|
||||
BRL-CAD's documentation consists of manual pages located throughout
|
||||
the package, most of the files in the doc/ directory, and the
|
||||
top-level administrative project text files (e.g. README & AUTHORS).
|
||||
Unless otherwise denoted, all of BRL-CAD's documentation is made
|
||||
available under the terms of the BSD Documentation License (BDL) or
|
||||
are in the public domain. Refer to each document for specific terms.
|
||||
|
||||
The full text of the LGPL, BDL, and BSD license should be included in
|
||||
the source distribution of BRL-CAD in the doc/legal/ directory. Refer
|
||||
to the full license text for more details, information, requirements,
|
||||
and implications of each license.
|
||||
|
||||
3rd-Party Components
|
||||
--------------------
|
||||
|
||||
The BRL-CAD package utilizes and redistributes several 3rd party
|
||||
source codes, libraries, and applications. Said 3rd party source
|
||||
code, libraries, and applications all retain their respective
|
||||
agreements, licenses, and copyrights and should be referred to
|
||||
individually for their specific terms. For the purposes of
|
||||
redistribution and legal compatibility for all of BRL-CAD's existing
|
||||
user base, NO 3RD PARTY LIBRARIES SHALL BE INCLUDED THAT ARE UNDER THE
|
||||
TERMS OF THE GNU GENERAL PUBLIC LICENSE or any other license with
|
||||
similar legal implications that would impose legal obligations on
|
||||
external codes that utilize BRL-CAD as a library.
|
||||
|
||||
When referring to BRL-CAD, its source code, documentation, and
|
||||
libraries, the reference is not meant to include or imply 3rd party
|
||||
source code, libraries, and/or applications unless specifically stated
|
||||
otherwise. No endorsement or claim of authorship is implied to any
|
||||
3rd party asset that is included with BRL-CAD.
|
||||
|
||||
Copyright
|
||||
---------
|
||||
|
||||
All contributions to BRL-CAD have been provided under agreement. By
|
||||
requiring all contributions be given back to the BRL-CAD developers,
|
||||
this agreement allows the BRL-CAD project to continue to grow
|
||||
unhindered. As such, a majority of the source code is copyright by
|
||||
the United States Government as represented by the United States Army
|
||||
Research Laboratory.
|
||||
|
||||
Authors and other BRL-CAD contributors must comply with the copyright
|
||||
terms for their respective contributions unless otherwise noted or
|
||||
arranged. This includes an implicit assignment of copyright for any
|
||||
and all contributions being made. The following notice should be
|
||||
prominent in the BRL-CAD sources:
|
||||
|
||||
Copyright (c) 1984-2026 United States Government as represented by
|
||||
the U.S. Army Research Laboratory.
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
Questions or comments regarding BRL-CAD legal issues pertaining to
|
||||
copying, linking, licensing, trademark, or otherwise should be
|
||||
directed to the BRL-CAD Development Team at the following address:
|
||||
|
||||
BRL-CAD Development Team
|
||||
devs@brlcad.org
|
||||
http://brlcad.org
|
||||
|
||||
---
|
||||
$Revision$
|
||||
@@ -1,510 +0,0 @@
|
||||
The Installation Guide to BRL-CAD
|
||||
=================================
|
||||
|
||||
This document covers the installing BRL-CAD from either a source or binary
|
||||
distribution. Please see REPORTING PROBLEMS to troubleshoot.
|
||||
|
||||
Some platforms have additional platform-specific documentation provided in the
|
||||
doc/ directory with additional information. This presently includes the
|
||||
following:
|
||||
|
||||
doc/README.BSD -- FreeBSD, NetBSD, OpenBSD, etc.
|
||||
doc/README.Linux -- Various Linux distributions
|
||||
doc/README.MacOSX -- Apple Mac OS X
|
||||
doc/README.Solaris -- Oracle Solaris, OpenIndiana (Illumos), etc.
|
||||
doc/README.VAX -- Virtual Address eXtension architecture from DEC.
|
||||
One of the original BRL-CAD platforms. These
|
||||
days, re-created using the simh simulator.
|
||||
doc/README.Windows -- Microsoft Windows
|
||||
|
||||
|
||||
TABLE OF CONTENTS
|
||||
-----------------
|
||||
Introduction
|
||||
Table of Contents
|
||||
Quick Source Install
|
||||
Installing from Binary
|
||||
Installing from Source
|
||||
Testing Functionality
|
||||
Post-Installation
|
||||
Reporting Problems
|
||||
Configuration Options
|
||||
|
||||
|
||||
QUICK SOURCE INSTALL
|
||||
--------------------
|
||||
|
||||
See https://brlcad.org/wiki/Compiling for a platform-specific walk-through
|
||||
including instructions for building on Windows.
|
||||
|
||||
Required tools:
|
||||
- Git must be 2.17 or later
|
||||
- CMake must be 3.26 or later
|
||||
- Compiler must be C++17-compliant
|
||||
- If using Visual Studio, version 2019 (16.8+) or later
|
||||
- If using GCC/G++, version 7 or later
|
||||
- If using LLVM/Clang 5 or later
|
||||
- If using Intel, version 19.0.1 or later
|
||||
|
||||
Steps to compile, test, and install an optimized BRL-CAD on non-Windows
|
||||
platforms:
|
||||
|
||||
git clone https://github.com/BRL-CAD/brlcad.git
|
||||
mkdir brlcad/build
|
||||
cd brlcad/build
|
||||
cmake .. -DENABLE_ALL=ON -DCMAKE_BUILD_TYPE=Release
|
||||
make -j4
|
||||
make check
|
||||
sudo make install
|
||||
|
||||
Once installed, run bin/mged or bin/archer to launch BRL-CAD's GUI apps. See
|
||||
POST-INSTALLATION for instruction adding bin/ folder to your system PATH to
|
||||
more easily run geometry converters.
|
||||
|
||||
|
||||
INSTALLING FROM BINARY
|
||||
----------------------
|
||||
|
||||
There are a variety of different kinds of binary distributions of
|
||||
BRL-CAD. Some of the binary distributions are sufficiently generic and
|
||||
are simply a binary compressed tarball distribution. Others are
|
||||
specific to a particular platform such as Debian, Mac OS X, FreeBSD,
|
||||
and Windows etc.
|
||||
|
||||
|
||||
Generic Binary Distributions:
|
||||
|
||||
For binary distributions that are simply compressed tarballs of the
|
||||
installation root, they should contain the entire hierarchy of the
|
||||
distribution. To put that hierarchy in its "installed" location, you just
|
||||
create the directory and move the expanded tarball contents:
|
||||
|
||||
gunzip BRL-CAD_X.Y.Z_Linux_ia64.tar.gz
|
||||
tar -xvf BRL-CAD_X.Y.Z_Linux_ia64.tar
|
||||
sudo mkdir /usr/brlcad/rel-X.Y.Z
|
||||
sudo mv BRL-CAD_X.Y.Z_Linux_ia64/* /usr/brlcad/rel-7.X.Y/
|
||||
|
||||
Of course, there are other compression options possible including zip and
|
||||
bzip2. By default, BRL-CAD expects to be installed into /usr/brlcad/rel-X.Y.Z.
|
||||
On some platforms the binary may be relocatable, but this is not guaranteed.
|
||||
It's recommended that you start from a source distribution if you would like to
|
||||
install into an alternate installation location. That said, if you do desire
|
||||
to install and/or run BRL-CAD from a different location, give it a try...on
|
||||
some platforms it will work.
|
||||
|
||||
Something to be aware of, even if a binary distribution IS relocatable: it will
|
||||
use its local copies of things like libraries only so long as the "final"
|
||||
installed target directory that the build was compiled for does not contain a
|
||||
BRL-CAD installation. Due to the way path logic is set, an installed copy of a
|
||||
library in the correct location will always be loaded first, regardless of the
|
||||
presence of a "local" copy.
|
||||
|
||||
|
||||
Mac OS X Disk Mounting Image:
|
||||
|
||||
Mount the .dmg and run the Installer .pkg contained therein. This will install
|
||||
into /usr/brlcad/rel-X.Y.Z and will only require confirming that your
|
||||
environment is set up properly (i.e. add /usr/brlcad/rel-X.Y.Z/bin to your
|
||||
path) as described in the Quick Installation section.
|
||||
|
||||
|
||||
Validating checksums:
|
||||
|
||||
The integrity of distributed files can be verified using checksums that are
|
||||
published with released files. Released files and their checksums are
|
||||
available from the GitHub releases page (https://github.com/BRL-CAD/brlcad/releases). If you
|
||||
re-distribute BRL-CAD, checksums should be retained with the files so others
|
||||
can validate origination.
|
||||
|
||||
|
||||
INSTALLING FROM SOURCE
|
||||
----------------------
|
||||
|
||||
There are a couple of ways to obtain the BRL-CAD sources, usually via one of
|
||||
the following starting points:
|
||||
|
||||
1) from a Git checkout, or
|
||||
2) from a source distribution tarball
|
||||
|
||||
Using the latest Git sources is recommended where possible since it
|
||||
will have the latest changes.
|
||||
|
||||
There are many different ways to build BRL-CAD and depending on what
|
||||
you need/want will determine which configuration options you should
|
||||
use. See the CONFIGURATION OPTIONS section below for details on how
|
||||
to go about selecting which options are appropriate for you.
|
||||
|
||||
BRL-CAD's dependencies are managed in a separate repository, located at
|
||||
https://github.com/BRL-CAD/bext By default BRL-CAD's configure process will
|
||||
download and manage the necessary dependencies, avoiding the need for user
|
||||
awareness of the bext repository, but there are a number of scenarios where it
|
||||
is advantageous for developers to adjust how this process works.
|
||||
|
||||
The full dependency stack of BRL-CAD, with all optional and experimental
|
||||
features enabled, is a VERY large and long compile. Therefore, the bext build
|
||||
outputs can be built as their own separate, external project to allow for reuse
|
||||
of the compiled outputs. Building bext separately means BRL-CAD won't get a
|
||||
chance to customize what is and is not built, but the trade-off is that outputs
|
||||
can be built once and reused over and over. Doing so can significantly shorten
|
||||
time spent configuring BRL-CAD builds - reusing bext compiled outputs is
|
||||
recommended for serious developers.
|
||||
|
||||
Various useful configurations for working with bext:
|
||||
|
||||
* Acquire bext and its dependencies from another repository host
|
||||
|
||||
cmake .. -DBRLCAD_REPOSITORY_ROOT=https://git.example.org/brlcad
|
||||
|
||||
* Acquire bext and its dependencies from local bare Git mirrors
|
||||
|
||||
cmake .. "-DBRLCAD_REPOSITORY_ROOT=/path/to/mirror/BRL-CAD"
|
||||
|
||||
* Have prebuilt bext outputs to reuse - BRL-CAD will simply copy and prepare
|
||||
the pre-existing files
|
||||
|
||||
cmake .. -DBRLCAD_EXT_DIR=/home/user/bext_output
|
||||
|
||||
* Already have an existing bext clone but want BRL-CAD to build bext outputs
|
||||
|
||||
cmake .. -DBRLCAD_EXT_SOURCE_DIR=/home/user/bext
|
||||
|
||||
* Download, build and bundle only what is needed for librt
|
||||
|
||||
cmake .. -DBRLCAD_COMPONENTS=librt
|
||||
|
||||
* Build and bundle only what is needed, but don't require internet for bext clone
|
||||
cmake .. -DBRLCAD_EXT_SOURCE_DIR=/home/user/bext -DBRLCAD_COMPONENTS=librt
|
||||
|
||||
|
||||
By default, the build system will prepare a Debug build and install into the
|
||||
/usr/brlcad/dev-X.Y.Z directory. The CMAKE_INSTALL_PREFIX option may be used
|
||||
to change that directory, or a Release build type may be specified to install
|
||||
to /usr/brlcad/rel-X.Y.Z - more on this below. The tradition of non-system
|
||||
installation paths goes back a couple of decades and is a convenient means to
|
||||
isolate the BRL-CAD solid modeling system from your system, resolves conflicts,
|
||||
facilitates uninstalls, and simplifies upgrades. The default configuration is
|
||||
performed by running `cmake'. It is not required to do the build in a
|
||||
directory different from your source directory, but it is much cleaner and
|
||||
*highly* recommended - this guide will illustrate the build process with the
|
||||
assumption that the BRL-CAD source code is in the directory brlcad-X.Y.Z and
|
||||
the directory intended to hold the build output is brlcad-build, located in the
|
||||
same parent directory as brlcad-X.Y.Z:
|
||||
|
||||
.
|
||||
./brlcad-X.Y.Z
|
||||
./brlcad-build
|
||||
|
||||
To start the build process, cd into brlcad-build and run CMake,
|
||||
pointing it to the source directory:
|
||||
|
||||
cd brlcad-build
|
||||
cmake ../brlcad-X.Y.Z
|
||||
|
||||
As mentioned earlier, CMake uses two "build types", controlled by
|
||||
the CMAKE_BUILD_TYPE variable, that are useful for specific purposes:
|
||||
|
||||
* Debug (-DCMAKE_BUILD_TYPE=Debug) - Debug is the configuration that most
|
||||
developers will want to use when working on BRL-CAD. It will add
|
||||
debug flags to the compile, and sets the default install directory to
|
||||
be /usr/brlcad/dev-X.Y.Z - in order to run the resulting installed
|
||||
binaries, the developer should ensure that the dev-X.Y.Z path is
|
||||
first in his or her PATH environment variable.
|
||||
|
||||
* Release (-DCMAKE_BUILD_TYPE=Release) - A release build is intended for
|
||||
final consumption by end users and as such has optimizations enabled.
|
||||
It also sets the install path to /usr/brlcad/rel-X.Y.Z - best practice
|
||||
for release installation is to set up symbolic links in /usr/brlcad to
|
||||
point to the most current BRL-CAD release, while allowing older versions
|
||||
to remain installed on the system in case they are needed.
|
||||
|
||||
In both of these cases any individual variable may be overridden - for
|
||||
example, setting -DCMAKE_INSTALL_PREFIX=/usr/brlcad in a Debug build will
|
||||
override the ../brlcad-install default. Build types are a convenient way
|
||||
to bundle sets of settings, but they do not prevent overrides if a more
|
||||
custom setup is needed.
|
||||
|
||||
If the autodetection mechanisms fail to produce a working configuration,
|
||||
the next simplest approach is typically to enable ALL the third party
|
||||
components - this is typically a well tested configuration, but will
|
||||
increase both the build time and final install size of BRL-CAD on
|
||||
the system. To set this variable on the command line, use -D to
|
||||
define ENABLE_ALL for CMake:
|
||||
|
||||
-DENABLE_ALL=ON
|
||||
|
||||
To obtain an optimized build (for example, for BRL-CAD Benchmark
|
||||
performance evaluation), enable BRLCAD_FLAGS_OPTIMIZATION:
|
||||
|
||||
-DBRLCAD_FLAGS_OPTIMIZATION=ON
|
||||
|
||||
See the CONFIGURATION OPTIONS below for more details on all of the
|
||||
possible settings.
|
||||
|
||||
Once configured, you should be able to successfully build BRL-CAD via
|
||||
make:
|
||||
|
||||
make
|
||||
|
||||
(On multicore systems, adding the -j flag (e.g. -j6) is recommended)
|
||||
|
||||
Installing the Compilation:
|
||||
|
||||
After the build successfully completes and assuming the benchmark also
|
||||
produces correct results, installation may begin. Like any package,
|
||||
you must have sufficient filesystem permissions to install. To
|
||||
install into a system location, you can generally either become a
|
||||
super user via the su command and run
|
||||
|
||||
make install
|
||||
|
||||
or on operating systems set up to use sudo:
|
||||
|
||||
sudo make install
|
||||
|
||||
|
||||
TESTING FUNCTIONALITY
|
||||
---------------------
|
||||
|
||||
The primary build target to validate a compilation of BRL-CAD is:
|
||||
|
||||
make check
|
||||
|
||||
That runs a trio of test sets including "benchmark", "regress", and
|
||||
"unit". The first set is a performance test that also validates
|
||||
whether ray tracing behavior is correct:
|
||||
|
||||
make benchmark
|
||||
|
||||
The second test set is our regression tests that run a host of
|
||||
rigorous integration tests and validate essential behavior:
|
||||
|
||||
make regress
|
||||
|
||||
The third set runs unit tests that validate low-level behavior in
|
||||
BRL-CAD's core libraries:
|
||||
|
||||
make unit
|
||||
|
||||
Last but not least, one may simply run all available tests, though
|
||||
note that some tests will intentionally fail:
|
||||
|
||||
make test
|
||||
|
||||
|
||||
POST-INSTALLATION
|
||||
-----------------
|
||||
|
||||
Permissions:
|
||||
|
||||
Something to be aware of with CMake installations is that umask settings
|
||||
are ignored by current versions of CMake. It is a common situation in
|
||||
Unix environments to want "group" members to have read/write access -
|
||||
to achieve this, after installation the following find command can be
|
||||
run (of course, substituting the actual BRL-CAD version for X.Y.Z):
|
||||
|
||||
find /usr/brlcad/rel-X.Y.Z -type d -exec chmod ug+rwx {} \; -exec chmod o+rx {} \; -o -type f -exec chmod ug+rw {} \; -exec chmod o+r {} \;
|
||||
|
||||
The above 'find' line will set up permissions across a /usr/brlcad
|
||||
rooted installation such that 'user' and 'group' will have read-write
|
||||
access and 'other' will have read access consistently across all
|
||||
files.
|
||||
|
||||
|
||||
System PATH:
|
||||
|
||||
Normally, BRL-CAD's install directories are not in system PATH lists and
|
||||
consequently BRL-CAD's executables will not be invocable without specifying
|
||||
their full path. This is normally handled in Unix environments by adding
|
||||
the desired BRL-CAD installation's binary directory to the user's local path:
|
||||
|
||||
On Windows, the PATH system variable can be set using System Utility
|
||||
in control panel. Add the bin/ folder in the install directory to PATH.
|
||||
|
||||
On Linux/BSD/other systems:
|
||||
In the bash shell: export PATH=/usr/brlcad/rel-X.Y.Z:$PATH
|
||||
In the csh shell: setenv PATH /usr/brlcad/rel-X.Y.Z:$PATH
|
||||
|
||||
|
||||
REPORTING PROBLEMS
|
||||
------------------
|
||||
|
||||
Please report any bugs, support requests, or feature requests to:
|
||||
https://github.com/BRL-CAD/brlcad/issues
|
||||
|
||||
|
||||
|
||||
CONFIGURATION OPTIONS
|
||||
---------------------
|
||||
|
||||
--- ENABLE_ALL ---
|
||||
|
||||
If set to ON, and the BRL-CAD configure process is managing the bext
|
||||
dependencies, instructs bext to default to building local copies of the
|
||||
dependencies it will enable per the BRL-CAD feature settings, rather than
|
||||
searching for system versions.
|
||||
|
||||
|
||||
--- BRLCAD_ENABLE_OPENGL ---
|
||||
|
||||
Enable support for OpenGL based Display Managers in BRL-CAD.
|
||||
Default depends on whether OpenGL is successfully detected -
|
||||
if it is, default is to enable.
|
||||
|
||||
Aliases: ENABLE_OPENGL
|
||||
|
||||
|
||||
--- BRLCAD_X11_PROVIDER ---
|
||||
|
||||
Selects the X11 implementation used by BRL-CAD, Tk, Qt, and OpenGL. Accepted
|
||||
values are AUTO, SYSTEM, and XMIN. AUTO is the default and deliberately
|
||||
resolves to SYSTEM so installing Xmin cannot change an existing build.
|
||||
|
||||
XMIN selects an installed Xmin client SDK for deterministic GUI testing
|
||||
without a host X server. The SDK must provide Xmin::ToolkitX11; OpenGL builds
|
||||
also need Xmin::GL. Set Xmin_ROOT to the SDK installation prefix. Tk and Qt
|
||||
must be built for the same provider because their public X11 APIs conceal
|
||||
provider-private state; mixing Xmin and system client libraries is not ABI
|
||||
safe and is rejected during configuration.
|
||||
|
||||
When BRL-CAD manages bext, it derives the matching bext SDK prefix from the
|
||||
selected Xmin package. Bext then applies its version-matched Tk and Qt patches
|
||||
automatically to whichever bundled toolkits are selected. No external patch
|
||||
paths are needed.
|
||||
|
||||
A typical Xmin configuration is:
|
||||
|
||||
cmake .. -DBRLCAD_X11_PROVIDER=XMIN \
|
||||
-DXmin_ROOT=/path/to/xmin-prefix
|
||||
|
||||
Bext retains advanced TK_EXTRA_PATCHES, TK_CONFIGURE_ARGS, QT_EXTRA_PATCHES,
|
||||
and QT_XMIN_ROOT controls for custom profiles. The standard BRL-CAD Xmin
|
||||
configuration does not need them. Refer to bext's Xmin profile documentation
|
||||
before changing the bundled Tk or Qt revision.
|
||||
|
||||
|
||||
--- BRLCAD_COMPONENTS ---
|
||||
|
||||
Semicolon separated list of components to enable for building - see
|
||||
src/source_dirs.cmake for a list of the components that may be specified.
|
||||
|
||||
|
||||
--- BRLCAD_ENABLE_RUNTIME_DEBUG ---
|
||||
|
||||
Enables support for application and library debugging facilities.
|
||||
Disabling the run-time debugging facilities can provide a significant
|
||||
(10%-30%) performance boost at the expense of extensive error
|
||||
checking (that in turn help prevent corruption of your data).
|
||||
Default is "ON", and should only be disabled for read-only render
|
||||
work where performance is critical.
|
||||
|
||||
Aliases: ENABLE_RUNTIME_DEBUG, ENABLE_RUN_TIME_DEBUG, ENABLE_RUNTIME_DEBUGGING
|
||||
ENABLE_RUN_TIME_DEBUGGING
|
||||
|
||||
|
||||
--- BRLCAD_REPOSITORY_ROOT ---
|
||||
|
||||
Repository URL or local directory containing bext and its dependency
|
||||
repositories. Defaults to https://github.com/BRL-CAD. The root directly
|
||||
contains repositories such as bext.git and astyle.git; BRL-CAD does not
|
||||
append BRL-CAD to the root.
|
||||
|
||||
Remote Git URLs (including SSH), native paths, and file:// URLs are supported.
|
||||
Relative native paths are resolved against the BRL-CAD source directory.
|
||||
Quote the entire -D argument for paths containing spaces. The setting is
|
||||
cached and is also passed as BEXT_REPOSITORY_ROOT when BRL-CAD configures
|
||||
bext, including when BRLCAD_EXT_SOURCE_DIR supplies an existing checkout.
|
||||
Alternate roots require bext sources with BEXT_REPOSITORY_ROOT support.
|
||||
|
||||
Local roots restrict CMake-driven Git acquisition and queries to file
|
||||
transport, with no online fallback. Mirrors must contain all required pinned
|
||||
commits and recursive submodules. Dependencies outside bext's canonical URL
|
||||
prefix require their own Git URL mappings. This setting does not restrict
|
||||
network access by dependency build scripts or change persistent Git settings.
|
||||
BRLCAD_EXT_DIR still selects prebuilt outputs, and changing the repository
|
||||
root alone does not force those outputs to be rebuilt.
|
||||
|
||||
To return to the default source:
|
||||
|
||||
cmake .. -DBRLCAD_REPOSITORY_ROOT=https://github.com/BRL-CAD
|
||||
|
||||
|
||||
--- BRLCAD_EXT_DIR ---
|
||||
|
||||
If specified, BRL-CAD will look in this directory for bext compiled outputs to
|
||||
bundle and use during the build. Relative paths are resolved against the
|
||||
BRL-CAD source directory. Distcheck subconfigures reuse this resolved output
|
||||
directory and preserve BRLCAD_REPOSITORY_ROOT, BRLCAD_EXT_SOURCE_DIR, and
|
||||
BRLCAD_EXT_PARALLEL when specified.
|
||||
|
||||
|
||||
--- BRLCAD_EXT_SOURCE_DIR ---
|
||||
|
||||
If specified, BRL-CAD will look in this directory for bext source files. Use
|
||||
this when you have a pre-existing bext clone and don't want BRL-CAD's configure
|
||||
process to pull down another copy, but are still looking to have the BRL-CAD
|
||||
configure process manage producing bext build outputs. Relative paths are
|
||||
resolved against the BRL-CAD source directory.
|
||||
|
||||
|
||||
--- BRLCAD_EXT_PARALLEL ---
|
||||
|
||||
This number, when specified, describes how many compilation threads to use
|
||||
when compiling bext sources. Default is 8.
|
||||
|
||||
|
||||
--- BRLCAD_DEBUGGING ---
|
||||
|
||||
Add compiler flags to aid in program debugging. Defaults to ON.
|
||||
|
||||
Aliases: ENABLE_DEBUG, ENABLE_FLAGS_DEBUG, ENABLE_DEBUG_FLAGS
|
||||
BRLCAD_FLAGS_DEBUG
|
||||
|
||||
|
||||
--- BRLCAD_PGO ---
|
||||
|
||||
Enable profile-guided optimization build flags. Defaults to OFF.
|
||||
|
||||
Profile-guided optimization builds are possible via two-pass
|
||||
compilation. Compile with this flag set, run the benchmark suite,
|
||||
clean the build, and then compile again with this flag set. Supported
|
||||
compilers will utilize data from the first pass to guide optimization,
|
||||
typically resulting in a significant performance increase:
|
||||
|
||||
|
||||
--- BRLCAD_WARNINGS ---
|
||||
|
||||
Use extra warning flags when compiling C/C++ code. Defaults to ON.
|
||||
|
||||
Aliases: ENABLE_WARNINGS, ENABLE_COMPILER_WARNINGS
|
||||
BRLCAD_ENABLE_COMPILER_WARNINGS
|
||||
|
||||
|
||||
--- BRLCAD_ENABLE_STRICT ---
|
||||
|
||||
Causes all compilation warnings for C code to be treated as errors. This is now
|
||||
the default for BRL-CAD source code, and developers should address issues
|
||||
discovered by these flags whenever possible rather than disabling strict
|
||||
mode.
|
||||
|
||||
Aliases: ENABLE_STRICT, ENABLE_STRICT_COMPILE, ENABLE_STRICT_COMPILE_FLAGS
|
||||
|
||||
|
||||
--- ENABLE_ALL_CXX_COMPILE ---
|
||||
|
||||
Build all C and C++ files with a C++ compiler. Defaults to OFF.
|
||||
|
||||
EXPERIMENTAL!
|
||||
|
||||
Aliases: ENABLE_ALL_CXX
|
||||
|
||||
|
||||
--- BRLCAD_EXTRADOCS ---
|
||||
|
||||
The core option that enables and disables building of BRL-CAD's
|
||||
AsciiDoc based documentation (includes manuals and man pages for
|
||||
commands, among other things). It is built with BRL-CAD's bundled
|
||||
asciiquack processor into HTML and man-page (troff) formats. Defaults
|
||||
to ON for a full build and OFF for reduced target sets.
|
||||
|
||||
Aliases: ENABLE_DOCS, ENABLE_EXTRA_DOCS
|
||||
|
||||
-3677
File diff suppressed because it is too large.
Load diff
@@ -1,183 +0,0 @@
|
||||
BRL-CAD
|
||||
Release 7.46.0
|
||||
http://brlcad.org/
|
||||
|
||||
BRL-CAD is a powerful cross-platform open source combinatorial
|
||||
solid modeling system that includes an interactive 3D solid geometry
|
||||
editor, a network-distributed symmetric multiprocessing (SMP)
|
||||
high-performance ray-tracer with support for rendering and geometric
|
||||
analysis, image and signal-processing tools, a system performance
|
||||
analysis benchmark suite, a flexible geometry scripting interface,
|
||||
and a high-performance geometric representation and analysis library.
|
||||
|
||||
|
||||
TABLE OF CONTENTS
|
||||
-----------------
|
||||
Introduction
|
||||
Table of Contents
|
||||
Getting Started
|
||||
Compile and Install
|
||||
Benchmark
|
||||
Communication
|
||||
Bug Reports/Feature Requests
|
||||
Distribution Details
|
||||
Background Information
|
||||
|
||||
|
||||
GETTING STARTED
|
||||
---------------
|
||||
|
||||
This README file exists only to provide you a brief roadmap to the
|
||||
contents of the BRL-CAD distribution.
|
||||
|
||||
Some platforms have additional platform-specific documentation that
|
||||
should be consulted after reading this file:
|
||||
|
||||
doc/README.Windows -- Microsoft Windows
|
||||
doc/README.MacOSX -- Apple Mac OS X
|
||||
doc/README.Linux -- Various Linux distributions
|
||||
doc/README.* -- Other platforms, e.g., BSD, VAX
|
||||
|
||||
Information on how to install and run the software, to get involved
|
||||
with development, or to run the performance benchmark test suite are
|
||||
covered in detail in separate standalone documents. For more details
|
||||
on what BRL-CAD provides, consult the main website.
|
||||
|
||||
Information relevant to the source code is contained in the HACKING
|
||||
(developer guide) and COPYING (legal overview) files.
|
||||
|
||||
Note that only sample geometry models are included in public
|
||||
distributions of BRL-CAD. Detailed models are only available through
|
||||
official U.S. Gov't channels, e.g., via Advanced Joint Effectiveness
|
||||
Model (AJEM) support.
|
||||
|
||||
|
||||
COMPILE AND INSTALL
|
||||
-------------------
|
||||
|
||||
In order to compile and install BRL-CAD from a source distribution,
|
||||
the latest CMake ( http://www.cmake.org ), a recent compiler, and at
|
||||
least 3GB of disk space are recommended. More details are available
|
||||
at https://brlcad.org/wiki/Compiling
|
||||
|
||||
Typically, the following steps should result in a successful install:
|
||||
|
||||
tar -xvzf brlcad-VERSION.tar.gz
|
||||
mkdir brlcad-VERSION/build
|
||||
cd brlcad-VERSION/build
|
||||
cmake .. -DBRLCAD_ENABLE_STRICT=OFF -DCMAKE_BUILD_TYPE=Release
|
||||
make -j4
|
||||
make install
|
||||
|
||||
See the included INSTALL text file for explanation of the various
|
||||
cmake configuration options available for building BRL-CAD.
|
||||
|
||||
|
||||
BENCHMARK
|
||||
---------
|
||||
|
||||
After the build successfully completes, you will be able to verify
|
||||
basic functionality by running the BRL-CAD Benchmark. Running the
|
||||
benchmark suite is integrated into the build system such that any time
|
||||
after running CMake (in the cmake gui, configure and generate must both
|
||||
be performed) you may run:
|
||||
|
||||
make benchmark
|
||||
|
||||
If the build is successful, you will see "CORRECT" numbers and a
|
||||
performance summary at the end. The "vgr" line effectively shows you
|
||||
approximately how much faster your machine is to a VAX 11/780. After
|
||||
installing BRL-CAD, you may run the 'benchmark' tool as well to run
|
||||
the BRL-CAD Benchmark.
|
||||
|
||||
See the paper in doc/benchmark.tr for information on analyzing and
|
||||
comparing the results of the benchmark tests in more detail.
|
||||
|
||||
|
||||
COMMUNICATION
|
||||
-------------
|
||||
|
||||
There are various BRL-CAD mailing lists available including three
|
||||
developer-oriented lists, a user list, and a read-only news
|
||||
announcement list:
|
||||
|
||||
http://sourceforge.net/mail/?group_id=105292
|
||||
|
||||
For interactive discussion, please join our Zulip chat:
|
||||
|
||||
https://brlcad.zulipchat.com
|
||||
|
||||
|
||||
BUG REPORTS AND FEATURE REQUESTS
|
||||
--------------------------------
|
||||
|
||||
Please submit all bugs, support requests, and feature requests to:
|
||||
|
||||
https://github.com/BRL-CAD/brlcad/issues
|
||||
|
||||
|
||||
DISTRIBUTION DETAILS
|
||||
--------------------
|
||||
|
||||
BRL-CAD releases are available at:
|
||||
|
||||
https://github.com/BRL-CAD/brlcad/releases
|
||||
|
||||
Assets stored for each release will always include source archives,
|
||||
and usually binary compilations for commonly used operating systems.
|
||||
|
||||
For developers, BRL-CAD is available via Git version control cloning:
|
||||
|
||||
https://github.com/BRL-CAD/brlcad
|
||||
|
||||
|
||||
BACKGROUND INFORMATION
|
||||
----------------------
|
||||
|
||||
BRL-CAD is the primary tri-service solid modeling CAD system used by
|
||||
the U.S. military to model weapons systems for vulnerability and
|
||||
lethality analyses. The solid modeling system is frequently used in a
|
||||
wide range of military and industrial application including in the
|
||||
design and analysis of vehicles, mechanical parts, and architecture.
|
||||
The package has also been used in radiation dose planning, medical
|
||||
visualization, computer graphics education, CSG concepts and modeling
|
||||
education, and system performance benchmark testing among other
|
||||
purposes.
|
||||
|
||||
Actively developed since 1979, BRL-CAD is a collection of more than
|
||||
400 tools, utilities, and applications comprising more than a million
|
||||
lines of source code. BRL-CAD supports a great variety of geometric
|
||||
representations including an extensive set of traditional CSG
|
||||
primitive implicit solids such as boxes, ellipsoids, cones, and tori,
|
||||
as well as explicit solids made from closed collections of Uniform
|
||||
B-Spline Surfaces, Non-Uniform Rational B-Spline (NURBS) surfaces,
|
||||
n-Manifold Geometry (NMG), and purely faceted mesh geometry. All
|
||||
geometric objects may be combined using boolean set-theoretic CSG
|
||||
operations including union, intersection, and difference.
|
||||
|
||||
BRL-CAD has been under active development for more than 20 years with
|
||||
a portability heritage that includes systems such as a DEC VAX-11/780
|
||||
running 4.3 BSD; DECStations running ULTRIX; Silicon Graphics 3030, 4D
|
||||
"IRIS", O2, Onyx, and Origin systems running various versions of IRIX;
|
||||
Sun Microsystems Sun-3 and Sun-4 Sparcs running SunOS; the Cray 1,
|
||||
Cray X-MP, Cray Y-MP, and Cray 2 running UNICOS; DEC Alpha AXP running
|
||||
OSF/1; Apple Macintosh II running A/UX; iPSC/860 Hypercube running
|
||||
NX/2; the Alliant FX/8, FX/80, and FX/2800; Gould/Encore SEL PowerNode
|
||||
6000/9000 and NP1; NeXT workstations; IBM RS/6000; HPPA 9000/700
|
||||
running HPUX; Ardent/Stardent; Encore Multi-Max; and much much more.
|
||||
BRL-CAD's extensive portability of course also includes a plethora of
|
||||
common desktop and server versions of BSD, IRIX, Solaris, Mac OS X,
|
||||
Linux, and Windows.
|
||||
|
||||
The BRL-CAD package is intentionally designed to be extensively
|
||||
cross-platform and is actively developed on and maintained for many
|
||||
common operating system environments including various BSD
|
||||
distributions, Linux, Solaris, Mac OS X, and Windows. The entire
|
||||
package is distributed in binary and source code form as free open
|
||||
source software (FOSS), provided under Open Source Initiative (OSI)
|
||||
approved license terms. BRL-CAD was released as open source in
|
||||
December 2004. See the COPYING file for more details.
|
||||
|
||||
Best Wishes,
|
||||
The BRL-CAD Development Team
|
||||
devs@brlcad.org
|
||||
@@ -1,106 +0,0 @@
|
||||
add_subdirectory(ref)
|
||||
|
||||
add_definitions(-DCONSOLE)
|
||||
|
||||
brlcad_addexec(pixcmp pixcmp.c libbu)
|
||||
brlcad_add_test(
|
||||
NAME bench_pixcmp_tolerance
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} "-DPIXCMP=$<TARGET_FILE:pixcmp>" "-DTEST_DIR=${CMAKE_CURRENT_BINARY_DIR}"
|
||||
-P "${CMAKE_CURRENT_SOURCE_DIR}/pixcmp_test.cmake"
|
||||
)
|
||||
set(BARK_SOURCES benchmark.c compute.c run.c clean.c)
|
||||
brlcad_addexec(bark "${BARK_SOURCES}" "libbu;${M_LIBRARY}" NO_STRICT NO_INSTALL TEST_USESDATA)
|
||||
|
||||
if(BUILD_TESTING)
|
||||
configure_file(run.sh "${CMAKE_CURRENT_BINARY_DIR}/benchmark" COPYONLY)
|
||||
install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/benchmark" DESTINATION ${BIN_DIR})
|
||||
endif(BUILD_TESTING)
|
||||
distclean("${CMAKE_CURRENT_BINARY_DIR}/benchmark")
|
||||
|
||||
if(BUILD_TESTING)
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/benchmark-done
|
||||
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/run.sh $<TARGET_FILE_DIR:bark>/benchmark
|
||||
COMMAND "${CMAKE_COMMAND}" -E touch ${CMAKE_CURRENT_BINARY_DIR}/benchmark-done
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/run.sh
|
||||
)
|
||||
add_custom_target(benchmark_cp ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/benchmark-done)
|
||||
set_target_properties(benchmark_cp PROPERTIES FOLDER "Benchmark")
|
||||
endif(BUILD_TESTING)
|
||||
distclean(${CMAKE_BINARY_DIR}/${BIN_DIR}/benchmark)
|
||||
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/CMakeTmp/benchmsg.cmake" "message(\"---\")\n")
|
||||
file(
|
||||
APPEND
|
||||
"${CMAKE_BINARY_DIR}/CMakeTmp/benchmsg.cmake"
|
||||
"message(\"Run 'make benchmark-clean' in the bench directory to delete the logic\")\n"
|
||||
)
|
||||
file(
|
||||
APPEND
|
||||
"${CMAKE_BINARY_DIR}/CMakeTmp/benchmsg.cmake"
|
||||
"message(\"and image files generated during the benchmark analysis.\")\n"
|
||||
)
|
||||
|
||||
cmakefiles(
|
||||
CMakeLists.txt
|
||||
pixcmp_test.cmake
|
||||
run.sh
|
||||
try.sh
|
||||
viewdiff.sh
|
||||
)
|
||||
|
||||
if(SH_EXEC AND TARGET m35.g AND BUILD_TESTING)
|
||||
# CTest enabled short run of the benchmark suite
|
||||
brlcad_add_test(NAME benchmark COMMAND ${SH_EXEC} "$<TARGET_FILE_DIR:bark>/benchmark" run TIMEFRAME=1)
|
||||
set_tests_properties(benchmark PROPERTIES LABELS "Benchmark")
|
||||
add_custom_target(
|
||||
benchmark-check
|
||||
COMMAND ${CMAKE_CTEST_COMMAND} -L Benchmark --output-on-failure
|
||||
DEPENDS rt pixcmp BENCHMARK_PIX_cp PIX_LOG_cp benchmark_cp
|
||||
)
|
||||
add_dependencies(
|
||||
benchmark-check
|
||||
bldg391.g
|
||||
m35.g
|
||||
moss.g
|
||||
sphflake.g
|
||||
star.g
|
||||
world.g
|
||||
)
|
||||
set_target_properties(benchmark-check PROPERTIES FOLDER "Benchmark")
|
||||
if(TARGET check)
|
||||
add_dependencies(check benchmark-check)
|
||||
endif(TARGET check)
|
||||
|
||||
# Full run of the benchmark suite
|
||||
add_custom_target(
|
||||
benchmark
|
||||
COMMAND ${SH_EXEC} $<TARGET_FILE_DIR:bark>/benchmark run
|
||||
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/CMakeTmp/benchmsg.cmake"
|
||||
DEPENDS rt pixcmp BENCHMARK_PIX_cp PIX_LOG_cp benchmark_cp
|
||||
)
|
||||
add_dependencies(
|
||||
benchmark
|
||||
bldg391.g
|
||||
m35.g
|
||||
moss.g
|
||||
sphflake.g
|
||||
star.g
|
||||
world.g
|
||||
)
|
||||
set_target_properties(benchmark PROPERTIES FOLDER "Benchmark")
|
||||
|
||||
# benchmark cleanup targets
|
||||
add_custom_target(benchmark-clean ${SH_EXEC} ${CMAKE_BINARY_DIR}/bin/benchmark clean)
|
||||
set_target_properties(benchmark-clean PROPERTIES FOLDER "Benchmark")
|
||||
add_custom_target(benchmark-clobber ${SH_EXEC} ${CMAKE_BINARY_DIR}/bin/benchmark clobber)
|
||||
set_target_properties(benchmark-clobber PROPERTIES FOLDER "Benchmark")
|
||||
endif(SH_EXEC AND TARGET m35.g AND BUILD_TESTING)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width: 8
|
||||
# mode: cmake
|
||||
# indent-tabs-mode: t
|
||||
# End:
|
||||
# ex: shiftwidth=2 tabstop=8
|
||||
@@ -1,953 +0,0 @@
|
||||
/* B E N C H M A R K . C
|
||||
* BRL-CAD
|
||||
*
|
||||
* Copyright (c) 2011-2026 United States Government as represented by
|
||||
* the U.S. Army Research Laboratory.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/** @file benchmark.c
|
||||
*
|
||||
* This is the BRL-CAD Benchmark.
|
||||
*
|
||||
* The benchmark suite will test the performance of a system by
|
||||
* iteratively rendering several well-known datasets into 512x512
|
||||
* images where performance metrics are documented and fairly well
|
||||
* understood. The local machine's performance is compared to the
|
||||
* base system (called VGR) and a numeric "VGR" multiplier of
|
||||
* performance is computed. This number is a simplified metric from
|
||||
* which one may qualitatively compare cpu and cache performance,
|
||||
* versions of BRL-CAD, and different compiler characteristics.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
/* TODO - fall back on https://github.com/sandsmark/winuname for Windows? */
|
||||
#ifdef HAVE_SYS_UTSNAME_H
|
||||
# include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#include "bio.h"
|
||||
|
||||
#include "bu.h"
|
||||
|
||||
|
||||
/* TODO: !!! probably will need variants of these */
|
||||
int bu_exec(const char *program, void *data, struct bu_vls *out, struct bu_vls *err) {if (!program || !out || !err || !data) return 1; return 0;}
|
||||
int bu_grep(const char *pattern, const char *input, int(*callback)(const char *line, void *data), void *data) {if (!pattern || !input || !data) return 1; if (!callback) bu_log("TODO: need default callback!!!\n"); return 0;}
|
||||
int bu_file_glob(const char *pattern, char **paths) {if (!pattern || !paths) return 1; return 0;}
|
||||
const char *format_elapsed(double elapsed) {if (elapsed > 0) return "0 1 2"; return "-0 -1 -2";}
|
||||
int perf(const struct bu_vls *vp, const char *items, const char *args[]) {if (!vp || !items || !args) return -1; return 0;}
|
||||
double calculate_vgr(const struct bu_vls *summary) {if (!summary) return -0.0; return 0.0;}
|
||||
extern int bench(const char *cmd);
|
||||
|
||||
|
||||
/**
|
||||
* this routine writes the provided argument(s) to a log file as well
|
||||
* as echoing them to stdout if we're not in quiet mode.
|
||||
*/
|
||||
static void
|
||||
record(const char *fmt, ...)
|
||||
{
|
||||
struct bu_vls str = BU_VLS_INIT_ZERO;
|
||||
va_list ap;
|
||||
|
||||
const char *LOGFILE = getenv("LOGFILE");
|
||||
const char *QUIET = getenv("QUIET");
|
||||
|
||||
if (!fmt) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
bu_vls_vprintf(&str, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (!BU_STR_EQUAL(LOGFILE, "")) {
|
||||
FILE *fp = fopen(LOGFILE, "a");
|
||||
fprintf(fp, "%s", bu_vls_addr(&str));
|
||||
fclose(fp);
|
||||
}
|
||||
if (bu_str_false(QUIET)) {
|
||||
bu_log("%s", bu_vls_addr(&str));
|
||||
}
|
||||
|
||||
bu_vls_free(&str);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
display(const char *fmt, ...)
|
||||
{
|
||||
struct bu_vls str = BU_VLS_INIT_ZERO;
|
||||
va_list ap;
|
||||
|
||||
if (!fmt) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
bu_vls_vprintf(&str, fmt, ap);
|
||||
va_end(ap);
|
||||
bu_log("%s", bu_vls_cstr(&str));
|
||||
|
||||
bu_vls_free(&str);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sink(const char *fmt, ...)
|
||||
{
|
||||
if (!fmt) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************
|
||||
* search for resources *
|
||||
************************/
|
||||
typedef enum {
|
||||
executable=0x1,
|
||||
file=0x2,
|
||||
directory=0x4,
|
||||
script=0x8
|
||||
} look_for_type_t;
|
||||
|
||||
#define TYPE2STR(_t) \
|
||||
((_t) == executable) ? "executable" : \
|
||||
((_t) == file) ? "file" : \
|
||||
((_t) == directory) ? "directory" : \
|
||||
((_t) == script) ? "script" : \
|
||||
"unknown"
|
||||
|
||||
static void
|
||||
look_for(void (*verbose)(const char *, ...), look_for_type_t type, const char *label, const char *var, const char*paths[])
|
||||
{
|
||||
char *val;
|
||||
|
||||
/* utility function to search for a certain filesystem object in a
|
||||
* list of paths.
|
||||
*/
|
||||
|
||||
if (!var || !paths) {
|
||||
return;
|
||||
}
|
||||
if (!verbose) {
|
||||
verbose = sink;
|
||||
}
|
||||
|
||||
verbose("Looking for %s\n", label);
|
||||
|
||||
/* get the value of the variable */
|
||||
val = getenv(var);
|
||||
|
||||
if (val && (strlen(val) > 0)) {
|
||||
if (label) {
|
||||
verbose("...using %s from %s variable setting\n", val, var);
|
||||
}
|
||||
} else {
|
||||
while (paths && *paths) {
|
||||
int failed=0;
|
||||
|
||||
switch (type) {
|
||||
default:
|
||||
case directory:
|
||||
/* should work without read bit */
|
||||
if (!bu_file_directory(*paths)) {
|
||||
failed=1;
|
||||
}
|
||||
/* fall through */
|
||||
case executable:
|
||||
case script:
|
||||
if (!bu_file_executable(*paths)) {
|
||||
failed=1;
|
||||
}
|
||||
break;
|
||||
case file:
|
||||
if (!bu_file_exists(*paths, NULL)) {
|
||||
failed=1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!failed) {
|
||||
verbose("...found %s %s\n", TYPE2STR(type), *paths);
|
||||
bu_setenv(var, *paths, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
paths++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
set_if_unset(void (*echo)(const char *, ...), void (*verbose)(const char *, ...), const char *var, const char *val)
|
||||
{
|
||||
if (!var || !val) {
|
||||
return;
|
||||
}
|
||||
|
||||
const char *setval = getenv(var);
|
||||
|
||||
if (!echo) {
|
||||
echo = sink;
|
||||
}
|
||||
|
||||
if (!verbose) {
|
||||
verbose = sink;
|
||||
}
|
||||
|
||||
if (!setval || (strlen(setval) == 0)) {
|
||||
verbose("%s=\"%s\"\n", var, val);
|
||||
bu_setenv(var, val, 1);
|
||||
}
|
||||
|
||||
setval = getenv(var);
|
||||
echo("Using [%s] for %s\n", setval ? setval : "", var);
|
||||
}
|
||||
|
||||
|
||||
/* callback to bu_grep() */
|
||||
static int
|
||||
stashline(const char *line, void *data)
|
||||
{
|
||||
struct bu_vls *vls = (struct bu_vls *)data;
|
||||
|
||||
BU_CK_VLS(vls);
|
||||
|
||||
bu_vls_printf(vls, "%s\n", line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int ac, char *av[])
|
||||
{
|
||||
int arg;
|
||||
struct bu_vls rtargs = BU_VLS_INIT_ZERO;
|
||||
struct bu_vls str = BU_VLS_INIT_ZERO;
|
||||
|
||||
const char *RT = NULL;
|
||||
const char *DB = NULL;
|
||||
const char *PIX = NULL;
|
||||
const char *LOG = NULL;
|
||||
const char *CMP = NULL;
|
||||
const char *ELP = NULL;
|
||||
|
||||
char root[MAXPATHLEN] = {0};
|
||||
char db[MAXPATHLEN] = {0};
|
||||
char pix[MAXPATHLEN] = {0};
|
||||
char thisp[MAXPATHLEN] = {0};
|
||||
char *argv[MAXPATHLEN] = {NULL};
|
||||
struct bu_vls vp = BU_VLS_INIT_ZERO;
|
||||
|
||||
long MAXTIME = 0;
|
||||
long TIMEFRAME = 0;
|
||||
|
||||
int64_t start = 0;
|
||||
int ret = 0;
|
||||
|
||||
void (*verbose_echo)(const char *, ...) = sink;
|
||||
void (*echo)(const char *, ...) = record;
|
||||
|
||||
bu_setprogname(av[0]);
|
||||
|
||||
/* process the argument list for commands */
|
||||
for (arg=1; arg<ac; arg++) {
|
||||
if (BU_STR_EQUAL(av[arg], "clean")) {
|
||||
bu_setenv("CLEAN", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "clobber")) {
|
||||
bu_setenv("CLEAN", "1", 1);
|
||||
bu_setenv("CLOBBER", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "h")) {
|
||||
bu_setenv("HELP", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "help")) {
|
||||
bu_setenv("HELP", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (bu_strncasecmp(av[arg], "instruct", 8)) {
|
||||
bu_setenv("INSTRUCTIONS", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "start")) {
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "quiet")) {
|
||||
bu_setenv("QUIET", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "verbose")) {
|
||||
bu_setenv("VERBOSE", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (BU_STR_EQUAL(av[arg], "run")) {
|
||||
bu_setenv("RUN", "1", 1);
|
||||
continue;
|
||||
}
|
||||
if (strchr(av[arg], '=')) {
|
||||
/* TODO: !!! make sure this still works */
|
||||
char *var = bu_strdup(av[arg]);
|
||||
char *val = strtok(var, "=");
|
||||
if (var && val) {
|
||||
bu_setenv(var, val, 1);
|
||||
}
|
||||
bu_free(var, "strdup av[arg]");
|
||||
continue;
|
||||
}
|
||||
bu_log("WARNING: Passing unknown option [%s] to RT\n", av[arg]);
|
||||
bu_vls_printf(&rtargs, " %s", av[arg]);
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* handle help before main processing
|
||||
***/
|
||||
if (bu_str_true(getenv("HELP"))) {
|
||||
bu_log("Usage: %s [command(s)] [OPTION=value] [RT_OPTIONS]\n", av[0]);
|
||||
bu_log("\n");
|
||||
bu_log("Available commands:\n");
|
||||
bu_log(" clean\n");
|
||||
bu_log(" clobber\n");
|
||||
bu_log(" help (this is what you are reading right now)\n");
|
||||
bu_log(" instructions\n");
|
||||
bu_log(" quiet\n");
|
||||
bu_log(" verbose\n");
|
||||
bu_log(" run (this is probably what you want)\n");
|
||||
bu_log("\n");
|
||||
bu_log("Available options:\n");
|
||||
bu_log(" RT=/path/to/rt_binary (e.g., rt)\n");
|
||||
bu_log(" DB=/path/to/reference/geometry (e.g. ../db)\n");
|
||||
bu_log(" PIX=/path/to/reference/images (e.g., ../pix)\n");
|
||||
bu_log(" LOG=/path/to/reference/logs (e.g., ../pix)\n");
|
||||
bu_log(" CMP=/path/to/pixcmp_tool (e.g., pixcmp)\n");
|
||||
bu_log(" ELP=/path/to/time_tool (e.g., elapsed.sh)\n");
|
||||
bu_log(" TIMEFRAME=#seconds (default 32)\n");
|
||||
bu_log(" MAXTIME=#seconds (default 300)\n");
|
||||
bu_log(" DEVIATION=%%deviation (default 3)\n");
|
||||
bu_log(" AVERAGE=#frames (default 3)\n");
|
||||
bu_log("\n");
|
||||
bu_log("Available RT options:\n");
|
||||
bu_log(" -P# (e.g., -P1 to force single CPU)\n");
|
||||
bu_log(" See the 'rt' manpage for additional options\n");
|
||||
bu_log("\n");
|
||||
bu_log("The BRL-CAD Benchmark tests the overall performance of a system\n");
|
||||
bu_log("compared to a stable well-known baseline. The Benchmark calculates a\n");
|
||||
bu_log("figure-of-merit for this system that may be directly compared to other\n");
|
||||
bu_log("Benchmark runs on other system configurations.\n");
|
||||
bu_log("\n");
|
||||
bu_log("BRL-CAD is a powerful cross-platform open source solid modeling system.\n");
|
||||
bu_log("For more information about BRL-CAD, see http://brlcad.org\n");
|
||||
bu_log("\n");
|
||||
bu_log("Run '%s instructions' or see the manpage for additional information.\n", av[0]);
|
||||
bu_exit(1, NULL);
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* handle instructions before main processing
|
||||
***/
|
||||
if (bu_str_true(getenv("INSTRUCTIONS"))) {
|
||||
bu_log("\n");
|
||||
bu_log("This program runs the BRL-CAD Benchmark. The benchmark suite will\n");
|
||||
bu_log("test the performance of a system by iteratively rendering several\n");
|
||||
bu_log("well-known datasets into 512x512 images where performance metrics are\n");
|
||||
bu_log("documented and fairly well understood. The local machine's\n");
|
||||
bu_log("performance is compared to the base system (called VGR) and a numeric\n");
|
||||
bu_log("\"VGR\" multiplier of performance is computed. This number is a\n");
|
||||
bu_log("simplified metric from which one may qualitatively compare cpu and\n");
|
||||
bu_log("cache performance, versions of BRL-CAD, and different compiler\n");
|
||||
bu_log("characteristics.\n");
|
||||
bu_log("\n");
|
||||
bu_log("The suite is intended to be run from a source distribution of BRL-CAD\n");
|
||||
bu_log("after the package has been compiled either directly or via a make\n");
|
||||
bu_log("build system target. There are, however, several environment\n");
|
||||
bu_log("variables that will modify how the BRL-CAD benchmark behaves so that\n");
|
||||
bu_log("it may be run in a stand-alone environment:\n");
|
||||
bu_log("\n");
|
||||
bu_log(" RT - the rt binary (e.g. ../src/rt/rt or /usr/brlcad/bin/rt)\n");
|
||||
bu_log(" DB - the directory containing the reference geometry (e.g. ../db)\n");
|
||||
bu_log(" PIX - the directory containing the reference images (e.g. ../pix)\n");
|
||||
bu_log(" LOG - the directory containing the reference logs (e.g. ../pix)\n");
|
||||
bu_log(" CMP - the name of a pixcmp tool (e.g. ./pixcmp or cmp)\n");
|
||||
bu_log(" ELP - the name of an elapsed time tool (e.g. ../sh/elapsed.sh)\n");
|
||||
bu_log(" TIMEFRAME - the minimum number of seconds each trace needs to take\n");
|
||||
bu_log(" MAXTIME - the maximum number of seconds to spend on any test\n");
|
||||
bu_log(" DEVIATION - the minimum sufficient %% deviation from the average\n");
|
||||
bu_log(" AVERAGE - how many frames to average together\n");
|
||||
bu_log(" VERBOSE - turn on extra debug output for testing/development\n");
|
||||
bu_log(" QUIET - turn off all printing output (writes results to summary)\n");
|
||||
bu_log(" INSTRUCTIONS - display detailed instructions\n");
|
||||
bu_log(" RUN - start a benchmark analysis\n");
|
||||
bu_log("\n");
|
||||
bu_log("The TIMEFRAME, MAXTIME, DEVIATION, and AVERAGE options control how the\n");
|
||||
bu_log("benchmark will proceed including how long it should take. Each\n");
|
||||
bu_log("individual benchmark run will consume at least a minimum TIMEFRAME of\n");
|
||||
bu_log("wallclock time so that the results can stabilize. After consuming at\n");
|
||||
bu_log("least the minimum TIMEFRAME, additional frames may be computed until\n");
|
||||
bu_log("the standard deviation from the last AVERAGE count of frames is below\n");
|
||||
bu_log("the specified DEVIATION. When a test is run and it completes in less\n");
|
||||
bu_log("than TIMEFRAME, the raytrace is restarted using double the number of\n");
|
||||
bu_log("rays from the previous run. If the machine is fast enough, the\n");
|
||||
bu_log("benchmark may accelerate the number or rays being fired. These\n");
|
||||
bu_log("additional rays are hypersampled but without any jitter, so it's\n");
|
||||
bu_log("effectively performing a multiplier amount of work over the initial\n");
|
||||
bu_log("frame.\n");
|
||||
bu_log("\n");
|
||||
bu_log("Please send your BRL-CAD Benchmark results to the developers along with\n");
|
||||
bu_log("detailed system information to <devs@brlcad.org>. Include at least:\n");
|
||||
bu_log("\n");
|
||||
bu_log(" 0) Compiler name and version (e.g. gcc --version)\n");
|
||||
bu_log(" 1) All generated log files (i.e. *.log* after benchmark completes)\n");
|
||||
bu_log(" 2) Anything else you think might be relevant to performance\n");
|
||||
bu_log("\n");
|
||||
bu_log("The manual page has even more information and specific usage examples.\n");
|
||||
bu_log("Run 'brlman benchmark'.\n");
|
||||
bu_log("\n");
|
||||
bu_exit(0, NULL);
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* handle clean/clobber before main processing
|
||||
***/
|
||||
if (bu_str_true(getenv("CLEAN"))) {
|
||||
size_t i;
|
||||
size_t cnt;
|
||||
size_t num;
|
||||
char cwd[MAXPATHLEN] = {0};
|
||||
const char *tests[] = {"moss", "world", "star", "bldg391", "m35", "sphflake", NULL};
|
||||
char **paths = NULL;
|
||||
int printed = 0;
|
||||
|
||||
bu_log("\n");
|
||||
if (bu_str_true(getenv("CLOBBER"))) {
|
||||
bu_log("About to wipe out all benchmark images and log files in %s\n", bu_getcwd(cwd, MAXPATHLEN));
|
||||
bu_log("Send SIGINT (type ^C) within 5 seconds to abort\n");
|
||||
sleep(5);
|
||||
} else {
|
||||
bu_log("Deleting most benchmark images and log files in %s\n", bu_getcwd(cwd, MAXPATHLEN));
|
||||
bu_log("Running '%s clobber' will remove run logs.\n", av[0]);
|
||||
}
|
||||
bu_log("\n");
|
||||
|
||||
for (i=0; tests[i]; i++) {
|
||||
struct bu_vls pattern_str = BU_VLS_INIT_ZERO;
|
||||
char *pattern[5] = {NULL, NULL, NULL, NULL, NULL};
|
||||
size_t j;
|
||||
|
||||
/* rm -f $i.log $i.pix $i-[0-9]*.log $i-[0-9]*.pix */
|
||||
bu_vls_printf(&pattern_str, "%s.log %s.pix %s-[0-9]*.log %s-[0-9]*.pix", tests[i], tests[i], tests[i], tests[i]);
|
||||
bu_log("rm -f %s\n", bu_vls_cstr(&pattern_str));
|
||||
|
||||
j = bu_argv_from_string(pattern, 4, bu_vls_addr(&pattern_str));
|
||||
while (j > 0) {
|
||||
num = bu_file_glob(pattern[j-1], paths);
|
||||
if (!num || !paths || !paths[0]) {
|
||||
j--;
|
||||
continue;
|
||||
}
|
||||
cnt = num;
|
||||
while (num > 0) {
|
||||
bu_file_delete(paths[num-1]);
|
||||
num--;
|
||||
}
|
||||
bu_argv_free(cnt, paths);
|
||||
paths = NULL;
|
||||
j--;
|
||||
}
|
||||
bu_vls_free(&pattern_str);
|
||||
}
|
||||
|
||||
if (bu_str_true(getenv("CLOBBER"))) {
|
||||
/* NEVER automatically delete the summary file, but go
|
||||
* ahead with the rest.
|
||||
*/
|
||||
|
||||
num = bu_file_glob("benchmark-[0-9]*-run.log", paths);
|
||||
cnt = num;
|
||||
while (num > 0) {
|
||||
if (paths) {
|
||||
bu_log("rm -f %s\n", paths[num-1]);
|
||||
bu_file_delete(paths[num-1]);
|
||||
}
|
||||
num--;
|
||||
}
|
||||
bu_argv_free(cnt, paths);
|
||||
paths = NULL;
|
||||
}
|
||||
|
||||
if (bu_file_exists("summary", NULL)) {
|
||||
if (!printed) {
|
||||
bu_log("\nThe following files must be removed manually:\n");
|
||||
printed=1;
|
||||
}
|
||||
bu_log("summary ");
|
||||
}
|
||||
num = bu_file_glob("benchmark-[0-9]*-run.log", paths);
|
||||
cnt = num;
|
||||
while (num > 0) {
|
||||
if (!printed) {
|
||||
bu_log("\nThe following files must be removed manually:\n");
|
||||
printed=1;
|
||||
}
|
||||
if (paths)
|
||||
bu_log("%s ", paths[num-1]);
|
||||
num--;
|
||||
}
|
||||
bu_argv_free(cnt, paths);
|
||||
paths = NULL;
|
||||
|
||||
if (printed) {
|
||||
bu_log("\n");
|
||||
}
|
||||
|
||||
if (bu_str_true(getenv("CLOBBER"))) {
|
||||
bu_log("\nBenchmark clobber complete.\n");
|
||||
} else {
|
||||
bu_log("\nBenchmark clean complete.\n");
|
||||
}
|
||||
bu_exit(0, NULL);
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* B E G I N
|
||||
***/
|
||||
|
||||
if (bu_str_false(getenv("RUN"))) {
|
||||
bu_exit(1, "Type '%s help' for usage.\n", av[0]);
|
||||
}
|
||||
|
||||
/* where to write results */
|
||||
{
|
||||
int fd;
|
||||
const char *logfile;
|
||||
bu_vls_printf(&str, "run-%d-benchmark.log", bu_pid());
|
||||
logfile = bu_vls_addr(&str);
|
||||
bu_setenv("LOGFILE", logfile, 1);
|
||||
fd = open(logfile, O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR);
|
||||
if (fd < 0 || !bu_file_writable(logfile)) {
|
||||
if (!BU_STR_EQUAL(logfile, "/dev/null")) {
|
||||
bu_log("ERROR: Unable to log to %s\n", logfile);
|
||||
}
|
||||
/* FIXME: not valid logfile on windows, use 'nul' */
|
||||
bu_setenv("LOGFILE", "/dev/null", 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (bu_str_true(getenv("QUIET"))) {
|
||||
if (bu_str_true(getenv("VERBOSE"))) {
|
||||
bu_log("Verbose output quelled by quiet option. Further output disabled.\n");
|
||||
}
|
||||
} else {
|
||||
if (bu_str_true(getenv("VERBOSE"))) {
|
||||
verbose_echo=display;
|
||||
bu_log("Verbose output enabled\n");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
struct bu_vls v = BU_VLS_INIT_ZERO;
|
||||
char rfc2822[1024] = {0};
|
||||
const char *logfile = getenv("LOGFILE");
|
||||
#ifdef HAVE_SYS_UTSNAME_H
|
||||
struct utsname n;
|
||||
time_t t = time(NULL);
|
||||
strftime(rfc2822, sizeof(rfc2822), "%a, %d %b %Y %H:%M:%S %Z", localtime(&t));
|
||||
|
||||
if (uname(&n) == 0) {
|
||||
bu_vls_printf(&v, "%s %s %s %s %s", n.sysname, n.nodename, n.release, n.version, n.machine);
|
||||
} else {
|
||||
bu_vls_strcat(&v, "unknown");
|
||||
}
|
||||
#endif
|
||||
|
||||
echo("B R L - C A D B E N C H M A R K\n");
|
||||
echo("=================================\n");
|
||||
echo("Running %s on %s\n", av[0], rfc2822);
|
||||
echo("Logging output to %s\n", logfile ? logfile : "disabled");
|
||||
echo("%s\n\n", bu_vls_addr(&v));
|
||||
}
|
||||
|
||||
|
||||
bu_dir(root, MAXPATHLEN, BU_DIR_BIN, NULL);
|
||||
bu_dir(db, MAXPATHLEN, BU_DIR_DATA, "db", NULL);
|
||||
bu_dir(pix, MAXPATHLEN, BU_DIR_DATA, "pix" , NULL);
|
||||
bu_dir(thisp, MAXPATHLEN, BU_DIR_CURR, NULL);
|
||||
|
||||
bu_vls_printf(&vp,
|
||||
"%s/rt "
|
||||
"%s/rt "
|
||||
"./rt",
|
||||
root, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, executable, "the BRL-CAD raytracer", "RT", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
|
||||
bu_vls_printf(&vp,
|
||||
"%s/moss.g "
|
||||
"%s/db/moss.g "
|
||||
"%s/../db/moss.g "
|
||||
"./db/moss.g "
|
||||
"./moss.g",
|
||||
db, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, file, "a benchmark geometry directory", "DB", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
if (getenv("DB") && !bu_file_directory(getenv("DB"))) {
|
||||
bu_setenv("DB", bu_path_dirname(getenv("DB")), 1);
|
||||
}
|
||||
|
||||
bu_vls_printf(&vp,
|
||||
"%s/moss.pix "
|
||||
"%s/pix/moss.pix "
|
||||
"%s/../pix/moss.pix "
|
||||
"%s/../../pix/moss.pix "
|
||||
"%s/../../../pix/moss.pix "
|
||||
"./pix/moss.pix "
|
||||
"./moss.pix",
|
||||
pix, thisp, thisp, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, file, "a benchmark reference image directory", "PIX", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
if (getenv("PIX") && !bu_file_directory(getenv("PIX"))) {
|
||||
bu_setenv("PIX", bu_path_dirname(getenv("PIX")), 1);
|
||||
}
|
||||
|
||||
const char *pix_env = getenv("PIX");
|
||||
bu_vls_printf(&vp,
|
||||
"%s "
|
||||
"%s "
|
||||
"%s/pix "
|
||||
"%s/../pix "
|
||||
"%s/../../pix "
|
||||
"%s/../../../pix "
|
||||
"./pix",
|
||||
pix_env ? pix_env : "", pix, thisp, thisp, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, directory, "a benchmark reference log directory", "LOG", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
|
||||
bu_vls_printf(&vp,
|
||||
"%s/pixcmp "
|
||||
"%s/pixcmp "
|
||||
"%s/bench/pixcmp "
|
||||
"%s/../bench/pixcmp "
|
||||
"./pixcmp",
|
||||
root, thisp, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, executable, "a pixel comparison utility", "CMP", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
|
||||
/* FIXME: elapsed is no more */
|
||||
bu_vls_printf(&vp,
|
||||
"%s/elapsed.sh "
|
||||
"%s/elapsed.sh "
|
||||
"%s/sh/elapsed.sh "
|
||||
"%s/../sh/elapsed.sh "
|
||||
"%s/../../sh/elapsed.sh "
|
||||
"%s/../../../sh/elapsed.sh "
|
||||
"./elapsed.sh",
|
||||
root, thisp, thisp, thisp, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
look_for(verbose_echo, script, "a time elapsed utility", "ELP", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
|
||||
/*********************
|
||||
* output parameters *
|
||||
*********************/
|
||||
|
||||
/* sanity check, output all the final settings together */
|
||||
RT = getenv("RT");
|
||||
if (RT && strlen(RT) > 0) {
|
||||
echo("Using [%s] for RT\n", RT);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD raytracer\n");
|
||||
}
|
||||
|
||||
DB = getenv("DB");
|
||||
if (DB && strlen(DB) > 0) {
|
||||
echo("Using [%s] for DB\n", DB);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD database directory\n");
|
||||
}
|
||||
|
||||
PIX = getenv("PIX");
|
||||
if (PIX && strlen(PIX) > 0) {
|
||||
echo("Using [%s] for PIX\n", PIX);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD reference images\n");
|
||||
}
|
||||
|
||||
LOG = getenv("LOG");
|
||||
if (LOG && strlen(LOG) > 0) {
|
||||
echo("Using [%s] for LOG\n", LOG);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD reference logs\n");
|
||||
}
|
||||
|
||||
CMP = getenv("CMP");
|
||||
if (CMP && strlen(CMP) > 0) {
|
||||
echo("Using [%s] for CMP\n", CMP);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD pixel comparison utility\n");
|
||||
}
|
||||
|
||||
ELP = getenv("ELP");
|
||||
if (ELP && strlen(ELP) > 0) {
|
||||
echo("Using [%s] for ELP\n", ELP);
|
||||
} else {
|
||||
bu_exit(1, "ERROR: Could not find the BRL-CAD time elapsed script\n");
|
||||
}
|
||||
|
||||
/* determine the minimum time requirement in seconds for a single test run */
|
||||
set_if_unset(echo, verbose_echo, "TIMEFRAME", "32");
|
||||
|
||||
/* approximate maximum time in seconds that a given test is allowed to take */
|
||||
set_if_unset(echo, verbose_echo, "MAXTIME", "300");
|
||||
{
|
||||
char *mtimestr = getenv("MAXTIME");
|
||||
MAXTIME = (mtimestr) ? strtol(mtimestr, NULL, 0) : 300;
|
||||
char *timeframestr = getenv("TIMEFRAME");
|
||||
TIMEFRAME = (timeframestr) ? strtol(timeframestr, NULL, 0) : 32;
|
||||
if (MAXTIME < TIMEFRAME) {
|
||||
bu_exit(1, "ERROR: MAXTIME must be greater or equal to TIMEFRAME\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* maximum deviation percentage */
|
||||
set_if_unset(echo, verbose_echo, "DEVIATION", "3");
|
||||
|
||||
/* maximum number of iterations to average */
|
||||
set_if_unset(echo, verbose_echo, "AVERAGE", "3");
|
||||
|
||||
/* end of settings, separate the output */
|
||||
echo("\n");
|
||||
|
||||
|
||||
/**************************
|
||||
* output run-time status *
|
||||
**************************/
|
||||
|
||||
/* determine raytracer version */
|
||||
echo("RT reports the following version information:\n");
|
||||
{
|
||||
struct bu_vls rtout = BU_VLS_INIT_ZERO;
|
||||
struct bu_vls grep1 = BU_VLS_INIT_ZERO;
|
||||
struct bu_vls grep2 = BU_VLS_INIT_ZERO;
|
||||
|
||||
RT = getenv("RT");
|
||||
|
||||
bu_exec(RT, NULL, &rtout, &rtout);
|
||||
bu_grep("BRL-CAD", bu_vls_cstr(&rtout), stashline, (void *)&grep1);
|
||||
bu_grep("Release", bu_vls_cstr(&grep1), stashline, (void *)&grep2);
|
||||
if (bu_vls_strlen(&grep2) > 0) {
|
||||
echo("%s\n", bu_vls_addr(&grep2));
|
||||
} else {
|
||||
echo("Unknown\n\n");
|
||||
}
|
||||
|
||||
bu_vls_free(&grep2);
|
||||
bu_vls_free(&grep1);
|
||||
bu_vls_free(&rtout);
|
||||
}
|
||||
|
||||
/* let the user know about how long this might take */
|
||||
{
|
||||
struct bu_vls elapsed = BU_VLS_INIT_ZERO;
|
||||
double mintime = 6.0 * TIMEFRAME;
|
||||
double maxtime = 6.0 * MAXTIME;
|
||||
double estimate = 3.0 * mintime;
|
||||
|
||||
if (mintime < 1.0)
|
||||
mintime = 0; /* zero is okay */
|
||||
bu_vls_sprintf(&elapsed, "%s", format_elapsed(mintime));
|
||||
echo("Minimum run time is %s\n", bu_vls_cstr(&elapsed));
|
||||
|
||||
if (maxtime < 1.0)
|
||||
maxtime = 1.0; /* zero would be misleading */
|
||||
bu_vls_sprintf(&elapsed, "%s", format_elapsed(maxtime));
|
||||
echo("Maximum run time is %s\n", bu_vls_cstr(&elapsed));
|
||||
|
||||
if (estimate > maxtime)
|
||||
estimate = maxtime;
|
||||
|
||||
echo("Estimated time is %s\n", format_elapsed(estimate));
|
||||
}
|
||||
|
||||
/************************
|
||||
* Run the actual tests *
|
||||
************************/
|
||||
|
||||
start = bu_gettime();
|
||||
echo("Running the BRL-CAD Benchmark tests... please wait ...\n\n");
|
||||
|
||||
ret += bench("moss");
|
||||
ret += bench("world");
|
||||
ret += bench("star");
|
||||
ret += bench("bldg391");
|
||||
ret += bench("m35");
|
||||
ret += bench("sphflake");
|
||||
|
||||
echo("\n... Done.\n");
|
||||
echo("Total testing time elapsed: %.2lfs\n", format_elapsed(bu_gettime() - start));
|
||||
|
||||
if (ret != 0) {
|
||||
echo("\n");
|
||||
echo("THE BENCHMARK ANALYSIS DID NOT COMPLETE SUCCESSFULLY.\n");
|
||||
echo("\n");
|
||||
echo("A benchmark failure means this is not a viable install of BRL-CAD. This may be\n");
|
||||
echo("a new bug or (more likely) is a compilation configuration error. Ensure your\n");
|
||||
echo("compiler has strict aliasing disabled, compilation is optimized, and you have\n");
|
||||
echo("installed BRL-CAD (some platforms require this). If you still get a failure,\n");
|
||||
echo("please report your configuration information to benchmark@brlcad.org\n");
|
||||
echo("\n");
|
||||
echo("Output was saved to %s from %s\n", LOG, bu_dir(NULL, 0, BU_DIR_CURR, NULL));
|
||||
echo("Run '%s clean' to remove generated pix files.\n", av[0]);
|
||||
echo("Benchmark testing failed.\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
/******************************
|
||||
* compute and output results *
|
||||
******************************/
|
||||
{
|
||||
struct bu_vls performance = BU_VLS_INIT_ZERO;
|
||||
ret = perf(&performance, /*...!!!...*/"moss world star bldg391 m35 sphflake", (const char **)argv);
|
||||
|
||||
if (ret == 0) {
|
||||
/* !!! write performance to summary */
|
||||
}
|
||||
|
||||
echo("\n");
|
||||
echo("The following files have been generated and/or modified:\n");
|
||||
echo(" *.log ..... final log files for each individual raytrace test\n");
|
||||
echo(" *.pix ..... final pix image files for each individual raytrace test\n");
|
||||
echo(" *.log.* ... log files for previous frames and raytrace tests\n");
|
||||
echo(" *.pix.* ... pix image files for previous frames and raytrace tests\n");
|
||||
echo(" summary ... performance results summary, 2 lines per run\n");
|
||||
echo("\n");
|
||||
echo("Run '%s clean' to remove generated pix files.\n", av[0]);
|
||||
echo("\n");
|
||||
|
||||
echo("Summary:\n");
|
||||
echo("%s\n", bu_vls_cstr(&performance));
|
||||
|
||||
{
|
||||
double vgr = calculate_vgr(&performance);
|
||||
|
||||
if (vgr > 0.0) {
|
||||
echo("\n");
|
||||
echo("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#\n");
|
||||
echo("Benchmark results indicate an approximate VGR performance metric of %ld\n", (long int)vgr);
|
||||
echo("Logarithmic VGR metric is %.2lf (natural logarithm is %.2lf)\n", log10(vgr), log(vgr));
|
||||
echo("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#\n");
|
||||
echo("\n");
|
||||
echo("These numbers seem to indicate that this machine is approximately %ld times", (long int)vgr);
|
||||
echo("faster than the reference machine being used for comparison, a VAX 11/780\n");
|
||||
echo("running 4.3 BSD named VGR. These results are in fact approximately %.2lf", log10(vgr));
|
||||
echo("orders of magnitude faster than the reference.\n");
|
||||
echo("\n");
|
||||
|
||||
echo("Here are some other approximated VGR results for perspective:\n");
|
||||
echo(" 120 on a 200MHz R5000 running IRIX 6.5\n");
|
||||
echo(" 250 on a 500 MHz Pentium III running RedHat 7.1\n");
|
||||
echo(" 550 on a dual 450 MHz UltraSPARC II running SunOS 5.8\n");
|
||||
echo(" 1000 on a dual 500 MHz G4 PowerPC running Mac OS X 10.2\n");
|
||||
echo(" 1500 on a dual 1.66 GHz Athlon MP 2000+ running RedHat 7.3\n");
|
||||
echo(" 52000 on a 4x4 CPU 2.93 GHz Xeon running RHEL Server 5.4\n");
|
||||
echo(" 65000 on a 512 CPU 400 MHz R12000 Running IRIX 6.5\n");
|
||||
echo("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
/* TODO: !!! determine if this build is optimized or not */
|
||||
/* TODO: !!! determine if this build has run-time debugging */
|
||||
/* TODO: !!! determine if this build has compile-time debugging */
|
||||
}
|
||||
|
||||
/* if this was a valid benchmark run, encourage submission of results. */
|
||||
echo("You are encouraged to submit your benchmark results and system\n");
|
||||
echo("configuration information to benchmark@brlcad.org\n");
|
||||
echo(" ~~~~~~~~~~~~~~~~~~~~\n");
|
||||
|
||||
/* include information about the operating system and hardware in the log */
|
||||
echo("Including additional kernel and hardware information in the log.\n\n");
|
||||
|
||||
/* TODO: !!! print out system information via sysctl/prtdiag/prtconf/hinv/etc */
|
||||
bu_vls_free(&rtargs);
|
||||
|
||||
bu_vls_printf(&vp,
|
||||
"%s/../share/brlcad/*.*.*/doc/benchmark.tr "
|
||||
"%s/share/brlcad/*.*.*/doc/benchmark.tr "
|
||||
"%s/share/brlcad/doc/benchmark.tr "
|
||||
"%s/share/doc/benchmark.tr "
|
||||
"%s/doc/benchmark.tr "
|
||||
"%s/../doc/benchmark.tr "
|
||||
"./benchmark.tr",
|
||||
thisp, thisp, thisp, thisp, thisp, thisp);
|
||||
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
|
||||
|
||||
look_for(NULL, file, "BENCHMARK_TR", "benchmark", (const char **)argv);
|
||||
bu_vls_trunc(&vp, 0);
|
||||
|
||||
/* TODO: look for benchmark document here? */
|
||||
|
||||
echo("Output was saved to %s from %s\n", LOG, bu_dir(NULL, 0, BU_DIR_CURR, NULL));
|
||||
echo("Benchmark testing complete.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* tab-width: 8
|
||||
* mode: C
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "stroustrup"
|
||||
* End:
|
||||
* ex: shiftwidth=4 tabstop=8
|
||||
*/
|
||||
@@ -1,96 +0,0 @@
|
||||
/* C L E A N . C
|
||||
* BRL-CAD
|
||||
*
|
||||
* Copyright (c) 2011-2026 United States Government as represented by
|
||||
* the U.S. Army Research Laboratory.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/** @file clean.c
|
||||
*
|
||||
* utility functions to clean output files
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "bu/file.h"
|
||||
#include "bu/str.h"
|
||||
#include "bu/vls.h"
|
||||
|
||||
|
||||
/* TODO: !!! needed */
|
||||
//int bu_file_move(const char *fn1, const char *fn2) {if (!fn1 || !fn2) return -1; return 0;}
|
||||
|
||||
extern int bu_file_copy(const char *fn1, const char *fn2);
|
||||
|
||||
|
||||
/**
|
||||
* conditionally removes or saves any .pix or .log files output.
|
||||
*/
|
||||
void
|
||||
clean_obstacles(const char *base_filename, int id)
|
||||
{
|
||||
struct bu_vls vp = BU_VLS_INIT_ZERO;
|
||||
struct bu_vls vpid = BU_VLS_INIT_ZERO;
|
||||
|
||||
if (BU_STR_EMPTY(base_filename))
|
||||
return;
|
||||
|
||||
/* look for an image file */
|
||||
bu_vls_printf(&vp, "%s.pix", base_filename);
|
||||
if (bu_file_exists(bu_vls_cstr(&vp), NULL)) {
|
||||
bu_vls_printf(&vpid, "%s-%d.pix", base_filename, id);
|
||||
if (bu_file_exists(bu_vls_cstr(&vpid), NULL)) {
|
||||
bu_file_delete(bu_vls_cstr(&vp));
|
||||
}
|
||||
//bu_file_move(bu_vls_cstr(&vp), bu_vls_cstr(&vpid));
|
||||
}
|
||||
|
||||
/* look for a log file */
|
||||
bu_vls_printf(&vp, "%s.log", base_filename);
|
||||
if (bu_file_exists(bu_vls_cstr(&vp), NULL)) {
|
||||
bu_vls_printf(&vpid, "%s-%d.log", base_filename, id);
|
||||
if (bu_file_exists(bu_vls_cstr(&vpid), NULL)) {
|
||||
bu_file_delete(bu_vls_cstr(&vp));
|
||||
}
|
||||
//bu_file_move(bu_vls_cstr(&vp), bu_vls_cstr(&vpid));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* tab-width: 8
|
||||
* mode: C
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "stroustrup"
|
||||
* End:
|
||||
* ex: shiftwidth=4 tabstop=8
|
||||
*/
|
||||
@@ -1,96 +0,0 @@
|
||||
/* C O M P U T E . C
|
||||
* BRL-CAD
|
||||
*
|
||||
* Copyright (c) 2011-2026 United States Government as represented by
|
||||
* the U.S. Army Research Laboratory.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/** @file compute.c
|
||||
*
|
||||
* run and computation functions
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
/**
|
||||
* average [..numbers..]
|
||||
*
|
||||
* computes the integer average for a set of given numbers
|
||||
*/
|
||||
double
|
||||
average(int ac, double av[])
|
||||
{
|
||||
double total = 0.0;
|
||||
|
||||
if (ac < 1)
|
||||
return -0.0;
|
||||
|
||||
while (ac-- > 0) {
|
||||
total += av[ac];
|
||||
}
|
||||
return total / ac;
|
||||
}
|
||||
|
||||
|
||||
double
|
||||
variance(int ac, double av[])
|
||||
{
|
||||
double avg;
|
||||
double err = 0.0;
|
||||
double num = ac;
|
||||
|
||||
if (ac < 1)
|
||||
return -0.0;
|
||||
else if (ac == 1)
|
||||
return 0.0;
|
||||
|
||||
avg = average(ac, av);
|
||||
|
||||
/* compute variance numerator for the population */
|
||||
while (ac-- > 0) {
|
||||
err += (av[ac] - avg) * (av[ac] - avg);
|
||||
}
|
||||
|
||||
/* return the sample variance */
|
||||
return err / (num - 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* tab-width: 8
|
||||
* mode: C
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "stroustrup"
|
||||
* End:
|
||||
* ex: shiftwidth=4 tabstop=8
|
||||
*/
|
||||
-514
@@ -1,514 +0,0 @@
|
||||
/* P I X C M P . C
|
||||
* BRL-CAD
|
||||
*
|
||||
* Copyright (c) 2004-2026 United States Government as represented by
|
||||
* the U.S. Army Research Laboratory.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* version 2.1 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this file; see the file named COPYING for more
|
||||
* information.
|
||||
*
|
||||
*/
|
||||
/** @file pixcmp.c
|
||||
*
|
||||
* Compute and summarily report differences between two .pix files.
|
||||
*
|
||||
* This routine operates on a pixel-by-pixel basis, and thus
|
||||
* is independent of the resolution of the image.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
#include "bio.h"
|
||||
|
||||
// TODO - replace with std::filesystem::is_fifo
|
||||
#ifndef S_ISFIFO
|
||||
# ifdef S_IFIFO
|
||||
# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
|
||||
# else
|
||||
# define S_ISFIFO(mode) (0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include "bu/app.h"
|
||||
#include "bu/getopt.h"
|
||||
#include "bu/log.h"
|
||||
#include "bu/file.h"
|
||||
#include "bu/str.h"
|
||||
|
||||
/* exit codes for argument processing errors */
|
||||
#define OPTS_ERROR 127
|
||||
#define FILE_ERROR 126
|
||||
|
||||
/* exit codes for normal operation */
|
||||
#define EXIT_OFF_BY_NONE 0
|
||||
#define EXIT_OFF_BY_ONE 1
|
||||
#define EXIT_OFF_BY_MANY 2
|
||||
|
||||
enum diff {
|
||||
MATCHING,
|
||||
OFF_BY_ONE,
|
||||
OFF_BY_MANY,
|
||||
MISSING
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
usage(const char *name)
|
||||
{
|
||||
const char *unknown = "pixcmp";
|
||||
if (!name) {
|
||||
name = unknown;
|
||||
}
|
||||
|
||||
/* split to fit within ISO C90 max static string length < 509 chars */
|
||||
bu_log("Usage: %s [OPTIONS] FILE1 [FILE2 [SKIP1 [SKIP2]]]\n"
|
||||
"\n"
|
||||
" Compare two PIX files pixel by pixel (or byte by byte), optionally"
|
||||
" skipping initial pixels (or bytes) in one or both input files.\n"
|
||||
"\n", name);
|
||||
bu_log("Options:"
|
||||
" -b Iterate and print by bytes instead of by pixels.\n"
|
||||
" -s Print all that have the same matching values.\n"
|
||||
" -d Print all that have different values.\n"
|
||||
" -q Quiet. Suppress printing header and summary.\n"
|
||||
" -i SKIP\n"
|
||||
" Discard initial SKIP pixels (or bytes w/ -b) in FILE1 and FILE2 input.\n"
|
||||
" -i SKIP1:SKIP2\n"
|
||||
" Skip initial SKIP1 pixels (or bytes w/ -b) in FILE1 and SKIP2 in FILE2.\n"
|
||||
" -n COUNT\n"
|
||||
" Compare COUNT pixels (or bytes w/ -b). Stops by default at EOF.\n"
|
||||
"\n");
|
||||
bu_log("If either FILE is `-' or is missing, then input is read from standard input.\n"
|
||||
"If FILE1 and FILE2 are both standard input, then values must be interleaved.\n"
|
||||
"If the `-b' option is used, SKIP and COUNT values are bytes instead of pixels.\n"
|
||||
"Pixel numbers and bytes are indexed linearly from one.\n"
|
||||
"\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
handle_range_opt(const char *arg, size_t *skip1, size_t *skip2)
|
||||
{
|
||||
const char *endptr = arg;
|
||||
long val;
|
||||
|
||||
if ((arg == NULL) || ((skip1 == NULL) && (skip2 == NULL))) {
|
||||
/* nothing to do */
|
||||
return;
|
||||
}
|
||||
while ((endptr != NULL) && (endptr[0] != ':') && (endptr[0] != '\0')) {
|
||||
endptr++;
|
||||
}
|
||||
if (endptr == arg) {
|
||||
/* probably empty string */
|
||||
if (skip2) {
|
||||
endptr++;
|
||||
val = strtol(endptr, NULL, 10);
|
||||
*skip2 = (val < 0) ? 0 : val;
|
||||
}
|
||||
} else if ((endptr == NULL) || (endptr[0] == '\0')) {
|
||||
/* no : found */
|
||||
if (skip2) {
|
||||
val = strtol(arg, NULL, 10);
|
||||
*skip2 = (val < 0) ? 0 : val;
|
||||
}
|
||||
if (skip1 && skip2) {
|
||||
*skip1 = *skip2;
|
||||
}
|
||||
} else if (endptr[0] == ':') {
|
||||
/* found : */
|
||||
if (skip1) {
|
||||
val = strtol(arg, NULL, 10);
|
||||
*skip1 = (val < 0) ? 0 : val;
|
||||
}
|
||||
if (skip2) {
|
||||
endptr++; /* skip over : */
|
||||
val = strtol(endptr, NULL, 10);
|
||||
*skip2 = (val < 0) ? 0 : val;
|
||||
}
|
||||
} else {
|
||||
bu_exit(OPTS_ERROR, "Unexpected input processing [%s]\n", arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static enum diff
|
||||
compare_rgb(int r1, int g1, int b1, int r2, int g2, int b2, size_t *matching, size_t *off1, size_t *offmany, size_t *missing)
|
||||
{
|
||||
enum diff result = MISSING;
|
||||
|
||||
if ((r1 == r2 && r1 != -1)
|
||||
&& (g1 == g2 && g1 != -1)
|
||||
&& (b1 == b2 && b1 != -1))
|
||||
{
|
||||
result = MATCHING;
|
||||
} else if (r1 == -1 || r2 == -1 || g1 == -1 || g2 == -1 || b1 == -1 || b2 == -1) {
|
||||
/* image sizes don't match (or other I/O error) */
|
||||
result = MISSING;
|
||||
} else {
|
||||
/* at least this */
|
||||
result = OFF_BY_ONE;
|
||||
|
||||
/* but maybe more */
|
||||
if (r1 != r2) {
|
||||
if ((r1 > r2 ? r1 - r2 : r2 - r1) > 1) {
|
||||
result = OFF_BY_MANY;
|
||||
}
|
||||
}
|
||||
if (g1 != g2) {
|
||||
if ((g1 > g2 ? g1 - g2 : g2 - g1) > 1) {
|
||||
result = OFF_BY_MANY;
|
||||
}
|
||||
}
|
||||
if (b1 != b2) {
|
||||
if ((b1 > b2 ? b1 - b2 : b2 - b1) > 1) {
|
||||
result = OFF_BY_MANY;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (result == OFF_BY_ONE) {
|
||||
(*off1)++;
|
||||
} else if (result == OFF_BY_MANY) {
|
||||
(*offmany)++;
|
||||
} else if (result == MATCHING) {
|
||||
(*matching)++;
|
||||
} else {
|
||||
(*missing)++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
const char *argv0 = argv[0];
|
||||
|
||||
FILE *f1 = NULL;
|
||||
FILE *f2 = NULL;
|
||||
struct stat sf1;
|
||||
struct stat sf2;
|
||||
|
||||
memset(&sf1, 0, sizeof(struct stat));
|
||||
memset(&sf2, 0, sizeof(struct stat));
|
||||
|
||||
size_t matching = 0;
|
||||
size_t off1 = 0;
|
||||
size_t offmany = 0;
|
||||
size_t missing = 0;
|
||||
|
||||
int c;
|
||||
int list_diff = 0;
|
||||
int list_same = 0;
|
||||
int print_bytes = 0;
|
||||
int quiet = 0;
|
||||
|
||||
size_t bytes = 0;
|
||||
size_t f1_skip = 0;
|
||||
size_t f2_skip = 0;
|
||||
size_t stop_after = 0;
|
||||
|
||||
bu_setprogname(argv[0]);
|
||||
|
||||
/* process opts */
|
||||
while ((c = bu_getopt(argc, argv, "sdbi:n:q?")) != -1) {
|
||||
switch (c) {
|
||||
case 's':
|
||||
list_same = 1;
|
||||
break;
|
||||
case 'd':
|
||||
list_diff = 1;
|
||||
break;
|
||||
case 'b':
|
||||
print_bytes = 1;
|
||||
break;
|
||||
case 'i':
|
||||
handle_range_opt(bu_optarg, &f1_skip, &f2_skip);
|
||||
break;
|
||||
case 'n':
|
||||
{
|
||||
long num = strtol(bu_optarg, NULL, 10);
|
||||
stop_after = (num < 0) ? 0 : num;
|
||||
break;
|
||||
}
|
||||
case 'q':
|
||||
quiet = 1;
|
||||
break;
|
||||
case '?':
|
||||
case 'h':
|
||||
usage(argv0);
|
||||
return 0;
|
||||
default:
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
}
|
||||
argc -= bu_optind;
|
||||
argv += bu_optind;
|
||||
|
||||
/* validate what is left over */
|
||||
if (argc < 1 || argc > 4) {
|
||||
bu_log("ERROR: incorrect number of arguments provided\n\n");
|
||||
usage(argv0);
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
if ((argc > 0 && !argv[0]) || (argc > 1 && !argv[1])) {
|
||||
bu_log("ERROR: bad filename\n\n");
|
||||
usage(argv0);
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
if ((argc > 2 && !argv[2]) || (argc > 3 && !argv[3])) {
|
||||
bu_log("ERROR: bad skip value\n\n");
|
||||
usage(argv0);
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
|
||||
/* handle optional SKIP1 and SKIP2 following filenames */
|
||||
if (argc > 2) {
|
||||
char range[64] = {0};
|
||||
if (argc > 3) {
|
||||
snprintf(range, 64, "%s:%s", argv[2], argv[3]);
|
||||
} else {
|
||||
snprintf(range, 64, "%s", argv[2]);
|
||||
}
|
||||
handle_range_opt(range, &f1_skip, &f2_skip);
|
||||
}
|
||||
|
||||
if (!print_bytes) {
|
||||
if ((f1_skip > ((size_t)-1)/3)
|
||||
|| (f2_skip > ((size_t)-1)/3))
|
||||
{
|
||||
bu_log("ERROR: overflow, -i skip value(s) are too big {%zu:%zu}\n", f1_skip, f2_skip);
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
f1_skip *= 3;
|
||||
f2_skip *= 3;
|
||||
if (stop_after > ((size_t)-1)/3)
|
||||
{
|
||||
bu_log("ERROR: overflow, -n number is too big {%zu}\n", stop_after);
|
||||
exit(OPTS_ERROR);
|
||||
}
|
||||
stop_after *= 3;
|
||||
}
|
||||
|
||||
if (BU_STR_EQUAL(argv[0], "-")) {
|
||||
f1 = stdin;
|
||||
} else if ((f1 = fopen(argv[0], "rb")) == NULL) {
|
||||
perror(argv[0]);
|
||||
exit(FILE_ERROR);
|
||||
}
|
||||
|
||||
if ((argc < 2) || BU_STR_EQUAL(argv[1], "-")) {
|
||||
f2 = stdin;
|
||||
} else if ((f2 = fopen(argv[1], "rb")) == NULL) {
|
||||
perror(argv[1]);
|
||||
exit(FILE_ERROR);
|
||||
}
|
||||
|
||||
setmode(fileno(stdin), O_BINARY);
|
||||
/* we're writing out ascii */
|
||||
/* setmode(fileno(stdout), O_BINARY); */
|
||||
|
||||
if (f1_skip != f2_skip && f1 == stdin && f2 == stdin) {
|
||||
bu_exit(OPTS_ERROR, "ERROR: cannot skip the same input stream by different amounts\n");
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
if (fstat(fileno(f1), &sf1)) {
|
||||
bu_log("Warning - f1 fstat failed: %s\n", strerror(errno));
|
||||
}
|
||||
errno = 0;
|
||||
if (fstat(fileno(f2), &sf2)) {
|
||||
bu_log("Warning - f2 fstat failed: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
/* bu_log("FILE1_size(%zu) FILE1_skip(%zu) FILE2_size(%zu) FILE2_skip(%zu)\n", (size_t)sf1.st_size, f1_skip, (size_t)sf2.st_size, f2_skip); */
|
||||
|
||||
if (!quiet && ((sf1.st_size - f1_skip) != (sf2.st_size - f2_skip))) {
|
||||
bu_log("WARNING: Different image sizes detected\n");
|
||||
if (print_bytes) {
|
||||
bu_log("\t%s: %7zu bytes (%8zu bytes, skipping %7zu)\n",
|
||||
argv[0], (size_t)sf1.st_size - f1_skip, (size_t)sf1.st_size, f1_skip);
|
||||
bu_log("\t%s: %7zu bytes (%8zu bytes, skipping %7zu)\n",
|
||||
argv[1], (size_t)sf2.st_size - f2_skip, (size_t)sf2.st_size, f2_skip);
|
||||
} else {
|
||||
bu_log("\t%s: %7zu pixels (%8zu bytes, skipping %7zu)\n",
|
||||
argv[0], ((size_t)sf1.st_size - f1_skip)/3, (size_t)sf1.st_size, f1_skip);
|
||||
bu_log("\t%s: %7zu pixels (%8zu bytes, skipping %7zu)\n",
|
||||
argv[1], ((size_t)sf2.st_size - f2_skip)/3, (size_t)sf2.st_size, f2_skip);
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure we read all bytes */
|
||||
if (stop_after == 0) {
|
||||
stop_after = FMAX((sf1.st_size - f1_skip), (sf2.st_size - f2_skip));
|
||||
if (f1 == stdin && f2 == stdin) {
|
||||
/* dual stdin is interleaved */
|
||||
stop_after = (stop_after+1)/2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
bu_log("mode is [%d] and [%d]\n", S_ISFIFO(sf1.st_mode), S_ISFIFO(sf2.st_mode));
|
||||
bu_log("tty is [%d] and [%d]\n", isatty(fileno(f1)), isatty(fileno(f2)));
|
||||
*/
|
||||
|
||||
/* skip requested pixels/bytes in FILE1 */
|
||||
if (f1_skip) {
|
||||
if (S_ISFIFO(sf1.st_mode)) {
|
||||
size_t skipped = 0;
|
||||
for (skipped = 0; skipped < f1_skip; skipped++) {
|
||||
(void)fgetc(f1);
|
||||
}
|
||||
} else if (fseek(f1, (long)f1_skip, SEEK_SET)) {
|
||||
bu_log("ERROR: Unable to seek %zd %s%s in FILE1\n",
|
||||
f1_skip,
|
||||
print_bytes?"byte":"pixel",
|
||||
f1_skip==1?"":"s");
|
||||
perror("FILE1 fseek failure");
|
||||
exit(FILE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/* skip requested pixels in FILE2 */
|
||||
if (f2_skip) {
|
||||
if (S_ISFIFO(sf2.st_mode)) {
|
||||
size_t skipped = 0;
|
||||
for (skipped = 0; skipped < f2_skip; skipped++) {
|
||||
(void)fgetc(f2);
|
||||
}
|
||||
} else if (fseek(f2, (long)f2_skip, SEEK_SET)) {
|
||||
bu_log("ERROR: Unable to seek %zd %s%s in FILE2\n",
|
||||
f2_skip,
|
||||
print_bytes?"byte":"pixel",
|
||||
f2_skip==1?"":"s");
|
||||
perror("FILE2 fseek failure");
|
||||
exit(FILE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/* print header to stderr, output to stdout */
|
||||
if (!quiet && (list_same || list_diff)) {
|
||||
if (print_bytes) {
|
||||
bu_log("#Byte FILE1 FILE2 LABEL\n");
|
||||
} else {
|
||||
bu_log("#Pixel\t(FILE1 R, G, B) (FILE2 R, G, B)\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* iterate over the pixels/bytes in the files */
|
||||
while (bytes < stop_after) {
|
||||
enum diff result;
|
||||
int r1 = -1;
|
||||
int r2 = -1;
|
||||
int g1 = -1;
|
||||
int g2 = -1;
|
||||
int b1 = -1;
|
||||
int b2 = -1;
|
||||
|
||||
/* bu_log("\tbytes[%zu] < stop[%zu\n", bytes, stop_after); */
|
||||
|
||||
r1 = fgetc(f1);
|
||||
r2 = fgetc(f2);
|
||||
bytes++;
|
||||
|
||||
if (print_bytes) {
|
||||
/* replicate */
|
||||
b1 = g1 = 0;
|
||||
b2 = g2 = 0;
|
||||
} else {
|
||||
g1 = fgetc(f1);
|
||||
g2 = fgetc(f2);
|
||||
bytes++;
|
||||
b1 = fgetc(f1);
|
||||
b2 = fgetc(f2);
|
||||
bytes++;
|
||||
}
|
||||
|
||||
result = compare_rgb(r1, g1, b1, r2, g2, b2, &matching, &off1, &offmany, &missing);
|
||||
|
||||
/* print them? */
|
||||
if ((result==MATCHING && list_same)
|
||||
|| (result!=MATCHING && list_diff))
|
||||
{
|
||||
const char *label = NULL;
|
||||
switch (result) {
|
||||
case MATCHING:
|
||||
label = "MATCHING";
|
||||
break;
|
||||
case OFF_BY_MANY:
|
||||
label = "OFF_BY_MANY";
|
||||
break;
|
||||
case OFF_BY_ONE:
|
||||
label = "OFF_BY_ONE";
|
||||
break;
|
||||
case MISSING:
|
||||
default:
|
||||
label = "MISSING";
|
||||
break;
|
||||
}
|
||||
if (print_bytes) {
|
||||
printf("%zu %3d %3d %s\n", bytes, r1, r2, label);
|
||||
} else {
|
||||
printf("%zu\t(%3d, %3d, %3d)\t(%3d, %3d, %3d) %s\n", bytes / 3, r1, g1, b1, r2, g2, b2, label);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* print summary */
|
||||
if (!quiet) {
|
||||
printf("pixcmp %s: %8zd matching, %8zd off by 1, %8zd off by many",
|
||||
print_bytes?"bytes":"pixels", matching, off1, offmany);
|
||||
if (missing) {
|
||||
printf(", %8zd missing\n", missing);
|
||||
} else {
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* check for errors */
|
||||
if (ferror(f1) || ferror(f2)) {
|
||||
perror("pixcmp file error");
|
||||
return FILE_ERROR;
|
||||
}
|
||||
|
||||
/* indicate how many differences there were overall */
|
||||
if (offmany || missing) {
|
||||
return EXIT_OFF_BY_MANY;
|
||||
}
|
||||
if (off1) {
|
||||
return EXIT_OFF_BY_ONE;
|
||||
}
|
||||
|
||||
/* Success! */
|
||||
return EXIT_OFF_BY_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: C
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "stroustrup"
|
||||
* End:
|
||||
* ex: shiftwidth=4 tabstop=8
|
||||
*/
|
||||
@@ -1,80 +0,0 @@
|
||||
# Exercise pixcmp's pixel tolerance and exit-status contract with small,
|
||||
# deliberately readable byte streams.
|
||||
|
||||
if(NOT PIXCMP OR NOT TEST_DIR)
|
||||
message(FATAL_ERROR "PIXCMP and TEST_DIR are required")
|
||||
endif()
|
||||
|
||||
function(check_pixcmp name input1 input2 expected_status expected_summary)
|
||||
set(file1 "${TEST_DIR}/pixcmp_${name}_1.pix")
|
||||
set(file2 "${TEST_DIR}/pixcmp_${name}_2.pix")
|
||||
|
||||
file(WRITE "${file1}" "${input1}")
|
||||
file(WRITE "${file2}" "${input2}")
|
||||
|
||||
execute_process(
|
||||
COMMAND "${PIXCMP}" ${ARGN} "${file1}" "${file2}"
|
||||
OUTPUT_VARIABLE output
|
||||
ERROR_VARIABLE errors
|
||||
RESULT_VARIABLE status
|
||||
)
|
||||
|
||||
file(REMOVE "${file1}" "${file2}")
|
||||
|
||||
if(NOT "${status}" STREQUAL "${expected_status}")
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"${name}: pixcmp returned ${status}, expected ${expected_status}\nstdout: ${output}\nstderr: ${errors}"
|
||||
)
|
||||
endif()
|
||||
|
||||
string(REGEX REPLACE "[ \t\r\n]+" " " normalized_output "${output}")
|
||||
string(STRIP "${normalized_output}" normalized_output)
|
||||
string(FIND "${normalized_output}" "${expected_summary}" summary_position)
|
||||
if(summary_position EQUAL -1)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"${name}: expected summary '${expected_summary}'\nactual stdout: ${output}\nstderr: ${errors}"
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
set(exact_pixel "pixcmp pixels: 1 matching, 0 off by 1, 0 off by many")
|
||||
set(tolerated_pixel "pixcmp pixels: 0 matching, 1 off by 1, 0 off by many")
|
||||
set(rejected_pixel "pixcmp pixels: 0 matching, 0 off by 1, 1 off by many")
|
||||
|
||||
check_pixcmp(exact "ABC" "ABC" 0 "${exact_pixel}")
|
||||
check_pixcmp(one_channel_within_tolerance "ABC" "BBC" 1 "${tolerated_pixel}")
|
||||
check_pixcmp(two_channels_within_tolerance "ABC" "BCC" 1 "${tolerated_pixel}")
|
||||
check_pixcmp(three_channels_within_tolerance "ABC" "@CB" 1 "${tolerated_pixel}")
|
||||
|
||||
# Keep the tolerated channel first in two cases to catch short-circuiting that
|
||||
# would fail to inspect a later channel outside the tolerance.
|
||||
check_pixcmp(red_outside_tolerance "ABC" "CCD" 2 "${rejected_pixel}")
|
||||
check_pixcmp(green_outside_tolerance "ABC" "BDD" 2 "${rejected_pixel}")
|
||||
check_pixcmp(blue_outside_tolerance "ABC" "BCE" 2 "${rejected_pixel}")
|
||||
|
||||
check_pixcmp(
|
||||
missing_pixel
|
||||
"ABC"
|
||||
"ABCDEF"
|
||||
2
|
||||
"pixcmp pixels: 1 matching, 0 off by 1, 0 off by many, 1 missing"
|
||||
)
|
||||
|
||||
check_pixcmp(
|
||||
byte_within_tolerance
|
||||
"A"
|
||||
"B"
|
||||
1
|
||||
"pixcmp bytes: 0 matching, 1 off by 1, 0 off by many"
|
||||
-b
|
||||
)
|
||||
check_pixcmp(
|
||||
byte_outside_tolerance
|
||||
"A"
|
||||
"C"
|
||||
2
|
||||
"pixcmp bytes: 0 matching, 0 off by 1, 1 off by many"
|
||||
-b
|
||||
)
|
||||
@@ -1,33 +0,0 @@
|
||||
set(
|
||||
BENCHMARK_PIX
|
||||
bldg391.pix
|
||||
m35.pix
|
||||
moss.pix
|
||||
sphflake.pix
|
||||
star.pix
|
||||
world.pix
|
||||
)
|
||||
|
||||
set(
|
||||
PIX_LOG
|
||||
bldg391.log
|
||||
m35.log
|
||||
moss.log
|
||||
sphflake.log
|
||||
star.log
|
||||
world.log
|
||||
)
|
||||
|
||||
brlcad_adddata(BENCHMARK_PIX pix)
|
||||
brlcad_adddata(PIX_LOG pix)
|
||||
|
||||
cmakefiles(${BENCHMARK_PIX})
|
||||
cmakefiles(${PIX_LOG})
|
||||
cmakefiles(CMakeLists.txt)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width: 8
|
||||
# mode: cmake
|
||||
# indent-tabs-mode: t
|
||||
# End:
|
||||
# ex: shiftwidth=2 tabstop=8
|
||||
@@ -1,41 +0,0 @@
|
||||
BRL-CAD Release 3.26 Ray-Tracer
|
||||
Mon Aug 26 22:39:04 EDT 1991, Compilation 1
|
||||
butler@vgr.brl.mil:/usr/src/tmpcad/rt
|
||||
|
||||
db title: Building 391, with mirrored floors
|
||||
initial dynamic memory use=159208.
|
||||
GETTREE: 5.4user 1.5sys 0:07real 90% 125i+756d 566maxrss 6+46pf 6+84csw
|
||||
Additional dynamic memory used=198512. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: 1.6user 0.6sys 0:04real 50% 199i+1053d 663maxrss 0+16pf 0+32csw
|
||||
Additional dynamic memory used=72512. bytes
|
||||
Tree: 203 solids in 68 regions
|
||||
Model: X(-2100,1900), Y(-1600,2400), Z(-2000,2000)
|
||||
View: 35 azimuth, 25 elevation off of front view
|
||||
Orientation: 0.248097, 0.476591, 0.748097, 0.389435
|
||||
Eye_pos: 634.501, 863.325, 831.077
|
||||
Size: 1800mm
|
||||
Grid: (3.51563, 3.51563) mm, (512, 512) pixels
|
||||
Beam: radius=1.75781 mm, divergence=0 mm/1mm
|
||||
Output file is 'bldg391.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/all.g/light.r: (170.411, 474.302, 731.39), aimed at (0, 0, -1)
|
||||
/all.g/light.r: visible, casts shadows, 1000 lumens (83%), halfang=180
|
||||
|
||||
light_hit: ERROR, nothing hit, sxy=212,66, dtol=5.000000e-03
|
||||
------light_hit pt list
|
||||
00164228: PT floor.s (ARB8#53) magwall11 (ARB8#88) (-0.005,52.0515) Iflip
|
||||
InHIT dist=-0.005 (surf 5)
|
||||
OutHIT dist=52.0515 (surf 0)
|
||||
Solids: (88, 200, 201)
|
||||
------
|
||||
SHOT: 6407.1user 681.1sys 3:41:52real 53% 283i+1183d 735maxrss 1+42pf 163+99004csw
|
||||
Additional dynamic memory used=33464. bytes
|
||||
3025567 solid/ray intersections: 1327210 hits + 1698357 miss
|
||||
pruned 43.9%: 0 model RPP, 0 dups skipped, 159358 solid RPP
|
||||
Frame 0: 262144 pixels in 6407.16 sec = 40.91 pixels/sec
|
||||
Frame 0: 341875 rays in 6407.16 sec = 53.36 rays/sec (RTFM)
|
||||
|
||||
13330.7 real 6415.4 user 685.5 sys
|
||||
@@ -1 +0,0 @@
|
||||
cc�c�d�d�d�e�e�e�e�f�f�f�f�f�f�g�f�g�g�f�g�f�f�f�f�f�f�e�e�e�e�d�d�d�c�c�c�b�b�a�a�`�`�_�_�_╚^╚^╙]�]‐\‐\猏\猍[玔[玓Z玓Z琘Y琘Y璝Y璛X甔X甔X疻W疻W疻W癡V癡V盫V盪U睻U睻U砋U砊T碩T碩T碩T礣T礢S禨S禨S禨S稴S稴S稴S窻R窻R窻R窻R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R筊R窻R窻R窻R窼S窼S稴S稴S稴S禨S禩T礣T礣T碩T碩T碪U砋U砋U睻U睼V盫V盫V癢W癢W疿X疿X甔X甕Y璝Y璟Z琙Z琜[玔[玕\猏\猐]�^�^╛_╛_�`�a�a�b�c�c�d�e�e�f�g�g�h�i�i�j�k�k�l�m�m�n�n�o�o�p�p�q�q�q�r�r爎r爎r爎r爏s爏s爏s爏s爏s爏s爏s爏s爏s爎r爎r爎r爎r�q�q�q�p�p�o�o�n�n�m�m�l�l�k�k�j�i�i�h�h�g�g�f�e�e�d�d�c�c�b�b�a�a�`�`�`�_�_╚^╚^╚^╙]�]�]�]‐\猏\猏\猏\猏\猏\猍[猍[猍[玔[玔[玔[玔[玔[猍[玔[猏\猏\猏\猏\猏\猏\�]�]�]�^�^╚^╛_╛_�`�`�a�a�b�c�c�d�e�f�f�g�h�i�j�k�l�n�o�p�q�s爐t爒v爓w爕y爗{爘|爚~爛€爞偁剟爢啝垐爦姞寣�彙憫�摙枛�槪洓�潳牋ぃ%ΖΗЁèí�������鞍安膊吵炒创抖斗贩父负汉换患技揪究靠览懒亮侣履哪排牌破乔侨热缮墒适怂颂烫屯臀挝舷闲行蜒岩乙佑佑佑栽哉照照罩种鬃棕刎刎刭儋儋儋儋谮谮谮圹圹圹圹圮苘苘苘苘苘苘苘苘苘苘苘茌葺苘茌葺苘苘苘苘苘苘苘苘苘苘苒圹圹圹圹圹圳谮谮谮谮谮谫儋儋儋儋刎刎刎刎刈鬃鬃鬃鬃种种种种终照照照照栽栽栽栽栽栽佑佑佑佑右乙乙乙乙乙已蜒蜒蜒蜒蜒蜒蜒蜒蜒蜒行行行行行行行行行行行行行行行行行行行行行行醒蜒蜒蜒蜒蜒蜒蜒蜒岩乙乙乙乙乙矣佑佑佑佑佑釉栽栽栽栽照照照种种种种肿鬃鬃鬃鬃刎刎刎儋儋儋谮谮谮圹圹圹苘苘苘苘茌葺葺蒉揶揶捱哌哌哙噜噜噌後後徕忖忖忏沣沣沅滗滗溴邋邋彐骀骀骀骀珑珑珑梃梃梃梃栝殚殚殚殚觋觋觋觋阠c�d�d�d�e�e�e�e�f�f�f�f�g�f�g�g�g�g�g�g�g�g�f�f�f�f�f�e�e�e�e�d�d�d�c�c�b�b�b�a�a�`�`�`�_�_╚^╚^╙]�]‐\‐\猏\猍[玔[玓Z琙Z琘Y璝Y璝Y璛X甔X甔X疻W疻W癢W癡V癡V盫V盪U睻U睻U砋U砊T碩T碩T碩T礣T礢S禨S禨S禨S稴S稴S稴S窻R窻R窻R窻R筊R筊R筊R筊R筊R筊R筊R篟R篟R篟R篟R篟R篟R筊R筊R筊R筊R筊R筊R筊R窻R窻R窼S窼S稴S稴S稴S禨S禨S禩T礣T礣T碩T碩T砋U砋U睻U睼V盫V盫V癢W癢W疻W疿X甔X甕Y璝Y璟Z琙Z琜[玔[玕\猏\猐]�]�^╛_╛_�`�`�a�b�b�c�d�d�e�f�f�g�h�i�i�j�j�k�l�l�m�n�n�o�o�p�p�q�q�q�r�r爎r爎r爏s爏s爏s爏s爏s爏s爏s爏s爏s爏s爏s爎r爎r爎r爎r爍q�q�p�p�p�o�o�n�n�m�m�l�l�k�j�j�i�i�h�h�g�g�f�e�e�d�d�c�c�b�b�a�a�`�`�`�_�_╚^╚^╚^╚^�]�]�]�]‐\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猐]�]�]�]�^�^╚^╛_╛_╜`�`�a�a�b�b�c�d�d�e�f�g�h�h�j�k�l�m�n�o�p�r爏s爑u爒v爓w爕y爗{爘|爚~爛€爞偁剟爢啝垐爦姞崓�彙憫�敘枛�槪洓�灓 ぃ%ΖΗЁ┅┆�������北辈膊吵车档抖斗贩构购汉换患技揪究靠览懒亮妹媚哪排牌破乔侨热缮墒适怂颂烫屯臀挝舷闲行蜒岩乙佑釉栽栽哉照种种种鬃鬃鬃刎刭儋儋儋儋谮谮谮圹圹圹圹圮苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘圹圹圹圹圹圹谮谮谮谮谮谮儋儋儋儋儇刎刎刎刎鬃鬃鬃鬃字种种种种照照照照赵栽栽栽栽佑佑佑佑右乙乙乙乙乙已蜒蜒蜒蜒蜒蜒蜒行行行行行行行行行行行行行邢舷舷舷舷舷舷舷舷舷舷舷闲行行行行行行行行行行行醒蜒蜒蜒蜒蜒岩乙乙乙乙乙矣佑佑佑佑栽栽栽栽哉照照罩种种种种鬃鬃鬃刎刎刎刎刭儋儋仝谮谮谯圹圹圮苘苘茌葺葺蒉揶揶捱哌哌哙噜噜噌後後徕忖忖忏沣沣沅滗滗滗滗邋邋邋骀骀骀珑珑珑珑玷梃梃梃梃殚殚殚殚閐d�d�e�e�e�e�f�f�f�f�f�g�g�g�g�g�g�g�g�g�g�g�g�f�f�f�f�f�e�e�e�d�d�d�c�c�c�b�b�a�a�`�`�_�_�_╚^╚^╙]�]‐\猏\猍[猍[玔[玓Z琙Z琘Y琘Y璝Y璛X甔X甔X疻W疻W癢W癡V癡V盫V盪U睻U睻U砋U砊T碩T碩T礣T礣T礢S禨S禨S禨S稴S稴S稲R窻R窻R窻R窻R筊R筊R筊R筊R筊R篟R篟R篟R篟R篟R篟R篟R篟R篟R筊R筊R筊R筊R筊R筊R窻R窻R窻R窼S稴S稴S稴S禨S禨S禩T礣T礣T碩T碩T碪U砋U砋U睻U睼V盫V盬W癢W癢W疿X甔X甕Y璝Y璝Y琙Z琙Z玔[玕\猏\猐]�]�^╚^╛_╜`�`�a�a�b�c�d�d�e�f�f�g�h�h�i�j�k�k�l�l�m�m�n�n�o�o�p�p�q�q�r爎r爎r爎r爏s爏s爏s爏s爏s爏s爏s爏s爏s爏s爏s爎r爎r爎r爎r爍q�q�q�p�p�p�o�o�n�n�m�m�l�l�k�j�j�i�i�h�g�g�f�f�e�e�d�d�c�c�b�b�a�a�a�`�`�_�_╛_╚^╚^╚^╚^�]�]�]�]�]‐\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\猏\�]�]�]�]�^�^╚^╛_╛_╛_�`�`�a�a�b�c�c�d�e�e�f�g�h�i�j�k�l�m�n�o�q�r爏s爑u爒v爔x爕y爗{爙}�爛€爞偁剟爢啝墘爧嫚崓�彙拻�敘棗�櫍湝�灓 イぅΖΗЁ┅┆�������北辈膊吵车档抖斗贩构购汉换患技揪究靠览懒亮妹媚哪排牌破乔侨热缮墒适烫烫烫屯臀挝舷闲行蜒岩乙佑釉栽栽哉照种种种鬃棕刎刎刭儋儋儋儋谮谮谮圹圹圹圹圹圹苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苒圹圹圹圹圹圹圹谮谮谮谮谫儋儋儋儋刎刎刎刎刈鬃鬃鬃鬃种种种种终照照照照栽栽栽佑佑佑佑佑佑乙乙乙乙已蜒蜒蜒蜒蜒研行行行行行行行舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷舷行行行行行行行醒蜒蜒蜒蜒蜒岩乙乙乙乙佑佑佑佑釉栽栽哉照照照照种种种鬃鬃鬃鬃棕刎刎刭儋儋仝谮谮谯圹圹圮苘苘茌葺葺蒉揶揶捱哌哌哙噜噜噌後後徕忖忖忖忖沣沣沣滗滗滗邋邋邋邋彐骀骀骁珑珑珑珑梃梃梃梃鑔d�e�e�e�e�f�f�f�f�f�g�g�g�g�g�g�g�g�g�g�g�g�g�g�f�f�f�f�e�e�e�d�d�d�c�c�c�b�b�a�a�`�`�_�_╛_╚^╚^�]�]‐\猏\猍[猍[玔[玓Z琙Z琘Y璝Y璝Y璛X甔X甒W疻W疻W癡V癡V盫V盫V睻U睻U睻U砊T砊T碩T碩T礣T礣T礢S禨S禨S禨S稴S稴S窼S窻R窻R窻R窻R筊R筊R筊R筊R筊R篟R篟R篟R篟R篟R篟R篟R篟R篟R篟R筊R筊R筊R筊R筊R筊R窻R窻R窼S窼S稴S稴S稴S禨S禨S礣T礣T礣T碩T碪U砋U砋U睻U睼V盫V盫VLine truncated
|
||||
@@ -1,43 +0,0 @@
|
||||
BRL-CAD Release 3.26 Ray-Tracer
|
||||
Mon Aug 26 22:39:04 EDT 1991, Compilation 1
|
||||
butler@vgr.brl.mil:/usr/src/tmpcad/rt
|
||||
|
||||
db title: M35 2 1/2 ton truck
|
||||
initial dynamic memory use=907472.
|
||||
GETTREE: 53.9user 12.3sys 1:32real 71% 414i+3731d 2618maxrss 24+55pf 24+929csw
|
||||
Additional dynamic memory used=1352576. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: 17.2user 6.2sys 1:00real 38% 542i+5508d 3283maxrss 1+14pf 1+372csw
|
||||
Additional dynamic memory used=658960. bytes
|
||||
Tree: 1126 solids in 893 regions
|
||||
Model: X(-1828,4893), Y(-2302,1311), Z(0,5234)
|
||||
View: 33.0779 azimuth, 35.7436 elevation off of front view
|
||||
Orientation: 0.22019, 0.399295, 0.785465, 0.418479
|
||||
Eye_pos: 3974.53, 1503.32, 2874.63
|
||||
Size: 6787.39mm
|
||||
Grid: (13.2566, 13.2566) mm, (512, 512) pixels
|
||||
Beam: radius=6.62831 mm, divergence=0 mm/1mm
|
||||
Output file is 'm35.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/all.g/light2: (-1088.72, -2291.44, 5223.76), aimed at (0, 0, -1)
|
||||
/all.g/light2: visible, casts shadows, 1000 lumens (83%), halfang=45
|
||||
/all.g/light1: (4800, 1300, 2600), aimed at (-0.855372, -0.231663, -0.463326)
|
||||
/all.g/light1: visible, casts shadows, 1000 lumens (83%), halfang=180
|
||||
|
||||
light_hit: ERROR, nothing hit, sxy=460,369, dtol=5.000000e-03
|
||||
------light_hit pt list
|
||||
003c78b8: PT s960 (ARB8#65) s852 (ARB8#2) (-0.005,0.00231937)
|
||||
InHIT dist=-0.005 (surf 2)
|
||||
OutHIT dist=0.00231937 (surf 3)
|
||||
Solids: (2, 65)
|
||||
------
|
||||
SHOT: 9264.9user 383.3sys 4:41:16real 57% 593i+1653d 3353maxrss 4+48pf 207+137762csw
|
||||
Additional dynamic memory used=41752. bytes
|
||||
5741785 solid/ray intersections: 1858444 hits + 3883341 miss
|
||||
pruned 32.4%: 0 model RPP, 0 dups skipped, 625549 solid RPP
|
||||
Frame 0: 262144 pixels in 9264.91 sec = 28.29 pixels/sec
|
||||
Frame 0: 654979 rays in 9264.91 sec = 70.69 rays/sec (RTFM)
|
||||
|
||||
17058.7 real 9343.0 user 414.1 sys
|
||||
-1169
File diff suppressed because it is too large.
Load diff
@@ -1,34 +0,0 @@
|
||||
BRL-CAD Release 3.26 Ray-Tracer
|
||||
Mon Aug 26 22:39:04 EDT 1991, Compilation 1
|
||||
butler@vgr.brl.mil:/usr/src/tmpcad/rt
|
||||
|
||||
db title: Gary Moss's "World on a Platter"
|
||||
initial dynamic memory use=15568.
|
||||
GETTREE: 0.1user 0.3sys 0:01real 41% 315i+264d 395maxrss 22+48pf 22+4csw
|
||||
Additional dynamic memory used=15976. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: 0.0user 0.1sys 0:00real 53% 527i+360d 454maxrss 1+14pf 1+7csw
|
||||
Additional dynamic memory used=21096. bytes
|
||||
Tree: 6 solids in 6 regions
|
||||
Model: X(-50,90), Y(-70,70), Z(-24,63)
|
||||
View: 35 azimuth, 25 elevation off of front view
|
||||
Orientation: 0.248097, 0.476591, 0.748097, 0.389435
|
||||
Eye_pos: 63.7999, 32.7177, 33.6666
|
||||
Size: 157.203mm
|
||||
Grid: (0.307036, 0.307036) mm, (512, 512) pixels
|
||||
Beam: radius=0.153518 mm, divergence=0 mm/1mm
|
||||
Output file is 'moss.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/all.g/light.r: (20.1576, -13.526, 5.03474), aimed at (0, 0, -1)
|
||||
/all.g/light.r: visible, casts shadows, 1000 lumens (83%), halfang=180
|
||||
|
||||
SHOT: 2503.7user 184.1sys 1:20:23real 55% 577i+449d 517maxrss 4+40pf 69+39029csw
|
||||
Additional dynamic memory used=32584. bytes
|
||||
488710 solid/ray intersections: 316743 hits + 171967 miss
|
||||
pruned 64.8%: 51533 model RPP, 0 dups skipped, 205036 solid RPP
|
||||
Frame 0: 262144 pixels in 2503.79 sec = 104.70 pixels/sec
|
||||
Frame 0: 343042 rays in 2503.79 sec = 137.01 rays/sec (RTFM)
|
||||
|
||||
4828.3 real 2504.2 user 185.4 sys
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 768 KiB |
@@ -1,58 +0,0 @@
|
||||
BRL-CAD Release 4.6 The BRL-CAD Ray-Tracer RT
|
||||
Wed Dec 30 23:53:51 EST 1998, Compilation 1
|
||||
morrison@window.arl.mil:/n/cad/vld/morrison/programming/brlcad/.rt.6d
|
||||
BRL-CAD Release 4.6 The BRL-CAD Ray-Tracing Library
|
||||
Wed Dec 30 23:37:49 EST 1998, Compilation 1
|
||||
morrison@window.arl.mil:/n/cad/vld/morrison/programming/brlcad/.librt.6d
|
||||
BRL-CAD Release 4.6 The BRL-CAD Numerical Computation Library
|
||||
Wed Dec 30 23:00:29 EST 1998, Compilation 1
|
||||
morrison@window.arl.mil:/n/cad/vld/morrison/programming/brlcad/.libbn.6d
|
||||
BRL-CAD Release 4.6 The BRL-CAD Utility Library
|
||||
Wed Dec 30 22:59:12 EST 1998, Compilation 1
|
||||
morrison@window.arl.mil:/n/cad/vld/morrison/programming/brlcad/.libbu.6d
|
||||
|
||||
Planning to run with 2 processors
|
||||
db title: SphereFlake
|
||||
100bb288 TOL 5.000000e-03 (sq=2.500000e-05) perp=1.000000e-06, para=9.999990e-01
|
||||
BRL-CAD Release 4.6 The BRL-CAD Optical Shader Library
|
||||
Wed Dec 30 23:40:28 EST 1998, Compilation 1
|
||||
morrison@window.arl.mil:/n/cad/vld/morrison/programming/brlcad/.liboptical.6d
|
||||
initial dynamic memory use=131072.
|
||||
GETTREE: cpu = 0.132987 sec, elapsed = 0.268198 sec
|
||||
parent: 0.0user 0.0sys 0:00real 14% 0i+0d 216maxrss 1+24pf 12+1csw
|
||||
children: 0.0user 0.0sys 0:00real 29% 0i+0d 464maxrss 0+13pf 6+0csw
|
||||
Additional dynamic memory used=524288. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: cpu = 0.034682 sec, elapsed = 0.035548 sec
|
||||
parent: 0.0user 0.0sys 0:00real 100% 0i+0d 264maxrss 0+4pf 0+1csw
|
||||
children: 0.0user 0.0sys 0:00real 0% 0i+0d 464maxrss 0+0pf 0+0csw
|
||||
Additional dynamic memory used=0. bytes
|
||||
Tree: 823 solids in 8 regions
|
||||
Model: X(-18202,18202), Y(-18000,16914), Z(-10300,157000)
|
||||
View: 352.851 azimuth, 16.905 elevation off of front view
|
||||
Orientation: 0.440681, 0.400509, 0.522645, 0.61011
|
||||
Eye_pos: 24185, -3328.56, 8489.93
|
||||
Size: 25562.8mm
|
||||
Grid: (49.9274, 49.9274) mm, (512, 512) pixels
|
||||
Beam: radius=24.9637 mm, divergence=0 mm/1mm
|
||||
Output file is 'sflake.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/scene.r/light1.r: (13000, -13000, 152000), aimed at (0, 0, -1)
|
||||
/scene.r/light1.r: visible, casts shadows, 5000 lumens (50%), halfang=180
|
||||
/scene.r/light0.r: (5000, -5000, 150000), aimed at (0, 0, -1)
|
||||
/scene.r/light0.r: visible, casts shadows, 10000 lumens (83%), halfang=180
|
||||
|
||||
SHOT: cpu = 176.367 sec, elapsed = 90.6839 sec
|
||||
parent: 88.5user 0.2sys 1:30real 97% 0i+0d 1880maxrss 0+1pf 547+2160csw
|
||||
children: 87.8user 0.2sys 1:30real 97% 0i+0d 1880maxrss 0+2pf 200+0csw
|
||||
Additional dynamic memory used=131072. bytes
|
||||
4019960 solid/ray intersections: 3395228 hits + 624732 miss
|
||||
pruned 84.5%: 0 model RPP, 5336614 dups skipped, 11163251 solid RPP
|
||||
1323178 empty boxnodes (NUBSPT)
|
||||
Frame 0: 262144 pixels in 88.18 sec = 2972.71 pixels/sec
|
||||
Frame 0: 1307010 rays in 88.18 sec = 14821.48 rays/sec (RTFM)
|
||||
Frame 0: 1307010 rays in 176.37 sec = 7410.74 rays/CPU_sec
|
||||
Frame 0: 1307010 rays in 90.68 sec = 14412.81 rays/sec (wallclock)
|
||||
|
||||
Binary file not shown.
@@ -1,34 +0,0 @@
|
||||
BRL-CAD Release 3.26 Ray-Tracer
|
||||
Mon Aug 26 22:39:04 EDT 1991, Compilation 1
|
||||
butler@vgr.brl.mil:/usr/src/tmpcad/rt
|
||||
|
||||
db title: The Enterprise and Shuttlecraft
|
||||
initial dynamic memory use=94208.
|
||||
GETTREE: 3.7user 1.0sys 0:09real 51% 153i+594d 453maxrss 7+57pf 7+69csw
|
||||
Additional dynamic memory used=134208. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: 0.7user 0.2sys 0:01real 99% 214i+782d 522maxrss 0+15pf 0+12csw
|
||||
Additional dynamic memory used=45040. bytes
|
||||
Tree: 113 solids in 72 regions
|
||||
Model: X(-1e+07,1e+07), Y(-1e+07,1e+07), Z(-1e+07,1e+07)
|
||||
View: 58.1641 azimuth, -21.8449 elevation off of front view
|
||||
Orientation: 0.403268, 0.723479, 0.559692, 0.0264004
|
||||
Eye_pos: 210268, 84555, 29347.1
|
||||
Size: 250000mm
|
||||
Grid: (488.281, 488.281) mm, (512, 512) pixels
|
||||
Beam: radius=244.141 mm, divergence=0 mm/1mm
|
||||
Output file is 'star.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/all/light.r: (275000, 150000, 15000), aimed at (0, 0, -1)
|
||||
/all/light.r: visible, casts shadows, 1000 lumens (83%), halfang=180
|
||||
|
||||
SHOT: 5565.0user 237.6sys 3:01:30real 53% 300i+875d 589maxrss 1+30pf 153+79504csw
|
||||
Additional dynamic memory used=32392. bytes
|
||||
2396308 solid/ray intersections: 914336 hits + 1481972 miss
|
||||
pruned 38.2%: 0 model RPP, 0 dups skipped, 3009798 solid RPP
|
||||
Frame 0: 262144 pixels in 5565.04 sec = 47.11 pixels/sec
|
||||
Frame 0: 312052 rays in 5565.04 sec = 56.07 rays/sec (RTFM)
|
||||
|
||||
10906.5 real 5570.4 user 240.5 sys
|
||||
Binary file not shown.
@@ -1,34 +0,0 @@
|
||||
BRL-CAD Release 3.26 Ray-Tracer
|
||||
Mon Aug 26 22:39:04 EDT 1991, Compilation 1
|
||||
butler@vgr.brl.mil:/usr/src/tmpcad/rt
|
||||
|
||||
db title: Colorful version of the Moss World
|
||||
initial dynamic memory use=16624.
|
||||
GETTREE: 0.2user 0.3sys 0:01real 50% 167i+272d 290maxrss 41+31pf 41+8csw
|
||||
Additional dynamic memory used=17632. bytes
|
||||
|
||||
...................Frame 0...................
|
||||
PREP: 0.2user 0.1sys 0:00real 70% 283i+379d 344maxrss 8+7pf 8+5csw
|
||||
Additional dynamic memory used=26960. bytes
|
||||
Tree: 8 solids in 7 regions
|
||||
Model: X(-500,500), Y(-500,500), Z(-500,500)
|
||||
View: 35 azimuth, 25 elevation off of front view
|
||||
Orientation: 0.248097, 0.476591, 0.748097, 0.389435
|
||||
Eye_pos: 63.7999, 32.7177, 33.6666
|
||||
Size: 157.203mm
|
||||
Grid: (0.307036, 0.307036) mm, (512, 512) pixels
|
||||
Beam: radius=0.153518 mm, divergence=0 mm/1mm
|
||||
Output file is 'world.pix'
|
||||
Dynamic scanline buffering
|
||||
Lighting: Ambient = 40%
|
||||
/all.g/light.r: (20.1576, -13.526, 5.03474), aimed at (0, 0, -1)
|
||||
/all.g/light.r: visible, casts shadows, 1000 lumens (83%), halfang=180
|
||||
|
||||
SHOT: 6538.3user 490.2sys 4:13:00real 46% 403i+485d 458maxrss 27+31pf 214+100702csw
|
||||
Additional dynamic memory used=33872. bytes
|
||||
1477224 solid/ray intersections: 1311433 hits + 165791 miss
|
||||
pruned 88.8%: 0 model RPP, 0 dups skipped, 176285 solid RPP
|
||||
Frame 0: 262144 pixels in 6538.36 sec = 40.09 pixels/sec
|
||||
Frame 0: 438449 rays in 6538.36 sec = 67.06 rays/sec (RTFM)
|
||||
|
||||
15184.2 real 6539.0 user 491.2 sys
|
||||
@@ -1,308 +0,0 @@
|
||||
bb在b在b在b在b半b卉c卉c卉c卉c卉c卡d卡d卡d卡d卡d叉e叉e叉e叉e叉e叉e口f口f口f口f口f土gμgμgμgμgμgνhνhνhνhνhνhξiξiξiξi▏j▏j▏j▏j▏j▏j▎k▎k▎k▎k▎k▎k▍l▍l▍l▍l▍l▍l▌m▌m▌m《m《m《m《m》n》n》n》n》n》n》n︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r〈q〉r〉r〉r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r〉r〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o》n︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r�r�r�r�r�r坟s坟s坟s坟s坟s坟s慯t慯t慯t慯t抦u抦u抦u抦u抦u抦u戹v戹v戹v戹v拎w拎w拎w拎w㩜x㩜x㩜x㩜x懢y懢y懢y厪z厪z厪z厪z𣏵{𣏵{𣏵{捤|捤|捤|栂}栂}栂}㗒~㗒~㗒~������������������������������������������������𣏹��繧��𨘥��𠴱��鷄��働��𤙥��𤩎��硄��𠳿��𣌀��腼��𧙗��𧁋��𤪓��鴂��𨸹﹛丑‘╰失╞ㄒ奶丰孕孕它戌戌戌壯壯壯壯夾豕豕豕豕帘帘帘帘帚牧牧牧牧垂垂垂垂垂垂洵洵洵限限限限限限悅悅悅悅悖秤秤秤秤偽偽偽偽停控控控控眷眷眷眷眾陶陶陶陶陶陷斐斐斐斐紫紫紫紫紫紫順順順順須毽毽毽毽虜虜虜虜虜虜凳凳凳凳凳凳犖犖犖犖犖犖遙遙遙遙遙遙撮撮撮撮撮撮蝸蝸蝸蝸蝸蝸噢噢噢噢噢噢噢噶蕞蕞蕞蕞蕞蕞蕞擬擬擬擬擬擬擬擱謠謠謠謠謠謠謠舊朦a在b在b在b在b半b卉c卉c卉c卉c卉c卡d卡d卡d卡d卡d叉e叉e叉e叉e叉e叉e口f口f口f口f口f土g土gμgμgμgνhνhνhνhνhνhξiξiξiξiξi█i▏j▏j▏j▏j▏j▏j▎k▎k▎k▎k▎k▎k▍l▍l▍l▍l▍l▍l▌m▌m《m《m《m《m》n》n》n》n》n》n》n》n︽o︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p〈q︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r〉r�r�r�r〉r〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〉r〉r〉r�r�r�r�r�r坟s坟s坟s坟s坟s慯t慯t慯t慯t慯t抦u抦u抦u抦u抦u戹v戹v戹v戹v拎w拎w拎w拎w㩜x㩜x㩜x㩜x懢y懢y懢y懢y厪z厪z厪z𣏵{𣏵{𣏵{𣏵{捤|捤|栂}栂}栂}㗒~㗒~㗒~����������������������������������������������𣏹��㨃��繧��𨘥��𠴱��鷄��働��𤙥��𤩎��硄��𠳿��𣌀��腼��𧙗��𧁋��𤪓��鴂��𨸹﹛丑‘╰失╞ㄒ奶丰孕孕它戌戌戌壯壯壯壯夾豕豕豕豕豕貝帘帘帘帘牧牧牧垂垂垂垂垂垂洵洵洵洵洎限限限限悅悅悅悅悖秤秤秤秤偽偽偽偽偽偽控控控眷眷眷眷眷眷陶陶陶陶陷斐斐斐斐紫紫紫紫紫紫順順順順順順毽毽毽毽溢虜虜虜虜凳凳凳凳凳凳犖犖犖犖犖犖遙遙遙遙遙遙撮撮撮撮撮撮撮播蝸蝸蝸蝸蝸蝨噢噢噢噢噢噶蕞蕞蕞蕞蕞蕞蕞擬擬擬擬擬擬擬擬擬謠謠謠謠謠謠謠縱a在b在b在b在b在b卉c卉c卉c卉c卉c卉c卡d卡d卡d卡d叉e叉e叉e叉e叉e叉e口f口f口f口f口f口f土gμgμgμgμgνhνhνhνhνhξiξiξiξiξi█i▏j▏j▏j▏j▏j▏j▎k▎k▎k▎k▎k▎k▍l▍l▍l▍l▍l▍l▍l▌m▌m《m《m《m《m》n》n》n》n》n》n》n》n︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r〉r〉r�r〉r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︽o︾p︾p︾p︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r〉r�r�r�r�r�r坟s坟s坟s坟s坟s坟s慯t慯t慯t慯t慯t抦u抦u抦u抦u抦u戹v戹v戹v戹v拎w拎w拎w拎w㩜x㩜x㩜x㩜x懢y懢y懢y懢y厪z厪z厪z𣏵{𣏵{𣏵{捤|捤|捤|栂}栂}栂}㗒~㗒~㗒~�����������������������������������������������𣏹��㨃��繧��𨘥��𠴱��鷄��働��𤙥��佅��硄��𠳿��𣌀��腼��𧙗��𧁋��𤪓��鴂��𨸹﹛丑‘╰奴ㄔㄒ奶丰孕孕它戌戌戌戌戍壯壯壯壯豕豕豕豕貝帘帘帘帘牧牧牧牧物垂垂垂垂洵洵洵洵洎限限限限悅悅悅悅悖秤秤秤秤偽偽偽偽偽偽控控控控捲眷眷眷眷陶陶陶陶陷斐斐斐斐斐斯紫紫紫紫順順順順順順毽毽毽毽溢虜虜虜虜虜號凳凳凳凳凳劃犖犖犖犖犖獄遙遙遙遙撮撮撮撮撮撮撮播蝸蝸蝸蝸蝸蝨噢噢噢噢噢噢噢蕞蕞蕞蕞蕞蕞蕞蕞蕞擬擬擬擬擬擬擬擱謠謠謠謠謠縱a在b在b在b在b在b卉c卉c卉c卉c卉c卉c卡d卡d卡d卡d卡d千d叉e叉e叉e叉e叉e口f口f口f口f口f土gμgμgμgμgμgνhνhνhνhνhξiξiξiξiξi▏j▏j▏j▏j▏j▏j▎k▎k▎k▎k▎k▎k▍l▍l▍l▍l▍l▍l▍l▌m▌m《m《m《m《m《m》n》n》n》n》n》n》n︽o》n︽o︽o︽o︽o︽o︽o︽o︽o︾p︾p︾p︾p︾p︾p︾p︾p︾p〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〈q〉r〈q〉r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rLine truncated
|
||||
!
!&&++004477;;>>AADDGGIIKKNNPPR RS!SU!UW"WX#XZ#Z[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'dd'de(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&``&`_%_^%^]$]\$\[$[Y#YX#XW"WU!UT!TR RPPNNT%TT&TS&SS&SR&RQ&QP&PN%NL$LJ#JF!FCC>>88L8L���00,33,66,77,88,99,99-99-99-99-88-88-66-44-11-�����������������������������������������������﹚~﹚~﹚~﹚~﹙}栂}栂}栂}捤|捤|鞺|鞺|鞺|饀{饀{𤿂{𤿂{䝎z䝎z𪗋z𪗋z𪗋z递y递y䛐y䛐y𦮝x𦮝x𦮝x矗x矗x矗x𤦺w𤦺w鯱w鯱w鯱w鯱w鯝v鯝v脎v脎v猪u猪u猪u猪u𤩏u𤩏u𤩏u勇t勇t勇t鍟t鍟t鍟t鍟t鍟t珦s騯s騯s騯s騯s嫾r嫾r嫾r媆r媆r媆r媆r媆r媆r𦞴ij k"l$m%o'p)q*r,s.t/u1w3x4y6z8{:|;}=?�@�B�D�E�G�I�K�L�N�P�Q�S�U�V�X�Z�\�]�_�a�b�d�f�h�i�k�m�n�p�r�t�u�w�y�{�|�~������靊�𦂗苸𦅚噡𨰫唍旔䲰𧬘齄閠𣺿琸鴡獁蒈垈嚿𣳽㊣Ⅸ刈汛乳穹室借缺常`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�`�_�_�`�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^����������������������������������������������������������������������������������������������������������������������������������~�~�~�}�}�|�|�{�{�{�z�z�z�y�y�y�x�x�w�w�w�w�v�v�u�u�u� %%**//3377::>>AADDFFIIKKMMOOQ QS!SU!UW"WX#XZ#Z[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'dd'de(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&``%`_%_^%^]$]\$\Z#ZY#YX"XV"VU!US!SR RPPNNT&TT&TT&TS&SR&RQ&QP&PN%NL$LI#IF!FBB==77..���������������������������������������������������������������������﹚~﹚~﹚~﹚~﹚~栂}栂}栂}栂}捤|鞺|鞺|鞺|鞺|𤿂{𤿂{𤿂{𤿂{𤿂{𪗋z𪗋z𪗋z𪗋z递y䛐y䛐y䛐y䛐y𦮝x𦮝x矗x矗x矗x𤦺w𤦺w鯱w鯱w鯝v鯝v鯝v脎v脎v脎v猪u猪u猪u𤩏u𤩏u𤩏u𤩏u勇t勇t鍟t鍟t鍟t珦s珦s珦s珦s騯s騯s騯s騯s騯s嫾r嫾r媆r媆r媆r媆r媆r𧈛q𧈛q疃q疃q䒟op q"s$t&u'v)w+x,y.{0|1}3~56�8�:�;�=�?�A�B�D�F�G�I�K�L�N�P�R�S�U�W�X�Z�\�^�_�a�c�d�f�h�j�k�m�o�q�r�t�v�w�y�{�}�~������瑌鸌�龫罁陻㧥�𠶖袐梄䘏䮖𩐿𡡅𪃭𤣲块𧟌�𠳔﹊␈玉呎`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�����������������������������������������������������������������������������������������������������������������������������������~�~�~�}�|�|�|�{�{�{�z�z�y�y�y�x�x�x�w�w�w�v�v�u�u�u�##))..2266::==@@CCFFHHKKMMOOQ QS!SU!UW"WX#XY#Y[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'dd'de(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&`_%__%_^%^]$]\$\Z#ZY#YX"XV"VU!US!SQ QPPNNT&TT&TT&TS&SR&RQ&QP&PN%NL$LI#IF!FAA<<55++�����������������������������������������������������������������﹚~﹚~﹚~﹚~㗒~栂}栂}栂}栂}匬}鞺|鞺|鞺|鞺|饀{𤿂{𤿂{𤿂{䝎z䝎z𪗋z𪗋z𪗋z𪗋z递y䛐y䛐y𦮝x𦮝x𦮝x矗x矗x矗x𤦺w𤦺w鯱w鯱w鯱w鯱w鯝v脎v脎v脎v脎v猪u猪u𤩏u𤩏u𤩏u𤩏u勇t勇t鍟t鍟t鍟t鍟t鍟t珦s珦s騯s騯s騯s騯s嫾r嫾r嫾r媆r媆r媆r媆r媆r媆r𧈛q疃q疃q疃q疃q疃q𤳙tuw!x"y$z&{'|)}+,�.�0�2�3�5�7�8�:�<�=�?�A�C�D�F�H�I�K�M�N�P�R�T�U�W�Y�Z�\�^�`�a�c�e�g�h�j�l�m�o�q�s�t�v�x�z�{�}�������㓦������稬𧀎𡂝駠𦋐隣𨪜𥖄姰㵌䕷𤣻𨃨裇`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�`�`�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�_�^�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^����������������������������������������������������������������������������������������������������������������������������������~�~�~�~�}�}�|�|�{�{�{�z�z�y�y�y�x�x�x�w�w�w�v�v�v�u�u�"
"'',,115599<<@@CCEEHHKKMMOOQ QS!SU!UV"VX#XY#Y[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dc'cc'cb'bb&ba&a`&`_%__%_^%^]$][$[Z#ZY#YX"XV"VU!US!SQ QOOMMT&TT&TT'TS'SR'RQ&QP&PN%NL$LI#IE!EAA;;33''�����������������������������������������������������������������﹚~﹚~Line truncated
|
||||
&&++004488<<??BBEEHHJJMMOOQ QS SU!UV"VX"XY#Y[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dc'cc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZY#YW"WV"VT!TS SQ QOOU&UU&UT'TT'TS'SR'RQ'QP&PN&NK$KH#HD!D@@9911������������������������������������������������������������﹚~﹚~﹚~㗒~㗒~栂}栂}栂}栂}匬}鞺|鞺|鞺|鞺|𧿹|𤿂{𤿂{𤿂{𤿂{𪗋z𪗋z𪗋z𪗋z𪗋z𪗋z䛐y䛐y䛐y䛐y𦮝x矗x矗x矗x矗x𤦺w鯱w鯱w鯱w鯱w鯝v鯝v脎v脎v脎v脎v猪u猪u𤩏u𤩏u𤩏u𤩏u勇t勇t鍟t鍟t鍟t鍟t珦s珦s騯s騯s騯s騯s騯s騯s嫾r媆r媆r媆r媆r媆r媆r媆r𧈛q疃q疃q疃q疃q疃q疃q疃q䕑p𢖯p𢖯p𢖯p𢖯p����!�#�$�&�(�*�+�-�/�0�2�4�5�7�9�;�<�>�@�A�C�E�F�H�J�L�M�O�Q�S�T�V�X�Y�[�]�_�`�b�d�e�g�i�k�l�n�p�r�s�u�w�m�o�q�s�t�v�x�z�|�}�������𪘁䈣`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^������������������������������������������������������������������������������������������������������������������������������������~�~�~�}�}�}�|�|�{�{�z�z�z�y�y�y�x�x�x�w�w�w�v�v�v�u� %%**//3377;;>>BBEEGGJJLLOOQ QS SU!UV"VX"XY#Y[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee'ed'dd'dc'cc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZY#YW"WV"VT!TS SQ QOOU&UU&UT'TT'TS'SS'SQ'QP&PN&NK$KH#HD!D??88..�����������������������������������������������������������﹚~㗒~㗒~㗒~㗒~栂}栂}栂}匬}匬}鞺|鞺|鞺|鞺|𧿹|𤿂{𤿂{𤿂{𤿂{𪗋z𪗋z𪗋z𪗋z𪗋z递y䛐y䛐y䛐y䛐y䛐y矗x矗x矗x矗x矗x鯱w鯱w鯱w鯱w鯱w鯝v脎v脎v脎v脎v猪u猪u𤩏u𤩏u𤩏u勇t勇t勇t鍟t鍟t鍟t鍟t鍟t鍟t騯s騯s騯s騯s騯s騯s嫾r媆r媆r媆r媆r媆r媆r𧈛q𧈛q疃q疃q疃q疃q疃q疃q疃q䕑p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p���� �!�#�%�&�(�*�+�-�/�1�2�4�6�7�9�;�=�>�@�B�C�E�G�I�J�L�N�O�Q�S�U�V�X�Z�[�]�_�a�b�d�f�h�i�k�m�n�e�g�h�j�l�n�p�q�s�u�w�y�z�|�~�����`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�_�_�_�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�������������������������������������������������������������������������������������������������������������������������������������~�~�}�}�}�|�|�{�{�{�z�z�y�y�y�x�x�w�w�w�w�v�v�v�u�##))..2277::>>AADDGGJJLLNNQ QS ST!TV"VX"XY#Y[$[\$\]%]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee'ed'dd'dc'cc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZY#YW"WV"VT!TR RP PNNU&UU'UU'UT'TT'TS'SQ'QP'PN&NK$KH#HC C>>66**��������������������������������������������������������﹚~㗒~㗒~㗒~㗒~㗒~栂}栂}匬}匬}匬}匬}鞺|鞺|𧿹|𤿂{𤿂{𤿂{𤿂{𤿂{䶜{𪗋z𪗋z𪗋z𪗋z𪗋z䛐y䛐y䛐y䛐y𦮝x矗x矗x矗x矗x𤦺w𤦺w鯱w鯱w鯱w鯱w鯝v脎v脎v脎v脎v猪u猪u𤩏u𤩏u𤩏u𤩏u𤩏u勇t鍟t鍟t鍟t鍟t鍟t鍟t珦s騯s騯s騯s騯s騯s嫾r嫾r媆r媆r媆r媆r媆r媆r媆r疃q疃q疃q疃q疃q疃q疃q䕑p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p侊o���� �!�#�%�'�(�*�,�-�/�1�3�4�6�8�9�;�=�?�@�B�D�E�G�I�K�L�N�P�Q�S�U�W�X�Z�\�]�_�a�c�d�[�\�^�`�b�d�e�g�i�k�m�n�p�r�t�v�w�y``�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�`�`�_�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^��������������������������������������������������������������������������������������������������������������������������������������~�}�}�}�|�|�|�{�{�z�z�z�y�y�x�x�x�w�w�w�v�v�v�u�u�
|
||||
!
!''--1166::==AADDGGIILLNNP PR RT!TV"VX"XY#Y[$[\$\]$]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee'ed'dd'dc'cc'cb&ba&aa&a`&`_%_^%^]%]\$\[$[Z#ZX#XW"WU"UT!TR RPPNNU&UU'UU'UT(TT(TS(SR'RP'PN&NK$KG#GB B<<44""��������������������������������������������������㗒~㗒~㗒~㗒~㗒~㗒~栂}栂}匬}匬}匬}鞺|鞺|鞺|𧿹|𧿹|𧿹|𤿂{𤿂{𤿂{䶜{䶜{𪗋z𪗋z𪗋z𪗋z𦲤z䛐y䛐y䛐y䛐y䛐y𣘚y矗x矗x矗x矗x矗x鯱w鯱w鯱w鯱w鯝v脎v脎v脎v脎v脎v猪u𤩏u𤩏u𤩏u𤩏u𤩏u勇t鍟t鍟t鍟t鍟t鍟t珦s珦s騯s騯s騯s騯s騯s騯s騯s媆r媆r媆r媆r媆r𧈛q𧈛q疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p侊o侊o侊o侊o侊o���� �"�#�%�'�)�*�,�.�/�1�3�5�6�8�:�;�=�?�A�B�D�F�G�I�K�M�N�P�R�S�U�W�Y�Z�\�R�T�V�X�Y�[�]�_�a�b�d�f�h�j�k�m�o�qaa�a�a�`�a�`�a�`�`�`�`�`�`�`�`�a�`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�`�`�`�`�_�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�^�^�^�^�^�^�^�^�^��������������������������������������������������������������������������������������������������������������������������������������~�~�}�}�}�|�|�{�{�{�z�z�y�y�y�x�x�x�w�w�v�v�v�v�u� &&++005599==@@CCFFIILLNNPPR RT!TV"VX"XY#Y[#[\$\]$]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&aa&a`&`_%_^%^]%]\$\[$[Z#ZX#XW"WU!UT!TR RPPNNU'UU'UU'UT(TT(TS(SR(RP'PM&MJ$JF"FAA;;11������������������������������������������������������㗒~㗒~㗒~㗒~㗒~㗒~愰~匬}匬}匬}匬}匬}鞺|鞺|𧿹|𧿹|𧿹|𧿹|𤿂{𤿂{𤿂{䶜{䶜{𪗋z𪗋z𪗋z𪗋z𦲤z䛐y䛐y䛐y䛐y𦮝x矗x矗x矗x矗x矗x𤦺w鯱w鯱w鯱w鯱w鯱w脒w脎v脎v脎v脎v脎v𤩏u𤩏u𤩏u𤩏u𤩏u勇t勇t鍟t鍟t鍟t鍟t鍟t鍟t騯s騯s騯s騯s騯s嫾r嫾r媆r媆r媆r媆r媆r媆r媆r疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p侊o侊o侊o侊o侊o侊o侊o侊o侊o����� �"�$�%�'�)�+�,�.�0�1�3�5�7�8�:�<�=�?�A�C�D�F�H�I�K�M�O�P�R�H�J�L�N�O�Q�S�U�W�X�Z�\�^�_�a�c�e�g�haa�`�`�a�a�a�`�a�a�a�`�a�a�a�a�`�`�`�a�`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�_�^�_�_�^�^�^�^�^�^��������������������������������������������������������������������������������������������������������������������������������������~�~�}�}�}�|�|�{�{�{�z�z�z�y�y�x�x�x�w�w�w�v�v�v�u�$$**//4488<<??CCFFIIKKNNPPR RT!TV"VW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ee(ef(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&aa&a`&`_%_^%^]$]\$\[$[Y#YX#XW"WU!US!SR RPPNNU'UU'UU(UU(UT(TS(SR(RP'PM&MJ$JF"F@@99..����������������������������������������������㗒~㗒~㗒~㗒~愰~愰~愰~愰~匬}匬}匬}匬}匬}鞺|𧿹|𧿹|𧿹|𧿹|𧿹|𤿂{𤿂{䶜{䶜{䶜{𪗋z𪗋z𪗋z𦲤z𦲤z䛐y䛐y䛐y䛐y𣘚y𣘚y矗x矗x矗x矗x鯴x鯱w鯱w鯱w鯱w鯱w脎v脎v脎v脎v脎v脎v𤩏u𤩏u𤩏u𤩏u𤩏u𤩏u鍟t鍟t鍟t鍟t鍟t鍟t珦s騯s騯s騯s騯s騯s騯s騯s媆r媆r媆r媆r媆r媆r媆r疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p侊o侊o侊o侊o侊o侊o侊o侊o鰂o𤉋n𤉋n�����!�"�$�&�'�)�+�-�.�0�2�3�5�7�9�:�<�>�?�A�C�E�F�H�J�@�B�C�E�G�I�K�L�N�P�R�T�U�W�Y�[�]�^aa�a�a�a�a�`�a�a�a�a�`�`�a�a�`�`�`�a�a�`�`�a�a�`�a�`�a�`�`�`�`�`�`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�_�_�_�^�^�^�^�_�^�^�^�^�^�^���������������������������������������������������������������������������������������������������������������������������������������~�~�~�}�}�|�|�{�{�{�z�z�z�y�y�y�x�x�x�w�w�w�v�v�u�u�##))..3377;;??BBEEHHKKMMPPR RT!TV"VW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&aa&a`&`_%_^%^]$]\$\[$[Y#YX"XV"VU!US!SQ QOOMMV'VU(UU(UU(UT)TS(SR(RP'PM&MJ$JE"E??77((������������������������������愰~愰~愰~愰~愰~愰~愰~愰~匬}匬}匬}匬}匬}匬}匬}𧿹|𧿹|𧿹|𧿹|𧿹|𧿹|𧿹|𤿂{䶜{䶜{䶜{Line truncated
|
||||
!
!''--2266;;>>BBEEHHKKMMOOR RT!TV"VW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bb'bc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&aa&a`&`_%_^%^]$]\$\Z#ZY#YX"XV"VU!US!SQ QOOV'VV'VV(VU(UU)UT)TS)SR(RP(PM&MI$ID!D>>44������������������愰~愰~愰~愰~愰~愰~愰~愰~愰~愰~匬}匬}匬}𠿫}𠿫}𠿫}𠿫}𠿫}𧿹|𧿹|𧿹|𧿹|𧿹|𧿹|䶜{䶜{䶜{䶜{䶜{𪗋z𪗋z𦲤z𦲤z𦲤z𦲤z䛐y䛐y䛐y𣘚y𣘚y矗x矗x矗x矗x矗x鯴x鯱w鯱w鯱w鯱w鯱w脎v脎v脎v脎v脎v脎v𤩏u𤩏u𤩏u𤩏u𤩏u𤩏u鍟t鍟t鍟t鍟t鍟t鍟t鍟t騯s騯s騯s騯s騯s騯s嫾r媆r媆r媆r媆r媆r媆r媆r媆r疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p侊o侊o侊o侊o侊o侊o侊o侊o鰂o鰂o𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𪊴�����!�#�%�&�(�*�+�-�/�1�2�4�6�7�-�/�1�3�4�6�8�:�<�=�?�A�C�E�F�H�J�Laa�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�a�a�a�a�a�a�a�a�`�`�`�a�a�`�a�a�a�`�a�a�a�a�`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^�_�_�^�^������������������������������������������������������������������������������������������������������������������������������������������������諚|�{�{�{�z�z�z�y�y�y�x�x�w�w�w�v�v�v�u� &&,,1155::>>AADDGGJJMMOOQ QT!TU!UW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&a`&``%`_%_^%^]$]\$\Z#ZY#YX"XV"VT!TS SQ QOOV'VV(VV(VV)VU)UU)UT)TR)RP(PM&MI$IC!C<<11����������䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𧿹|𧿹|𧿹|𧿹|𧿹|𠲜|𠲜|𠲜|䶜{䶜{䶜{䶜{䶜{𪗋z𦲤z𦲤z𦲤z𦲤z𦲤z䛐y䛐y𣘚y𣘚y𣘚y𣘚y矗x矗x矗x鯴x鯴x鯱w鯱w鯱w鯱w脒w脒w脎v脎v脎v脎v脎v𤩏u𤩏u𤩏u𤩏u𤩏u𤩏u𠓾u鍟t鍟t鍟t鍟t鍟t鍟t𩣱t騯s騯s騯s騯s騯s騯s媆r媆r媆r媆r媆r媆r媆r媆r㽣r疃q疃q疃q疃q疃q疃q疃q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p𥙑p侊o侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n酧n酧n酧n鍳���� �!�#�%�'�(�*�,�-�/�%�'�(�*�,�.�0�1�3�5�7�9�:�<�>�@�B�Caa�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�a�a�a�a�`�`�`�a�`�a�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^������������������������������������������������������������������������������������������������������������������������������������������������������������𠋀y�y�x�x�w�w�w�v�v�v�v�u�$$**005599==AADDGGJJMMOOQ QS!SU!UW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ee'ed'dd'dc'cc'cb&ba&a`&``%`_%_^%^]$][$[Z#ZY#YW"WV"VT!TR RQ QOOV'VV(VV)VV)VV)VU*UT)TR)RP(PL&LH$HB B::--~~嗁~嗁~嗁~嗁~嗁~嗁~嗁~嗁~嗁~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~䃺~𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𠿫}𧿹|𠲜|𠲜|𠲜|𠲜|𠲜|䶜{䶜{䶜{䶜{䶜{䶜{画{𦲤z𦲤z𦲤z𦲤z𦲤z𦲤z䛐y𣘚y𣘚y𣘚y𣘚y矗x矗x矗x鯴x鯴x鯴x鯱w鯱w鯱w鯱w脒w脒w脎v脎v脎v脎v脎v繥v𤩏u𤩏u𤩏u𤩏u𤩏u𠓾u鍟t鍟t鍟t鍟t鍟t鍟t𩣱t騯s騯s騯s騯s騯s騯s媆r媆r媆r媆r媆r媆r媆r媆r疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p侊o侊o侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n酧n酧n酧n酧n酧n酧n酧n濶���� �"�#�%�'�)�*�,�.�$�&�'�)�+�-�.�0�2�4�6�7�9�;aa�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�`�`�`�`�`�`�a�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�`�`�`�`�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�_�_�_�^�_�����������������������������������������������������������������������������������������������������������������������������������������������������������������������ww�v�v�v�u�
|
||||
"
"))..4488<<@@CCGGJJLLOOQ QS!SU!UW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&`_%__%_^%^\$\[$[Z#ZY#YW"WV"VT!TR RPPNNV(VV(VV)VV)VV*VU*UT*TR)RP(PL&LG$GA A88~~墶~墶~墶~墶~嗁~嗁~嗁~嗁~嗁~嗁~嗁~嗁~嗁~嗁~达}达}达}达}达}达}达}达}达}达}达}达}𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|䶜{䶜{䶜{䶜{䶜{画{画{𦲤z𦲤z𦲤z𦲤z𦲤z𦲤z𦲤z𣘚y𣘚y𣘚y𣘚y𣘚y𣘚y矗x鯴x鯴x鯴x鯴x鯱w鯱w鯱w脒w脒w脒w脎v脎v脎v脎v繥v繥v𤩏u𤩏u𤩏u𤩏u𤩏u𠓾u鍟t鍟t鍟t鍟t鍟t鍟t𩣱t騯s騯s騯s騯s騯s騯s䅿s媆r媆r媆r媆r媆r媆r媆r㽣r疃q疃q疃q疃q疃q疃q疃q𢖾q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p𥙑p侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n酧n酧n酧n酧n酧n酧n都m都m都m都m都m𣸮����� �"�$�%�'�)�+�,�#�$�&�(�*�,�-�/�1aa�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�a�a�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
''--2277;;??CCFFIILLOOQ QS!SU!UW"WY#YZ#Z\$\]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZY#YW"WV"VT!TR RPPNNV(VW)WW)WV*VV*VU*UT*TR*RP(PL&LG#G??55~~𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}达}达}达}达}达}达}达}达}达}𠲜|达}达}𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|𠲜|画{画{画{画{画{𦲤z𦲤z𦲤z𦲤z𦲤z𦲤z𦲤z𣜖z𣜖z𣘚y𣘚y𣘚y𣘚y𣘚y矗x鯴x鯴x鯴x鯴x鯴x鯱w鯱w脒w脒w脒w脒w脒w脎v脎v脎v繥v繥v𤩏u𤩏u𤩏u𤩏u𠓾u𠓾u𠓾u鍟t鍟t鍟t鍟t鍟t𩣱t騯s騯s騯s騯s騯s騯s䅿s媆r媆r媆r媆r媆r媆r㽣r疃q疃q疃q疃q疃q疃q疃q疃q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p𥙑p侊o侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n𤉋n𤉋n酧n酧n酧n酧n酧n都m都m都m都m都m都m蓞m蓞m蓞m䙛�����!�"�$�&�'�)�+�-�#�%�'�)aa�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�a�a�a�`�`�`�`�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^�^��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%%,,1166;;??BBFFIILLNNQ QS SU!UW"WX#XZ#Z[$[]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dd'dc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZX#XW"WU!UT!TR RPPNNW(WW)WW*WW*WV+VV+VT+TR*RO(OK&KF#F>>11}}墵}墵}墵}墵}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}𦶮}补|补|补|补|补|补|补|补|补|补|画{补|画{画{画{画{画{画{画{画{𦲤z𦲤z𦲤z𣜖z𣜖z𣜖z𣘚y𣘚y𣘚y𣘚y𣘚y𣘚y𣘚y䱭y鯴x鯴x鯴x鯴x鯴x鯱w鯱w脒w脒w脒w脒w脎v脎v脎v繥v繥v繥v繥v𤩏u𤩏u𤩏u𠓾u𠓾u鍟t鍟t鍟t鍟t鍟t𩣱t𩣱t𩣱t騯s騯s騯s騯s騯s媆r媆r媆r媆r媆r媆r媆r㽣r㽣r疃q疃q疃q疃q疃q疃q疃q𢖾q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p𥙑p侊o侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n酧n酧n酧n酧n酧n酧n都m都m都m都m都m都m蓞m蓞m蓞m蓞m蓞m蓞m蓞m𧜏�����!�#�$�&�(�*ll𥱥l箢a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�`�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�^��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$$**0055::>>BBEEHHKKNNP PS SU!UW"WX#XZ#Z[$[]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dc'cc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZX#XW"WU!US!SR ROOMMW(WW)WW*WW+WW+WV+VU+UR*RO(OK&KD"D;;))}}墵}墵}墵}墵}墵}墵}𠍆|𠍆|𠍆|𠍆|𠍆|补|补|补|补|补|补|补|补|补|补|补|补|画{画{画{画{画{画{画{画{画{𣜖z𣜖z𣜖z𣜖z𣜖z𣜖z𣜖z𣜖z𣘚y𣘚y𣘚y𣘚y䱭y䱭y鯴x鯴x鯴x鯴x鯴x鯴xLine truncated
|
||||
"
"))//4499==AAEEHHKKNNPPS SU!UW"WX#XZ#Z[$[]$]^%^_%_`&`a&ab&bc'cc'cd'dd'de'ee(ee(ef(ff(ff(ff(ff(ff(ff(ff(fe(ee(ee(ed'dd'dc'cc'cb'bb&ba&a`&`_%_^%^]%]\$\[$[Z#ZX#XW"WU!US!SQ QOOW(WW)WW*WX*XW+WW,WV,VU+UR*RO)OJ&JC!C99||𡯂|𡯂|𡯂|𡯂|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|𠍆|纇{纇{纇{纇{纇{纇{纇{纇{纇{𣜖z𣜖z𣜖z𣜖z𣜖z𣜖z𣜖z𣘚y𣜖z𣘚y𣘚y䱭y䱭y䱭y䱭y䱭y鯴x鯴x鯴x鯴x鯴x畠x脒w脒w脒w脒w脒w脒w脒w脎v繥v繥v繥v繥v繥v繥v𤩏u𤩏u𠓾u𠓾u𠓾u鍟t鍟t鍟t鍟t𩣱t𩣱t𩣱t𩣱t騯s騯s騯s騯s䅿s䅿s媆r媆r媆r媆r媆r媆r㽣r㽣r疃q疃q疃q疃q疃q疃q𢖾q𢖾q𢖾q𢖯p𢖯p𢖯p𢖯p𢖯p𢖯p𥙑p𥙑p𥙑p侊o侊o侊o侊o侊o侊o鰂o鰂o鰂o鰂o鰂o鰂o鰂o𤉋n𤉋n𤉋n𤉋n酧n酧n酧n酧n酧n酧n酧n都m酧n都m都m都m蓞m蓞m蓞m蓞m蓞m蓞m蓞m蓞m蓞m𦹃l蓞m𦹃l𦹃l𥱥l耻�ll𥱥l𥱥l𥱥l𥱥l𥱥l𥱥l𥱥l𥱥l𥱥l𥱥l箢a�a�a�a�a� | ||||