ecbuild-3.16.0/0000775000175000017500000000000015252726137013406 5ustar alastairalastairecbuild-3.16.0/project_summary.cmake0000664000175000017500000000112215252726137017627 0ustar alastairalastairmessage( STATUS "---------------------------------------------------------" ) ecbuild_info( "[Generic]" ) if( PERL_EXECUTABLE ) ecbuild_info( " Perl : [${PERL_EXECUTABLE}] (${PERL_VERSION})" ) endif() if(PYTHONINTERP_FOUND) ecbuild_info( " Python : [${PYTHON_EXECUTABLE}] (${PYTHON_VERSION})" ) endif() if(PYTHONLIBS_FOUND) ecbuild_info( " Python include : [${PYTHON_INCLUDE_DIRS}]" ) ecbuild_info( " libs : [${PYTHON_LIBRARIES}]" ) endif() if( DEFINED FORTRAN_LIBRARIES ) ecbuild_info( "Fortan libs : [${FORTRAN_LIBRARIES}]" ) endif() ecbuild-3.16.0/INSTALL.rst0000664000175000017500000000141015252726137015242 0ustar alastairalastair================== Installing ecBuild ================== Bootstrap and install ===================== :: git clone https://github.com/ecmwf/ecbuild cd ecbuild mkdir bootstrap cd bootstrap ../bin/ecbuild --prefix=/path/to/install/ecbuild .. ctest make install Generating documentation ======================== The documentation is generated using Sphinx. Make sure that ``sphinx-build`` can be located using ``PATH`` or ``CMAKE_PREFIX_PATH``. You can either add the ``-DSPHINX_HTML=ON`` option (as well as ``-DCMAKE_PREFIX_PATH=...`` if needed) to the above ``ecbuild`` command, or re-run ecBuild:: cd ecbuild/bootstrap ../bin/ecbuild -DSPHINX_HTML=ON .. make documentation The documentation tree will be available in ``doc/html``. ecbuild-3.16.0/bamboo/0000775000175000017500000000000015252726137014645 5ustar alastairalastairecbuild-3.16.0/bamboo/env.sh0000775000175000017500000000037615252726137016002 0ustar alastairalastair#!/bin/bash #[[ $(uname) == "Darwin" ]] && return # no module environment on the Mac # initialise module environment if it is not #if [[ ! $(command -v module > /dev/null 2>&1) ]]; then # . /usr/local/apps/module/init/bash #fi #module load cmake/new ecbuild-3.16.0/bamboo/flags.cmake0000664000175000017500000000000015252726137016731 0ustar alastairalastairecbuild-3.16.0/.pre-commit-config.yaml0000664000175000017500000000057315252726137017674 0ustar alastairalastair--- # Only the cross-repo CI gate check for now. The repo's own formatting and lint # hooks are a separate rollout: it does not pass them today, and adding them here # would fail every pull request for reasons unrelated to CI. repos: - repo: https://github.com/ecmwf/ci-infrastructure rev: dac4b18ffe60c317fbab05246e851b6971f7eabf hooks: - id: check-ci-approval ecbuild-3.16.0/.github/0000775000175000017500000000000015252726137014746 5ustar alastairalastairecbuild-3.16.0/.github/ci-hpc-config.yml0000664000175000017500000000007415252726137020100 0ustar alastairalastairbuild: modules: - ninja - python3 parallel: 64 ecbuild-3.16.0/.github/ci-approval-allowlist.yml0000664000175000017500000000031315252726137021713 0ustar alastairalastair--- exempt: - workflow: contributor-declaration.yml - workflow: pr-label-downstream-ci.yml - workflow: old_CI.yml reason: "legacy, retiring; gates downstream-ci with an if: rather than needs:" ecbuild-3.16.0/.github/ci-config.yml0000664000175000017500000000006115252726137017324 0ustar alastairalastairdependency_branch: develop parallelism_factor: 8 ecbuild-3.16.0/.github/actionlint.yaml0000664000175000017500000000111315252726137017772 0ustar alastairalastair# SPDX-FileCopyrightText: 2026 European Centre for Medium-Range Weather Forecasts (ECMWF) # # SPDX-License-Identifier: Apache-2.0 # actionlint validates runs-on against GitHub's hosted labels and flags anything # else as unknown. These are this org's ARC scale sets and the HPC login-node # runner; add new ones here when a scale set is added. Kept identical to # ecmwf/ci-infrastructure/.github/actionlint.yaml so the files stay diffable. self-hosted-runner: labels: - arc-runner-normal - arc-runner-large - arc-runner-very-large - arc-hpc-pet-vsphere-prod - hpc ecbuild-3.16.0/.github/workflows/0000775000175000017500000000000015252726137017003 5ustar alastairalastairecbuild-3.16.0/.github/workflows/contributor-declaration.yml0000664000175000017500000000121515252726137024362 0ustar alastairalastairname: Contributor Declaration on: # Parked: run it by hand only, until the declaration check comes back. To # restore, put back the trigger below -- pull_request_target runs the BASE # branch's copy of this file, so a pull request cannot edit the gate that # judges it, and it is safe here because nothing from the pull request is ever # checked out or executed and no write token is used. # # pull_request_target: # types: [opened, edited, reopened, synchronize] workflow_dispatch: permissions: contents: read jobs: contributor-declaration: uses: ecmwf/ci-infrastructure/.github/workflows/check-pr-declaration.yml@main ecbuild-3.16.0/.github/workflows/trigger-downstream.yml0000664000175000017500000001334415252726137023357 0ustar alastairalastair# GENERATED FILE - DO NOT EDIT. # Regenerate via the ci-infrastructure-generate CLI. # Source of truth: each repo's .ci/manifest.toml. name: Downstream runner (ecbuild) on: workflow_run: workflows: - CI types: - completed concurrency: group: trigger-downstream-runner-${{ github.event.workflow_run.head_sha }} cancel-in-progress: true jobs: context: runs-on: ubuntu-slim permissions: actions: read outputs: head-sha: ${{ steps.ctx.outputs.head-sha }} head-branch: ${{ steps.ctx.outputs.head-branch }} ci-conclusion: ${{ steps.ctx.outputs.ci-conclusion }} ci-url: ${{ steps.ctx.outputs.ci-url }} ci-summary: ${{ steps.ctx.outputs.ci-summary }} steps: - name: Resolve the commit under test id: ctx uses: ecmwf/ci-infrastructure/actions/resolve-dispatch-context@main label-gate: runs-on: ubuntu-slim permissions: pull-requests: read outputs: run: ${{ steps.gate.outputs.run }} steps: - name: Check the downstream-CI label id: gate uses: ecmwf/ci-infrastructure/actions/check-pr-label@main with: label: run-downstream-CI sha: ${{ needs.context.outputs.head-sha }} needs: - context validate: if: ${{ (needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - uses: actions/checkout@v6 with: ref: ${{ needs.context.outputs.head-sha }} token: ${{ steps.mint.outputs.token }} allow-unsafe-pr-checkout: true - uses: ecmwf/ci-infrastructure/actions/validate-generated-workflows@main with: token: ${{ steps.mint.outputs.token }} needs: - context - label-gate report-start: if: ${{ (needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post pending downstream status env: GH_TOKEN: ${{ github.token }} run: | gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state=pending \ -f context='downstream/runner' \ -f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ -f description='Downstream runner tests running' needs: - context - label-gate report-ci-failure: if: ${{ (needs.context.outputs.ci-conclusion != 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post downstream failure status env: GH_TOKEN: ${{ github.token }} run: | gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state=failure \ -f context='downstream/runner' \ -f target_url="${{ needs.context.outputs.ci-url }}" \ -f description="${{ needs.context.outputs.ci-summary }}; downstream runner not run" needs: - context - label-gate eccodes: name: eccodes needs: - context - label-gate - validate - eckit uses: ecmwf/eccodes/.github/workflows/cross-repo-trigger.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} ecflow: name: ecflow needs: - context - label-gate - validate uses: ecmwf/ecflow/.github/workflows/cross-repo-trigger.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} eckit: name: eckit needs: - context - label-gate - validate uses: ecmwf/eckit/.github/workflows/cross-repo-trigger.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} report-result: needs: - context - label-gate - validate - eccodes - ecflow - eckit if: ${{ (always() && needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post final downstream status env: GH_TOKEN: ${{ github.token }} run: | state=success for r in ${{ needs.validate.result }} ${{ needs.eccodes.result }} ${{ needs.ecflow.result }} ${{ needs.eckit.result }}; do if [ "$r" = failure ] || [ "$r" = cancelled ]; then state=failure fi done gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state="$state" \ -f context='downstream/runner' \ -f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ -f description="Downstream runner tests $state" ecbuild-3.16.0/.github/workflows/trigger-downstream-hpc.yml0000664000175000017500000001334415252726137024127 0ustar alastairalastair# GENERATED FILE - DO NOT EDIT. # Regenerate via the ci-infrastructure-generate CLI. # Source of truth: each repo's .ci/manifest.toml. name: Downstream HPC (ecbuild) on: workflow_run: workflows: - CI types: - completed concurrency: group: trigger-downstream-hpc-${{ github.event.workflow_run.head_sha }} cancel-in-progress: true jobs: context: runs-on: ubuntu-slim permissions: actions: read outputs: head-sha: ${{ steps.ctx.outputs.head-sha }} head-branch: ${{ steps.ctx.outputs.head-branch }} ci-conclusion: ${{ steps.ctx.outputs.ci-conclusion }} ci-url: ${{ steps.ctx.outputs.ci-url }} ci-summary: ${{ steps.ctx.outputs.ci-summary }} steps: - name: Resolve the commit under test id: ctx uses: ecmwf/ci-infrastructure/actions/resolve-dispatch-context@main label-gate: runs-on: ubuntu-slim permissions: pull-requests: read outputs: run: ${{ steps.gate.outputs.run }} steps: - name: Check the downstream-CI label id: gate uses: ecmwf/ci-infrastructure/actions/check-pr-label@main with: label: run-downstream-CI sha: ${{ needs.context.outputs.head-sha }} needs: - context validate: if: ${{ (needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - uses: actions/checkout@v6 with: ref: ${{ needs.context.outputs.head-sha }} token: ${{ steps.mint.outputs.token }} allow-unsafe-pr-checkout: true - uses: ecmwf/ci-infrastructure/actions/validate-generated-workflows@main with: token: ${{ steps.mint.outputs.token }} needs: - context - label-gate report-start: if: ${{ (needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post pending downstream status env: GH_TOKEN: ${{ github.token }} run: | gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state=pending \ -f context='downstream/hpc' \ -f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ -f description='Downstream HPC tests running' needs: - context - label-gate report-ci-failure: if: ${{ (needs.context.outputs.ci-conclusion != 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post downstream failure status env: GH_TOKEN: ${{ github.token }} run: | gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state=failure \ -f context='downstream/hpc' \ -f target_url="${{ needs.context.outputs.ci-url }}" \ -f description="${{ needs.context.outputs.ci-summary }}; downstream HPC not run" needs: - context - label-gate eccodes: name: eccodes needs: - context - label-gate - validate - eckit uses: ecmwf/eccodes/.github/workflows/cross-repo-trigger-hpc.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build-hpc"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} ecflow: name: ecflow needs: - context - label-gate - validate uses: ecmwf/ecflow/.github/workflows/cross-repo-trigger-hpc.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build-hpc"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} eckit: name: eckit needs: - context - label-gate - validate uses: ecmwf/eckit/.github/workflows/cross-repo-trigger-hpc.yml@develop with: from-repo: ${{ github.repository }} from-sha: ${{ needs.context.outputs.head-sha }} from-jobs: '["ecbuild/build-hpc"]' branch: ${{ needs.context.outputs.head-branch }} fallback-ref: develop secrets: inherit if: ${{ needs['label-gate'].outputs.run == 'true' }} report-result: needs: - context - label-gate - validate - eccodes - ecflow - eckit if: ${{ (always() && needs.context.outputs.ci-conclusion == 'success') && needs['label-gate'].outputs.run == 'true' }} runs-on: ubuntu-slim permissions: statuses: write steps: - name: Post final downstream status env: GH_TOKEN: ${{ github.token }} run: | state=success for r in ${{ needs.validate.result }} ${{ needs.eccodes.result }} ${{ needs.ecflow.result }} ${{ needs.eckit.result }}; do if [ "$r" = failure ] || [ "$r" = cancelled ]; then state=failure fi done gh api -X POST \ "/repos/${{ github.repository }}/statuses/${{ needs.context.outputs.head-sha }}" \ -f state="$state" \ -f context='downstream/hpc' \ -f target_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ -f description="Downstream HPC tests $state" ecbuild-3.16.0/.github/workflows/pr-label-downstream-ci.yml0000664000175000017500000000150315252726137023775 0ustar alastairalastairname: "[PR] Downstream-CI label gate" on: # pull_request_target runs the BASE branch's copy of this file and gets a token # that can post a status on a fork's pull request. Safe here because nothing # from the pull request is ever checked out or executed. # # `labeled`/`unlabeled` are what make the gate reactive; `synchronize` re-posts # it, since a commit status is per-SHA. pull_request_target: types: [opened, reopened, synchronize, labeled, unlabeled] permissions: statuses: write jobs: gate: runs-on: ubuntu-slim steps: - uses: ecmwf/ci-infrastructure/actions/require-label-decision@main with: label: run-downstream-CI opt-out-label: downstream-CI-not-needed context: downstream-ci-label description-decided: Downstream-CI decision recorded ecbuild-3.16.0/.github/workflows/ci.yml0000664000175000017500000001166015252726137020125 0ustar alastairalastairname: CI on: push: branches: [develop, master] paths-ignore: - "docs/**" - "bamboo/**" - "README.rst" - ".cd/**" pull_request: types: [opened, reopened, synchronize, labeled] paths-ignore: - "docs/**" - "bamboo/**" - "README.rst" - ".cd/**" workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: ARTIFACT_POLL_INTERVAL: ${{ vars.ARTIFACT_POLL_INTERVAL || '60' }} ARTIFACT_S3_ENDPOINT: ${{ secrets.ARTIFACT_S3_ENDPOINT }} ARTIFACT_S3_BUCKET: ${{ secrets.ARTIFACT_S3_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} permissions: contents: read jobs: ci-approval: runs-on: ubuntu-slim permissions: pull-requests: write steps: - uses: ecmwf/ci-infrastructure/actions/require-ci-approval@main pre-commit: needs: ci-approval runs-on: ubuntu-slim env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true' steps: - uses: actions/checkout@v6 - uses: ecmwf/ci-infrastructure/actions/pre-commit@main resolve: needs: [ci-approval, pre-commit] runs-on: arc-runner-normal container: image: eccr.ecmwf.int/public-ci-images/ubuntu24.04-base:latest outputs: build-matrix: ${{ steps.r.outputs.matrix-build }} test-matrix: ${{ steps.r.outputs.matrix-test }} build-hpc-matrix: ${{ steps.r.outputs.matrix-build-hpc }} steps: - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - uses: ecmwf/ci-infrastructure/actions/checkout-under-test@main - id: r uses: ecmwf/ci-infrastructure/actions/resolve-deps@main with: current-branch: ${{ github.head_ref || github.ref_name }} matrix: build,test,build-hpc token: ${{ steps.mint.outputs.token }} client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} app-private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} build: needs: [ci-approval, resolve] name: build (${{ matrix._resolved['job-name'] }}) runs-on: ${{ matrix['runs-on'] }} container: image: ${{ matrix.container || '' }} strategy: fail-fast: false matrix: ${{ fromJSON(needs.resolve.outputs.build-matrix) }} steps: - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - uses: ecmwf/ci-infrastructure/actions/checkout-under-test@main - name: Build ecbuild id: build uses: ./.github/actions/build-ecbuild with: build-type: ${{ matrix.build-type }} - name: Publish ecbuild uses: ecmwf/ci-infrastructure/actions/publish-artifact@main with: install-path: ${{ steps.build.outputs.install-path }} artifact-name: ${{ matrix._resolved.own-artifact-name }} test: needs: [ci-approval, resolve] name: test (${{ matrix._resolved['job-name'] }}) runs-on: ${{ matrix['runs-on'] }} container: image: ${{ matrix.container || '' }} strategy: fail-fast: false matrix: ${{ fromJSON(needs.resolve.outputs.test-matrix) }} steps: - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - uses: ecmwf/ci-infrastructure/actions/checkout-under-test@main - name: Test ecbuild uses: ./.github/actions/test-ecbuild with: build-type: ${{ matrix.build-type }} build-hpc: needs: [ci-approval, resolve] name: build-hpc (${{ matrix._resolved['job-name'] }}) runs-on: ${{ matrix['runs-on'] }} container: image: ${{ matrix.container }} credentials: username: ${{ secrets.ECCR_PULL_ROBOT_NAME }} password: ${{ secrets.ECCR_PULL_ROBOT_TOKEN }} strategy: fail-fast: false matrix: ${{ fromJSON(needs.resolve.outputs.build-hpc-matrix) }} steps: - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - uses: ecmwf/ci-infrastructure/actions/checkout-under-test@main - name: Build ecbuild on HPC uses: ecmwf/ci-infrastructure/actions/build-on-hpc@main with: site: ${{ matrix.site }} job-script: ${{ matrix.job-script || './.ci/hpc/build.sh.j2' }} # The render context for the .j2 recipe: the toolchain this leg declares. matrix-leg: ${{ toJSON(matrix) }} artifact-name: ${{ matrix._resolved.own-artifact-name }} work-dir: ${{ vars.HPC_CI_WORK_DIR }} remote-work-dir: ${{ vars.HPC_CI_REMOTE_WORK_DIR }} troika-user: ${{ secrets.HPC_CI_SSH_USER }} ecbuild-3.16.0/.github/workflows/old_CI.yml0000664000175000017500000000673715252726137020674 0ustar alastairalastairname: old CI on: # Trigger the workflow on push to master or develop, except tag creation push: branches: - "master" - "develop" tags-ignore: - "**" paths-ignore: - "docs/**" - "bamboo/**" - "README.rst" - ".cd/**" # Trigger the workflow on pull request pull_request: ~ # Trigger the workflow manually workflow_dispatch: ~ # Trigger after public PR approved for CI pull_request_target: types: [labeled] jobs: # Run CI including downstream packages on self-hosted runners downstream-ci: name: downstream-ci if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} uses: ecmwf/downstream-ci/.github/workflows/downstream-ci.yml@main with: ecbuild: ecmwf/ecbuild@${{ github.event.pull_request.head.sha || github.sha }} codecov_upload: false secrets: inherit # Run CI of private downstream packages on self-hosted runners private-downstream-ci: name: private-downstream-ci needs: [downstream-ci] if: ${{ (success() || failure()) && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }} runs-on: ubuntu-latest permissions: pull-requests: write steps: - name: Dispatch private downstream CI uses: ecmwf/dispatch-private-downstream-ci@v1 with: token: ${{ secrets.GH_REPO_READ_TOKEN }} owner: ecmwf repository: private-downstream-ci event_type: downstream-ci payload: '{"ecbuild": "ecmwf/ecbuild@${{ github.event.pull_request.head.sha || github.sha }}"}' # Build downstream packages on HPC downstream-ci-hpc: name: downstream-ci-hpc if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} uses: ecmwf/downstream-ci/.github/workflows/downstream-ci-hpc.yml@main with: ecbuild: ecmwf/ecbuild@${{ github.event.pull_request.head.sha || github.sha }} secrets: inherit # Run CI of private downstream packages on HPC private-downstream-ci-hpc: name: private-downstream-ci-hpc needs: [downstream-ci-hpc] if: ${{ (success() || failure()) && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }} runs-on: ubuntu-latest permissions: pull-requests: write steps: - name: Dispatch private downstream CI uses: ecmwf/dispatch-private-downstream-ci@v1 with: token: ${{ secrets.GH_REPO_READ_TOKEN }} owner: ecmwf repository: private-downstream-ci event_type: downstream-ci-hpc payload: '{"ecbuild": "ecmwf/ecbuild@${{ github.event.pull_request.head.sha || github.sha }}","skip_matrix_jobs": "nvidia-22.11"}' # DISABLED FOR NOW UNTIL REPO IS SET UP FOR THIS # notify: # runs-on: ubuntu-latest # needs: # - downstream-ci # - private-downstream-ci # - downstream-ci-hpc # - private-downstream-ci-hpc # if: ${{ always() && !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} # steps: # - name: Trigger Teams notification # uses: ecmwf/notify-teams@v1 # with: # incoming_webhook: ${{ secrets.MS_TEAMS_INCOMING_WEBHOOK }} # needs_context: ${{ toJSON(needs) }} ecbuild-3.16.0/.github/workflows/check-release-version.yml0000664000175000017500000000030715252726137023704 0ustar alastairalastairname: Check VERSION file on: push: branches: - "release/**" - "hotfix/**" jobs: check_version: uses: ecmwf/reusable-workflows/.github/workflows/check-release-version.yml@v2 ecbuild-3.16.0/.github/workflows/cross-repo-trigger-hpc.yml0000664000175000017500000002013015252726137024027 0ustar alastairalastair# GENERATED FILE - DO NOT EDIT. # Regenerate via the ci-infrastructure-generate CLI. # Source of truth: each repo's .ci/manifest.toml. name: Cross-repo trigger (ecbuild) run-name: Cross-repo trigger (${{ inputs.from-repo }}@${{ inputs.from-sha }}) [${{ inputs.dispatch-id }}] on: workflow_call: inputs: from-repo: description: owner/repo of the dispatcher (upstream producer or downstream consumer) required: true type: string from-sha: description: SHA of the dispatcher commit required: true type: string from-jobs: description: JSON array of package/kinds that triggered us (e.g. '["fortmath/build","fortmath/build-hpc"]') for upstream-change dispatches. '[]' when rebuild-request is true. required: false default: '[]' type: string rebuild-request: description: True when a downstream consumer dispatches us because our artifact was missing. Mutually exclusive with from-jobs. required: false default: false type: boolean branch: description: Dispatcher branch name; we attempt branch-matching against it required: true type: string fallback-ref: description: Ref to check out if branch does not exist in this repo required: false type: string default: main workflow_dispatch: inputs: dispatch-id: description: Correlation id stamped into run-name so the dispatcher can find this run required: false default: '' type: string from-repo: description: owner/repo of the dispatcher (upstream producer or downstream consumer) required: true type: string from-sha: description: SHA of the dispatcher commit required: true type: string from-jobs: description: JSON array of package/kinds that triggered us (e.g. '["fortmath/build","fortmath/build-hpc"]') for upstream-change dispatches. '[]' when rebuild-request is true. required: false default: '[]' type: string rebuild-request: description: True when a downstream consumer dispatches us because our artifact was missing. Mutually exclusive with from-jobs. required: false default: false type: boolean branch: description: Dispatcher branch name; we attempt branch-matching against it required: true type: string fallback-ref: description: Ref to check out if branch does not exist in this repo required: false type: string default: main concurrency: group: cross-repo-trigger-hpc-ecbuild-${{ github.ref }} cancel-in-progress: false env: ARTIFACT_POLL_INTERVAL: ${{ vars.ARTIFACT_POLL_INTERVAL || '60' }} ARTIFACT_S3_ENDPOINT: ${{ secrets.ARTIFACT_S3_ENDPOINT }} ARTIFACT_S3_BUCKET: ${{ secrets.ARTIFACT_S3_BUCKET }} SCCACHE_BUCKET: ${{ secrets.SCCACHE_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} jobs: resolve: if: inputs.rebuild-request runs-on: ubuntu-slim outputs: ref: ${{ steps.pick.outputs.ref }} matrix-build-hpc: ${{ steps.r.outputs.matrix-build-hpc }} steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - id: pick uses: ecmwf/ci-infrastructure/actions/pick-ref@main with: repo: ecmwf/ecbuild try-branch: ${{ inputs.branch }} fallback-ref: ${{ inputs.fallback-ref }} token: ${{ steps.mint.outputs.token }} - uses: actions/checkout@v6 with: repository: ecmwf/ecbuild ref: ${{ steps.pick.outputs.ref }} token: ${{ steps.mint.outputs.token }} - id: r uses: ecmwf/ci-infrastructure/actions/resolve-deps@main with: current-branch: ${{ steps.pick.outputs.ref }} matrix: build-hpc token: ${{ steps.mint.outputs.token }} client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} app-private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} ecbuild__build_hpc: needs: - resolve if: inputs.rebuild-request name: ecbuild/build-hpc (${{ matrix._resolved['job-name'] }}) runs-on: ${{ matrix['runs-on'] }} container: image: ${{ matrix.container || '' }} credentials: username: ${{ secrets.ECCR_PULL_ROBOT_NAME }} password: ${{ secrets.ECCR_PULL_ROBOT_TOKEN }} strategy: fail-fast: false matrix: ${{ fromJSON(needs.resolve.outputs.matrix-build-hpc) }} steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - id: check_start if: ${{ github.event_name == 'workflow_dispatch' && inputs.from-jobs != '[]' }} uses: ecmwf/ci-infrastructure/actions/report-check-run@main with: token: ${{ steps.mint.outputs.token }} head-repo: ${{ inputs.from-repo }} head-sha: ${{ inputs.from-sha }} name: ecbuild/build-hpc (${{ matrix._resolved['job-name'] }}) details-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} phase: start - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - uses: actions/checkout@v6 with: repository: ecmwf/ecbuild ref: ${{ needs.resolve.outputs.ref }} token: ${{ steps.mint.outputs.token }} - name: Decode matrix-leg id: m shell: bash env: MATRIX_LEG: ${{ toJSON(matrix) }} run: | set -euo pipefail shopt -s inherit_errexit 2>/dev/null || true command -v jq >/dev/null || { echo "::error::jq is required but not installed in this runner/image." >&2 exit 1 } leg="$MATRIX_LEG" require() { local val val=$(jq -r "$1" <<<"$leg") if [ -z "$val" ] || [ "$val" = "null" ]; then echo "::error::matrix-leg field '$2' empty or null (jq -r '$1' returned '$val')." >&2 exit 1 fi printf '%s' "$val" } deps_json=$(require '._resolved.deps | tojson' '_resolved.deps') own_artifact_name=$(require '._resolved."own-artifact-name"' '_resolved.own-artifact-name') { echo "deps-json=${deps_json}" echo "own-artifact-name=${own_artifact_name}" } >> "$GITHUB_OUTPUT" - name: Fetch resolved deps id: deps uses: ecmwf/ci-infrastructure/actions/fetch-deps@main with: deps-json: ${{ steps.m.outputs.deps-json }} token: ${{ steps.mint.outputs.token }} install-python-deps: 'false' - name: Build on HPC id: build uses: ecmwf/ci-infrastructure/actions/build-on-hpc@main with: site: ${{ matrix.site }} job-script: ${{ matrix.job-script || './.ci/hpc/build.sh.j2' }} matrix-leg: ${{ toJSON(matrix) }} artifact-name: ${{ steps.m.outputs.own-artifact-name }} cmake-prefix-path: ${{ steps.deps.outputs.cmake-prefix-path }} work-dir: ${{ vars.HPC_CI_WORK_DIR }} remote-work-dir: ${{ vars.HPC_CI_REMOTE_WORK_DIR }} troika-user: ${{ secrets.HPC_CI_SSH_USER }} - name: Report check-run conclusion if: ${{ always() && github.event_name == 'workflow_dispatch' && inputs.from-jobs != '[]' }} uses: ecmwf/ci-infrastructure/actions/report-check-run@main with: token: ${{ steps.mint.outputs.token }} head-repo: ${{ inputs.from-repo }} head-sha: ${{ inputs.from-sha }} name: ecbuild/build-hpc (${{ matrix._resolved['job-name'] }}) details-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} phase: finish conclusion: ${{ job.status }} check-run-id: ${{ steps.check_start.outputs.check-run-id }} ecbuild-3.16.0/.github/workflows/cross-repo-trigger.yml0000664000175000017500000001747615252726137023302 0ustar alastairalastair# GENERATED FILE - DO NOT EDIT. # Regenerate via the ci-infrastructure-generate CLI. # Source of truth: each repo's .ci/manifest.toml. name: Cross-repo trigger (ecbuild) run-name: Cross-repo trigger (${{ inputs.from-repo }}@${{ inputs.from-sha }}) [${{ inputs.dispatch-id }}] on: workflow_call: inputs: from-repo: description: owner/repo of the dispatcher (upstream producer or downstream consumer) required: true type: string from-sha: description: SHA of the dispatcher commit required: true type: string from-jobs: description: JSON array of package/kinds that triggered us (e.g. '["fortmath/build","fortmath/build-hpc"]') for upstream-change dispatches. '[]' when rebuild-request is true. required: false default: '[]' type: string rebuild-request: description: True when a downstream consumer dispatches us because our artifact was missing. Mutually exclusive with from-jobs. required: false default: false type: boolean branch: description: Dispatcher branch name; we attempt branch-matching against it required: true type: string fallback-ref: description: Ref to check out if branch does not exist in this repo required: false type: string default: main workflow_dispatch: inputs: dispatch-id: description: Correlation id stamped into run-name so the dispatcher can find this run required: false default: '' type: string from-repo: description: owner/repo of the dispatcher (upstream producer or downstream consumer) required: true type: string from-sha: description: SHA of the dispatcher commit required: true type: string from-jobs: description: JSON array of package/kinds that triggered us (e.g. '["fortmath/build","fortmath/build-hpc"]') for upstream-change dispatches. '[]' when rebuild-request is true. required: false default: '[]' type: string rebuild-request: description: True when a downstream consumer dispatches us because our artifact was missing. Mutually exclusive with from-jobs. required: false default: false type: boolean branch: description: Dispatcher branch name; we attempt branch-matching against it required: true type: string fallback-ref: description: Ref to check out if branch does not exist in this repo required: false type: string default: main concurrency: group: cross-repo-trigger-runner-ecbuild-${{ github.ref }} cancel-in-progress: false env: ARTIFACT_POLL_INTERVAL: ${{ vars.ARTIFACT_POLL_INTERVAL || '60' }} ARTIFACT_S3_ENDPOINT: ${{ secrets.ARTIFACT_S3_ENDPOINT }} ARTIFACT_S3_BUCKET: ${{ secrets.ARTIFACT_S3_BUCKET }} SCCACHE_BUCKET: ${{ secrets.SCCACHE_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} jobs: resolve: if: inputs.rebuild-request runs-on: ubuntu-slim outputs: ref: ${{ steps.pick.outputs.ref }} matrix-build: ${{ steps.r.outputs.matrix-build }} steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - id: pick uses: ecmwf/ci-infrastructure/actions/pick-ref@main with: repo: ecmwf/ecbuild try-branch: ${{ inputs.branch }} fallback-ref: ${{ inputs.fallback-ref }} token: ${{ steps.mint.outputs.token }} - uses: actions/checkout@v6 with: repository: ecmwf/ecbuild ref: ${{ steps.pick.outputs.ref }} token: ${{ steps.mint.outputs.token }} - id: r uses: ecmwf/ci-infrastructure/actions/resolve-deps@main with: current-branch: ${{ steps.pick.outputs.ref }} matrix: build token: ${{ steps.mint.outputs.token }} client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} app-private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} ecbuild__build: needs: - resolve if: inputs.rebuild-request name: ecbuild/build (${{ matrix._resolved['job-name'] }}) runs-on: ${{ matrix['runs-on'] }} container: image: ${{ matrix.container || '' }} strategy: fail-fast: false matrix: ${{ fromJSON(needs.resolve.outputs.matrix-build) }} steps: - id: mint uses: actions/create-github-app-token@v3 with: client-id: ${{ secrets.CI_PERMISSIONS_APP_CLIENT_ID }} private-key: ${{ secrets.CI_PERMISSIONS_APP_PRIVATE_KEY }} owner: ${{ github.repository_owner }} - id: check_start if: ${{ github.event_name == 'workflow_dispatch' && inputs.from-jobs != '[]' }} uses: ecmwf/ci-infrastructure/actions/report-check-run@main with: token: ${{ steps.mint.outputs.token }} head-repo: ${{ inputs.from-repo }} head-sha: ${{ inputs.from-sha }} name: ecbuild/build (${{ matrix._resolved['job-name'] }}) details-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} phase: start - name: Announce image uses: ecmwf/ci-infrastructure/actions/announce-image@main - uses: actions/checkout@v6 with: repository: ecmwf/ecbuild ref: ${{ needs.resolve.outputs.ref }} token: ${{ steps.mint.outputs.token }} - name: Decode matrix-leg id: m shell: bash env: MATRIX_LEG: ${{ toJSON(matrix) }} run: | set -euo pipefail shopt -s inherit_errexit 2>/dev/null || true command -v jq >/dev/null || { echo "::error::jq is required but not installed in this runner/image." >&2 exit 1 } leg="$MATRIX_LEG" require() { local val val=$(jq -r "$1" <<<"$leg") if [ -z "$val" ] || [ "$val" = "null" ]; then echo "::error::matrix-leg field '$2' empty or null (jq -r '$1' returned '$val')." >&2 exit 1 fi printf '%s' "$val" } build_type=$(require '."build-type"' build-type) deps_json=$(require '._resolved.deps | tojson' '_resolved.deps') own_artifact_name=$(require '._resolved."own-artifact-name"' '_resolved.own-artifact-name') { echo "build-type=${build_type}" echo "deps-json=${deps_json}" echo "own-artifact-name=${own_artifact_name}" } >> "$GITHUB_OUTPUT" - name: Fetch resolved deps id: deps uses: ecmwf/ci-infrastructure/actions/fetch-deps@main with: deps-json: ${{ steps.m.outputs.deps-json }} token: ${{ steps.mint.outputs.token }} - name: Build id: build uses: ./.github/actions/build-ecbuild with: build-type: ${{ steps.m.outputs.build-type }} - name: Publish uses: ecmwf/ci-infrastructure/actions/publish-artifact@main with: install-path: ${{ steps.build.outputs.install-path }} artifact-name: ${{ steps.m.outputs.own-artifact-name }} - name: Report check-run conclusion if: ${{ always() && github.event_name == 'workflow_dispatch' && inputs.from-jobs != '[]' }} uses: ecmwf/ci-infrastructure/actions/report-check-run@main with: token: ${{ steps.mint.outputs.token }} head-repo: ${{ inputs.from-repo }} head-sha: ${{ inputs.from-sha }} name: ecbuild/build (${{ matrix._resolved['job-name'] }}) details-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} phase: finish conclusion: ${{ job.status }} check-run-id: ${{ steps.check_start.outputs.check-run-id }} ecbuild-3.16.0/.github/workflows/sync.yml0000664000175000017500000000125615252726137020506 0ustar alastairalastairname: sync # Controls when the workflow will run on: # Trigger the workflow on all pushes push: branches: - '**' tags: - '**' # Trigger the workflow when a branch or tag is deleted delete: ~ # Allow workflow to be dispatched on demand workflow_dispatch: ~ jobs: # Calls a reusable CI workflow to sync the current with a remote repository. # It will correctly handle addition of any new and removal of existing Git objects. sync: name: sync uses: ecmwf/reusable-workflows/.github/workflows/sync.yml@v2 secrets: target_repository: ecsdk/ecbuild target_username: ClonedDuck target_token: ${{ secrets.BITBUCKET_PAT }} ecbuild-3.16.0/.github/workflows/cd.yml0000664000175000017500000000137115252726137020116 0ustar alastairalastairname: CD on: push: tags: - 'v?[0-9]+.[0-9]+.[0-9]+' - 'v?[0-9]+.[0-9]+.[0-9]+-*' branches: - '*' pull_request: types: [opened, synchronize, reopened, labeled] workflow_dispatch: permissions: contents: write jobs: build-and-release: name: "${{ startsWith(github.ref, 'refs/tags/') && 'Build and Release' || 'Dry Run' }}" if: | startsWith(github.ref, 'refs/tags/') || github.ref_name == github.event.repository.default_branch || (github.event.pull_request.base.ref == github.event.repository.default_branch && github.event.label.name == 'approved-for-cd') uses: ecmwf/reusable-workflows/.github/workflows/main-cd.yml@v2 with: ref_name: ${{ github.ref_name }} secrets: inherit ecbuild-3.16.0/.github/workflows/ci-single.yml0000664000175000017500000000125315252726137021401 0ustar alastairalastairname: ci-single # Controls when the workflow will run on: # Trigger the workflow on all pushes, except on tag creation push: branches: - '**' tags-ignore: - '**' paths-ignore: - ".cd/**" # Trigger the workflow on all pull requests pull_request: ~ # Allow workflow to be dispatched on demand workflow_dispatch: ~ jobs: # Calls a reusable CI workflow to build & test the current repository. # We skip jobs that will result in duplicate artifacts, since the code does not depend on the compiler. ci: name: ci uses: ecmwf/reusable-workflows/.github/workflows/ci.yml@v2 with: skip_matrix_jobs: | clang@rocky-8.6 ecbuild-3.16.0/.github/cd-config.yml0000664000175000017500000000027615252726137017327 0ustar alastairalastairbuilds: - name: "conda-build" type: "conda" enabled: true - name: "hpc" type: "hpc" enabled: true config: modules: - python3 release: enabled: true ecbuild-3.16.0/.github/actions/0000775000175000017500000000000015252726137016406 5ustar alastairalastairecbuild-3.16.0/.github/actions/build-ecbuild/0000775000175000017500000000000015252726137021112 5ustar alastairalastairecbuild-3.16.0/.github/actions/build-ecbuild/action.yml0000664000175000017500000000362215252726137023115 0ustar alastairalastairname: Build ecbuild from source description: > Configures, builds and installs the already-checked-out ecbuild (a compiler-independent CMake toolchain collection) to a canonical prefix derived from the shared install-prefix action. Caller must have already run actions/checkout@v6 in the same job — the action reads the source from $GITHUB_WORKSPACE. The test suite lives in .github/actions/test-ecbuild. inputs: build-type: description: 'CMake build type' required: false default: Release outputs: install-path: description: 'Absolute path where ecbuild is installed' value: ${{ steps.set-paths.outputs.install-path }} build-dir: description: 'Absolute path of the build tree, for ctest' value: ${{ steps.set-paths.outputs.build-dir }} runs: using: composite steps: - name: Get install prefix id: prefix uses: ecmwf/ci-infrastructure/actions/install-prefix@main - name: Set paths id: set-paths shell: bash run: | set -euo pipefail { echo "install-path=${{ steps.prefix.outputs.base }}/ecbuild" echo "build-dir=$RUNNER_TEMP/_ecbuild-build" } >> "$GITHUB_OUTPUT" - name: Configure ecbuild shell: bash env: BUILD_TYPE: ${{ inputs.build-type }} INSTALL_PATH: ${{ steps.set-paths.outputs.install-path }} BUILD_DIR: ${{ steps.set-paths.outputs.build-dir }} run: | set -euo pipefail cmake -S "$GITHUB_WORKSPACE" \ -B "$BUILD_DIR" \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DCMAKE_INSTALL_PREFIX="$INSTALL_PATH" - name: Build and install ecbuild shell: bash env: BUILD_DIR: ${{ steps.set-paths.outputs.build-dir }} run: | set -euo pipefail cmake --build "$BUILD_DIR" --parallel "$(nproc 2>/dev/null || sysctl -n hw.ncpu)" cmake --install "$BUILD_DIR" ecbuild-3.16.0/.github/actions/test-ecbuild/0000775000175000017500000000000015252726137020772 5ustar alastairalastairecbuild-3.16.0/.github/actions/test-ecbuild/action.yml0000664000175000017500000000346515252726137023002 0ustar alastairalastairname: Test ecbuild description: > Configures the already-checked-out ecbuild with its test suite enabled and runs ctest against it. Caller must have already run actions/checkout@v6 in the same job — the action reads the source from $GITHUB_WORKSPACE. inputs: build-type: description: 'CMake build type' required: false default: Release fortran-compiler: description: > Exported as FC, not -DCMAKE_Fortran_COMPILER: the tests shell out to nested `cmake` invocations that inherit only the environment. The default matches the gfortran13 image, which ships no unversioned `gfortran`. required: false default: gfortran-13 runs: using: composite steps: - name: Set paths id: set-paths shell: bash run: echo "build-dir=$RUNNER_TEMP/_ecbuild-test-build" >> "$GITHUB_OUTPUT" - name: Configure ecbuild with tests shell: bash env: BUILD_TYPE: ${{ inputs.build-type }} BUILD_DIR: ${{ steps.set-paths.outputs.build-dir }} FC: ${{ inputs.fortran-compiler }} run: | set -euo pipefail if ! command -v "$FC" >/dev/null; then echo "::error::Fortran compiler '$FC' not found. ecbuild's suite needs one;" echo "::error::pass a different 'fortran-compiler' or use an image that ships it." exit 1 fi cmake -S "$GITHUB_WORKSPACE" \ -B "$BUILD_DIR" \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DENABLE_TESTS=ON - name: Run ctest shell: bash env: BUILD_DIR: ${{ steps.set-paths.outputs.build-dir }} FC: ${{ inputs.fortran-compiler }} run: | set -euo pipefail ctest --test-dir "$BUILD_DIR" \ --output-on-failure \ -j "$(nproc 2>/dev/null || sysctl -n hw.ncpu)" ecbuild-3.16.0/ecbuild_3.0_release_notes.rst0000664000175000017500000003551015252726137021043 0ustar alastairalastair========================= ecBuild 3.0 Release Notes ========================= Minimal CMake version requirement ================================= The minimal CMake version required for ecbuild 3 is 3.6. However we strongly recommend to update to a more recent version when possible. Backwards compatibility ======================= Many breaking changes have been done in order for ecBuild and users to take advantage of modern CMake features. In order to ensure a smooth transition, a compatibility layer has been kept and allows to build ecbuild2-compliant packages. However, this layer is deprecated by definition and efforts should be made to modernise the building scripts. Deprecated features print out warnings if the CMake variable ``ECBUILD_2_COMPAT_DEPRECATE`` is ``ON`` (add ``-DECBUILD_2_COMPAT_DEPRECATE=ON`` to the command line). The compatibility layer can be turned off completely by setting ``ECBUILD_2_COMPAT`` to ``OFF``. Bear in mind that packages built with the compatibility layer turned off may break dependencies relying on this layer (for third-party libraries handling for instance). Modernising ecBuild code ======================== This section contains some guidelines on the tasks that need to be done in order to modernise the code and make it work when compatibility mode is turned off. See below for details on the specific changes and how to handle them. 1. Put the version number into the main ``CMakeLists.txt`` in the ``project`` call 2. Replace ``REQUIRED_PACKAGES`` parameters of ``ecbuild_add_option`` by a combination of a ``find_package`` and ``CONDITION`` on the relevant packages. 3. Replace ``ecbuild_use_package`` by either ``add_subdirectory`` or ``ecbuild_find_package`` as appropriate 4. Declare a visibility for your link libraries and includes, either with the ``PRIVATE_*`` and ``PUBLIC_*`` parameters of ``ecbuild_add_library`` or by using ``target_link_libraries`` directly. 5. Advertise your usage requirements explicitly (replacement for the legacy TPL system) 6. Update the capitalisation of variable names New features ============ Project declaration ------------------- Fewer lines are now needed to enable ecBuild in a project:: cmake_minimum_required(VERSION 3.12 FATAL_ERROR) # ecbuild requires at least 3.6 find_package(ecbuild 3.0 REQUIRED) # note: the version requirement is optional project(foo LANGUAGES C CXX) # define options, targets... ecbuild_install_project(NAME ${PROJECT_NAME}) Project version management -------------------------- Instead of having a ``VERSION.cmake`` file, you should either create a file ``VERSION`` which contains the version that can contain an additional suffix; e.g. ``1.2-beta``. Alternatively you can declare the version (without suffix) as a parameter to the ``project`` command:: project(foo VERSION 1.2 LANGUAGES C CXX) This automatically defines the following variables: * ``foo_VERSION_STR`` (the full version number with suffix, as printed in ``VERSION`` file. * ``foo_VERSION`` (the full version number, without suffix) * ``foo_VERSION_MAJOR``, ``foo_VERSION_MINOR``, ``foo_VERSION_PATCH``, and ``foo_VERSION_TWEAK`` for the components of the version number (in this order) * ``foo_VERSION_SUFFIX`` (the suffix extracted from ``foo_VERSION_STR``) Variable naming conventions --------------------------- Some variable names have been changed in order to stick with the CMake naming schemes. Project information ^^^^^^^^^^^^^^^^^^^ All project-related variables now use the same capitalisation as the project itself, e.g. if the project name is ``projectA``, the version variable is ``projectA_VERSION``. This also includes variables resulting from a call to ``find_package`` (or ecBuild substitutes), like ``projectA_FOUND``. Features and options ^^^^^^^^^^^^^^^^^^^^ For options declared with ``ecbuild_add_option``, the status can be queried by checking ``HAVE_`` or ``_HAVE_``, where ```` and ```` have the same capitalisation as the original names. In order to comply with CMake package components checking, dependent packages can also use ``__FOUND``, e.g. ``projectA_TESTS_FOUND`` (where the project name is ``projectA`` and the feature is ``TESTS``). New macros ---------- ecbuild_configure_file ^^^^^^^^^^^^^^^^^^^^^^ This is a wrapper around `configure_file `_ and `file(GENERATE) `_, allowing to resolve both configuration variables and generator expressions at the same time. Target dependencies ------------------- Modern CMake aims to make the visibility of dependencies explicit. Build-only dependencies should be declared ``PRIVATE``, whereas usage requirements should be declared ``INTERFACE``. The ``PUBLIC`` flag exposes them both for build-time and as usage requirements. Bear in mind that any ``INTERFACE`` or ``PUBLIC`` requirement (library, include directory, compile flag) will be propagated transitively to dependent targets, even when building shared libraries. ``ecbuild_add_library(PUBLIC_LIBS | PRIVATE_LIBS)`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ These parameters have been added to allow easy update of the ``LIBS`` parameter of ``ecbuild_add_library``. This parameter is now deprecated and is only available in compatibility mode. Include directories and compile flags ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ With the use of targets, most include directories do not need to be set explicitly. If a library is defined with ``ecbuild_add_library``, the installation include directory is exported automatically. You may want to add build-only include directories using the ``BUILD_INTERFACE`` generator expression. In any case, the use of ``include_directories`` is not recommended, please link include directories to the relevant targets using either the ``{PUBLIC,PRIVATE}_INCLUDES`` parameters of ``ecbuild_add_*``, or ``target_include_directories``. The same is true for compile flags that should be explicitly associated to the relevant targets. As a consequence, the ``_INCLUDE_DIRECTORIES`` and ``_COMPILE_DEFINITIONS`` variables should not be used anymore for CMake projects. Bundles ------- The way bundles (or super-builds) work has been simplified. The interface of ``ecbuild_bundle`` has not changed and is the preferred way, but it is also possible to add "drop-in" packages just by using ``add_subdirectory``. Note however that there should still be a call to ``ecbuild_find_package`` or ``find_package`` to explicit dependencies and make sure the needed variables and targets are defined in the project scope. The use of ``ecbuild_use_package`` for bundles is kept only as part of the compatibility layer. Exported packages ----------------- CMake files location ^^^^^^^^^^^^^^^^^^^^ The CMake package configuration files are now installed into ``lib/cmake/`` instead of ``share//cmake``. Package configuration file ^^^^^^^^^^^^^^^^^^^^^^^^^^ The way package configuration files are generated, as well as their contents, has been modernised (see `configure_package_config_file `_ for details). The TPL handling has been removed (see below for details). The new config file template allows dependent packages to require specific features via the ``COMPONENTS`` parameter of ``find_package`` and ``ecbuild_find_package``. All features defined via ``ecbuild_add_option`` will have a corresponding ``__FOUND`` variable that can be queried from dependent packages to check whether the feature is available. Package version file ^^^^^^^^^^^^^^^^^^^^ The version file is now directly generated by CMake (see `write_basic_package_version_file `_ for details). Package targets file ^^^^^^^^^^^^^^^^^^^^ Instead of using one targets file per build, bundles now use one file per project. Interface libraries ------------------- The ``ecbuild_add_library`` macro now supports ``TYPE INTERFACE``, wrapping `CMake INTERFACE libraries `_. These libraries do not have any build stage, but can be used for aggregating libraries, include directories and compile definitions, or for header-only libraries. The ``PRIVATE`` visibility makes no sense for these libraries and should not be used. The ``PUBLIC_INCLUDES`` and ``PUBLIC_LIBS`` will be used to populate the interface properties. Fortran interfaces ------------------ The ``ecbuild_generate_fortran_interfaces`` macro now creates an INTERFACE library target that can be linked to by using ``target_link_libraries`` or the ``*LIBS`` parameters of ecBuild macros, the include directories will be propagated automatically. Deprecated / Removed features ============================= Third-party libraries (TPL) --------------------------- The TPL facilities are deprecated, and package maintainers should not rely on them. Instead, in case a package has **usage** dependencies, it should ensure they are available as well. One way of doing this is to create a file called ``-import.cmake.in`` at the top-level source directory (where the main ``CMakeLists.txt`` is located), which will be configured (see `configure_file `_) and loaded by CMake when calling ``find_package`` (or an ecBuild wrapper). For instance, if the package ``bar`` requires ``foo`` as a usage dependency, the ``bar-import.cmake.in`` file could contain:: include(CMakeFindDependencyMacro) set(bar_foo_FOUND @foo_FOUND@) if(bar_foo_FOUND) find_dependency(foo 1.3 HINTS @foo_DIR@ ) endif() Since the include directories and compile flags can (and should) be associated to the targets, the ``_LIBRARIES``, ``_INCLUDE_DIRECTORIES``, and ``_COMPILE_DEFINITIONS`` variables are not exported anymore (except in the compatibility layer). ecbuild_use_package ------------------- The ``ecbuild_use_package`` macro is only available in compatibility mode and should not be used anymore. This macro had two different use cases, which should be replaced by different code, as suggested in the following. Include a package as a sub-project ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This behaviour allows to import a package provided as a source code subdirectory, either by setting ``_SOURCE_DIR`` , or by matching the package name with the name of an actual subdirectory. This should be replaced by a direct call to ``add_subdirectory``. Look for a package ^^^^^^^^^^^^^^^^^^ This behaviour is equivalent to ``ecbuild_find_package``, which should be used as a replacement. Extra targets ------------- The special targets ``execs``, ``libs``, ``and`` ``links`` has been removed. C++11 feature checking ---------------------- ecbuild_add_cxx11_flags ^^^^^^^^^^^^^^^^^^^^^^^ This macro is only available in compatibility mode and should not be used anymore. CMake can handle C++ standard requirements directly:: set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) ecbuild_check_cxx11 ^^^^^^^^^^^^^^^^^^^ This function has been removed, a placeholder is available in compatibility mode. If you want to check for specific features, see the `CMAKE_CXX_COMPILE_FEATURES `_ variable. Package search path manipulation macros --------------------------------------- The ``ecbuild_add_extra_search_paths`` and ``ecbuild_list_extra_search_paths`` macros have been removed, since the package search paths are handled by ``ecbuild_find_package`` and ``find_package`` directly. ecbuild_add_option(REQUIRED_PACKAGES) ------------------------------------- The ``REQUIRED_PACKAGES`` of ``ecbuild_add_option`` is only available in compatibility mode and should not be used anymore. Instead, check for the package before and use ``CONDITION``:: find_package(foo 1.3 QUIET) # or ecbuild_find_package ecbuild_add_option(FEATURE FOO CONDITION foo_FOUND) The behaviour of ``REQUIRED_PACKAGES`` is as follows, you may want to mimic that functionality: 1. ``REQUIRED_PACKAGES`` takes a list of strings, each one representing a package requirement. If the string starts with ``PROJECT``, it should contains valid arguments for a direct call to ``ecbuild_use_package``. Otherwise, you can use either ``ecbuild_find_package`` or ``find_package``. We recommend using ``ecbuild_find_package`` for ECMWF software built with ecBuild. 2. Some special cases were present in the ``REQUIRED_PACKAGES`` handling: requiring ``MPI``, ``OMP``, ``Python``, or ``LEXYACC`` called the corresponding ``ecbuild_find_*`` macro. ecbuild_generate_rpc -------------------- This macro is deprecated and only available in compatibility mode. External "contrib" modules -------------------------- GreatCMakeCookOff ^^^^^^^^^^^^^^^^^ The files imported from the `GreatCMakeCookOff repository on GitHub `_ have been removed CMake 3.7 modules ^^^^^^^^^^^^^^^^^ The modules ``CheckFortranCompilerFlag.cmake``, ``CheckFortranSourceCompiles.cmake``, and ``CMakeCheckCompilerFlagCommonPatterns.cmake`` were backported from CMake 3.7, and have now been removed since they also exist in CMake 3.6. Find*.cmake ----------- In order to reduce the amount of code to maintain within ecBuild, many Find*.cmake scripts have been removed. If your project has specific needs, please include the appropriate scripts in the ``cmake/`` directory. Here is a list of the modules that have been removed: * contrib/FindNumPy.cmake * contrib/GreatCMakeCookOff/FindEigen.cmake * FindADSM.cmake * FindAEC.cmake * FindAIO.cmake * FindArmadillo.cmake * FindHPSS.cmake * FindLibGFortran.cmake * FindLibIFort.cmake * FindLustreAPI.cmake * FindNAG.cmake (still available in compat mode) * FindNDBM.cmake * FindNetCDF3.cmake (still available in compat mode) * FindOpenCL.cmake * FindOpenJPEG.cmake * FindPGIFortran.cmake * FindProj4.cmake * FindREADLINE.cmake * FindRealtime.cmake * FindRPC.cmake * FindRPCGEN.cmake * Findspot.cmake * FindSZip.cmake * FindTrilinos.cmake * FindViennaCL.cmake * FindXLFortranLibs.cmake Boost unit tests ---------------- The ``BOOST`` keyword has been removed from ``ecbuild_add_test``, as well as all associated facilities. Boost unit tests can still be used but the user is responsible for linking to Boost libraries. ecbuild_bundle(STASH) --------------------- The ``STASH`` keyword of ``ecbuild_bundle`` is ECMWF-specific and requires hardcoding some internal URLs into the ecBuild source code. Therefore, it is only available in compatibility mode and should not be used anymore. Please put the full git URL instead (you may want to use a variable to enable easy changes). ecbuild-3.16.0/regressions/0000775000175000017500000000000015252726137015751 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_399/0000775000175000017500000000000015252726137017424 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_399/ld-origin/0000775000175000017500000000000015252726137021310 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_399/ld-origin/dso1.c0000664000175000017500000000002415252726137022316 0ustar alastairalastairvoid fun1(void) {} ecbuild-3.16.0/regressions/ECBUILD_399/ld-origin/CMakeLists.txt0000664000175000017500000000133715252726137024054 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) project(test_ld_origin VERSION 1.0 LANGUAGES C) include(ecbuild_system NO_POLICY_SCOPE) ecbuild_requires_macro_version( 2.9 ) ecbuild_declare_project() # Allow RPATH to be overridden at build time # This allows to recreate the bug without having to install a dummy project set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) ecbuild_add_library(TARGET dso1 SOURCES dso1.c) ecbuild_add_library(TARGET dso2 SOURCES dso2.c) target_link_libraries(dso2 PRIVATE dso1) ecbuild_target_rpath(dso2 REPLACE "../lib") ecbuild_add_executable(TARGET main SOURCES main.c) target_link_libraries(main PRIVATE dso2) ecbuild_target_rpath(main REPLACE "../lib") ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/regressions/ECBUILD_399/ld-origin/main.c0000664000175000017500000000007115252726137022376 0ustar alastairalastairvoid fun2(void); int main(void) { fun2(); return 0; } ecbuild-3.16.0/regressions/ECBUILD_399/ld-origin/dso2.c0000664000175000017500000000005615252726137022324 0ustar alastairalastairvoid fun1(void); void fun2(void) { fun1(); } ecbuild-3.16.0/regressions/ECBUILD_399/CMakeLists.txt0000664000175000017500000000117415252726137022167 0ustar alastairalastair configure_file( ld-origin.sh.in ld-origin.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-399-ld-origin TYPE SCRIPT COMMAND ld-origin.sh CONDITION UNIX ) #[=[ Description of the bug: the linker fix check (look for test_ld_origin in cmake/ecbuild_check_os.cmake) makes the build fail if two different versions of ecbuild are used in the same build directory. #]=] configure_file( buildfail.sh.in buildfail.sh @ONLY ) configure_file( buildfail-CMakeLists.txt.in buildfail/CMakeLists.txt @ONLY ) ecbuild_add_test( TARGET ECBUILD-399-buildfail TYPE SCRIPT COMMAND buildfail.sh CONDITION UNIX ) ecbuild-3.16.0/regressions/ECBUILD_399/buildfail-CMakeLists.txt.in0000664000175000017500000000043115252726137024520 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) project( dummy VERSION 0.1 LANGUAGES NONE ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9 ) ecbuild_declare_project() ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_399/ld-origin.sh.in0000775000175000017500000000066215252726137022260 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@ # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # --------------------- cleanup ------------------------ rm -rf $HERE/ld-origin # ------------------ build project --------------------- mkdir -p $HERE/ld-origin cd $HERE/ld-origin ecbuild -- $SRC_DIR/ld-origin make ecbuild-3.16.0/regressions/ECBUILD_399/buildfail.sh.in0000775000175000017500000000123515252726137022324 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH cd buildfail # ---------------------- cleanup ----------------------- rm -rf build # ----------------------- build ------------------------ mkdir build cd build ecbuild -- .. # -------------------- contaminate --------------------- # In practice, this may be caused by using two different # installations of ecbuild echo "CMAKE_HOME_DIRECTORY:INTERNAL=/non/existent" \ >ecbuild_tmp/check_linker/CMakeCache.txt # ---------------------- rebuild ----------------------- ecbuild -- .. ecbuild-3.16.0/regressions/ECBUILD_511/0000775000175000017500000000000015252726137017406 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_511/run-test.sh.in0000775000175000017500000000205115252726137022131 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@ # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # --------------------- cleanup ------------------------ $HERE/clean.sh # ----------------- build projectAB --------------------- mkdir -p $HERE/bundleAB cd $HERE/bundleAB mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib $SRC_DIR/bundleAB make install cd .. rm -rfv build # ----------------- build projectC --------------------- mkdir -p $HERE/projectC cd $HERE/projectC mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib \ -DprojectA_DIR=$HERE/bundleAB/install/lib/cmake/projectA \ -DprojectB_DIR=$HERE/bundleAB/install/lib/cmake/projectB \ $SRC_DIR/projectC make install cd .. rm -rfv build # ----------------- run --------------------- cd $HERE projectC/install/bin/main | tee projectC_main.log grep -qF "libraryA = 4" projectC_main.log grep -qF "libraryB = 5" projectC_main.log ecbuild-3.16.0/regressions/ECBUILD_511/CMakeLists.txt0000664000175000017500000000030515252726137022144 0ustar alastairalastair set( ec511_res clean.sh ) configure_file( run-test.sh.in run-test.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-511 TYPE SCRIPT COMMAND run-test.sh RESOURCES ${ec511_res} ) ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/0000775000175000017500000000000015252726137021062 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/CMakeLists.txt0000664000175000017500000000036515252726137023626 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(bundleAB VERSION 0.1.0 LANGUAGES C) ecbuild_bundle(PROJECT projectA) ecbuild_bundle(PROJECT projectB) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectA/0000775000175000017500000000000015252726137022631 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectA/CMakeLists.txt0000664000175000017500000000052515252726137025373 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectA VERSION 0.1.0 LANGUAGES C) ecbuild_add_library( TARGET projectA SOURCES libraryA.h libraryA.c PUBLIC_INCLUDES $ INSTALL_HEADERS LISTED) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectA/libraryA.c0000664000175000017500000000006715252726137024545 0ustar alastairalastair#include "libraryA.h" int libraryA() { return 4; } ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectA/libraryA.h0000664000175000017500000000012415252726137024544 0ustar alastairalastair#ifndef _LIBRARYA_H_ #define _LIBRARYA_H_ int libraryA(); #endif /* _LIBRARYA_H_ */ ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectB/0000775000175000017500000000000015252726137022632 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectB/projectb-import.cmake.in0000664000175000017500000000007415252726137027362 0ustar alastairalastairinclude(CMakeFindDependencyMacro) find_dependency(projectA) ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectB/CMakeLists.txt0000664000175000017500000000061515252726137025374 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectB VERSION 0.1.0 LANGUAGES C) find_package(projectA REQUIRED) ecbuild_add_library( TARGET projectB SOURCES libraryB.h libraryB.c PUBLIC_LIBS projectA PUBLIC_INCLUDES $ INSTALL_HEADERS LISTED) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectB/libraryB.c0000664000175000017500000000013215252726137024540 0ustar alastairalastair#include "libraryB.h" #include "libraryA.h" int libraryB() { return libraryA() + 1; } ecbuild-3.16.0/regressions/ECBUILD_511/bundleAB/projectB/libraryB.h0000664000175000017500000000015215252726137024547 0ustar alastairalastair#ifndef _LIBRARYB_H_ #define _LIBRARYB_H_ #include "libraryA.h" int libraryB(); #endif /* _LIBRARYB_H_ */ ecbuild-3.16.0/regressions/ECBUILD_511/projectC/0000775000175000017500000000000015252726137021157 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_511/projectC/CMakeLists.txt0000664000175000017500000000043415252726137023720 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectC VERSION 0.1.0 LANGUAGES C) find_package(projectB REQUIRED) ecbuild_add_executable( TARGET main SOURCES main.c LIBS projectB) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/regressions/ECBUILD_511/projectC/main.c0000664000175000017500000000031315252726137022244 0ustar alastairalastair#include #include "libraryA.h" #include "libraryB.h" int main(int argc, char* argv[]) { printf("libraryA = %d\n", libraryA()); printf("libraryB = %d\n", libraryB()); return 0; } ecbuild-3.16.0/regressions/ECBUILD_511/clean.sh0000775000175000017500000000017215252726137021027 0ustar alastairalastair#!/usr/bin/env bash set -e rm -rf bundleAB/build rm -rf bundleAB/install rm -rf projectC/build rm -rf projectC/install ecbuild-3.16.0/regressions/CMakeLists.txt0000664000175000017500000000053015252726137020507 0ustar alastairalastairadd_subdirectory( ECBUILD_359 ) add_subdirectory( ECBUILD_401 ) add_subdirectory( ECBUILD_407 ) add_subdirectory( ECBUILD_415 ) add_subdirectory( ECBUILD_433 ) add_subdirectory( ECBUILD_495 ) add_subdirectory( ECBUILD_509 ) add_subdirectory( ECBUILD_511 ) if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" ) add_subdirectory( ECBUILD_399 ) endif() ecbuild-3.16.0/regressions/ECBUILD_433/0000775000175000017500000000000015252726137017411 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_433/CMakeLists.txt0000664000175000017500000000020115252726137022142 0ustar alastairalastair configure_file( run.sh.in run.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-433 TYPE SCRIPT COMMAND run.sh ) ecbuild-3.16.0/regressions/ECBUILD_433/run.sh.in0000775000175000017500000000123315252726137021160 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@/proj # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH cd $HERE # ---------------------- cleanup ----------------------- rm -rf build build2 # ----------------------- build ------------------------ mkdir build cd build ecbuild -- $SRC_DIR make # ---------------------- relocate ---------------------- cd $HERE mv build build2 # ------------------------ run ------------------------- build2/bin/myexe >myexe.out # -------------------- check output -------------------- grep -q "^Hello!$" myexe.out ecbuild-3.16.0/regressions/ECBUILD_433/proj/0000775000175000017500000000000015252726137020363 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_433/proj/mylib.c0000664000175000017500000000010215252726137021634 0ustar alastairalastair#include void hello(void) { printf("Hello!\n"); } ecbuild-3.16.0/regressions/ECBUILD_433/proj/CMakeLists.txt0000664000175000017500000000044415252726137023125 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.0 QUIET) project(myproj VERSION 0.1.0 LANGUAGES C) ecbuild_add_library(TARGET mylib SOURCES mylib.c) ecbuild_add_executable(TARGET myexe SOURCES myexe.c LIBS mylib) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_433/proj/myexe.c0000664000175000017500000000013215252726137021652 0ustar alastairalastairextern void hello(void); int main(int argc, char **argv) { hello(); return 0; } ecbuild-3.16.0/regressions/ECBUILD_401/0000775000175000017500000000000015252726137017404 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_401/run-test.sh.in0000775000175000017500000000160415252726137022132 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@ # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # --------------------- cleanup ------------------------ $HERE/clean.sh # ----------------- build projectA --------------------- mkdir -p $HERE/projectA cd $HERE/projectA mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib $SRC_DIR/projectA make install # ----------------- build projectB --------------------- mkdir -p $HERE/projectB cd $HERE/projectB mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib -DprojectA_DIR=$HERE/projectA/install/lib/cmake/projectA $SRC_DIR/projectB make install # ----------------- run --------------------- cd $HERE projectB/install/bin/main >projectB_main.log grep -qF "libraryA = 4" projectB_main.log ecbuild-3.16.0/regressions/ECBUILD_401/CMakeLists.txt0000664000175000017500000000030515252726137022142 0ustar alastairalastair set( ec401_res clean.sh ) configure_file( run-test.sh.in run-test.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-401 TYPE SCRIPT COMMAND run-test.sh RESOURCES ${ec401_res} ) ecbuild-3.16.0/regressions/ECBUILD_401/clean.sh0000775000175000017500000000017215252726137021025 0ustar alastairalastair#!/usr/bin/env bash set -e rm -rf projectA/build rm -rf projectA/install rm -rf projectB/build rm -rf projectB/install ecbuild-3.16.0/regressions/ECBUILD_401/projectA/0000775000175000017500000000000015252726137021153 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_401/projectA/CMakeLists.txt0000664000175000017500000000057515252726137023722 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) project( projectA VERSION 0.1.0 LANGUAGES CXX ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() ecbuild_add_library( TARGET projectA SOURCES libraryA.h libraryA.cc INSTALL_HEADERS LISTED ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_401/projectA/libraryA.cc0000664000175000017500000000006615252726137023231 0ustar alastairalastair#include "libraryA.h" int libraryA() { return 4; } ecbuild-3.16.0/regressions/ECBUILD_401/projectA/libraryA.h0000664000175000017500000000002015252726137023061 0ustar alastairalastairint libraryA(); ecbuild-3.16.0/regressions/ECBUILD_401/projectB/0000775000175000017500000000000015252726137021154 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_401/projectB/main.cc0000664000175000017500000000023115252726137022403 0ustar alastairalastair#include #include int main(int argc, char* argv[]) { std::cout << "libraryA = " << libraryA() << std::endl; return 0; } ecbuild-3.16.0/regressions/ECBUILD_401/projectB/CMakeLists.txt0000664000175000017500000000064015252726137023714 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) project( projectB VERSION 0.1.0 LANGUAGES CXX ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() find_package( projectA REQUIRED ) ecbuild_add_executable( TARGET main SOURCES main.cc ) target_link_libraries( main projectA ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_407/0000775000175000017500000000000015252726137017412 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_407/run-test.sh.in0000775000175000017500000000060015252726137022133 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@ # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # --------------------- cleanup ------------------------ rm -rf build # ----------------- build --------------------- mkdir build cd build ecbuild -- $SRC_DIR/mybundle ecbuild-3.16.0/regressions/ECBUILD_407/CMakeLists.txt0000664000175000017500000000022015252726137022144 0ustar alastairalastair configure_file( run-test.sh.in run-test.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-407 TYPE SCRIPT COMMAND run-test.sh ) ecbuild-3.16.0/regressions/ECBUILD_407/mybundle/0000775000175000017500000000000015252726137021231 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_407/mybundle/CMakeLists.txt0000664000175000017500000000052615252726137023774 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) include( ecbuild_bundle ) project( mybundle VERSION 0.1.0.0 LANGUAGES NONE ) ecbuild_bundle_initialize() ecbuild_requires_macro_version( 2.9.5 ) ecbuild_bundle( PROJECT mylib ) ecbuild_bundle( PROJECT myexe ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_407/mybundle/myexe/0000775000175000017500000000000015252726137022360 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_407/mybundle/myexe/CMakeLists.txt0000664000175000017500000000060615252726137025122 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) project( myexe VERSION 0.1.0 LANGUAGES NONE ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() ecbuild_find_package( NAME mylib REQUIRED ) if( NOT DEFINED mylib_FOO ) message( FATAL_ERROR "mylib_FOO is not defined" ) endif() ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_407/mybundle/mylib/0000775000175000017500000000000015252726137022345 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_407/mybundle/mylib/mylib-import.cmake.in0000664000175000017500000000002315252726137026373 0ustar alastairalastairset( mylib_FOO 1 ) ecbuild-3.16.0/regressions/ECBUILD_407/mybundle/mylib/CMakeLists.txt0000664000175000017500000000043515252726137025107 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) project( mylib VERSION 0.1.0 LANGUAGES NONE ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_359/0000775000175000017500000000000015252726137017420 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_359/run-test.sh.in0000775000175000017500000000172315252726137022150 0ustar alastairalastair#!/usr/bin/env bash # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin EXAMPLES_DIR=@CMAKE_SOURCE_DIR@/examples SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@ # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # Cleanup previous builds rm -rf $HERE/build $HERE/bundle # Build and install bundle mkdir -p $HERE/bundle/build cd $HERE/bundle/build ecbuild --prefix=$HERE/bundle/install $EXAMPLES_DIR/cpp-bundle make install # Build project that uses subproject bar of bundle mkdir -p $HERE/build cd $HERE/build ecbuild -DBAR_PATH=$HERE/bundle/install ../ ecbuild-3.16.0/regressions/ECBUILD_359/test-CMakeLists.txt0000664000175000017500000000103715252726137023136 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project(kata VERSION 0.0 LANGUAGES CXX) ecbuild_find_package(NAME bar REQUIRED) ecbuild-3.16.0/regressions/ECBUILD_359/CMakeLists.txt0000664000175000017500000000031215252726137022154 0ustar alastairalastair configure_file(run-test.sh.in run-test.sh @ONLY) configure_file(test-CMakeLists.txt CMakeLists.txt COPYONLY) ecbuild_add_test( TARGET ECBUILD-359 TYPE SCRIPT COMMAND run-test.sh ) ecbuild-3.16.0/regressions/ECBUILD_495/0000775000175000017500000000000015252726137017421 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_495/CMakeLists.txt0000664000175000017500000000020115252726137022152 0ustar alastairalastair configure_file( run.sh.in run.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-495 TYPE SCRIPT COMMAND run.sh ) ecbuild-3.16.0/regressions/ECBUILD_495/run.sh.in0000775000175000017500000000075415252726137021177 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@PROJECT_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@/proj # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH cd $HERE # ---------------------- cleanup ----------------------- rm -rf build # --------------------- configure ---------------------- mkdir build cd build ecbuild -- \ -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ -DCMAKE_FIND_ROOT_PATH=/invalid \ $SRC_DIR ecbuild-3.16.0/regressions/ECBUILD_495/proj/0000775000175000017500000000000015252726137020373 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_495/proj/CMakeLists.txt0000664000175000017500000000034315252726137023133 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(foo VERSION 0.1 LANGUAGES NONE) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR/cmake}) ecbuild_find_package(Bar REQUIRED) ecbuild-3.16.0/regressions/ECBUILD_495/proj/cmake/0000775000175000017500000000000015252726137021453 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_495/proj/cmake/FindBar.cmake0000664000175000017500000000011415252726137023756 0ustar alastairalastairmessage(STATUS "Found Bar: ${CMAKE_CURRENT_LIST_FILE}") set(Bar_FOUND TRUE) ecbuild-3.16.0/regressions/ECBUILD_509/0000775000175000017500000000000015252726137017415 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_509/CMakeLists.txt0000664000175000017500000000020115252726137022146 0ustar alastairalastair configure_file( run.sh.in run.sh @ONLY ) ecbuild_add_test( TARGET ECBUILD-509 TYPE SCRIPT COMMAND run.sh ) ecbuild-3.16.0/regressions/ECBUILD_509/run.sh.in0000775000175000017500000000062415252726137021167 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@/proj # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH cd $HERE # ---------------------- cleanup ----------------------- rm -rf build # ----------------------- build ------------------------ mkdir build cd build ecbuild -- $SRC_DIR make ecbuild-3.16.0/regressions/ECBUILD_509/proj/0000775000175000017500000000000015252726137020367 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_509/proj/mylib.c0000664000175000017500000000010215252726137021640 0ustar alastairalastair#include void hello(void) { printf("Hello!\n"); } ecbuild-3.16.0/regressions/ECBUILD_509/proj/CMakeLists.txt0000664000175000017500000000051015252726137023123 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.6 QUIET) project(myproj VERSION 0.1.0 LANGUAGES C) ecbuild_add_library(TARGET mylib SOURCES mylib.c) ecbuild_add_test( TARGET myexe SOURCES myexe.c PROPERTIES TIMEOUT 60 LIBS mylib ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/regressions/ECBUILD_509/proj/myexe.c0000664000175000017500000000013215252726137021656 0ustar alastairalastairextern void hello(void); int main(int argc, char **argv) { hello(); return 0; } ecbuild-3.16.0/regressions/ECBUILD_415/0000775000175000017500000000000015252726137017411 5ustar alastairalastairecbuild-3.16.0/regressions/ECBUILD_415/CMakeLists.txt0000664000175000017500000000033215252726137022147 0ustar alastairalastair ecbuild_add_test( TARGET ECBUILD-415 TYPE SCRIPT COMMAND ${CMAKE_COMMAND} ARGS -DCMAKE_MODULE_PATH=${ECBUILD_MACROS_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/test_path_append.cmake ) ecbuild-3.16.0/regressions/ECBUILD_415/test_path_append.cmake0000664000175000017500000000100715252726137023733 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) include( ecbuild_append_to_rpath ) unset( SOME_PATH ) ecbuild_path_append( SOME_PATH "/usr/local/foo" ) message( "${SOME_PATH}" ) ecbuild_path_append( SOME_PATH "/usr/bar" ) message( "${SOME_PATH}" ) ecbuild_path_append( SOME_PATH "/system/baz" ) message( "${SOME_PATH}" ) if( NOT "${SOME_PATH}" STREQUAL "/usr/local/foo;/usr/bar;/system/baz" ) message( FATAL_ERROR "ecbuild_path_append() not working as expected" ) endif() ecbuild-3.16.0/tests/0000775000175000017500000000000015252726137014550 5ustar alastairalastairecbuild-3.16.0/tests/test_requires_simple/0000775000175000017500000000000015252726137021017 5ustar alastairalastairecbuild-3.16.0/tests/test_requires_simple/build-and-run.sh0000775000175000017500000000106215252726137024016 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # Build the project ecbuild $SOURCE/test_project -B $HERE/build # Run only one specific test (which should invoke the dependencies) (cd $HERE/build; ctest -R write_world_after_hello) # Avoid using --test-dir option in ctest # Check if the output is as expected echo -n "Hello, World!" | diff - $HERE/build/output.txt ecbuild-3.16.0/tests/test_requires_simple/CMakeLists.txt0000664000175000017500000000041215252726137023554 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_test_requires_simple TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/test_requires_simple/test_project/0000775000175000017500000000000015252726137023524 5ustar alastairalastairecbuild-3.16.0/tests/test_requires_simple/test_project/CMakeLists.txt0000664000175000017500000000116115252726137026263 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_test_requires_simple VERSION 0.1.0 LANGUAGES NONE ) ecbuild_add_test( TARGET clean_output COMMAND ${CMAKE_COMMAND} ARGS -E remove ${CMAKE_CURRENT_BINARY_DIR}/output.txt ) ecbuild_add_test( TARGET write_hello TEST_REQUIRES clean_output COMMAND bash ARGS -c "echo -n 'Hello, ' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" ) ecbuild_add_test( TARGET write_world_after_hello TEST_REQUIRES write_hello COMMAND bash ARGS -c "echo -n 'World!' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" ) ecbuild-3.16.0/tests/bundle_override_features/0000775000175000017500000000000015252726137021616 5ustar alastairalastairecbuild-3.16.0/tests/bundle_override_features/run-test.sh.in0000775000175000017500000000050015252726137024336 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" # --------------------- cleanup ------------------------ rm -rf $HERE/build # ---------------- build the bundle -------------------- cd $HERE export ecbuild_DIR=@PROJECT_BINARY_DIR@ mkdir build cd build cmake @bundle_SOURCE_DIR@ ecbuild-3.16.0/tests/bundle_override_features/bundle/0000775000175000017500000000000015252726137023067 5ustar alastairalastairecbuild-3.16.0/tests/bundle_override_features/bundle/project_b/0000775000175000017500000000000015252726137025036 5ustar alastairalastairecbuild-3.16.0/tests/bundle_override_features/bundle/project_b/CMakeLists.txt0000664000175000017500000000156115252726137027601 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( project_b VERSION 0.0.0 LANGUAGES C ) if( NOT HAVE_TESTS ) ecbuild_error( "Tests should be enabled" ) endif() if( NOT DEFINED PROJECT_B_ENABLE_X ) ecbuild_error( "This test is designed to have PROJECT_B_ENABLE_X=OFF" ) endif() ecbuild_add_option( FEATURE X DEFAULT ON ) if( HAVE_X ) ecbuild_error( "Feature X should be disabled, as PROJECT_B_ENABLE_X=${PROJECT_B_ENABLE_X}," " even though ENABLE_X=OFF" ) endif() ecbuild_add_option( FEATURE Y DEFAULT OFF ) if( NOT HAVE_Y ) ecbuild_error( "Feature Y should be enabled, as ENABLE_Y=${ENABLE_Y} as set at bundle level" ) endif() ecbuild_add_option( FEATURE Z DEFAULT OFF ) if( HAVE_Z ) ecbuild_error( "Feature Y should be disabled, with ENABLE_Z=${ENABLE_Z} as set at bundle level" ) endif()ecbuild-3.16.0/tests/bundle_override_features/bundle/CMakeLists.txt0000664000175000017500000000060515252726137025630 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) set( ENABLE_TESTS ON CACHE BOOL "" ) set( PROJECT_A_ENABLE_TESTS OFF CACHE BOOL "" ) set( PROJECT_B_ENABLE_X OFF CACHE BOOL "" ) set(ENABLE_Y ON CACHE BOOL "" ) set(ENABLE_Z OFF CACHE BOOL "" ) project( bundle VERSION 0.0.0 LANGUAGES C ) add_subdirectory( project_a ) add_subdirectory( project_b ) ecbuild-3.16.0/tests/bundle_override_features/bundle/project_a/0000775000175000017500000000000015252726137025035 5ustar alastairalastairecbuild-3.16.0/tests/bundle_override_features/bundle/project_a/CMakeLists.txt0000664000175000017500000000203715252726137027577 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( project_a VERSION 0.0.0 LANGUAGES C ) if( HAVE_TESTS ) ecbuild_error( "Tests should be disabled, as PROJECT_A_ENABLE_TESTS=${PROJECT_A_ENABLE_TESTS}," " even though ENABLE_TESTS=${ENABLE_TESTS}" ) endif() if( DEFINED ENABLE_X ) if( NOT _configured_before ) ecbuild_error( "This test is designed to have ENABLE_X undefined (upon first run at least)" ) set( _configured_before TRUE CACHE BOOL INTERNAL ) endif() endif() ecbuild_add_option( FEATURE X DEFAULT ON ) if( NOT HAVE_X ) ecbuild_error( "Feature X should be default-enabled as ENABLE_X is undefined" ) endif() ecbuild_add_option( FEATURE Y DEFAULT ON ) if( NOT HAVE_Y ) ecbuild_error( "Feature Y should be enabled, with ENABLE_Y=${ENABLE_Y} as set at bundle level" ) endif() ecbuild_add_option( FEATURE Z DEFAULT OFF ) if( HAVE_Z ) ecbuild_error( "Feature Y should be disabled, with ENABLE_Z=${ENABLE_Z} as set at bundle level" ) endif()ecbuild-3.16.0/tests/bundle_override_features/CMakeLists.txt0000664000175000017500000000042115252726137024353 0ustar alastairalastair set( _ref ${CMAKE_CURRENT_BINARY_DIR} ) set( bundle_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bundle ) configure_file( run-test.sh.in ${_ref}/run-test.sh @ONLY ) ecbuild_add_test( TARGET bundle-override-features TYPE SCRIPT COMMAND ${_ref}/run-test.sh ) ecbuild-3.16.0/tests/ecbuild_get_test_multidata/0000775000175000017500000000000015252726137022121 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_get_test_multidata/run_test.cmake0000664000175000017500000000375715252726137025002 0ustar alastairalastaircmake_minimum_required(VERSION 3.18 FATAL_ERROR) function(run_configure_case case_name expected_result expected_error) set(build_dir "${TEST_BINARY_DIR}/${case_name}") file(REMOVE_RECURSE "${build_dir}") execute_process( COMMAND "${CMAKE_COMMAND}" -S "${TEST_SOURCE_DIR}/test_project" -B "${build_dir}" -Decbuild_ROOT=${ecbuild_ROOT} -DTEST_CASE=${case_name} RESULT_VARIABLE result OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr ) set(output "${stdout}${stderr}") if(expected_result STREQUAL "success") if(NOT result EQUAL 0) message(FATAL_ERROR "Case '${case_name}' should configure successfully, but returned ${result}:\n${output}") endif() elseif(expected_result STREQUAL "failure") if(result EQUAL 0) message(FATAL_ERROR "Case '${case_name}' should fail to configure, but succeeded") endif() if(NOT output MATCHES "${expected_error}") message(FATAL_ERROR "Case '${case_name}' failed without the expected diagnostic '${expected_error}':\n${output}") endif() else() message(FATAL_ERROR "Unknown expected result '${expected_result}' for case '${case_name}'") endif() endfunction() # Existing supported inputs must continue to generate distinct download targets. run_configure_case(supported_names success "") run_configure_case(checksum_options success "") run_configure_case(punctuation_in_relative_filenames success "") run_configure_case(punctuation_in_relative_directories success "") run_configure_case(semicolon_in_path failure "target.*already exists") run_configure_case(brackets_in_filename failure "Expected 2 generated targets") # Existing limitations are isolated so each failure mode remains observable. run_configure_case(duplicate_basename failure "custom rule.*a\\.txt") run_configure_case(dot_underscore_collision success "") run_configure_case(equals_in_filename success "") run_configure_case(comma_in_filename success "") run_configure_case(multiple_invalid_characters success "") ecbuild-3.16.0/tests/ecbuild_get_test_multidata/CMakeLists.txt0000664000175000017500000000045415252726137024664 0ustar alastairalastairecbuild_add_test( TARGET test_ecbuild_get_test_multidata TYPE SCRIPT COMMAND ${CMAKE_COMMAND} ARGS -DTEST_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -Decbuild_ROOT=${PROJECT_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/run_test.cmake ) ecbuild-3.16.0/tests/ecbuild_get_test_multidata/test_project/0000775000175000017500000000000015252726137024626 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_get_test_multidata/test_project/CMakeLists.txt0000664000175000017500000002125415252726137027372 0ustar alastairalastaircmake_minimum_required(VERSION 3.18 FATAL_ERROR) find_package(ecbuild REQUIRED) project(test_get_test_multidata VERSION 1.0.0 LANGUAGES NONE) if(NOT TEST_CASE) message(FATAL_ERROR "TEST_CASE is required") endif() # Verify that a multidata aggregate generated the expected number of unique # internal download targets and matching invocations in its helper script. # # aggregate_target # Name passed to ecbuild_get_test_multidata(TARGET). # expected_count # Number of internal download targets and helper-script invocations expected. function(assert_generated_targets aggregate_target expected_count) get_property(directory_targets DIRECTORY PROPERTY BUILDSYSTEM_TARGETS) list(FILTER directory_targets INCLUDE REGEX "^__get_data_${aggregate_target}_") list(LENGTH directory_targets actual_count) if(NOT actual_count EQUAL expected_count) message(FATAL_ERROR "Expected ${expected_count} generated targets for '${aggregate_target}', " "found ${actual_count}: ${directory_targets}") endif() list(REMOVE_DUPLICATES directory_targets) list(LENGTH directory_targets unique_count) if(NOT unique_count EQUAL expected_count) message(FATAL_ERROR "Generated targets for '${aggregate_target}' are not unique: ${directory_targets}") endif() file(READ "${CMAKE_CURRENT_BINARY_DIR}/get_data_${aggregate_target}.cmake" generated_script) foreach(target IN LISTS directory_targets) string(FIND "${generated_script}" "--target ${target}" target_position) if(target_position EQUAL -1) message(FATAL_ERROR "Generated download script does not invoke target '${target}'") endif() endforeach() string(REGEX MATCHALL "--target __get_data_${aggregate_target}_[^ )\n]+" script_invocations "${generated_script}") list(LENGTH script_invocations invocation_count) if(NOT invocation_count EQUAL expected_count) message(FATAL_ERROR "Expected ${expected_count} target invocations for '${aggregate_target}', " "found ${invocation_count}: ${script_invocations}") endif() endfunction() # Verify the target name generated from readable directory and basename # components, and the hash of the full relative source path. # # aggregate_target # Name passed to ecbuild_get_test_multidata(TARGET). # source_path # Relative source path passed as an entry in NAMES, without a checksum. function(assert_generated_target_name aggregate_target source_path) # # Important: # The following algorithm MUST match the one in ecbuild_get_test_multidata.cmake # to ensure that the generated target name is correct. # # The steps are: # 1. Split the source path into a directory and a filename. # 2. Convert the directory and filename into C identifiers. # 3. Compute the MD5 hash of the full source path. # 4. Define that expecte target, from: # - "__get_data_" prefix # - aggregate target # - directory identifier # - filename identifier # - and, full source path hash. # get_filename_component(file "${source_path}" NAME) get_filename_component(dir "${source_path}" PATH) if(dir) string(MAKE_C_IDENTIFIER "${dir}" dir_cidentifier) string(APPEND dir_cidentifier "_") else() set(dir_cidentifier "") endif() string(MAKE_C_IDENTIFIER "${file}" file_cidentifier) string(MD5 dir_file_hash "${source_path}") set(expected_target "__get_data_${aggregate_target}_${dir_cidentifier}${file_cidentifier}_${dir_file_hash}") if(NOT TARGET ${expected_target}) message(FATAL_ERROR "Expected target '${expected_target}' was not created for '${source_path}'") endif() if(expected_target MATCHES "[=,?^;]") message(FATAL_ERROR "Generated target '${expected_target}' contains an unsupported character") endif() endfunction() if(TEST_CASE STREQUAL "supported_names") set(supported_names foo.grib archive.tar.gz README .config a-b.grib a+b.grib a_b.grib a,b.grib a=b.grib ,a.grib b=.grib a?.grib b^c.grib c|d.grib e!f.grib foo/1.txt foo/_1.txt bar/other.txt ) ecbuild_get_test_multidata( TARGET supported_names NAMES ${supported_names} NOCHECK ) list(LENGTH supported_names supported_name_count) assert_generated_targets(supported_names ${supported_name_count}) foreach(source_path IN LISTS supported_names) assert_generated_target_name(supported_names "${source_path}") endforeach() elseif(TEST_CASE STREQUAL "checksum_options") set(checksum "d41d8cd98f00b204e9800998ecf8427e") ecbuild_get_test_multidata( TARGET inline_checksum NAMES checked.data:${checksum} ) assert_generated_targets(inline_checksum 1) ecbuild_get_test_multidata( TARGET no_checksum NAMES unchecked.data NOCHECK ) assert_generated_targets(no_checksum 1) elseif(TEST_CASE STREQUAL "punctuation_in_relative_filenames") set(relative_filenames foo/a,b.grib bar/a=b.grib baz/,c.grib qux/d=.grib question/a?.grib caret/b^c.grib pipe/c|d.grib bang/e!f.grib nested/deep/gridType,regular_ll.grib nested/other/gridType=regular_ll,scanningMode=96.grib ) ecbuild_get_test_multidata( TARGET punctuation_in_relative_filenames NAMES ${relative_filenames} NOCHECK ) list(LENGTH relative_filenames relative_filename_count) assert_generated_targets(punctuation_in_relative_filenames ${relative_filename_count}) foreach(source_path IN LISTS relative_filenames) assert_generated_target_name(punctuation_in_relative_filenames "${source_path}") endforeach() elseif(TEST_CASE STREQUAL "punctuation_in_relative_directories") set(relative_directories foo,bar/a.grib foo=bar/b.grib ,foo/c.grib bar=/d.grib question?/g.grib caret^dir/h.grib pipe|dir/i.grib bang!dir/j.grib nested,dir/child=dir/e.grib nested=dir/child,dir/f.grib nested/de^p/gridType,regular_ll.grib nested/oth&r/gridType=regular_ll,scanningMode=96.grib ) ecbuild_get_test_multidata( TARGET punctuation_in_relative_directories NAMES ${relative_directories} NOCHECK ) list(LENGTH relative_directories relative_directory_count) assert_generated_targets(punctuation_in_relative_directories ${relative_directory_count}) foreach(source_path IN LISTS relative_directories) assert_generated_target_name(punctuation_in_relative_directories "${source_path}") endforeach() elseif(TEST_CASE STREQUAL "semicolon_in_path") # Semicolons are CMake list separators. Even when escaped in the source # list, expansion through the multidata argument chain splits these paths. set(semicolon_paths "semi\;colon.grib" "semi\;dir/nested.grib" ) ecbuild_get_test_multidata( TARGET semicolon_in_path NAMES ${semicolon_paths} NOCHECK ) assert_generated_targets(semicolon_in_path 2) foreach(source_path IN LISTS semicolon_paths) assert_generated_target_name(semicolon_in_path "${source_path}") endforeach() elseif(TEST_CASE STREQUAL "brackets_in_filename") # Unquoted unmatched opening and closing brackets are combined by CMake's # argument parser rather than forwarded as two independent filenames. set(bracket_filenames c[d.grib c]d.grib ) ecbuild_get_test_multidata( TARGET brackets_in_filename NAMES ${bracket_filenames} NOCHECK ) assert_generated_targets(brackets_in_filename 2) elseif(TEST_CASE STREQUAL "duplicate_basename") ecbuild_get_test_multidata( TARGET duplicate_basename NAMES foo/a.txt bar/a.txt NOCHECK ) elseif(TEST_CASE STREQUAL "dot_underscore_collision") ecbuild_get_test_multidata( TARGET dot_underscore_collision NAMES a.b a_b NOCHECK ) assert_generated_targets(dot_underscore_collision 2) assert_generated_target_name(dot_underscore_collision "a.b") assert_generated_target_name(dot_underscore_collision "a_b") elseif(TEST_CASE STREQUAL "equals_in_filename") ecbuild_get_test_multidata( TARGET equals_in_filename NAMES gridType=regular_ll.grib NOCHECK ) assert_generated_targets(equals_in_filename 1) assert_generated_target_name(equals_in_filename "gridType=regular_ll.grib") elseif(TEST_CASE STREQUAL "comma_in_filename") ecbuild_get_test_multidata( TARGET comma_in_filename NAMES gridType,regular_ll.grib NOCHECK ) assert_generated_targets(comma_in_filename 1) assert_generated_target_name(comma_in_filename "gridType,regular_ll.grib") elseif(TEST_CASE STREQUAL "multiple_invalid_characters") ecbuild_get_test_multidata( TARGET multiple_invalid_characters NAMES gridType=regular_ll,scanningMode=96.grib NOCHECK ) assert_generated_targets(multiple_invalid_characters 1) assert_generated_target_name(multiple_invalid_characters "gridType=regular_ll,scanningMode=96.grib") else() message(FATAL_ERROR "Unknown TEST_CASE '${TEST_CASE}'") endif() ecbuild-3.16.0/tests/bundle_options/0000775000175000017500000000000015252726137017574 5ustar alastairalastairecbuild-3.16.0/tests/bundle_options/configure.sh0000775000175000017500000001246115252726137022120 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep -e "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # (0) Options: (default) # proja, FEATURE_A is enabled (by default) # projb, FEATURE_A is disabled (by default) TC=0 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" # (1) Options: -DSOME_PACKAGE_FOUND # proja, FEATURE_A is enabled (by default) # projb, FEATURE_A is disabled (by default), event if the conditional package is found TC=1 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" # (2) Options: -DENABLE_FEATURE_A=ON # proja, FEATURE_A is explicitly enabled (by global option) # projb, FEATURE_A is explicitly enabled (by global option), but fails since the conditional package is not found TC=2 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred" # (3) Options: -DENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON # proja, FEATURE_A is explicitly enabled (by global option) # projb, FEATURE_A is explicitly enabled (by global option), and succeeds because the conditional package is found TC=3 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" # (4) Options: -DENABLE_FEATURE_A=OFF # proja, FEATURE_A is explicitly disabled (by global option) # projb, FEATURE_A is explicitly disabled (by global option) TC=4 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" # (5) Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON # proja, FEATURE_A is explicitly disabled (by global option) # projb, FEATURE_A is explicitly enabled (by project-specific option), but fails since the conditional package is not found TC=5 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred" # (6) Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON # proja, FEATURE_A is explicitly disabled (by global option) # projb, FEATURE_A is explicitly enabled (by project-specific option), possible because the conditional package is found TC=6 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" # (7) Options: -DENABLE_FEATURE_A=ON -DPROJA_ENABLE_FEATURE_A=OFF # proja, FEATURE_A is explicitly disabled (by project-specific option) # projb, FEATURE_A is explicitly enabled (by global option), but fails since the conditional package is not found TC=7 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DPROJA_ENABLE_FEATURE_A=OFF -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log " Configuring incomplete, errors occurred" # (8) Options: -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF -DSOME_PACKAGE_FOUND=ON # proja, FEATURE_A is explicitly enabled (by global option) # projb, FEATURE_A is explicitly disabled (by project-specific option), event if the conditional package is found TC=8 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/projx -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF -DSOME_PACKAGE_FOUND=ON -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*proja(ON): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "FEATURE_A, .*projb(OFF): ''.*" EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" ecbuild-3.16.0/tests/bundle_options/projx/0000775000175000017500000000000015252726137020736 5ustar alastairalastairecbuild-3.16.0/tests/bundle_options/projx/CMakeLists.txt0000664000175000017500000000032215252726137023473 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( projx LANGUAGES NONE VERSION 0.1 ) add_subdirectory( proja ) add_subdirectory( projb ) ecbuild_print_summary()ecbuild-3.16.0/tests/bundle_options/projx/projb/0000775000175000017500000000000015252726137022052 5ustar alastairalastairecbuild-3.16.0/tests/bundle_options/projx/projb/CMakeLists.txt0000664000175000017500000000026015252726137024610 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projb LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT OFF CONDITION SOME_PACKAGE_FOUND ) ecbuild-3.16.0/tests/bundle_options/projx/proja/0000775000175000017500000000000015252726137022051 5ustar alastairalastairecbuild-3.16.0/tests/bundle_options/projx/proja/CMakeLists.txt0000664000175000017500000000021615252726137024610 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( proja LANGUAGES NONE VERSION 0.1 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT ON ) ecbuild-3.16.0/tests/bundle_options/CMakeLists.txt0000664000175000017500000000040015252726137022326 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_bundle_options TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/bundle_options/clean.sh0000775000175000017500000000033115252726137021212 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/CMakeLists.txt0000664000175000017500000000266415252726137017320 0ustar alastairalastairadd_subdirectory( bundle_options ) add_subdirectory( bundle_subdir ) add_subdirectory( bundle_subproj ) # ECBUILD-460 add_subdirectory( bundle_override_features ) # ECBUILD-486 add_subdirectory( ecbuild_regex_escape ) add_subdirectory( ecbuild_remove_fortran_flags ) # ECBUILD-484 add_subdirectory( ecbuild_add_option ) add_subdirectory( ecbuild_add_option_multiproject_defaults ) add_subdirectory( ecbuild_add_flags ) add_subdirectory( ecbuild_bundle_shallow ) add_subdirectory( ecbuild_find_package ) add_subdirectory( ecbuild_find_python ) add_subdirectory( ecbuild_handle_deprecated ) add_subdirectory( find_ecbuild ) add_subdirectory( ecbuild_shared_libs ) add_subdirectory( interface_library ) add_subdirectory( project_import ) add_subdirectory( project_options ) add_subdirectory( project_options_cached ) add_subdirectory( project_options_cached_multiproject ) add_subdirectory( project_summary ) add_subdirectory( ecbuild_override_compiler_flags ) add_subdirectory( ecbuild_override_compiler_flags_bailout ) add_subdirectory( ecbuild_override_compiler_flags_pre_project ) add_subdirectory( test_properties ) add_subdirectory( ecbuild_get_test_data ) add_subdirectory( test_requires_simple ) add_subdirectory( test_requires_complex ) add_subdirectory( test_custom_build_type ) add_subdirectory( ecbuild_install_dependency_with_soversion ) add_subdirectory( ecbuild_get_test_multidata ) add_subdirectory( sg_pl ) add_subdirectory( mkl_fake_intel_cpu ) ecbuild-3.16.0/tests/project_options/0000775000175000017500000000000015252726137017771 5ustar alastairalastairecbuild-3.16.0/tests/project_options/configure.sh0000775000175000017500000000705015252726137022313 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # (1) Options: (default) mkdir -p $HERE/build_1 ecbuild $SOURCE/test_project -B $HERE/build_1 | tee $HERE/build_1.log EXPECT_ONE_OF $HERE/build_1.log "Feature FEATUREON was not enabled" EXPECT_ONE_OF $HERE/build_1.log "Feature FEATUREOFF disabled" EXPECT_ONE_OF $HERE/build_1.log "Build files have been written" # (2) Options: -DENABLE_FEATUREON=ON mkdir -p $HERE/build_2 ecbuild -DENABLE_FEATUREON=ON $SOURCE/test_project -B $HERE/build_2 | tee $HERE/build_2.log EXPECT_ONE_OF $HERE/build_2.log "Configuring incomplete, errors occurred!" # (2a) Options: -DENABLE_FEATUREON=OFF mkdir -p $HERE/build_2a ecbuild -DENABLE_FEATUREON=OFF $SOURCE/test_project -B $HERE/build_2a | tee $HERE/build_2a.log EXPECT_ONE_OF $HERE/build_2a.log "Feature FEATUREON disabled" EXPECT_ONE_OF $HERE/build_2a.log "Feature FEATUREOFF disabled" EXPECT_ONE_OF $HERE/build_2a.log "Build files have been written" # (3) Options: -DENABLE_FEATUREON=ON -DFEATUREON_CONDITION=ON mkdir -p $HERE/build_3 ecbuild -DENABLE_FEATUREON=ON -DFEATUREON_CONDITION=ON $SOURCE/test_project -B $HERE/build_3 | tee $HERE/build_3.log EXPECT_ONE_OF $HERE/build_3.log "Feature FEATUREON enabled" EXPECT_ONE_OF $HERE/build_3.log "Feature FEATUREOFF disabled" EXPECT_ONE_OF $HERE/build_3.log "Build files have been written" # (4) Options: -DPROJA_ENABLE_FEATUREON=ON mkdir -p $HERE/build_4 ecbuild -DPROJA_ENABLE_FEATUREON=ON $SOURCE/test_project -B $HERE/build_4 | tee $HERE/build_4.log EXPECT_ONE_OF $HERE/build_4.log "Configuring incomplete, errors occurred!" # (4a) Options: -DPROJA_ENABLE_FEATUREON=OFF mkdir -p $HERE/build_4a ecbuild -DPROJA_ENABLE_FEATUREON=OFF $SOURCE/test_project -B $HERE/build_4a | tee $HERE/build_4a.log EXPECT_ONE_OF $HERE/build_4a.log "Feature FEATUREON disabled" EXPECT_ONE_OF $HERE/build_4a.log "Feature FEATUREOFF disabled" EXPECT_ONE_OF $HERE/build_4a.log "Build files have been written" # (5) Options: -DPROJA_ENABLE_FEATUREON=ON -DFEATUREON_CONDITION=ON -DENABLE_FEATUREON=OFF mkdir -p $HERE/build_5 ecbuild -DPROJA_ENABLE_FEATUREON=ON -DFEATUREON_CONDITION=ON -DENABLE_FEATUREON=OFF $SOURCE/test_project -B $HERE/build_5 | tee $HERE/build_5.log EXPECT_ONE_OF $HERE/build_5.log "Feature FEATUREON enabled" EXPECT_ONE_OF $HERE/build_5.log "Feature FEATUREOFF disabled" EXPECT_ONE_OF $HERE/build_5.log "Build files have been written" # (6) Options: -DPROJA_ENABLE_FEATUREOFF=ON mkdir -p $HERE/build_6 ecbuild -DPROJA_ENABLE_FEATUREOFF=ON $SOURCE/test_project -B $HERE/build_6 | tee $HERE/build_6.log EXPECT_ONE_OF $HERE/build_6.log "Configuring incomplete, errors occurred!" # (7) Options: -DPROJA_ENABLE_FEATUREOFF=ON -DFEATUREOFF_CONDITION=ON mkdir -p $HERE/build_7 ecbuild -DPROJA_ENABLE_FEATUREOFF=ON -DFEATUREOFF_CONDITION=ON $SOURCE/test_project -B $HERE/build_7 | tee $HERE/build_7.log EXPECT_ONE_OF $HERE/build_7.log "Feature FEATUREON was not enabled" EXPECT_ONE_OF $HERE/build_7.log "Feature FEATUREOFF enabled" EXPECT_ONE_OF $HERE/build_7.log "Build files have been written" ecbuild-3.16.0/tests/project_options/CMakeLists.txt0000664000175000017500000000040115252726137022524 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_project_options TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/project_options/test_project/0000775000175000017500000000000015252726137022476 5ustar alastairalastairecbuild-3.16.0/tests/project_options/test_project/CMakeLists.txt0000664000175000017500000000052115252726137025234 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( proja LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATUREON DEFAULT ON CONDITION DEFINED FEATUREON_CONDITION ) ecbuild_add_option( FEATURE FEATUREOFF DEFAULT OFF CONDITION DEFINED FEATUREOFF_CONDITION )ecbuild-3.16.0/tests/project_options/clean.sh0000775000175000017500000000033115252726137021407 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/test_properties/0000775000175000017500000000000015252726137020003 5ustar alastairalastairecbuild-3.16.0/tests/test_properties/build-and-run.sh0000775000175000017500000000105415252726137023003 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # Build the project ecbuild $SOURCE/test_project -B $HERE/build # Run only one specific test (which should invoke the others) (cd $HERE/build; ctest -R write_world_after_hello) # Avoid using --test-dir option in ctest # Check if the output is as expected echo -n "Hello, World!" | diff - $HERE/build/output.txt ecbuild-3.16.0/tests/test_properties/CMakeLists.txt0000664000175000017500000000040515252726137022542 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_test_properties TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/test_properties/test_project/0000775000175000017500000000000015252726137022510 5ustar alastairalastairecbuild-3.16.0/tests/test_properties/test_project/CMakeLists.txt0000664000175000017500000000133715252726137025254 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_test_properties VERSION 0.1.0 LANGUAGES NONE ) ecbuild_add_test( TARGET clean_output TEST_PROPERTIES FIXTURES_SETUP clean_output COMMAND ${CMAKE_COMMAND} ARGS -E remove ${CMAKE_CURRENT_BINARY_DIR}/output.txt ) ecbuild_add_test( TARGET write_hello TEST_PROPERTIES FIXTURES_SETUP write_hello FIXTURES_REQUIRED clean_output COMMAND bash ARGS -c "echo -n 'Hello, ' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" ) ecbuild_add_test( TARGET write_world_after_hello TEST_PROPERTIES FIXTURES_REQUIRED write_hello COMMAND bash ARGS -c "echo -n 'World!' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" ) ecbuild-3.16.0/tests/test_requires_complex/0000775000175000017500000000000015252726137021175 5ustar alastairalastairecbuild-3.16.0/tests/test_requires_complex/build-and-run.sh0000775000175000017500000000143415252726137024177 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # Build the project ecbuild $SOURCE/test_project -B $HERE/build # Run only one specific test (which should invoke the dependency) (cd $HERE/build; ctest -R write_world) # Avoid using --test-dir option in ctest # Check if the output is as expected echo -n "World!" | diff - $HERE/build/world.txt # Run only one specific test (which should invoke the dependencies) (cd $HERE/build; ctest -R combine_hello_world) # Avoid using --test-dir option in ctest # Check if the output is as expected echo -n "Hello, World!" | diff - $HERE/build/helloworld.txt ecbuild-3.16.0/tests/test_requires_complex/CMakeLists.txt0000664000175000017500000000041315252726137023733 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_test_requires_complex TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/test_requires_complex/test_project/0000775000175000017500000000000015252726137023702 5ustar alastairalastairecbuild-3.16.0/tests/test_requires_complex/test_project/CMakeLists.txt0000664000175000017500000000166015252726137026445 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_test_requires_complex VERSION 0.1.0 LANGUAGES NONE ) ecbuild_add_test( TARGET clean_output COMMAND ${CMAKE_COMMAND} ARGS -E remove ${CMAKE_CURRENT_BINARY_DIR}/hello.txt ${CMAKE_CURRENT_BINARY_DIR}/world.txt ${CMAKE_CURRENT_BINARY_DIR}/helloworld.txt ) ecbuild_add_test( TARGET write_hello TEST_REQUIRES clean_output COMMAND bash ARGS -c "echo -n 'Hello, ' >> ${CMAKE_CURRENT_BINARY_DIR}/hello.txt" ) ecbuild_add_test( TARGET write_world TEST_REQUIRES clean_output COMMAND bash ARGS -c "echo -n 'World!' >> ${CMAKE_CURRENT_BINARY_DIR}/world.txt" ) ecbuild_add_test( TARGET combine_hello_world TEST_REQUIRES write_hello write_world COMMAND bash ARGS -c "cat ${CMAKE_CURRENT_BINARY_DIR}/hello.txt ${CMAKE_CURRENT_BINARY_DIR}/world.txt >> ${CMAKE_CURRENT_BINARY_DIR}/helloworld.txt" ) ecbuild-3.16.0/tests/ecbuild_add_option/0000775000175000017500000000000015252726137020357 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option/build-and-run.sh0000775000175000017500000000400615252726137023357 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE run_test() { local tname=$1 local exp_sts=$2 shift 2 local bdir=$HERE/build_$tname local logf=$HERE/$tname.log mkdir -p $bdir && cd $bdir local sts=0 echo "Running test '$tname'" ecbuild -- -Wno-deprecated $* $SOURCE/test_project >$logf 2>&1 || sts=$? if [[ $sts -ne $exp_sts ]] ; then echo "Test '$tname': expected exit code $exp_sts, got $sts" cat $logf exit 1 fi } # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ---------------------- tests ------------------------- run_test all_def 0 \ -DEXPECT_TEST_A=ON -DEXPECT_TEST_B=ON -DEXPECT_TEST_C=OFF -DEXPECT_TEST_D=ON -DEXPECT_TEST_E=OFF -DEXPECT_TEST_F=ON -DEXPECT_TEST_G=OFF \ -DEXPECT_TEST_H=ON -DEXPECT_TEST_I=ON -DEXPECT_TEST_J=OFF -DEXPECT_TEST_K=OFF run_test all_off 0 \ -DENABLE_TEST_A=OFF -DENABLE_TEST_B=OFF -DENABLE_TEST_C=OFF -DENABLE_TEST_D=OFF -DENABLE_TEST_E=OFF -DENABLE_TEST_F=OFF -DENABLE_TEST_G=OFF \ -DEXPECT_TEST_A=OFF -DEXPECT_TEST_B=OFF -DEXPECT_TEST_C=OFF -DEXPECT_TEST_D=OFF -DEXPECT_TEST_E=OFF -DEXPECT_TEST_F=OFF -DEXPECT_TEST_G=OFF \ -DENABLE_TEST_H=OFF -DENABLE_TEST_I=OFF -DENABLE_TEST_J=OFF -DENABLE_TEST_K=OFF \ -DEXPECT_TEST_H=OFF -DEXPECT_TEST_I=OFF -DEXPECT_TEST_J=OFF -DEXPECT_TEST_K=OFF run_test ok_on 0 \ -DENABLE_TEST_A=ON -DENABLE_TEST_B=ON -DENABLE_TEST_C=ON -DENABLE_TEST_D=ON -DENABLE_TEST_F=ON \ -DEXPECT_TEST_A=ON -DEXPECT_TEST_B=ON -DEXPECT_TEST_C=ON -DEXPECT_TEST_D=ON -DEXPECT_TEST_F=ON -DEXPECT_TEST_E=OFF -DEXPECT_TEST_G=OFF \ -DEXPECT_TEST_H=ON -DEXPECT_TEST_I=ON -DEXPECT_TEST_J=OFF -DEXPECT_TEST_K=OFF run_test fail_pkg_E 1 -DENABLE_TEST_E=ON run_test fail_cond_G 1 -DENABLE_TEST_G=ON run_test fail_pkg_J 1 -DENABLE_TEST_J=ON run_test fail_pkg_K 1 -DENABLE_TEST_K=ON ecbuild-3.16.0/tests/ecbuild_add_option/CMakeLists.txt0000664000175000017500000000040015252726137023111 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_add_option TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_add_option/test_project/0000775000175000017500000000000015252726137023064 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option/test_project/CMakeLists.txt0000664000175000017500000000264215252726137025630 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_add_option VERSION 0.1.0 LANGUAGES NONE ) ecbuild_add_option(FEATURE TEST_A) # should default to ON ecbuild_add_option(FEATURE TEST_B DEFAULT ON) ecbuild_add_option(FEATURE TEST_C DEFAULT OFF) ecbuild_add_option(FEATURE TEST_D REQUIRED_PACKAGES "NAME foo") ecbuild_add_option(FEATURE TEST_E REQUIRED_PACKAGES "NAME foo" "NAME bar") set(COND_F TRUE) ecbuild_add_option(FEATURE TEST_F CONDITION COND_F) set(COND_G FALSE) ecbuild_add_option(FEATURE TEST_G CONDITION COND_G) ecbuild_add_option(FEATURE TEST_H REQUIRED_PACKAGES "foo 1.2" ) # should pass as available is version 1.2.3 ecbuild_add_option(FEATURE TEST_I REQUIRED_PACKAGES "foo VERSION 1.2" ) # should pass as available is version 1.2.3 ecbuild_add_option(FEATURE TEST_J REQUIRED_PACKAGES "foo 2.1" ) # should fail as available is version 1.2.3 ecbuild_add_option(FEATURE TEST_K REQUIRED_PACKAGES "foo VERSION 2.1" ) # should fail as available is version 1.2.3 foreach(var IN ITEMS A B C D E F G H I J K) set(expected ${EXPECT_TEST_${var}}) set(actual ${HAVE_TEST_${var}}) if(expected AND NOT actual) message(SEND_ERROR "HAVE_TEST_${var} = ${actual}, expected 1") elseif(actual AND NOT expected) message(SEND_ERROR "HAVE_TEST_${var} = ${actual}, expected 0") else() message("HAVE_TEST_${var} = ${actual} as expected") endif() endforeach() ecbuild-3.16.0/tests/ecbuild_add_option/test_project/cmake/0000775000175000017500000000000015252726137024144 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option/test_project/cmake/Findbar.cmake0000664000175000017500000000002115252726137026504 0ustar alastairalastairset(bar_FOUND 0) ecbuild-3.16.0/tests/ecbuild_add_option/test_project/cmake/Findfoo.cmake0000664000175000017500000000026515252726137026535 0ustar alastairalastairset(_foo_FOUND 1) set(_foo_VERSION 1.2.3 ) include( FindPackageHandleStandardArgs ) find_package_handle_standard_args( foo REQUIRED_VARS _foo_FOUND VERSION_VAR _foo_VERSION ) ecbuild-3.16.0/tests/ecbuild_add_option/clean.sh0000775000175000017500000000034515252726137022002 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* $HERE/*.log ecbuild-3.16.0/tests/project_options_cached/0000775000175000017500000000000015252726137021260 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached/configure.sh0000775000175000017500000000717615252726137023613 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # (1) Configure with default options, and then reconfigure with user specified options mkdir -p $HERE/build_1 ecbuild $SOURCE/test_project -B $HERE/build_1 -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.a.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.a.log "Feature FEATUREA disabled" EXPECT_ONE_OF $HERE/build_1.a.log "Feature FEATUREB enabled" EXPECT_ONE_OF $HERE/build_1.a.log "Build files have been written" # Ensure the option values are correct in CMakeCache EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREA_defined_value:INTERNAL=OFF" EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREB_defined_value:INTERNAL=ON" ecbuild $SOURCE/test_project -B $HERE/build_1 -DENABLE_FEATUREA=ON -DENABLE_FEATUREB=OFF -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.b.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.b.log "Feature FEATUREA enabled" EXPECT_ONE_OF $HERE/build_1.b.log "Feature FEATUREB disabled" EXPECT_ONE_OF $HERE/build_1.b.log "Build files have been written" # Ensure the option values are correct in CMakeCache EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREA_defined_value:INTERNAL=ON" EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREB_defined_value:INTERNAL=OFF" ecbuild $SOURCE/test_project -B $HERE/build_1 -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.c.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.c.log "Feature FEATUREA enabled" EXPECT_ONE_OF $HERE/build_1.c.log "Feature FEATUREB disabled" EXPECT_ONE_OF $HERE/build_1.c.log "Build files have been written" # Ensure the option values are correct in CMakeCache EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREA_defined_value:INTERNAL=ON" EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREB_defined_value:INTERNAL=OFF" ecbuild $SOURCE/test_project -B $HERE/build_1 -DENABLE_FEATUREA=OFF -DENABLE_FEATUREB=ON -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.d.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.d.log "Feature FEATUREA disabled" EXPECT_ONE_OF $HERE/build_1.d.log "Feature FEATUREB enabled" EXPECT_ONE_OF $HERE/build_1.d.log "Build files have been written" # Ensure the option values are correct in CMakeCache EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREA_defined_value:INTERNAL=OFF" EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREB_defined_value:INTERNAL=ON" ecbuild $SOURCE/test_project -B $HERE/build_1 -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.e.log EXPECT_ONE_OF $HERE/build_1.e.log "Feature FEATUREA disabled" EXPECT_ONE_OF $HERE/build_1.e.log "Feature FEATUREB enabled" EXPECT_ONE_OF $HERE/build_1.e.log "Build files have been written" # Ensure the option values are correct in CMakeCache EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREA_defined_value:INTERNAL=OFF" EXPECT_ONE_OF $HERE/build_1/CMakeCache.txt "project_ENABLE_FEATUREB_defined_value:INTERNAL=ON" ecbuild-3.16.0/tests/project_options_cached/CMakeLists.txt0000664000175000017500000000041015252726137024013 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_project_options_cached TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/project_options_cached/test_project/0000775000175000017500000000000015252726137023765 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached/test_project/CMakeLists.txt0000664000175000017500000000037515252726137026532 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATUREA DEFAULT OFF ) ecbuild_add_option( FEATURE FEATUREB DEFAULT ON )ecbuild-3.16.0/tests/project_options_cached/clean.sh0000775000175000017500000000033115252726137022676 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/ecbuild_bundle_shallow/0000775000175000017500000000000015252726137021241 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_bundle_shallow/setup-umbrella-bundle.sh0000664000175000017500000000241315252726137026005 0ustar alastairalastair#!/usr/bin/env bash set -e set -u set -o pipefail # ───────────────────────────────────────────── # Configuration # ───────────────────────────────────────────── BASE_DIR="${1:-$(pwd)/bundle}" UMBRELLA_DIR="${2:-$(pwd)/projects/umbrella}" echo "==> Creating bundle workspace at: $BASE_DIR" mkdir -p "$BASE_DIR" cd "$BASE_DIR" # ───────────────────────────────────────────── # Create the umbrella bundle # ───────────────────────────────────────────── UMBRELLA_GIT="file://$(dirname "${UMBRELLA_DIR}")/../bare-repos/$(basename "${UMBRELLA_DIR}").git" cat > CMakeLists.txt < VERSION <= 2.32) and GIT_CONFIG_COUNT (not forwarded # by git-submodule to its child processes) are not viable alternatives here. # # Required on git >= 2.38.1 and on distros that have backported CVE-2022-39253 # (e.g. Debian 11's git 2.30.2). # _tmp_home=$(mktemp -d) export HOME="${_tmp_home}" trap 'rm -rf "${_tmp_home}"' EXIT pushd "${HOME}" > /dev/null git config --global protocol.file.allow always git config --global user.name "Test User" git config --global user.email "test@user" popd > /dev/null # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # ---- cleanup ----------------------------------------- [[ -n "${BINARY_TEST_DIR}" ]] || { echo "BINARY_TEST_DIR is not set"; exit 1; } rm -rf "${BINARY_TEST_DIR}/workspace-shallow-only" WORKSPACE="${BINARY_TEST_DIR}/workspace-shallow-only" BUNDLE_DIR="${WORKSPACE}/bundle" # ---- setup umbrella project (with submodules) -------- cd "${BINARY_TEST_DIR}" bash "${SOURCE_TEST_DIR}/setup-umbrella-project.sh" "${WORKSPACE}/projects" BARE_DIR="${WORKSPACE}/bare-repos" UMBRELLA_GIT="file://${BARE_DIR}/umbrella.git" # ---- create bundle: SHALLOW only (no RECURSIVE) ------ mkdir -p "${BUNDLE_DIR}" cat > "${BUNDLE_DIR}/CMakeLists.txt" < "${BUNDLE_DIR}/VERSION" <= 2.32) and GIT_CONFIG_COUNT (not forwarded # by git-submodule to its child processes) are not viable alternatives here. # # Required on git >= 2.38.1 and on distros that have backported CVE-2022-39253 # (e.g. Debian 11's git 2.30.2). # _tmp_home=$(mktemp -d) export HOME="${_tmp_home}" trap 'rm -rf "${_tmp_home}"' EXIT pushd "${HOME}" > /dev/null git config --global protocol.file.allow always git config --global user.name "Test User" git config --global user.email "test@user" popd > /dev/null # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # ---- cleanup ----------------------------------------- [[ -n "${BINARY_TEST_DIR}" ]] || { echo "BINARY_TEST_DIR is not set"; exit 1; } rm -rf "${BINARY_TEST_DIR}/workspace-invalid-update" WORKSPACE="${BINARY_TEST_DIR}/workspace-invalid-update" BUNDLE_DIR="${WORKSPACE}/bundle" # ---- create bundle: SHALLOW + UPDATE (invalid combination) --- # ecbuild_critical fires before any git operation, so the URL need not exist. mkdir -p "${BUNDLE_DIR}" cat > "${BUNDLE_DIR}/CMakeLists.txt" < "${BUNDLE_DIR}/VERSION" <&1 ) cmake_status=$? set -e if [[ "${cmake_status}" -eq 0 ]]; then echo "cmake configure should have failed for SHALLOW+UPDATE but succeeded: FAIL" exit 1 fi # A `case` rather than `echo "${output}" | grep -q ...`: with `set -o pipefail` # (above) that pipeline reports failure when grep -q finds its match and exits # while echo is still writing, so echo takes SIGPIPE and the status of a # SUCCESSFUL match becomes 141. That made this test flaky on GitHub-hosted # runners. Bash matches the substring with no pipe, no subprocess and no locale. case "${output}" in *"Cannot pass both UPDATE and SHALLOW"*) echo "SHALLOW+UPDATE correctly rejected: PASS" ;; *) echo "cmake failed but expected error message not found: FAIL" echo "${output}" exit 1 ;; esac ecbuild-3.16.0/tests/ecbuild_bundle_shallow/run-test-shallow-recursive.sh0000775000175000017500000000454215252726137027042 0ustar alastairalastair#!/usr/bin/env bash set -euo pipefail ECBUILD_PATH=${CMAKE_SOURCE_DIR}/bin SOURCE_TEST_DIR=${CMAKE_CURRENT_SOURCE_DIR} BINARY_TEST_DIR=${CMAKE_CURRENT_BINARY_DIR} # # Redirect HOME to a per-job temp directory so that every git process # (including subprocesses spawned internally by git-submodule) reads a private # ~/.gitconfig. This avoids lock contention on the real ~/.gitconfig when # parallel CI jobs run, and works on all git versions. # # GIT_CONFIG_GLOBAL (requires git >= 2.32) and GIT_CONFIG_COUNT (not forwarded # by git-submodule to its child processes) are not viable alternatives here. # # Required on git >= 2.38.1 and on distros that have backported CVE-2022-39253 # (e.g. Debian 11's git 2.30.2). # _tmp_home=$(mktemp -d) export HOME="${_tmp_home}" trap 'rm -rf "${_tmp_home}"' EXIT pushd "${HOME}" > /dev/null git config --global protocol.file.allow always git config --global user.name "Test User" git config --global user.email "test@user" popd > /dev/null # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # ---- cleanup ----------------------------------------- [[ -n "${BINARY_TEST_DIR}" ]] || { echo "BINARY_TEST_DIR is not set"; exit 1; } rm -rf "${BINARY_TEST_DIR}/workspace" # ---- setup umbrella project (with submodules) -------- cd "${BINARY_TEST_DIR}" bash "${SOURCE_TEST_DIR}/setup-umbrella-project.sh" \ "${BINARY_TEST_DIR}/workspace/projects" # ---- setup umbrella bundle --------------------------- cd "${BINARY_TEST_DIR}" bash "${SOURCE_TEST_DIR}/setup-umbrella-bundle.sh" \ "${BINARY_TEST_DIR}/workspace/bundle" \ "${BINARY_TEST_DIR}/workspace/projects/umbrella" # ---- configure umbrella bundle ----------------------- cd ${BINARY_TEST_DIR}/workspace mkdir build cd build ecbuild --prefix=$(pwd)/install -- ../bundle # ---- check shallowness (umbrella + submodules) ------- PASS=1 cd "${BINARY_TEST_DIR}/workspace/bundle/umbrella" if [[ "$(git rev-parse --is-shallow-repository)" != "true" ]]; then echo "Umbrella is not shallow: FAIL" PASS=0 else echo "Umbrella is shallow: PASS" fi for sub in alpha beta gamma; do cd "${BINARY_TEST_DIR}/workspace/bundle/umbrella/${sub}" if [[ "$(git rev-parse --is-shallow-repository)" != "true" ]]; then echo "Submodule $sub is not shallow: FAIL" PASS=0 else echo "Submodule $sub is shallow: PASS" fi done exit $(( 1 - PASS )) ecbuild-3.16.0/tests/ecbuild_bundle_shallow/run-test-invalid-noremote.sh0000775000175000017500000000550515252726137026640 0ustar alastairalastair#!/usr/bin/env bash set -euo pipefail ECBUILD_PATH=${CMAKE_SOURCE_DIR}/bin BINARY_TEST_DIR=${CMAKE_CURRENT_BINARY_DIR} # # Redirect HOME to a per-job temp directory so that every git process # (including subprocesses spawned internally by git-submodule) reads a private # ~/.gitconfig. This avoids lock contention on the real ~/.gitconfig when # parallel CI jobs run, and works on all git versions. # # GIT_CONFIG_GLOBAL (requires git >= 2.32) and GIT_CONFIG_COUNT (not forwarded # by git-submodule to its child processes) are not viable alternatives here. # # Required on git >= 2.38.1 and on distros that have backported CVE-2022-39253 # (e.g. Debian 11's git 2.30.2). # _tmp_home=$(mktemp -d) export HOME="${_tmp_home}" trap 'rm -rf "${_tmp_home}"' EXIT pushd "${HOME}" > /dev/null git config --global protocol.file.allow always git config --global user.name "Test User" git config --global user.email "test@user" popd > /dev/null # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # ---- cleanup ----------------------------------------- [[ -n "${BINARY_TEST_DIR}" ]] || { echo "BINARY_TEST_DIR is not set"; exit 1; } rm -rf "${BINARY_TEST_DIR}/workspace-invalid-noremote" WORKSPACE="${BINARY_TEST_DIR}/workspace-invalid-noremote" BUNDLE_DIR="${WORKSPACE}/bundle" # ---- create bundle: SHALLOW + NOREMOTE (invalid combination) - # ecbuild_critical fires before any git operation, so the URL need not exist. mkdir -p "${BUNDLE_DIR}" cat > "${BUNDLE_DIR}/CMakeLists.txt" < "${BUNDLE_DIR}/VERSION" <&1 ) cmake_status=$? set -e if [[ "${cmake_status}" -eq 0 ]]; then echo "cmake configure should have failed for SHALLOW+NOREMOTE but succeeded: FAIL" exit 1 fi # A `case` rather than `echo "${output}" | grep -q ...`: with `set -o pipefail` # (above) that pipeline reports failure when grep -q finds its match and exits # while echo is still writing, so echo takes SIGPIPE and the status of a # SUCCESSFUL match becomes 141. That made this test flaky on GitHub-hosted # runners. Bash matches the substring with no pipe, no subprocess and no locale. case "${output}" in *"Cannot pass both NOREMOTE and SHALLOW"*) echo "SHALLOW+NOREMOTE correctly rejected: PASS" ;; *) echo "cmake failed but expected error message not found: FAIL" echo "${output}" exit 1 ;; esac ecbuild-3.16.0/tests/ecbuild_bundle_shallow/setup-umbrella-project.sh0000664000175000017500000000717615252726137026215 0ustar alastairalastair#!/usr/bin/env bash set -e set -u set -o pipefail # ───────────────────────────────────────────── # Configuration # ───────────────────────────────────────────── BASE_DIR="${1:-$(pwd)/projects}" PROJECTS=(alpha beta gamma) UMBRELLA="umbrella" echo "==> Creating workspace at: $BASE_DIR" mkdir -p "$BASE_DIR" cd "$BASE_DIR" # ───────────────────────────────────────────── # Helper: make a commit # ───────────────────────────────────────────── commit() { git add -A git commit -m "$1" } # ───────────────────────────────────────────── # Create the 3 dummy projects # ───────────────────────────────────────────── for proj in "${PROJECTS[@]}"; do echo "" echo "──> Setting up project: $proj" mkdir -p "$proj" cd "$proj" git init -b main git config --local user.email "demo@example.com" git config --local user.name "Demo User" # Initial commit with README cat > README.md < "src/$proj.sh" <> README.md < config.env < Setting up umbrella project: $UMBRELLA" mkdir -p "$UMBRELLA" cd "$UMBRELLA" git init -b main git config --local user.email "demo@example.com" git config --local user.name "Demo User" # Initial README cat > README.md < CMakeLists.txt </dev/null git -c protocol.file.allow=always submodule add "file://$BARE_DIR/$proj.git" "$proj" done commit "Add submodules: alpha, beta, gamma" # A follow-up commit that records a pinned state cat >> README.md </dev/null ecbuild-3.16.0/tests/project_import/0000775000175000017500000000000015252726137017610 5ustar alastairalastairecbuild-3.16.0/tests/project_import/run-test.sh.in0000775000175000017500000000175315252726137022343 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" export ecbuild_ROOT=@PROJECT_BINARY_DIR@ # --------------------- cleanup ------------------------ rm -rf $HERE/projectA/build rm -rf $HERE/projectA/install rm -rf $HERE/projectB/build rm -rf $HERE/projectB/install rm -rf $HERE/projectC/build rm -rf $HERE/projectC/install # ------------------ build projectA -------------------- cd $HERE mkdir -p projectA cd projectA projectA_ROOT=$PWD/install mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=$projectA_ROOT @projectA_SOURCE_DIR@ make install # ------------------ build projectB -------------------- cd $HERE mkdir -p projectB cd projectB projectB_ROOT=$PWD/install mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=$projectB_ROOT @projectB_SOURCE_DIR@ make install # ------------------ build projectC -------------------- cd $HERE mkdir -p projectC cd projectC export projectA_ROOT export projectB_ROOT mkdir build cd build cmake @projectC_SOURCE_DIR@ ecbuild-3.16.0/tests/project_import/CMakeLists.txt0000664000175000017500000000061315252726137022350 0ustar alastairalastair set( _ref ${CMAKE_CURRENT_BINARY_DIR} ) set( projectA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/projectA ) set( projectB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/projectB ) set( projectC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/projectC ) configure_file( run-test.sh.in ${_ref}/run-test.sh @ONLY ) ecbuild_add_test( TARGET project_import TYPE SCRIPT COMMAND ${_ref}/run-test.sh ) ecbuild-3.16.0/tests/project_import/projectC/0000775000175000017500000000000015252726137021361 5ustar alastairalastairecbuild-3.16.0/tests/project_import/projectC/CMakeLists.txt0000664000175000017500000000117615252726137024126 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectC VERSION 0.1 LANGUAGES NONE) find_package(projectA REQUIRED) find_package(projectB REQUIRED) set(EXP_projectA_FOO foo) set(EXP_projectA_BAR bar) set(EXP_projectB_FOO spam) set(EXP_projectB_BAR eggs) foreach(var projectA_FOO projectA_BAR projectB_FOO projectB_BAR) if(NOT DEFINED ${var}) message(FATAL_ERROR "${var} is not defined") elseif(NOT ${var} STREQUAL EXP_${var}) message(FATAL_ERROR "${var}: expected ${EXP_${var}}, got ${${var}}") else() message( "${var} = ${${var}} as expected") endif() endforeach() ecbuild-3.16.0/tests/project_import/projectA/0000775000175000017500000000000015252726137021357 5ustar alastairalastairecbuild-3.16.0/tests/project_import/projectA/CMakeLists.txt0000664000175000017500000000041715252726137024121 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectA VERSION 0.0 LANGUAGES C) set(projectA_FOO foo) set(projectA_BAR bar) ecbuild_add_library(TARGET libA SOURCES libA.c) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/tests/project_import/projectA/libA.c0000664000175000017500000000004015252726137022364 0ustar alastairalastairint helloA(void) { return 1; } ecbuild-3.16.0/tests/project_import/projectA/projecta-import.cmake.in0000664000175000017500000000025015252726137026102 0ustar alastairalastairset(projectA_FOO @projectA_FOO@) if(TARGET libA) message(FATAL_ERROR "libA should not be defined yet") else() message("libA not defined yet, as expected") endif() ecbuild-3.16.0/tests/project_import/projectA/projecta-post-import.cmake.in0000664000175000017500000000022515252726137027067 0ustar alastairalastairset(projectA_BAR @projectA_BAR@) if(NOT TARGET libA) message(FATAL_ERROR "libA not defined") else() message("libA defined as expected") endif() ecbuild-3.16.0/tests/project_import/projectB/0000775000175000017500000000000015252726137021360 5ustar alastairalastairecbuild-3.16.0/tests/project_import/projectB/CMakeLists.txt0000664000175000017500000000034215252726137024117 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.4 REQUIRED) project(projectB VERSION 0.0 LANGUAGES C) ecbuild_add_library(TARGET libB SOURCES libB.c) ecbuild_install_project(NAME ${PROJECT_NAME}) ecbuild-3.16.0/tests/project_import/projectB/projectb-import.cmake0000664000175000017500000000023615252726137025503 0ustar alastairalastairset(projectB_FOO spam) if(TARGET libB) message(FATAL_ERROR "libB should not be defined yet") else() message("libB not defined yet, as expected") endif() ecbuild-3.16.0/tests/project_import/projectB/projectb-post-import.cmake0000664000175000017500000000021315252726137026461 0ustar alastairalastairset(projectB_BAR eggs) if(NOT TARGET libB) message(FATAL_ERROR "libB not defined") else() message("libB defined as expected") endif() ecbuild-3.16.0/tests/project_import/projectB/libB.c0000664000175000017500000000004015252726137022366 0ustar alastairalastairint helloB(void) { return 2; } ecbuild-3.16.0/tests/mkl_fake_intel_cpu/0000775000175000017500000000000015252726137020363 5ustar alastairalastairecbuild-3.16.0/tests/mkl_fake_intel_cpu/build-and-run.sh0000775000175000017500000000054315252726137023365 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} export PATH=$SOURCE/../../bin:$PATH rm -rf $HERE/build ecbuild $SOURCE/test_project -B $HERE/build cmake --build $HERE/build --parallel ${CPU_COUNT:-2} (cd $HERE/build; ctest --output-on-failure)ecbuild-3.16.0/tests/mkl_fake_intel_cpu/CMakeLists.txt0000664000175000017500000000040215252726137023117 0ustar alastairalastairecbuild_add_test( TARGET test_mkl_fake_intel_cpu TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/mkl_fake_intel_cpu/test_project/0000775000175000017500000000000015252726137023070 5ustar alastairalastairecbuild-3.16.0/tests/mkl_fake_intel_cpu/test_project/CMakeLists.txt0000664000175000017500000000241615252726137025633 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_mkl_fake_intel_cpu VERSION 0.1.0 LANGUAGES C ) # Enable the feature under test before FindMKL.cmake is loaded. set( MKL_FAKE_INTEL_CPU ON ) find_package( MKL QUIET ) if( MKL_FOUND ) message( STATUS "test_mkl_fake_intel_cpu: testing against real MKL (${MKL_LIB_CORE})" ) # FindMKL has created the override object library and prepended its objects # to MKL_LIBRARIES. libm is explicit because this is a pure C link. ecbuild_add_test( TARGET test_mkl_fake_intel_cpu SOURCES test_mkl_fake_intel_cpu.c INCLUDES ${MKL_INCLUDE_DIRS} DEFINITIONS HAVE_MKL LIBS ${MKL_LIBRARIES} m ) else() message( STATUS "test_mkl_fake_intel_cpu: MKL not found, falling back to fake mkl_core" ) add_library( fakemkl_core STATIC fake_mkl_core.c ) add_library( mkl_fake_intel_cpu OBJECT mkl_fake_intel_cpu.c ) set_target_properties( mkl_fake_intel_cpu PROPERTIES POSITION_INDEPENDENT_CODE ON ) ecbuild_add_test( TARGET test_mkl_fake_intel_cpu SOURCES test_mkl_fake_intel_cpu.c OBJECTS mkl_fake_intel_cpu LIBS fakemkl_core ) endif()ecbuild-3.16.0/tests/mkl_fake_intel_cpu/test_project/test_mkl_fake_intel_cpu.c0000664000175000017500000000261515252726137030112 0ustar alastairalastair#include #include #ifdef HAVE_MKL #include #endif extern int mkl_serv_intel_cpu_true(void); int main(void) { int result; #ifdef HAVE_MKL /* When linked against the real MKL, call a real MKL service routine so * the test genuinely exercises the MKL libraries, not just the override * object. */ { MKLVersion version; MKL_Get_Version( &version ); printf( "Using Intel MKL %d.%d update %d\n", version.MajorVersion, version.MinorVersion, version.UpdateVersion ); } const int N = 4; double A[N * N]; double B[N * N]; double C[N * N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { A[i * N + j] = i + 1; B[i * N + j] = (i == j) ? 2.0 : 0.0; C[i * N + j] = 0.0; } } cblas_dgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans, N, N, N, 1.0, A, N, B, N, 0.0, C, N); #endif result = mkl_serv_intel_cpu_true(); if( result != 1 ) { fprintf( stderr, "mkl_serv_intel_cpu_true() returned %d, expected 1 " "(override object did not take precedence over mkl_core)\n", result ); return EXIT_FAILURE; } return EXIT_SUCCESS; }ecbuild-3.16.0/tests/mkl_fake_intel_cpu/test_project/fake_mkl_core.c0000664000175000017500000000024015252726137026011 0ustar alastairalastair/* Stand-in for mkl_core: defines this symbol returning 0 (false), as the * real MKL does on non-Intel CPUs. */ int mkl_serv_intel_cpu_true(void) { return 0; }ecbuild-3.16.0/tests/mkl_fake_intel_cpu/test_project/mkl_fake_intel_cpu.c0000664000175000017500000000027115252726137027047 0ustar alastairalastair/* Stand-in for the override object that FindMKL.cmake generates when * MKL_FAKE_INTEL_CPU is ON: forces MKL onto its Intel codepath. */ int mkl_serv_intel_cpu_true(void) { return 1; }ecbuild-3.16.0/tests/ecbuild_remove_fortran_flags/0000775000175000017500000000000015252726137022443 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_remove_fortran_flags/CMakeLists.txt0000664000175000017500000000040115252726137025176 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_remove_fortran_flags TYPE SCRIPT COMMAND ${CMAKE_COMMAND} ARGS -DCMAKE_MODULE_PATH=${ECBUILD_MACROS_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/test_ecbuild_remove_fortran_flags.cmake ) ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootecbuild-3.16.0/tests/ecbuild_remove_fortran_flags/test_ecbuild_remove_fortran_flags_project_undefined.cmakeecbuild-3.16.0/tests/ecbuild_remove_fortran_flags/test_ecbuild_remove_fortran_flags_project_undefine0000664000175000017500000000110015252726137034713 0ustar alastairalastairset(CMAKE_Fortran_COMPILER_LOADED TRUE) set(CMAKE_BUILD_TYPE Testing) set(PNAME TEST) set(TEST_Fortran_FLAGS_TESTING "unused -g") include(ecbuild_log) include(ecbuild_remove_fortran_flags) ecbuild_remove_fortran_flags(-g PROJECT) if(DEFINED TEST_Fortran_FLAGS) message(FATAL_ERROR "TEST_Fortran_FLAGS should remain undefined when removing project flags from an undefined base variable") endif() if(NOT TEST_Fortran_FLAGS_TESTING STREQUAL "unused ") message(FATAL_ERROR "TEST_Fortran_FLAGS_TESTING should still be updated when TEST_Fortran_FLAGS is undefined") endif() ecbuild-3.16.0/tests/ecbuild_remove_fortran_flags/test_ecbuild_remove_fortran_flags.cmake0000664000175000017500000000607515252726137032407 0ustar alastairalastair set(CMAKE_Fortran_COMPILER_LOADED TRUE) set(CMAKE_BUILD_TYPE Testing) set(CMAKE_Fortran_FLAGS_TESTING "unused") include(ecbuild_log) include(ecbuild_remove_fortran_flags) function(test_remove_flags args input expected) set(CMAKE_Fortran_FLAGS "${input}") ecbuild_remove_fortran_flags(${args}) if(NOT CMAKE_Fortran_FLAGS STREQUAL "${expected}") message(FATAL_ERROR "ecbuild_remove_fortran_flags(\"${args}\"): " "input \"${input}\", " "output \"${CMAKE_Fortran_FLAGS}\", " "expected \"${expected}\"") endif() endfunction() function(test_remove_project_flags args input input_build expected expected_build) set(CMAKE_BUILD_TYPE Testing) set(PNAME TEST) set(TEST_Fortran_FLAGS "${input}") set(TEST_Fortran_FLAGS_TESTING "${input_build}") ecbuild_remove_fortran_flags(${args} PROJECT) if(NOT TEST_Fortran_FLAGS STREQUAL "${expected}") message(FATAL_ERROR "ecbuild_remove_fortran_flags(\"${args} PROJECT\"): " "input \"${input}\", " "output \"${TEST_Fortran_FLAGS}\", " "expected \"${expected}\"") endif() if(NOT TEST_Fortran_FLAGS_TESTING STREQUAL "${expected_build}") message(FATAL_ERROR "ecbuild_remove_fortran_flags(\"${args} PROJECT\") build flags: " "input \"${input_build}\", " "output \"${TEST_Fortran_FLAGS_TESTING}\", " "expected \"${expected_build}\"") endif() endfunction() test_remove_flags("-g" "-g" "") test_remove_flags("-g" " -g" " ") test_remove_flags("-g" "-g " "") test_remove_flags("-g" "-g -foo" "-foo") test_remove_flags("-g" "-bar -g -baz" "-bar -baz") test_remove_flags("-g" "-ggg -g -gcc -g" "-ggg -gcc ") test_remove_flags("-g" "-gcc" "-gcc") test_remove_flags("-g" "--g -g-" "--g -g-") test_remove_flags("-g" "---g" "---g") test_remove_flags("-g" " -g" " ") test_remove_flags("-g" "-g " "") test_remove_flags("-g" " -g " " ") test_remove_flags("-g" "-g-g" "-g-g") test_remove_flags("-foo;-bar" "-foobar" "-foobar") test_remove_flags("-foo;-bar" "-barfoo" "-barfoo") test_remove_flags("-foo;-bar" "-foo -bar" "") test_remove_flags("-foo;-bar" "-foo -g -bar" "-g ") test_remove_flags("-foo;-bar" "-g -bar -foo" "-g ") set(CMAKE_BUILD_TYPE Unused) test_remove_flags("-foo" "" "") test_remove_flags("-foo;BUILD;Unused" "" "") test_remove_project_flags("-g" "-g -foo" "unused -g" "-foo" "unused ") test_remove_project_flags("-g;BUILD;TESTING" "-g -foo" "unused -g" "-g -foo" "unused ") execute_process( COMMAND ${CMAKE_COMMAND} -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} -P ${CMAKE_CURRENT_LIST_DIR}/test_ecbuild_remove_fortran_flags_project_undefined.cmake RESULT_VARIABLE _project_undefined_result OUTPUT_VARIABLE _project_undefined_stdout ERROR_VARIABLE _project_undefined_stderr ) if(NOT _project_undefined_result EQUAL 0) message(FATAL_ERROR "ecbuild_remove_fortran_flags(PROJECT ...) should succeed when TEST_Fortran_FLAGS is not defined:\n" "${_project_undefined_stdout}${_project_undefined_stderr}") endif() ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/0000775000175000017500000000000015252726137023124 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_override_compiler_flags/run-test.sh.in0000775000175000017500000000061515252726137025653 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" cd $HERE rm -rf build # cleanup mkdir build cd build cmake -DCMAKE_MODULE_PATH=@ECBUILD_MACROS_DIR@ -DECBUILD_LOG_LEVEL=DEBUG -DCMAKE_BUILD_TYPE=BIT .. cd .. rm -rf build # cleanup mkdir build cd build cmake -DCMAKE_MODULE_PATH=@ECBUILD_MACROS_DIR@ -DECBUILD_LOG_LEVEL=DEBUG -DCMAKE_BUILD_TYPE=DEBUG .. ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/CMakeLists.txt0000664000175000017500000000105415252726137025664 0ustar alastairalastairset(_dir ${CMAKE_CURRENT_BINARY_DIR}) configure_file(run-test.sh.in ${_dir}/run-test.sh @ONLY) configure_file(test_ecbuild_override_compiler_flags.cmake ${_dir}/CMakeLists.txt COPYONLY) configure_file(emptyfile.c ${_dir}/emptyfile.c COPYONLY) configure_file(emptyfile.cxx ${_dir}/emptyfile.cxx COPYONLY) configure_file(emptyfile.F90 ${_dir}/emptyfile.F90 COPYONLY) configure_file(compiler_flags.cmake ${_dir}/compiler_flags.cmake COPYONLY) ecbuild_add_test( TARGET test_ecbuild_override_compiler_flags TYPE SCRIPT COMMAND run-test.sh ) ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/test_ecbuild_override_compiler_flags.cmake0000664000175000017500000000632415252726137033546 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.6 REQUIRED ) project(OverrideCompilerFlags VERSION 1.0 LANGUAGES C CXX Fortran) set( ECBUILD_C_FLAGS "-user_common_c" ) set( ECBUILD_C_FLAGS_DEBUG "-user_debug_c" ) set( ECBUILD_C_FLAGS_BIT "-user_bit_c" ) set( ECBUILD_Fortran_FLAGS "-user_common_fortran" ) ecbuild_override_compiler_flags( COMPILE_FLAGS ${CMAKE_CURRENT_SOURCE_DIR}/compiler_flags.cmake INHERIT_ECBUILD_FLAGS ) # ecbuild_override_compiler_flags must invoke ecbuild_purge_compiler_flags and # clear CMAKE__FLAGS* for every build type, even though # OVERRIDECOMPILERFLAGS_ECBUILD_COMPILE_FLAGS is not set. Previously the purge # was a no-op on this code path. ecbuild_get_build_type_list( _purged_btypes ) list( REMOVE_ITEM _purged_btypes NONE ) foreach( _lang C CXX Fortran ) if( NOT CMAKE_${_lang}_FLAGS STREQUAL "" ) message(FATAL_ERROR "ecbuild_purge_compiler_flags did not clear CMAKE_${_lang}_FLAGS: '${CMAKE_${_lang}_FLAGS}'") endif() foreach( _btype IN LISTS _purged_btypes ) if( NOT CMAKE_${_lang}_FLAGS_${_btype} STREQUAL "" ) message(FATAL_ERROR "ecbuild_purge_compiler_flags did not clear CMAKE_${_lang}_FLAGS_${_btype}: '${CMAKE_${_lang}_FLAGS_${_btype}}'") endif() endforeach() endforeach() ecbuild_add_library( TARGET overrideflags SOURCES emptyfile.c emptyfile.cxx emptyfile.F90 ) get_property( _flags SOURCE emptyfile.c PROPERTY COMPILE_FLAGS ) if( NOT _flags MATCHES "-user_common_c" ) message(${_flags}) message(FATAL_ERROR "Missing cached common C flags for emptyfile.c") endif() if( NOT _flags MATCHES "-g -fPIC" ) message(${_flags}) message(FATAL_ERROR "Missing compile-flags file common C flags for emptyfile.c") endif() if( CMAKE_BUILD_TYPE MATCHES BIT ) if( NOT _flags MATCHES "-user_bit_c" ) message(${_flags}) message(FATAL_ERROR "Missing cached BIT C flags for emptyfile.c") endif() if( NOT _flags MATCHES "-O2" ) message(${_flags}) message(FATAL_ERROR "Missing compile-flags file BIT C flags for emptyfile.c") endif() elseif( CMAKE_BUILD_TYPE MATCHES DEBUG ) if( NOT _flags MATCHES "-user_debug_c" ) message(${_flags}) message(FATAL_ERROR "Missing cached DEBUG C flags for emptyfile.c") endif() if( NOT _flags MATCHES "-O0" ) message(${_flags}) message(FATAL_ERROR "Missing compile-flags file DEBUG C flags for emptyfile.c") endif() endif() get_property( _flags SOURCE emptyfile.cxx PROPERTY COMPILE_FLAGS ) if( CMAKE_BUILD_TYPE MATCHES BIT ) if( NOT _flags MATCHES "-g -fPIC -O2" ) message(${_flags}) message(FATAL_ERROR "Incorrect BIT flags for emptyfile.cxx") endif() elseif( CMAKE_BUILD_TYPE MATCHES DEBUG ) if( NOT _flags MATCHES "-g -fPIC -O0" ) message(${_flags}) message(FATAL_ERROR "Incorrect DEBUG flags for emptyfile.cxx") endif() endif() get_property( _flags SOURCE emptyfile.F90 PROPERTY COMPILE_FLAGS ) if( NOT _flags MATCHES "-user_common_fortran" ) message(${_flags}) message(FATAL_ERROR "Missing cached common Fortran flags for emptyfile.F90") endif() if( NOT _flags MATCHES "-g -fortran_only_flag" ) message(${_flags}) message(FATAL_ERROR "Missing compile-flags file Fortran flags for emptyfile.F90") endif() ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/emptyfile.c0000664000175000017500000000002115252726137025257 0ustar alastairalastair// An empty file ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/emptyfile.F900000664000175000017500000000002015252726137025372 0ustar alastairalastair! An empty file ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/emptyfile.cxx0000664000175000017500000000002115252726137025637 0ustar alastairalastair// An empty file ecbuild-3.16.0/tests/ecbuild_override_compiler_flags/compiler_flags.cmake0000664000175000017500000000077715252726137027127 0ustar alastairalastairset( OVERRIDECOMPILERFLAGS_C_FLAGS "${OVERRIDECOMPILERFLAGS_C_FLAGS} -g -fPIC" ) set( OVERRIDECOMPILERFLAGS_CXX_FLAGS "-g -fPIC" ) set( OVERRIDECOMPILERFLAGS_Fortran_FLAGS "${OVERRIDECOMPILERFLAGS_Fortran_FLAGS} -g -fortran_only_flag" ) set( OVERRIDECOMPILERFLAGS_C_FLAGS_DEBUG "${OVERRIDECOMPILERFLAGS_C_FLAGS_DEBUG} -O0" ) set( OVERRIDECOMPILERFLAGS_CXX_FLAGS_DEBUG "-O0" ) set( OVERRIDECOMPILERFLAGS_C_FLAGS_BIT "${OVERRIDECOMPILERFLAGS_C_FLAGS_BIT} -O2" ) set( OVERRIDECOMPILERFLAGS_CXX_FLAGS_BIT "-O2" ) ecbuild-3.16.0/tests/bundle_subproj/0000775000175000017500000000000015252726137017565 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subproj/run-test.sh.in0000775000175000017500000000043115252726137022310 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" # --------------------- cleanup ------------------------ rm -rf $HERE/build # ---------------- build the bundle -------------------- cd $HERE mkdir build cd build cmake @mybundle_SOURCE_DIR@ ecbuild-3.16.0/tests/bundle_subproj/CMakeLists.txt0000664000175000017500000000041315252726137022323 0ustar alastairalastair set( _ref ${CMAKE_CURRENT_BINARY_DIR} ) set( mybundle_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mybundle ) configure_file( run-test.sh.in ${_ref}/run-test.sh @ONLY ) ecbuild_add_test( TARGET bundle-subproj TYPE SCRIPT COMMAND ${_ref}/run-test.sh ) ecbuild-3.16.0/tests/bundle_subproj/mybundle/0000775000175000017500000000000015252726137021404 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subproj/mybundle/CMakeLists.txt0000664000175000017500000000076315252726137024152 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) project( mybundle VERSION 0.1.0.0 LANGUAGES NONE ) add_subdirectory( ecbuild ) add_subdirectory( mylib ) find_package( mylib REQUIRED ) if( NOT mylib_found_using_find_package ) # This variable is defined within the export files that are only called during find_package() message( FATAL_ERROR "The variable mylib_found_using_find_package is not set" ) endif() message( "mylib has been found successfully within a standard CMake project" ) ecbuild-3.16.0/tests/bundle_subproj/mybundle/ecbuild0000777000175000017500000000000015252726137023574 2../../../ustar alastairalastairecbuild-3.16.0/tests/bundle_subproj/mybundle/mylib/0000775000175000017500000000000015252726137022520 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subproj/mybundle/mylib/mylib-import.cmake.in0000664000175000017500000000005015252726137026546 0ustar alastairalastairset( mylib_found_using_find_package 1 ) ecbuild-3.16.0/tests/bundle_subproj/mybundle/mylib/CMakeLists.txt0000664000175000017500000000027015252726137025257 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.0 REQUIRED ) project( mylib VERSION 0.1.0 LANGUAGES NONE ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/find_ecbuild/0000775000175000017500000000000015252726137017157 5ustar alastairalastairecbuild-3.16.0/tests/find_ecbuild/run-test.sh.in0000775000175000017500000000026215252726137021704 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" cd $HERE rm -rf build # cleanup mkdir build cd build @_EXPORTS@ cmake @_CMDLINE_OPTS@ ..ecbuild-3.16.0/tests/find_ecbuild/test-CMakeLists.txt0000664000175000017500000000050515252726137022674 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.0 REQUIRED) project(dummy VERSION 0.1 LANGUAGES NONE) if(NOT DEFINED ECBUILD_MACROS_DIR) ecbuild_critical("ecbuild has not been loaded properly") endif() if(NOT ecbuild_DIR) ecbuild_critical("ecbuild_DIR has not been defined properly") endif() ecbuild-3.16.0/tests/find_ecbuild/CMakeLists.txt0000664000175000017500000000203315252726137021715 0ustar alastairalastair # Configs to test: # - CMAKE_MODULE_PATH # - ecbuild_DIR from environment # - ecbuild_DIR from command-line definition set(_configs module direnv direnv-full dircmd) foreach(_config ${_configs}) set(_ref ${CMAKE_CURRENT_BINARY_DIR}/${_config}) if(_config STREQUAL "module") unset(_EXPORTS) set(_CMDLINE_OPTS "-DCMAKE_MODULE_PATH=${PROJECT_SOURCE_DIR}/cmake") elseif(_config STREQUAL "direnv") set(_EXPORTS "export ecbuild_DIR=${PROJECT_SOURCE_DIR}") unset(_CMDLINE_OPTS) elseif(_config STREQUAL "direnv-full") set(_EXPORTS "export ecbuild_DIR=${PROJECT_SOURCE_DIR}/lib/cmake/ecbuild") unset(_CMDLINE_OPTS) elseif(_config STREQUAL "dircmd") unset(_EXPORTS) set(_CMDLINE_OPTS "-Decbuild_DIR=${PROJECT_SOURCE_DIR}/lib/cmake/ecbuild") endif() configure_file(run-test.sh.in ${_ref}/run-test.sh @ONLY) configure_file(test-CMakeLists.txt ${_ref}/CMakeLists.txt COPYONLY) ecbuild_add_test( TARGET find-ecbuild-${_config} TYPE SCRIPT COMMAND ${_ref}/run-test.sh ) endforeach() ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/0000775000175000017500000000000015252726137024643 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/run-test.sh.in0000775000175000017500000000055215252726137027372 0ustar alastairalastair#!/usr/bin/env bash set -euo pipefail HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" cd "$HERE" rm -rf build mkdir build cd build cmake -DCMAKE_MODULE_PATH=@ECBUILD_MACROS_DIR@ -DECBUILD_LOG_LEVEL=DEBUG -DCMAKE_BUILD_TYPE=BIT .. 2>&1 | tee configure.log grep -F "Skipping" configure.log grep -F "compiler flags are already defined" configure.log ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/CMakeLists.txt0000664000175000017500000000070615252726137027406 0ustar alastairalastairset(_dir ${CMAKE_CURRENT_BINARY_DIR}) configure_file(run-test.sh.in ${_dir}/run-test.sh @ONLY) configure_file(test_ecbuild_override_compiler_flags_bailout.cmake ${_dir}/CMakeLists.txt COPYONLY) configure_file(compiler_flags.cmake ${_dir}/compiler_flags.cmake COPYONLY) configure_file(emptyfile.F90 ${_dir}/emptyfile.F90 COPYONLY) ecbuild_add_test( TARGET test_ecbuild_override_compiler_flags_bailout TYPE SCRIPT COMMAND run-test.sh ) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/test_ecbuild_override_compiler_flags_bailout.cmakeecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/test_ecbuild_override_compiler_flags_ba0000664000175000017500000000311115252726137034637 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.6 REQUIRED ) project(OverrideCompilerFlagsBailout VERSION 1.0 LANGUAGES Fortran) set( OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS "-developer_owned" ) set( ECBUILD_Fortran_FLAGS "-ecbuild_owned" ) set( ECBUILD_Fortran_FLAGS_BIT "-ecbuild_bit" ) ecbuild_override_compiler_flags( COMPILE_FLAGS ${CMAKE_CURRENT_SOURCE_DIR}/compiler_flags.cmake INHERIT_ECBUILD_FLAGS ) if( NOT OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS STREQUAL "-developer_owned" ) message(FATAL_ERROR "Project Fortran flags should not be overwritten when bailout is triggered") endif() if( DEFINED OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS_BIT ) message(FATAL_ERROR "Build-type project Fortran flags should not be inherited when bailout is triggered") endif() ecbuild_add_library( TARGET bailoutflags SOURCES emptyfile.F90 ) get_property( _flags SOURCE emptyfile.F90 PROPERTY COMPILE_FLAGS ) if( NOT _flags MATCHES "-developer_owned" ) message(${_flags}) message(FATAL_ERROR "Missing developer-owned Fortran flags for emptyfile.F90") endif() if( _flags MATCHES "-ecbuild_owned" ) message(${_flags}) message(FATAL_ERROR "ECBUILD common Fortran flags should not be inherited when bailout is triggered") endif() if( _flags MATCHES "-ecbuild_bit" ) message(${_flags}) message(FATAL_ERROR "ECBUILD build-type Fortran flags should not be inherited when bailout is triggered") endif() if( _flags MATCHES "-included_flag" ) message(${_flags}) message(FATAL_ERROR "Compile flags include should be skipped when bailout is triggered") endif() ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/emptyfile.F900000664000175000017500000000002015252726137027111 0ustar alastairalastair! An empty file ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_bailout/compiler_flags.cmake0000664000175000017500000000035615252726137030637 0ustar alastairalastairset( OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS "${OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS} -included_flag" ) set( OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS_BIT "${OVERRIDECOMPILERFLAGSBAILOUT_Fortran_FLAGS_BIT} -included_bit_flag" ) ecbuild-3.16.0/tests/test_custom_build_type/0000775000175000017500000000000015252726137021341 5ustar alastairalastairecbuild-3.16.0/tests/test_custom_build_type/toolchain.cmake0000664000175000017500000000077115252726137024330 0ustar alastairalastair set( OpenMP_C_FLAGS "-openmp" ) set( OpenMP_CXX_FLAGS "-openmp" ) set( OpenMP_Fortran_FLAGS "-openmp" ) set( ECBUILD_Fortran_FLAGS "-Wno-common-f-flag") set( ECBUILD_C_FLAGS "-Wno-common-c-flag" ) set( ECBUILD_CXX_FLAGS "-Wno-common-cxx-flag" ) set( ECBUILD_Fortran_FLAGS_CUSTOM "-Wno-custom-f-flag" ) set( ECBUILD_C_FLAGS_CUSTOM "-Wno-custom-c-flag" ) set( ECBUILD_CXX_FLAGS_CUSTOM "-Wno-custom-cxx-flag" ) ecbuild-3.16.0/tests/test_custom_build_type/build-and-run.sh0000775000175000017500000000433715252726137024350 0ustar alastairalastair#!/usr/bin/env bash set -e set -x HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE function assert_flag() { local file=$1 local variable=$2 local flag=$3 local found=$(grep "${variable} = " ${file} | grep "\\${flag}" | wc -l) if [ $found -ne 1 ]; then echo "File ${file} does not contain exacly one of '$3'" exit 1 fi } # 1) Build the project -- using toolchain mkdir -p $HERE/build-1 cd $HERE/build-1 cmake $SOURCE/test_project \ -DCMAKE_BUILD_TYPE=CUSTOM \ -DCMAKE_TOOLCHAIN_FILE=$SOURCE/toolchain.cmake # Check that the flags are correctly set for Fortran, C and C++ assert_flag CMakeFiles/proj_f.dir/flags.make "Fortran_FLAGS" "-Wno-common-f-flag" assert_flag CMakeFiles/proj_f.dir/flags.make "Fortran_FLAGS" "-Wno-custom-f-flag" assert_flag CMakeFiles/proj_c.dir/flags.make "C_FLAGS" "-Wno-common-c-flag" assert_flag CMakeFiles/proj_c.dir/flags.make "C_FLAGS" "-Wno-custom-c-flag" assert_flag CMakeFiles/proj_cxx.dir/flags.make "CXX_FLAGS" "-Wno-common-cxx-flag" assert_flag CMakeFiles/proj_cxx.dir/flags.make "CXX_FLAGS" "-Wno-custom-cxx-flag" # 2) Build the project -- using explicit ECBUILD_*_FLAGS_ variables mkdir -p $HERE/build-2 cd $HERE/build-2 cmake $SOURCE/test_project \ -DCMAKE_BUILD_TYPE=CUSTOM \ -DECBUILD_Fortran_FLAGS="-Wno-common-f-flag" \ -DECBUILD_C_FLAGS="-Wno-common-c-flag" \ -DECBUILD_CXX_FLAGS="-Wno-common-cxx-flag" \ -DECBUILD_Fortran_FLAGS_CUSTOM="-Wno-custom-f-flag" \ -DECBUILD_C_FLAGS_CUSTOM="-Wno-custom-c-flag" \ -DECBUILD_CXX_FLAGS_CUSTOM="-Wno-custom-cxx-flag" # Check that the flags are correctly set for Fortran, C and C++ assert_flag CMakeFiles/proj_f.dir/flags.make "Fortran_FLAGS" "-Wno-common-f-flag" assert_flag CMakeFiles/proj_f.dir/flags.make "Fortran_FLAGS" "-Wno-custom-f-flag" assert_flag CMakeFiles/proj_c.dir/flags.make "C_FLAGS" "-Wno-common-c-flag" assert_flag CMakeFiles/proj_c.dir/flags.make "C_FLAGS" "-Wno-custom-c-flag" assert_flag CMakeFiles/proj_cxx.dir/flags.make "CXX_FLAGS" "-Wno-common-cxx-flag" assert_flag CMakeFiles/proj_cxx.dir/flags.make "CXX_FLAGS" "-Wno-custom-cxx-flag" ecbuild-3.16.0/tests/test_custom_build_type/CMakeLists.txt0000664000175000017500000000041415252726137024100 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_test_custom_build_type TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/test_custom_build_type/test_project/0000775000175000017500000000000015252726137024046 5ustar alastairalastairecbuild-3.16.0/tests/test_custom_build_type/test_project/CMakeLists.txt0000664000175000017500000000055615252726137026614 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_test_custom_build_type VERSION 0.1.0 LANGUAGES Fortran C CXX ) ecbuild_enable_fortran (REQUIRED) ecbuild_add_executable (TARGET proj_f SOURCES proj.F90) ecbuild_add_executable (TARGET proj_c SOURCES proj.c) ecbuild_add_executable (TARGET proj_cxx SOURCES proj.cpp) ecbuild-3.16.0/tests/test_custom_build_type/test_project/proj.cpp0000664000175000017500000000003415252726137025521 0ustar alastairalastair int main() { return 0; } ecbuild-3.16.0/tests/test_custom_build_type/test_project/proj.F900000664000175000017500000000002115252726137025271 0ustar alastairalastairPROGRAM MAIN END ecbuild-3.16.0/tests/test_custom_build_type/test_project/proj.c0000664000175000017500000000003415252726137025161 0ustar alastairalastair int main() { return 0; } ecbuild-3.16.0/tests/ecbuild_regex_escape/0000775000175000017500000000000015252726137020671 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_regex_escape/CMakeLists.txt0000664000175000017500000000036115252726137023431 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_regex_escape TYPE SCRIPT COMMAND ${CMAKE_COMMAND} ARGS -DCMAKE_MODULE_PATH=${ECBUILD_MACROS_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/test_ecbuild_regex_escape.cmake ) ecbuild-3.16.0/tests/ecbuild_regex_escape/test_ecbuild_regex_escape.cmake0000664000175000017500000000113015252726137027046 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) include( ecbuild_regex_escape ) set(testno 1) foreach(str "bla" "1.2" "a(b)" "a[b]" "x++" "a\\0" "x*" "x?" "a|b" "$v" "^a") message("Escaping '${str}'") ecbuild_regex_escape("${str}" test${testno}) message("-> ${test${testno}}") string(REGEX REPLACE "${test${testno}}" "match" test${testno}_match "${str}") if(NOT "${test${testno}_match}" STREQUAL "match") message(FATAL_ERROR "ecbuild_regex_escape not working as expected") endif() math(EXPR testno "${testno} + 1") endforeach() ecbuild-3.16.0/tests/ecbuild_get_test_data/0000775000175000017500000000000015252726137021046 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_get_test_data/build-and-run.sh0000775000175000017500000000673415252726137024060 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH export FAKE_CURL_LOG=$HERE/curl.log fail() { echo "FAIL: $*" exit 1 } # There is one curl invocation per file, so the flags are asserted on the # recorded command line rather than on any observable download behaviour. # Only the download invocations count: the capability probe is in the log too, # and it names --retry-all-errors whatever the answer turns out to be. flag_used() { grep -- "--output" $FAKE_CURL_LOG | grep -q -- "$1" } # Same, restricted to the invocation that fetched one file. flag_used_for() { grep -- "--output ./$1 " $FAKE_CURL_LOG | grep -q -- "$2" } build_and_download() { local build=$1 shift rm -rf "$build" : > $FAKE_CURL_LOG ecbuild $SOURCE/test_project -B "$build" -DCURL_PROGRAM=$SOURCE/fake-curl "$@" # The download target fails (b.txt is refused); the point is what it does anyway. (cd "$build"; ctest -L download_data --output-on-failure > ctest.log 2>&1) || true } # --- a refused file must not abandon the rest of the set --------------------- build_and_download $HERE/build test -f $HERE/build/a.txt || fail "a.txt, downloaded before the failure, is missing" test -f $HERE/build/c.txt || fail "c.txt, queued after the failure, was never attempted" test ! -f $HERE/build/b.txt || fail "b.txt should have been refused" # --- and the failure must name the command that failed ----------------------- grep -q "Failed downloads:" $HERE/build/ctest.log || fail "no failure summary" grep -q "__get_data_get_stuff_b_txt" $HERE/build/ctest.log || fail "the failure summary does not name the failing command" # --- a curl that knows --retry-all-errors is asked to use it ----------------- flag_used "--retry-all-errors" || fail "modern curl was not given --retry-all-errors" if flag_used "--http1.1"; then fail "modern curl should negotiate its own HTTP version"; fi # --- and is left to back off on its own between retries ---------------------- # --retry-delay would replace curl's exponential backoff with a fixed wait. if flag_used "--retry-delay"; then fail "a download was given a fixed retry delay"; fi # --- one that does not is kept off HTTP/2 instead ---------------------------- # It could not retry a framing error, so it is not given the chance to hit one. FAKE_CURL_OLD=1 build_and_download $HERE/build-old flag_used "--http1.1" || fail "old curl was not pinned to HTTP/1.1" if flag_used "--retry-all-errors"; then fail "old curl was given a flag it does not have"; fi # --- the caller can still ask for a version explicitly ----------------------- build_and_download $HERE/build-http2 -DECBUILD_DOWNLOAD_HTTP_VERSION=2 flag_used "--http2 " || fail "ECBUILD_DOWNLOAD_HTTP_VERSION=2 was ignored" # --- certificates are checked unless the caller says otherwise --------------- if flag_used_for a.txt "--insecure"; then fail "a plain download skipped certificate checking"; fi flag_used_for d.txt "--insecure" || fail "INSECURE was ignored" build_and_download $HERE/build-insecure -DECBUILD_DOWNLOAD_INSECURE=ON flag_used_for a.txt "--insecure" || fail "ECBUILD_DOWNLOAD_INSECURE=ON was ignored" # --- anything else is reachable through the escape hatch --------------------- build_and_download $HERE/build-extra "-DECBUILD_DOWNLOAD_EXTRA_FLAGS=--retry-delay;5" flag_used "--retry-delay 5" || fail "ECBUILD_DOWNLOAD_EXTRA_FLAGS was ignored" echo "OK" ecbuild-3.16.0/tests/ecbuild_get_test_data/CMakeLists.txt0000664000175000017500000000040215252726137023602 0ustar alastairalastairecbuild_add_test( TARGET test_ecbuild_get_test_data TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_get_test_data/fake-curl0000775000175000017500000000145315252726137022650 0ustar alastairalastair#!/usr/bin/env bash # Stands in for curl via -DCURL_PROGRAM, so the download paths can be exercised # with no network. Records each argv, refuses b.txt with curl's HTTP/2 framing # error, and writes any other file. # # `--version` is the capability probe ecbuild runs to decide whether this curl # understands --retry-all-errors; FAKE_CURL_OLD=1 makes it answer "no". echo "$@" >> "$FAKE_CURL_LOG" case " $* " in *" --version "*) [ -n "${FAKE_CURL_OLD:-}" ] && exit 2 exit 0 ;; esac out="" url="" while [ $# -gt 0 ]; do case "$1" in --output) out="$2"; shift 2 ;; -*) shift ;; *) url="$1"; shift ;; esac done case "$url" in *b.txt) echo "curl: (16) Error in the HTTP2 framing layer" >&2; exit 16 ;; esac printf 'content of %s\n' "$( basename "$url" )" > "$out" ecbuild-3.16.0/tests/ecbuild_get_test_data/test_project/0000775000175000017500000000000015252726137023553 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_get_test_data/test_project/CMakeLists.txt0000664000175000017500000000061415252726137026314 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_ecbuild_get_test_data VERSION 0.1.0 LANGUAGES NONE ) # b.txt is the one fake-curl refuses; a.txt and c.txt must arrive regardless. ecbuild_get_test_multidata( TARGET get_stuff NOCHECK NAMES a.txt b.txt c.txt ) ecbuild_get_test_multidata( TARGET get_stuff_insecure NOCHECK INSECURE NAMES d.txt ) ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/0000775000175000017500000000000015252726137025520 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/run-test.sh.in0000775000175000017500000000033715252726137030250 0ustar alastairalastair#!/usr/bin/env bash set -euo pipefail HERE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd -P )" cd "$HERE" rm -rf build mkdir build cd build cmake -DCMAKE_MODULE_PATH=@ECBUILD_MACROS_DIR@ -DECBUILD_LOG_LEVEL=DEBUG .. ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/CMakeLists.txt0000664000175000017500000000071215252726137030260 0ustar alastairalastairset(_dir ${CMAKE_CURRENT_BINARY_DIR}) configure_file(run-test.sh.in ${_dir}/run-test.sh @ONLY) configure_file(test_ecbuild_override_compiler_flags_pre_project.cmake ${_dir}/CMakeLists.txt COPYONLY) configure_file(compiler_flags.cmake ${_dir}/compiler_flags.cmake COPYONLY) configure_file(emptyfile.c ${_dir}/emptyfile.c COPYONLY) ecbuild_add_test( TARGET test_ecbuild_override_compiler_flags_pre_project TYPE SCRIPT COMMAND run-test.sh ) ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/emptyfile.c0000664000175000017500000000002115252726137027653 0ustar alastairalastair/* empty file */ ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/test_ecbuild_override_compiler_flags_pre_project.cmakeecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/test_ecbuild_override_compiler_flag0000664000175000017500000000154515252726137034700 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.6 REQUIRED ) set( ECBUILD_COMPILE_FLAGS ${CMAKE_CURRENT_SOURCE_DIR}/compiler_flags.cmake ) set( ECBUILD_C_FLAGS "-ecbuild_owned" ) project(OverrideCompilerFlagsPreProject VERSION 1.0 LANGUAGES C) if( DEFINED _C_FLAGS ) message(${_C_FLAGS}) message(FATAL_ERROR "ECBUILD C flags should not be inherited when ECBUILD_COMPILE_FLAGS is set before project()") endif() ecbuild_add_library( TARGET preprojectflags SOURCES emptyfile.c ) get_property( _flags SOURCE emptyfile.c PROPERTY COMPILE_FLAGS ) if( NOT _flags MATCHES "-included_flag" ) message(${_flags}) message(FATAL_ERROR "Missing compile-flags file flag for emptyfile.c") endif() if( _flags MATCHES "-ecbuild_owned" ) message(${_flags}) message(FATAL_ERROR "ECBUILD C flags should not be set for emptyfile.c") endif() ecbuild-3.16.0/tests/ecbuild_override_compiler_flags_pre_project/compiler_flags.cmake0000664000175000017500000000016015252726137031505 0ustar alastairalastairset( OVERRIDECOMPILERFLAGSPREPROJECT_C_FLAGS "${OVERRIDECOMPILERFLAGSPREPROJECT_C_FLAGS} -included_flag" ) ecbuild-3.16.0/tests/ecbuild_find_package/0000775000175000017500000000000015252726137020632 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_package/build-and-run.sh0000775000175000017500000000205515252726137023634 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- build projectA --------------------- mkdir -p $HERE/projectA/build && cd $HERE/projectA/build pwd ecbuild --prefix=../install -- -Wno-deprecated $SOURCE/projectA make install export projectA_ROOT=$HERE/projectA/install # ----------------- build projectB --------------------- mkdir -p $HERE/projectB/build && cd $HERE/projectB/build ecbuild --prefix=../install -- -Wno-deprecated $SOURCE/projectB make install export projectB_ROOT=$HERE/projectB/install # ----------------- build projectC --------------------- mkdir -p $HERE/projectC/build && cd $HERE/projectC/build ecbuild --prefix=../install -- -Wno-deprecated $SOURCE/projectC make install # ----------------- Run --------------------- $HERE/projectC/install/bin/main-C ecbuild-3.16.0/tests/ecbuild_find_package/CMakeLists.txt0000664000175000017500000000040215252726137023366 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_find_package TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_find_package/projectC/0000775000175000017500000000000015252726137022403 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_package/projectC/libraryC.h0000664000175000017500000000001715252726137024321 0ustar alastairalastairint libraryC();ecbuild-3.16.0/tests/ecbuild_find_package/projectC/main.cc0000664000175000017500000000023315252726137023634 0ustar alastairalastair#include #include "libraryC.h" int main(int argc, char* argv[]) { std::cout << "libraryC = " << libraryC() << std::endl; return 0; } ecbuild-3.16.0/tests/ecbuild_find_package/projectC/CMakeLists.txt0000664000175000017500000000103115252726137025136 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectC VERSION 0.1.0 LANGUAGES CXX ) ecbuild_find_package( NAME projectB REQUIRED ) if( NOT projectB_MODULE ) ecbuild_critical( "projectB must be found via contained cmake/FindprojectB.cmake") endif() ecbuild_add_library( TARGET projectC SOURCES libraryC.cc libraryC.h INSTALL_HEADERS LISTED PRIVATE_LIBS projectB ) ecbuild_add_executable( TARGET main-C SOURCES main.cc LIBS projectC ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/ecbuild_find_package/projectC/libraryC.cc0000664000175000017500000000022615252726137024461 0ustar alastairalastair#ifndef A_EXPORT #error A_EXPORT should be exported by projectA via projectB #endif extern int libraryB(); int libraryC() { return libraryB(); } ecbuild-3.16.0/tests/ecbuild_find_package/projectC/cmake/0000775000175000017500000000000015252726137023463 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_package/projectC/cmake/FindprojectB.cmake0000664000175000017500000000010115252726137027026 0ustar alastairalastairset( projectB_MODULE TRUE ) find_package( projectB NO_MODULE ) ecbuild-3.16.0/tests/ecbuild_find_package/README.md0000664000175000017500000000126115252726137022111 0ustar alastairalastair# Transitive dependencies across projects and using ecbuild_find_package This example contains 3 projects, where projectB depends on projectA, and projectC depends on projectB. Since projectB requires linking against projectA, the `projectB/projectb-import.cmake.in` file propagates the dependency (it gets included when a package calls `find_package(projectB)`). It also demonstrates PRIVATE (build requirements) and PUBLIC (usage requirements) dependency keywords. projectC searches for projectB using a FindprojectB module, which in turn uses a find_package( projectB NO_MODULE ) This demonstrates that ecbuild_find_package now prioritises Find modules. ## Usage ./build-and-run.sh ecbuild-3.16.0/tests/ecbuild_find_package/clean.sh0000775000175000017500000000056315252726137022257 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/projectA/build rm -rf $HERE/projectA/install rm -rf $HERE/projectB/build rm -rf $HERE/projectB/install rm -rf $HERE/projectC/build rm -rf $HERE/projectC/install ecbuild-3.16.0/tests/ecbuild_find_package/projectA/0000775000175000017500000000000015252726137022401 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_package/projectA/CMakeLists.txt0000664000175000017500000000072415252726137025144 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectA VERSION 1.1.0 LANGUAGES CXX ) ecbuild_add_library( TARGET projectA_Private SOURCES libraryA_Private.cc PRIVATE_DEFINITIONS A_PRIVATE PUBLIC_DEFINITIONS A_PUBLIC ) ecbuild_add_library( TARGET projectA SOURCES libraryA.h libraryA.cc INSTALL_HEADERS LISTED PRIVATE_LIBS projectA_Private PUBLIC_DEFINITIONS A_EXPORT ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/ecbuild_find_package/projectA/libraryA.cc0000664000175000017500000000053315252726137024456 0ustar alastairalastair#include "libraryA.h" #ifdef A_PRIVATE #error A_PRIVATE should not be exported by target projectA_private #endif #ifndef A_PUBLIC #error A_PUBLIC should have been exported by target projectA_private #endif #ifndef A_EXPORT #error A_EXPORT should be defined #endif extern int libraryA_Private(); int libraryA() { return libraryA_Private(); } ecbuild-3.16.0/tests/ecbuild_find_package/projectA/libraryA_Private.cc0000664000175000017500000000023715252726137026151 0ustar alastairalastair#ifndef A_PRIVATE #error A_PRIVATE should be defined #endif #ifndef A_PUBLIC #error A_PUBLIC should be defined #endif int libraryA_Private() { return 1; }ecbuild-3.16.0/tests/ecbuild_find_package/projectA/libraryA.h0000664000175000017500000000001715252726137024315 0ustar alastairalastairint libraryA();ecbuild-3.16.0/tests/ecbuild_find_package/projectA/projecta-import.cmake.in0000664000175000017500000000015215252726137027125 0ustar alastairalastair if( NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY ) message( "Importing projectA, not QUIET!!!") endif() ecbuild-3.16.0/tests/ecbuild_find_package/projectB/0000775000175000017500000000000015252726137022402 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_package/projectB/projectb-import.cmake.in0000664000175000017500000000042515252726137027132 0ustar alastairalastairif( NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY ) message( "Importing projectB, not QUIET!!!") endif() # projectB requires projectA. # find_dependency propagates QUIET and REQUIRED keywords from current scope include( CMakeFindDependencyMacro ) find_dependency( projectA ) ecbuild-3.16.0/tests/ecbuild_find_package/projectB/CMakeLists.txt0000664000175000017500000000066415252726137025150 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectB VERSION 0.1.0 LANGUAGES CXX ) ecbuild_find_package( NAME projectA REQUIRED QUIET ) ecbuild_add_library( TARGET projectB SOURCES libraryB.cc libraryB.h INSTALL_HEADERS LISTED PUBLIC_LIBS projectA ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_debug_var( CMAKE_MODULE_PATH ) ecbuild_debug_var( CMAKE_SYSTEM_MODULE_PATH )ecbuild-3.16.0/tests/ecbuild_find_package/projectB/libraryB.h0000664000175000017500000000001715252726137024317 0ustar alastairalastairint libraryB();ecbuild-3.16.0/tests/ecbuild_find_package/projectB/libraryB.cc0000664000175000017500000000053215252726137024457 0ustar alastairalastair#ifdef A_PRIVATE #error A_PRIVATE should not be exported by target projectA_private #endif #ifdef A_PUBLIC #error A_PUBLIC should not be exported by target projectA #endif #ifndef A_EXPORT #error A_EXPORT should have been exported by target projectA #endif #include "libraryB.h" extern int libraryA(); int libraryB() { return libraryA(); } ecbuild-3.16.0/tests/interface_library/0000775000175000017500000000000015252726137020234 5ustar alastairalastairecbuild-3.16.0/tests/interface_library/build-and-run.sh0000775000175000017500000000162715252726137023242 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE run_test() { local tname=$1 local exp_sts=$2 shift 2 local bdir=$HERE/build_$tname local idir=$HERE/install_$tname local logf=$HERE/$tname.log mkdir -p $bdir && cd $bdir local sts=0 echo "Running test '$tname'" ecbuild --prefix=$idir -- -Wno-deprecated $* $SOURCE/test_project >$logf 2>&1 || sts=$? make install if [[ $sts -ne $exp_sts ]] ; then echo "Test '$tname': expected exit code $exp_sts, got $sts" cat $logf exit 1 fi } # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ---------------------- tests ------------------------- run_test test_interface_library 0 ecbuild-3.16.0/tests/interface_library/CMakeLists.txt0000664000175000017500000000040715252726137022775 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_interface_library TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/interface_library/test_project/0000775000175000017500000000000015252726137022741 5ustar alastairalastairecbuild-3.16.0/tests/interface_library/test_project/CMakeLists.txt0000664000175000017500000000077615252726137025513 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_interface_library VERSION 0.1.0 LANGUAGES C ) ecbuild_add_library( TARGET intfb_lib TYPE INTERFACE PUBLIC_INCLUDES $ $ENV{HOME} PUBLIC_LIBS some_lib PUBLIC_DEFINITIONS MYDEF=1 ) ecbuild_install_project( NAME test_interface_library ) ecbuild-3.16.0/tests/interface_library/.gitignore0000664000175000017500000000007415252726137022225 0ustar alastairalastairbuild_test_interface_library install_test_interface_library ecbuild-3.16.0/tests/interface_library/clean.sh0000775000175000017500000000034515252726137021657 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* $HERE/*.log ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/0000775000175000017500000000000015252726137025047 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/configure.sh0000775000175000017500000000253415252726137027373 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # Options: (default) mkdir -p $HERE/build_1 ecbuild $SOURCE/test_project -B $HERE/build_1 | tee $HERE/build_1.log EXPECT_ONE_OF $HERE/build_1.log "FEATURE_A, proja(ON): '', projb(OFF): '', projc(OFF): ''" # Options: -DENABLE_FEATURE_A=ON (fails because of projc depends on nonexisting package) mkdir -p $HERE/build_2 ecbuild -DENABLE_FEATURE_A=ON $SOURCE/test_project -B $HERE/build_2 | tee $HERE/build_2.log EXPECT_ONE_OF $HERE/build_2.log "Configuring incomplete, errors occurred!" # Options: -DPROJB_ENABLE_FEATURE_A=ON mkdir -p $HERE/build_3 ecbuild -DPROJB_ENABLE_FEATURE_A=ON $SOURCE/test_project -B $HERE/build_3 | tee $HERE/build_3.log EXPECT_ONE_OF $HERE/build_3.log "FEATURE_A, proja(ON): '', projb(ON): '', projc(OFF): ''"ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/CMakeLists.txt0000664000175000017500000000042215252726137027605 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_add_option_multiproject_defaults TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/0000775000175000017500000000000015252726137027554 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/CMakeLists.txt0000664000175000017500000000035515252726137032317 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( main LANGUAGES NONE VERSION 0.2 ) add_subdirectory( proja ) add_subdirectory( projb ) add_subdirectory( projc ) ecbuild_print_summary() ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/projb/0000775000175000017500000000000015252726137030670 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/projb/CMakeLists.txt0000664000175000017500000000021715252726137033430 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projb LANGUAGES NONE VERSION 0.1 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT OFF ) ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/projc/0000775000175000017500000000000015252726137030671 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/projc/CMakeLists.txt0000664000175000017500000000026715252726137033436 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projc LANGUAGES NONE VERSION 0.3 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT ON REQUIRED_PACKAGES nonexistent ) ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/proja/0000775000175000017500000000000015252726137030667 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/test_project/proja/CMakeLists.txt0000664000175000017500000000021615252726137033426 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( proja LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT ON ) ecbuild-3.16.0/tests/ecbuild_add_option_multiproject_defaults/clean.sh0000775000175000017500000000033115252726137026465 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/ecbuild_handle_deprecated/0000775000175000017500000000000015252726137021652 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_handle_deprecated/CMakeLists.txt0000664000175000017500000000037715252726137024421 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_handle_deprecated TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_handle_deprecated/README.md0000664000175000017500000000153615252726137023136 0ustar alastairalastair# Handle CMAKE_*_DEPRECATED Since CMake 4.4, and according to the CMake policy CMP0218, the non-cached variables CMAKE_WARN_DEPRECATED and CMAKE_ERROR_DEPRECATED are essentially ignored. Instead, the new policy uses cmake_diagnostic/CMD_DEPRECATED to control the behaviour of deprecated features. From CMake 4.4 onwards, if any of the CMAKE_*_DEPRECATED variables are set while CMP0218 is unset, CMake issues a policy warning. This example configures a project that uses ecbuild, and ensures that no policy warning is issued during the configuration phase. A second project ensures that project code still issue policy warning. ## Usage The test is normally run through CTest: ctest -R test_ecbuild_handle_deprecated It can also be run directly, in which case the project is configured in a temporary directory that is removed on exit: ./build.sh ecbuild-3.16.0/tests/ecbuild_handle_deprecated/build.sh0000775000175000017500000000403015252726137023305 0ustar alastairalastair#!/usr/bin/env bash set -euo pipefail SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd -P )"} # When not launched by CTest, build in a temporary directory, to avoid polluting the source tree if [[ -n "${CMAKE_CURRENT_BINARY_DIR:-}" ]]; then HERE=${CMAKE_CURRENT_BINARY_DIR} else HERE=$(mktemp -d) trap 'rm -rf "${HERE}"' EXIT fi # Add ecbuild to path export PATH="${SOURCE}/../../bin:${PATH}" # ----------------- CMake version ---------------------- CMAKE_VERSION=$(cmake --version | head -1 | awk '{print $3}') IFS=. read -r CMAKE_MAJOR_VERSION CMAKE_MINOR_VERSION _ <<< "$CMAKE_VERSION" # --------------------- cleanup ------------------------ [[ -n "${HERE}" ]] || { echo "error: build directory is not set" >&2; exit 1; } rm -rf "${HERE}/projectA/build" rm -rf "${HERE}/projectB/build" # ----------------- build projectA --------------------- mkdir -p "${HERE}/projectA/build" && cd "${HERE}/projectA/build" BUILD_LOG="${HERE}/projectA/build/ecbuild.log" ecbuild "${SOURCE}/projectA" 2>&1 | tee "${BUILD_LOG}" if grep -q 'Policy CMP0218 is not set' "${BUILD_LOG}"; then echo "error: Unexpected reference to CMP0218 found in '${BUILD_LOG}'" >&2 exit 1 fi # ----------------- build projectB --------------------- if (( CMAKE_MAJOR_VERSION > 4 || (CMAKE_MAJOR_VERSION == 4 && CMAKE_MINOR_VERSION >= 4) )); then # This test can only be run if using CMake 4.4+, which actually enforces Policy CMP0218 # # Important: This test will need to be reviewed/removed, if CMake updates its behaviour # and stops producing the deprecation message. mkdir -p "${HERE}/projectB/build" && cd "${HERE}/projectB/build" BUILD_LOG="${HERE}/projectB/build/ecbuild.log" ecbuild "${SOURCE}/projectB" 2>&1 | tee "${BUILD_LOG}" if ! grep -q 'Policy CMP0218 is not set' "${BUILD_LOG}"; then echo "error: Could not find reference to CMP0218 in '${BUILD_LOG}'" >&2 exit 1 fi else echo "Note: skipping projectB (requires CMake 4.4+, found ${CMAKE_VERSION})" fi ecbuild-3.16.0/tests/ecbuild_handle_deprecated/projectA/0000775000175000017500000000000015252726137023421 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_handle_deprecated/projectA/CMakeLists.txt0000664000175000017500000000042015252726137026155 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectA VERSION 0.0.1 LANGUAGES CXX ) # This project performs no build actions. # It exists only to verify that the project is configured without issuing deprecation warnings. ecbuild-3.16.0/tests/ecbuild_handle_deprecated/projectB/0000775000175000017500000000000015252726137023422 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_handle_deprecated/projectB/CMakeLists.txt0000664000175000017500000000100215252726137026153 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectB VERSION 0.0.1 LANGUAGES CXX ) # This project performs no build actions. # Since CMake 4.4+, per CMP0218, setting either of the CMAKE_{WARN,ERROR}_DEPRECATED # non-cached variables produces a deprecation message. # # Although the deprecation messages in `ecbuild` itself are suppressed, any use # of these variables in project CMake code will trigger the deprecation messages. set( CMAKE_WARN_DEPRECATED ON ) ecbuild-3.16.0/tests/project_summary/0000775000175000017500000000000015252726137017773 5ustar alastairalastairecbuild-3.16.0/tests/project_summary/configure.sh0000775000175000017500000000610115252726137022311 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # Options: (defaults) mkdir -p $HERE/build_0 ecbuild $SOURCE/test_project -B $HERE/build_0 | tee $HERE/build_0.log EXPECT_ONE_OF $HERE/build_0.log "* FEATURE_A, proja(ON): '', projb(OFF): ''" EXPECT_ONE_OF $HERE/build_0.log "* FEATURE_B, projb(OFF): ''" EXPECT_ONE_OF $HERE/build_0.log "* FEATURE_C, projc(OFF): ''" EXPECT_ONE_OF $HERE/build_0.log "Build files have been written" # Options: -DENABLE_FEATURE_A=ON mkdir -p $HERE/build_1 ecbuild -DENABLE_FEATURE_A=ON $SOURCE/test_project -B $HERE/build_1 | tee $HERE/build_1.log EXPECT_ONE_OF $HERE/build_1.log "* FEATURE_A, proja(ON): '', projb(ON): ''" # Options: -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF mkdir -p $HERE/build_2 ecbuild -DENABLE_FEATURE_A=ON -DPROJB_ENABLE_FEATURE_A=OFF $SOURCE/test_project -B $HERE/build_2 | tee $HERE/build_2.log EXPECT_ONE_OF $HERE/build_2.log "* FEATURE_A, proja(ON): '', projb(OFF): ''" # Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=OFF mkdir -p $HERE/build_3 ecbuild -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=OFF $SOURCE/test_project -B $HERE/build_3 | tee $HERE/build_3.log EXPECT_ONE_OF $HERE/build_3.log "* FEATURE_A, proja(OFF): '', projb(ON): ''" EXPECT_ONE_OF $HERE/build_3.log "* FEATURE_B, projb(OFF): ''" # Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON mkdir -p $HERE/build_4 ecbuild -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DSOME_PACKAGE_FOUND=ON $SOURCE/test_project -B $HERE/build_4 | tee $HERE/build_4.log EXPECT_ONE_OF $HERE/build_4.log "* FEATURE_A, proja(OFF): '', projb(ON): ''" EXPECT_ONE_OF $HERE/build_4.log "* FEATURE_B, projb(ON): ''" # Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DENABLE_FEATURE_B=ON -DSOME_PACKAGE_FOUND=ON mkdir -p $HERE/build_5 ecbuild -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DENABLE_FEATURE_B=ON -DSOME_PACKAGE_FOUND=ON $SOURCE/test_project -B $HERE/build_5 | tee $HERE/build_5.log EXPECT_ONE_OF $HERE/build_5.log "* FEATURE_A, proja(OFF): '', projb(ON): ''" EXPECT_ONE_OF $HERE/build_5.log "* FEATURE_B, projb(ON): ''" # Options: -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DENABLE_FEATURE_B=ON -DSOME_PACKAGE_FOUND=OFF mkdir -p $HERE/build_6 ecbuild -DENABLE_FEATURE_A=OFF -DPROJB_ENABLE_FEATURE_A=ON -DENABLE_FEATURE_B=ON -DSOME_PACKAGE_FOUND=OFF $SOURCE/test_project -B $HERE/build_6 | tee $HERE/build_6.log EXPECT_ONE_OF $HERE/build_6.log "Configuring incomplete, errors occurred!" ecbuild-3.16.0/tests/project_summary/CMakeLists.txt0000664000175000017500000000040115252726137022526 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_project_summary TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/project_summary/test_project/0000775000175000017500000000000015252726137022500 5ustar alastairalastairecbuild-3.16.0/tests/project_summary/test_project/CMakeLists.txt0000664000175000017500000000035315252726137025241 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( main LANGUAGES NONE VERSION 0.1 ) add_subdirectory( proja ) add_subdirectory( projb ) add_subdirectory( projc ) ecbuild_print_summary()ecbuild-3.16.0/tests/project_summary/test_project/projb/0000775000175000017500000000000015252726137023614 5ustar alastairalastairecbuild-3.16.0/tests/project_summary/test_project/projb/CMakeLists.txt0000664000175000017500000000033515252726137026355 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projb LANGUAGES NONE VERSION 0.1 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT OFF ) ecbuild_add_option( FEATURE FEATURE_B CONDITION SOME_PACKAGE_FOUND ) ecbuild-3.16.0/tests/project_summary/test_project/projc/0000775000175000017500000000000015252726137023615 5ustar alastairalastairecbuild-3.16.0/tests/project_summary/test_project/projc/CMakeLists.txt0000664000175000017500000000026015252726137026353 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projc LANGUAGES NONE VERSION 0.3 ) ecbuild_add_option( FEATURE FEATURE_C DEFAULT ON REQUIRED_PACKAGES NONEXISTENT ) ecbuild-3.16.0/tests/project_summary/test_project/proja/0000775000175000017500000000000015252726137023613 5ustar alastairalastairecbuild-3.16.0/tests/project_summary/test_project/proja/CMakeLists.txt0000664000175000017500000000021615252726137026352 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( proja LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATURE_A DEFAULT ON ) ecbuild-3.16.0/tests/project_summary/clean.sh0000775000175000017500000000033115252726137021411 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/project_options_cached_multiproject/0000775000175000017500000000000015252726137024061 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached_multiproject/configure.sh0000775000175000017500000000410015252726137026374 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- # (1) Configure with default options, and then reconfigure with user specified options mkdir -p $HERE/build_1 ecbuild $SOURCE/test_project -B $HERE/build_1 -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.a.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREA.*proja(ON): ''" EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREA.*projb(OFF): ''" EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREB.*proja(ON): ''" # Uses value specified at 'bundle' level EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREB.*projb(ON): ''" EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREC.*proja(OFF): ''" # Uses value specified at 'bundle' level EXPECT_ONE_OF $HERE/build_1.a.log "FEATUREC.*projb(OFF): ''" EXPECT_ONE_OF $HERE/build_1.a.log "Build files have been written" ecbuild $SOURCE/test_project -B $HERE/build_1 -DENABLE_FEATUREA=ON -DENABLE_FEATUREB=OFF -DECBUILD_LOG_LEVEL=DEBUG | tee $HERE/build_1.b.log # Ensure the option values are correct in CMake output EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREA.*proja(ON): ''" EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREA.*projb(ON): ''" EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREB.*proja(OFF): ''" # Uses value specified by 'CLI' EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREB.*projb(OFF): ''" EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREC.*proja(OFF): ''" # Uses value specified at 'bundle' level EXPECT_ONE_OF $HERE/build_1.b.log "FEATUREC.*projb(OFF): ''" EXPECT_ONE_OF $HERE/build_1.b.log "Build files have been written" ecbuild-3.16.0/tests/project_options_cached_multiproject/CMakeLists.txt0000664000175000017500000000042515252726137026622 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_project_options_cached_multiproject TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/0000775000175000017500000000000015252726137026566 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/CMakeLists.txt0000664000175000017500000000044715252726137031333 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( bundle LANGUAGES NONE VERSION 0.2 ) set ( ENABLE_FEATUREB ON CACHE BOOL "" ) set ( ENABLE_FEATUREC OFF CACHE BOOL "" ) add_subdirectory( proja ) add_subdirectory( projb ) ecbuild_print_summary()ecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/projb/0000775000175000017500000000000015252726137027702 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/projb/CMakeLists.txt0000664000175000017500000000040515252726137032441 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( projb LANGUAGES NONE VERSION 0.1 ) ecbuild_add_option( FEATURE FEATUREA DEFAULT OFF ) ecbuild_add_option( FEATURE FEATUREB DEFAULT ON ) ecbuild_add_option( FEATURE FEATUREC DEFAULT OFF )ecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/proja/0000775000175000017500000000000015252726137027701 5ustar alastairalastairecbuild-3.16.0/tests/project_options_cached_multiproject/test_project/proja/CMakeLists.txt0000664000175000017500000000040515252726137032440 0ustar alastairalastair find_package( ecbuild 3.4 REQUIRED ) project( proja LANGUAGES NONE VERSION 0.2 ) ecbuild_add_option( FEATURE FEATUREA DEFAULT ON ) ecbuild_add_option( FEATURE FEATUREB DEFAULT OFF ) ecbuild_add_option( FEATURE FEATUREC DEFAULT OFF )ecbuild-3.16.0/tests/project_options_cached_multiproject/clean.sh0000775000175000017500000000033115252726137025477 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/sg_pl/0000775000175000017500000000000015252726137015654 5ustar alastairalastairecbuild-3.16.0/tests/sg_pl/run-test.sh.in0000775000175000017500000000517615252726137020412 0ustar alastairalastair#!/usr/bin/env bash set -ex # ------------------------------------------------------------------ # Test: sg.pl handles explicit template specializations (template <>) # # Verifies: # 1. sg.pl exits 0 (no crash on template <>) # 2. RegularClass.b exists and contains correct specName # 3. TemplateClass.b exists and contains correct template specName # 4. No .b file generated for the explicit specialization # 5. AfterSpecClass.b exists (parser recovery after specialization) # 6. Exactly 3 .b files total # ------------------------------------------------------------------ PERL="@PERL_EXECUTABLE@" SG_PL="@ECBUILD_MACROS_DIR@/sg.pl" HEADER="@CMAKE_CURRENT_SOURCE_DIR@/test_sg_pl.h" OUTDIR="@CMAKE_CURRENT_BINARY_DIR@/sg_output" # Clean and create output directory rm -rf "${OUTDIR}" mkdir -p "${OUTDIR}" # Run sg.pl -- primary assertion: exit code 0 "${PERL}" "${SG_PL}" "${HEADER}" "${OUTDIR}" eckit # ------------------------------------------------------------------ # Assert expected .b files exist # ------------------------------------------------------------------ echo "Checking RegularClass.b exists..." test -f "${OUTDIR}/RegularClass.b" echo "Checking TemplateClass.b exists..." test -f "${OUTDIR}/TemplateClass.b" echo "Checking AfterSpecClass.b exists..." test -f "${OUTDIR}/AfterSpecClass.b" # ------------------------------------------------------------------ # Assert NO .b file for the explicit specialization # ------------------------------------------------------------------ echo "Checking no .b file for explicit specialization..." count=$(ls -1 "${OUTDIR}" | grep -c 'TemplateClass<' || true) if [ "${count}" -ne 0 ]; then echo "FAIL: found .b file for template specialization" ls -la "${OUTDIR}" exit 1 fi # Exactly 3 .b files expected file_count=$(ls -1 "${OUTDIR}"/*.b | wc -l | tr -d ' ') if [ "${file_count}" -ne 3 ]; then echo "FAIL: expected 3 .b files, found ${file_count}" ls -la "${OUTDIR}" exit 1 fi # ------------------------------------------------------------------ # Assert .b file content # ------------------------------------------------------------------ echo "Checking RegularClass.b content..." grep -q 'static const char\* specName' "${OUTDIR}/RegularClass.b" grep -q 'return "RegularClass"' "${OUTDIR}/RegularClass.b" echo "Checking TemplateClass.b content..." grep -q 'static std::string specName' "${OUTDIR}/TemplateClass.b" grep -q 'Traits::name()' "${OUTDIR}/TemplateClass.b" echo "Checking AfterSpecClass.b content..." grep -q 'static const char\* specName' "${OUTDIR}/AfterSpecClass.b" grep -q 'return "AfterSpecClass"' "${OUTDIR}/AfterSpecClass.b" echo "All checks passed." ecbuild-3.16.0/tests/sg_pl/CMakeLists.txt0000664000175000017500000000031715252726137020415 0ustar alastairalastairecbuild_find_perl( REQUIRED ) set(_dir ${CMAKE_CURRENT_BINARY_DIR}) configure_file(run-test.sh.in ${_dir}/run-test.sh @ONLY) ecbuild_add_test( TARGET test_sg_pl TYPE SCRIPT COMMAND run-test.sh ) ecbuild-3.16.0/tests/sg_pl/test_sg_pl.h0000664000175000017500000000131215252726137020165 0ustar alastairalastair#ifndef TEST_SG_PL_H #define TEST_SG_PL_H // Case 1: Regular (non-template) class with base and member class RegularClass : public BaseClass { public: int value; }; // Case 2: Template class with base and member template class TemplateClass : public BaseClass { public: T data; }; // Case 3: Explicit template specialization -- must not crash sg.pl template <> class TemplateClass : public BaseClass { public: int data; }; // Case 4: Explicit specialization with no body (semicolon-only form) template <> class TemplateClass; // Case 5: Class after the specializations -- tests parser recovery class AfterSpecClass : public BaseClass { public: double result; }; #endif ecbuild-3.16.0/tests/ecbuild_find_python/0000775000175000017500000000000015252726137020560 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/configure.sh0000775000175000017500000000335315252726137023104 0ustar alastairalastair#!/usr/bin/env bash set -e function EXPECT_ONE_OF() { local file=$1 local pattern=$2 local found=$(cat ${file} | grep "${pattern}" | wc -l | xargs) if [ "$found" != "1" ]; then echo "File ${file} does not contain exacly one of '$2'" exit 1 fi } HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE # Ensure Python 3.x is available # This effectively asserts that a working python3 exists, otherwise the script will fail here python3 --version # --------------------- cleanup ------------------------ $SOURCE/clean.sh # ----------------- configure project --------------------- TC=1 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/interpreter_and_libs_project -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" TC=2 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/interpreter_and_libs_with_version_project -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" TC=3 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/interpreter_only_project -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" TC=4 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/interpreter_only_with_version_project -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" TC=5 mkdir -p $HERE/build_${TC} ecbuild $SOURCE/nonexistent_version_project -B $HERE/build_${TC} | tee $HERE/build_${TC}.log EXPECT_ONE_OF $HERE/build_${TC}.log "Build files have been written" ecbuild-3.16.0/tests/ecbuild_find_python/nonexistent_version_project/0000775000175000017500000000000015252726137026431 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/nonexistent_version_project/CMakeLists.txt0000664000175000017500000000047115252726137031173 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_find_python( VERSION 3.999) include(${CMAKE_SOURCE_DIR}/../cmake/expecting.cmake) expecting_false( CONDITION PYTHON_FOUND ) expecting_false( CONDITION Python_FOUND ) ecbuild-3.16.0/tests/ecbuild_find_python/interpreter_only_project/0000775000175000017500000000000015252726137025712 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/interpreter_only_project/CMakeLists.txt0000664000175000017500000000244115252726137030453 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_find_python( NO_LIBS ) include(${CMAKE_SOURCE_DIR}/../cmake/expecting.cmake) expecting_true( CONDITION PYTHON_FOUND ) expecting_true( CONDITION PYTHONINTERP_FOUND ) expecting_false( CONDITION PYTHONLIBS_FOUND ) expecting_nonempty( CONDITION PYTHON_EXECUTABLE) expecting_nonempty( CONDITION PYTHON_VERSION_MAJOR ) expecting_nonempty( CONDITION PYTHON_VERSION_MINOR ) expecting_nonempty( CONDITION PYTHON_VERSION_PATCH ) expecting_nonempty( CONDITION PYTHON_VERSION_STRING ) expecting_empty( CONDITION PYTHON_INCLUDE_DIRS ) expecting_empty( CONDITION PYTHON_LIBRARIES ) expecting_nonempty( CONDITION PYTHON_SITE_PACKAGES ) expecting_true( CONDITION Python_FOUND ) expecting_true( CONDITION Python_Interpreter_FOUND ) expecting_false( CONDITION Python_Development_FOUND ) expecting_nonempty( CONDITION Python_EXECUTABLE ) expecting_nonempty( CONDITION Python_VERSION_MAJOR ) expecting_nonempty( CONDITION Python_VERSION_MINOR ) expecting_nonempty( CONDITION Python_VERSION_PATCH ) expecting_nonempty( CONDITION Python_VERSION ) expecting_empty( CONDITION Python_INCLUDE_DIRS ) expecting_empty( CONDITION Python_LIBRARIES ) expecting_nonempty( CONDITION Python_SITELIB )ecbuild-3.16.0/tests/ecbuild_find_python/interpreter_and_libs_project/0000775000175000017500000000000015252726137026504 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/interpreter_and_libs_project/CMakeLists.txt0000664000175000017500000000244315252726137031247 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_find_python( ) include(${CMAKE_SOURCE_DIR}/../cmake/expecting.cmake) expecting_true( CONDITION PYTHON_FOUND ) expecting_true( CONDITION PYTHONINTERP_FOUND ) expecting_true( CONDITION PYTHONLIBS_FOUND ) expecting_nonempty( CONDITION PYTHON_EXECUTABLE) expecting_nonempty( CONDITION PYTHON_VERSION_MAJOR ) expecting_nonempty( CONDITION PYTHON_VERSION_MINOR ) expecting_nonempty( CONDITION PYTHON_VERSION_PATCH ) expecting_nonempty( CONDITION PYTHON_VERSION_STRING ) expecting_nonempty( CONDITION PYTHON_INCLUDE_DIRS ) expecting_nonempty( CONDITION PYTHON_LIBRARIES ) expecting_nonempty( CONDITION PYTHON_SITE_PACKAGES ) expecting_true( CONDITION Python_FOUND ) expecting_true( CONDITION Python_Interpreter_FOUND ) expecting_true( CONDITION Python_Development_FOUND ) expecting_nonempty( CONDITION Python_EXECUTABLE ) expecting_nonempty( CONDITION Python_VERSION_MAJOR ) expecting_nonempty( CONDITION Python_VERSION_MINOR ) expecting_nonempty( CONDITION Python_VERSION_PATCH ) expecting_nonempty( CONDITION Python_VERSION ) expecting_nonempty( CONDITION Python_INCLUDE_DIRS ) expecting_nonempty( CONDITION Python_LIBRARIES ) expecting_nonempty( CONDITION Python_SITELIB )ecbuild-3.16.0/tests/ecbuild_find_python/CMakeLists.txt0000664000175000017500000000037515252726137023325 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_find_python TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_find_python/interpreter_only_with_version_project/0000775000175000017500000000000015252726137030512 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/interpreter_only_with_version_project/CMakeLists.txt0000664000175000017500000000245415252726137033257 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_find_python( VERSION 3.6 NO_LIBS) include(${CMAKE_SOURCE_DIR}/../cmake/expecting.cmake) expecting_true( CONDITION PYTHON_FOUND ) expecting_true( CONDITION PYTHONINTERP_FOUND ) expecting_false( CONDITION PYTHONLIBS_FOUND ) expecting_nonempty( CONDITION PYTHON_EXECUTABLE) expecting_nonempty( CONDITION PYTHON_VERSION_MAJOR ) expecting_nonempty( CONDITION PYTHON_VERSION_MINOR ) expecting_nonempty( CONDITION PYTHON_VERSION_PATCH ) expecting_nonempty( CONDITION PYTHON_VERSION_STRING ) expecting_empty( CONDITION PYTHON_INCLUDE_DIRS ) expecting_empty( CONDITION PYTHON_LIBRARIES ) expecting_nonempty( CONDITION PYTHON_SITE_PACKAGES ) expecting_true( CONDITION Python_FOUND ) expecting_true( CONDITION Python_Interpreter_FOUND ) expecting_false( CONDITION Python_Development_FOUND ) expecting_nonempty( CONDITION Python_EXECUTABLE ) expecting_nonempty( CONDITION Python_VERSION_MAJOR ) expecting_nonempty( CONDITION Python_VERSION_MINOR ) expecting_nonempty( CONDITION Python_VERSION_PATCH ) expecting_nonempty( CONDITION Python_VERSION ) expecting_empty( CONDITION Python_INCLUDE_DIRS ) expecting_empty( CONDITION Python_LIBRARIES ) expecting_nonempty( CONDITION Python_SITELIB )ecbuild-3.16.0/tests/ecbuild_find_python/interpreter_and_libs_with_version_project/0000775000175000017500000000000015252726137031304 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/interpreter_and_libs_with_version_project/CMakeLists.txt0000664000175000017500000000245715252726137034054 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED ) project( project LANGUAGES NONE VERSION 0.2 ) ecbuild_find_python( VERSION 3.6 ) include(${CMAKE_SOURCE_DIR}/../cmake/expecting.cmake) expecting_true( CONDITION PYTHON_FOUND ) expecting_true( CONDITION PYTHONINTERP_FOUND ) expecting_true( CONDITION PYTHONLIBS_FOUND ) expecting_nonempty( CONDITION PYTHON_EXECUTABLE) expecting_nonempty( CONDITION PYTHON_VERSION_MAJOR ) expecting_nonempty( CONDITION PYTHON_VERSION_MINOR ) expecting_nonempty( CONDITION PYTHON_VERSION_PATCH ) expecting_nonempty( CONDITION PYTHON_VERSION_STRING ) expecting_nonempty( CONDITION PYTHON_INCLUDE_DIRS ) expecting_nonempty( CONDITION PYTHON_LIBRARIES ) expecting_nonempty( CONDITION PYTHON_SITE_PACKAGES ) expecting_true( CONDITION Python_FOUND ) expecting_true( CONDITION Python_Interpreter_FOUND ) expecting_true( CONDITION Python_Development_FOUND ) expecting_nonempty( CONDITION Python_EXECUTABLE ) expecting_nonempty( CONDITION Python_VERSION_MAJOR ) expecting_nonempty( CONDITION Python_VERSION_MINOR ) expecting_nonempty( CONDITION Python_VERSION_PATCH ) expecting_nonempty( CONDITION Python_VERSION ) expecting_nonempty( CONDITION Python_INCLUDE_DIRS ) expecting_nonempty( CONDITION Python_LIBRARIES ) expecting_nonempty( CONDITION Python_SITELIB )ecbuild-3.16.0/tests/ecbuild_find_python/cmake/0000775000175000017500000000000015252726137021640 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_find_python/cmake/expecting.cmake0000664000175000017500000000345115252726137024633 0ustar alastairalastair function( expecting_true ) set( options ) set( single_value_args CONDITION ) set( multi_value_args ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) ecbuild_debug( "Checking if true: ${_p_CONDITION}=${${_p_CONDITION}}" ) if ( NOT ${${_p_CONDITION}} ) ecbuild_critical( "Expected condition ${_p_CONDITION} to be true" ) endif() endfunction() function( expecting_false ) set( options ) set( single_value_args CONDITION ) set( multi_value_args ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) ecbuild_debug( "Checking if true: ${_p_CONDITION}=${${_p_CONDITION}}" ) if ( ${${_p_CONDITION}} ) ecbuild_critical( "Expected condition ${_p_CONDITION} to be false" ) endif() endfunction() function( expecting_empty ) set( options ) set( single_value_args CONDITION ) set( multi_value_args ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) ecbuild_debug( "Checking if nonempty: ${_p_CONDITION}=${${_p_CONDITION}}" ) if ( NOT "${${_p_CONDITION}}" STREQUAL "" ) ecbuild_critical( "Expected condition ${_p_CONDITION} to be a non-empty string" ) endif() endfunction() function( expecting_nonempty ) set( options ) set( single_value_args CONDITION ) set( multi_value_args ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) ecbuild_debug( "Checking if nonempty: ${_p_CONDITION}=${${_p_CONDITION}}" ) if ( "${${_p_CONDITION}}" STREQUAL "" ) ecbuild_critical( "Expected condition ${_p_CONDITION} to be a non-empty string" ) endif() endfunction() ecbuild-3.16.0/tests/ecbuild_find_python/clean.sh0000775000175000017500000000033115252726137022176 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build_* ecbuild-3.16.0/tests/ecbuild_add_flags/0000775000175000017500000000000015252726137020143 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_add_flags/run-test.sh.in0000775000175000017500000000033215252726137022666 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" cd $HERE rm -rf build # cleanup mkdir build cd build cmake -DCMAKE_MODULE_PATH=@ECBUILD_MACROS_DIR@ -DECBUILD_LOG_LEVEL=DEBUG ..ecbuild-3.16.0/tests/ecbuild_add_flags/CMakeLists.txt0000664000175000017500000000042115252726137022700 0ustar alastairalastairset(_dir ${CMAKE_CURRENT_BINARY_DIR}) configure_file(run-test.sh.in ${_dir}/run-test.sh @ONLY) configure_file(test_ecbuild_add_flags.cmake ${_dir}/CMakeLists.txt COPYONLY) ecbuild_add_test( TARGET test_ecbuild_add_flags TYPE SCRIPT COMMAND run-test.sh )ecbuild-3.16.0/tests/ecbuild_add_flags/test_ecbuild_add_flags.cmake0000664000175000017500000001047215252726137025603 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.6 REQUIRED ) project(TestFlags VERSION 1.0 LANGUAGES C CXX ) include(CheckCCompilerFlag) include( ecbuild_add_c_flags ) ecbuild_add_c_flags( "-O2" ) # should be able to add to (nearly) all compilers ecbuild_add_c_flags( "-g -O1" ) # should be able to add to (nearly) all compilers ecbuild_add_c_flags( "-O1" BUILD RELEASE) # should be able to add to (nearly) all compilers ecbuild_add_c_flags( "-g -O1" BUILD DEBUG) # should be able to add to (nearly) all compilers ecbuild_add_c_flags( "-fooxxx" NO_FAIL ) # should not add to any compiler ecbuild_add_cxx_flags( "-O1" ) # should be able to add to (nearly) all compilers ecbuild_add_cxx_flags( "-barxxx" NO_FAIL ) # should not add to any compiler set(_cmake_c_flags_before_project "${CMAKE_C_FLAGS}") set(TESTFLAGS_C_FLAGS "-developer_owned") set(TESTFLAGS_C_FLAGS_RELEASE "-developer_owned_release") ecbuild_add_c_flags( "-O2" PROJECT ) ecbuild_add_c_flags( "-O1" BUILD RELEASE PROJECT ) message("CMAKE_C_FLAGS ${CMAKE_C_FLAGS}") message("CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}") message("TESTFLAGS_C_FLAGS ${TESTFLAGS_C_FLAGS}") message("TESTFLAGS_C_FLAGS_RELEASE ${TESTFLAGS_C_FLAGS_RELEASE}") if( CMAKE_C_FLAGS MATCHES "-O2" ) message("Flag -O2 added") else() message(FATAL_ERROR "Failed to add C flag -O2" ) endif() if( CMAKE_C_FLAGS MATCHES "-g -O1" ) message("Flag -g -O1 added") else() message(FATAL_ERROR "Failed to add C flag -g -O1" ) endif() if( CMAKE_C_FLAGS_RELEASE MATCHES "-O1" ) message("Flag -O1 added") else() message(FATAL_ERROR "Failed to add C flag -O1 to RELEASE" ) endif() if( CMAKE_C_FLAGS_DEBUG MATCHES "-g -O1" ) message("Flag -g -O1 added") else() message(FATAL_ERROR "Failed to add C flag -g -O1 to DEBUG" ) endif() if( CMAKE_C_FLAGS MATCHES "-fooxxx" ) message(FATAL_ERROR "Flag -fooxxx wrongly added" ) else() message("Successfully skipped addition of fake C flag -fooxxx") endif() if( CMAKE_CXX_FLAGS MATCHES "-O1" ) message("Flag -O1 added") else() message(FATAL_ERROR "Failed to add CXX flag -O1" ) endif() if( CMAKE_CXX_FLAGS MATCHES "-fantasyflag" ) message(FATAL_ERROR "Flag -fantasyflag wrongly added" ) else() message("Successfully skipped addition of fake CXX flag -fantasyflag") endif() if( TESTFLAGS_C_FLAGS MATCHES "-developer_owned" AND TESTFLAGS_C_FLAGS MATCHES "-O2" ) message("Project C flag -O2 added") else() message(FATAL_ERROR "Failed to add project C flag -O2" ) endif() if( TESTFLAGS_C_FLAGS_RELEASE MATCHES "-developer_owned_release" AND TESTFLAGS_C_FLAGS_RELEASE MATCHES "-O1" ) message("Project C flag -O1 added to RELEASE") else() message(FATAL_ERROR "Failed to add project C flag -O1 to RELEASE" ) endif() if( NOT CMAKE_C_FLAGS STREQUAL "${_cmake_c_flags_before_project}" ) message(FATAL_ERROR "CMAKE_C_FLAGS should not change when PROJECT is used" ) endif() set(_project_undefined_source_dir ${CMAKE_CURRENT_BINARY_DIR}/project_undefined_src) set(_project_undefined_binary_dir ${CMAKE_CURRENT_BINARY_DIR}/project_undefined_build) file(MAKE_DIRECTORY ${_project_undefined_source_dir}) file(WRITE ${_project_undefined_source_dir}/CMakeLists.txt [=[ cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.6 REQUIRED ) project(TestFlags VERSION 1.0 LANGUAGES C) include( ecbuild_add_c_flags ) ecbuild_add_c_flags( "-O2" PROJECT ) ecbuild_add_c_flags( "-O1" BUILD RELEASE PROJECT ) if( NOT TESTFLAGS_C_FLAGS MATCHES "-O2" ) message(FATAL_ERROR "Failed to add project C flag -O2 when TESTFLAGS_C_FLAGS was initially undefined" ) endif() if( NOT TESTFLAGS_C_FLAGS_RELEASE MATCHES "-O1" ) message(FATAL_ERROR "Failed to add project C flag -O1 to RELEASE when TESTFLAGS_C_FLAGS was initially undefined" ) endif() ]=]) execute_process( COMMAND ${CMAKE_COMMAND} -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} -Decbuild_DIR=${ecbuild_DIR} -S ${_project_undefined_source_dir} -B ${_project_undefined_binary_dir} RESULT_VARIABLE _project_undefined_result OUTPUT_VARIABLE _project_undefined_stdout ERROR_VARIABLE _project_undefined_stderr ) if( NOT _project_undefined_result EQUAL 0 ) message(FATAL_ERROR "ecbuild_add_c_flags(PROJECT ...) should succeed when TESTFLAGS_C_FLAGS is not defined:\n" "${_project_undefined_stdout}${_project_undefined_stderr}") endif() ecbuild-3.16.0/tests/ecbuild_shared_libs/0000775000175000017500000000000015252726137020516 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_shared_libs/build-and-run.sh0000775000175000017500000000406715252726137023525 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} # Add ecbuild to path export PATH=$SOURCE/../../bin:$PATH echo $PATH echo $SOURCE check_lib_exists() { local libname=$1 local ext=$2 if [ ! -f $HERE/build/lib/lib${libname}.$ext ]; then echo "$HERE/build/lib/lib${libname}.$ext not found" exit 1 fi } dyn_ext="so" if [[ $(uname) == "Darwin" ]]; then dyn_ext="dylib" fi static_ext="a" logf=$HERE/test_ecbuild_shared_libs.log # enable shared libraries across project $SOURCE/clean.sh ecbuild -DENABLE_TESTS=OFF -DTEST_SHARED_LIBS_BUILD_SHARED_LIBS=OFF $SOURCE/test_project -B $HERE/build cmake --build build check_lib_exists test_shared_libs ${static_ext} check_lib_exists lib2 ${static_ext} check_lib_exists lib1 ${dyn_ext} # test that BUILD_SHARED_LIBS is overriden $SOURCE/clean.sh ecbuild -DENABLE_TESTS=OFF -DTEST_SHARED_LIBS_BUILD_SHARED_LIBS=OFF -DBUILD_SHARED_LIBS=ON $SOURCE/test_project -B $HERE/build cmake --build build check_lib_exists test_shared_libs ${static_ext} check_lib_exists lib2 ${static_ext} check_lib_exists lib1 ${dyn_ext} # test ecbuild failure for invalid argument $SOURCE/clean.sh ecbuild -DENABLE_TESTS=OFF -DTEST_SHARED_LIBS_BUILD_SHARED_LIBS=SHARED $SOURCE/test_project -B $HERE/build >$logf 2>&1 || result=$? if [ ! $result ]; then echo "ecbuild should have failed for invalid argument" cat $logf exit 1 fi # enable target specific override 1 $SOURCE/clean.sh ecbuild -DENABLE_TESTS=OFF -DECBUILD_TARGET_test_shared_libs_TYPE=SHARED -DBUILD_SHARED_LIBS=OFF $SOURCE/test_project -B $HERE/build cmake --build build check_lib_exists test_shared_libs ${dyn_ext} check_lib_exists lib2 ${static_ext} check_lib_exists lib1 ${dyn_ext} # enable target specific override 2 $SOURCE/clean.sh ecbuild -DENABLE_TESTS=OFF -DECBUILD_TARGET_test_shared_libs_TYPE=STATIC $SOURCE/test_project -B $HERE/build cmake --build build check_lib_exists test_shared_libs ${static_ext} check_lib_exists lib2 ${dyn_ext} check_lib_exists lib1 ${dyn_ext} ecbuild-3.16.0/tests/ecbuild_shared_libs/CMakeLists.txt0000664000175000017500000000040115252726137023251 0ustar alastairalastair ecbuild_add_test( TARGET test_ecbuild_shared_libs TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_shared_libs/test_project/0000775000175000017500000000000015252726137023223 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_shared_libs/test_project/CMakeLists.txt0000664000175000017500000000057015252726137025765 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( test_shared_libs VERSION 0.1.0 LANGUAGES Fortran ) ecbuild_add_library( TARGET test_shared_libs SOURCES dummy_src.F90 ) # this should never be overriden ecbuild_add_library( TARGET lib1 TYPE SHARED SOURCES dummy_src.F90 ) ecbuild_add_library( TARGET lib2 SOURCES dummy_src.F90 ) ecbuild-3.16.0/tests/ecbuild_shared_libs/test_project/dummy_src.F900000664000175000017500000000003215252726137025500 0ustar alastairalastairprogram main end program ecbuild-3.16.0/tests/ecbuild_shared_libs/clean.sh0000775000175000017500000000035115252726137022136 0ustar alastairalastair#!/usr/bin/env bash set -e HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} # --------------------- cleanup ------------------------ echo "cleaning $HERE" rm -rf $HERE/build rm -f $HERE/*.log ecbuild-3.16.0/tests/bundle_subdir/0000775000175000017500000000000015252726137017371 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subdir/run-test.sh.in0000775000175000017500000000117615252726137022123 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" ECBUILD_PATH=@CMAKE_SOURCE_DIR@/bin # Add ecbuild to path export PATH=$ECBUILD_PATH:$PATH # --------------------- cleanup ------------------------ rm -rf $HERE/build rm -rf $HERE/mylib/build rm -rf $HERE/mylib/install # ------------- build the "system" package ------------- cd $HERE/mylib mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib .. make install export mylib_DIR=$HERE/mylib/install/lib/cmake/mylib # ---------------- build the bundle -------------------- cd $HERE mkdir build cd build ecbuild -- ../mybundle ecbuild-3.16.0/tests/bundle_subdir/CMakeLists.txt0000664000175000017500000000170615252726137022135 0ustar alastairalastair set( _funcs std ecbfind ) foreach( _func ${_funcs} ) set( _ref ${CMAKE_CURRENT_BINARY_DIR}/${_func} ) set( _FUNC ${_func} ) configure_file( run-test.sh.in ${_ref}/run-test.sh @ONLY ) file( COPY mybundle/CMakeLists.txt DESTINATION ${_ref}/mybundle/ ) configure_file( mybundle/myexe/CMakeLists.txt.in ${_ref}/mybundle/myexe/CMakeLists.txt @ONLY ) set( _confs SYSTEM BUNDLE ) set( _dir_SYSTEM ${_ref} ) set( _dir_BUNDLE ${_ref}/mybundle ) foreach( _conf ${_confs} ) set( _dir ${_dir_${_conf}} ) set( _CONFNAME ${_conf} ) file( GLOB_RECURSE _infiles RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/mylib.in "${CMAKE_CURRENT_SOURCE_DIR}/mylib.in/*" ) foreach( _infile ${_infiles} ) configure_file( mylib.in/${_infile} ${_dir}/mylib/${_infile} @ONLY ) endforeach() endforeach() ecbuild_add_test( TARGET bundle-subdir-${_func} TYPE SCRIPT COMMAND ${_ref}/run-test.sh ) endforeach() ecbuild-3.16.0/tests/bundle_subdir/mylib.in/0000775000175000017500000000000015252726137021112 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subdir/mylib.in/mylib-import.cmake.in0000664000175000017500000000004215252726137025141 0ustar alastairalastairset( mylib_CONFNAME @_CONFNAME@ ) ecbuild-3.16.0/tests/bundle_subdir/mylib.in/CMakeLists.txt0000664000175000017500000000043615252726137023655 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) project( mylib VERSION 0.1.0 LANGUAGES NONE ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/bundle_subdir/mybundle/0000775000175000017500000000000015252726137021210 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subdir/mybundle/CMakeLists.txt0000664000175000017500000000051315252726137023747 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild QUIET) include( ecbuild_bundle ) project( mybundle VERSION 0.1.0.0 LANGUAGES NONE ) ecbuild_bundle_initialize() ecbuild_requires_macro_version( 2.9.5 ) add_subdirectory( mylib ) add_subdirectory( myexe ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/bundle_subdir/mybundle/myexe/0000775000175000017500000000000015252726137022337 5ustar alastairalastairecbuild-3.16.0/tests/bundle_subdir/mybundle/myexe/CMakeLists.txt.in0000664000175000017500000000104515252726137025504 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) project( myexe VERSION 0.1.0 LANGUAGES NONE ) include( ecbuild_system NO_POLICY_SCOPE ) ecbuild_requires_macro_version( 2.9.5 ) ecbuild_declare_project() if( @_FUNC@ STREQUAL "std" ) find_package( mylib REQUIRED ) else() #( @_FUNC@ STREQUAL "ecbfind" ) ecbuild_find_package( NAME mylib REQUIRED ) endif() if( NOT mylib_CONFNAME STREQUAL "BUNDLE" ) message( FATAL_ERROR "mylib_CONFNAME == '${mylib_CONFNAME}', expected 'BUNDLE'" ) endif() ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/0000775000175000017500000000000015252726137025245 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/0000775000175000017500000000000015252726137026517 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/CMakeLists.txt0000664000175000017500000000305515252726137031262 0ustar alastairalastaircmake_minimum_required(VERSION 3.18 FATAL_ERROR) project(foo VERSION 1.33.7 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) add_library(foo SHARED src/foo.cc ) target_include_directories(foo PUBLIC $ $ ) set_target_properties(foo PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} PUBLIC_HEADER "src/include/foo/foo.h" ) add_executable(foo_test src/test_foo.cc ) target_link_libraries(foo_test PRIVATE foo) include(GNUInstallDirs) include(CMakePackageConfigHelpers) install( TARGETS foo EXPORT fooTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/foo ) install( EXPORT fooTargets FILE fooTargets.cmake NAMESPACE foo:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/foo ) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/fooConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/fooConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/fooConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/foo ) ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/0000775000175000017500000000000015252726137027306 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/test_foo.cc0000664000175000017500000000017215252726137031437 0ustar alastairalastair#include "foo/foo.h" #include int main() { std::cout << foo::true_random_int() << std::endl; return 0; } ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/include/0000775000175000017500000000000015252726137030731 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/include/foo/0000775000175000017500000000000015252726137031514 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/include/foo/foo.h0000664000175000017500000000007315252726137032450 0ustar alastairalastair#pragma once namespace foo { int true_random_int(); } ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/src/foo.cc0000664000175000017500000000021615252726137030377 0ustar alastairalastair#include "foo/foo.h" namespace foo { int true_random_int() { // Determined in a truly random dice roll return 4; } } ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/cmake/0000775000175000017500000000000015252726137027577 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/libfoo/cmake/fooConfig.cmake0000664000175000017500000000100015252726137032501 0ustar alastairalastairinclude("${CMAKE_CURRENT_LIST_DIR}/fooTargets.cmake") get_target_property(_imported_configs foo::foo IMPORTED_CONFIGURATIONS) message(STATUS "_imported_configs=${_imported_configs}") foreach(_config ${_imported_configs}) get_target_property(_library_chk foo::foo "IMPORTED_LOCATION_${_config}") message(STATUS "_library_chk=${_library_chk}") if(EXISTS "${_library_chk}") set_target_properties(foo::foo PROPERTIES IMPORTED_LOCATION "${_library_chk}") break() endif() endforeach() ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/CMakeLists.txt0000664000175000017500000000031215252726137030001 0ustar alastairalastairecbuild_add_test( TARGET test_ecbuild_install_dependency_with_soversion TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run-test.sh WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/run-test.sh0000775000175000017500000000213615252726137027367 0ustar alastairalastair#!/usr/bin/env bash set -ex echo "HI" TEST_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" foo_src="$TEST_ROOT/libfoo" project_src="$TEST_ROOT/project" foo_install="$(pwd)/foo-install" project_install="$(pwd)/project-install" mkdir -p foo-{build,install} cmake \ -B foo-build \ -S "$foo_src" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="$foo_install" cmake --build foo-build --target install -j mkdir -p project-{build,install} cmake \ -B project-build \ -S "$project_src" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="$project_install" \ -DCMAKE_PREFIX_PATH="$foo_install" \ -Decbuild_ROOT="$TEST_ROOT/../../" cmake --build project-build --target install -j lib_file_count="$(find $(pwd)/project-install \( -type f -o -type l \) -name 'libfoo.*' | wc -l)" if [[ ! "${lib_file_count}" -eq 3 ]]; then echo "ERROR: Install tree is not correct" exit 1 fi random=$($project_install/bin/project) if [[ ! "${random}" -eq 4 ]]; then echo "ERROR: project executable did run but did not output the expected value" exit 1 fi ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/project/0000775000175000017500000000000015252726137026713 5ustar alastairalastairecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/project/main.cc0000664000175000017500000000017215252726137030146 0ustar alastairalastair#include "foo/foo.h" #include int main() { std::cout << foo::true_random_int() << std::endl; return 0; } ecbuild-3.16.0/tests/ecbuild_install_dependency_with_soversion/project/CMakeLists.txt0000664000175000017500000000123515252726137031454 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild 3.12 REQUIRED HINTS ${CMAKE_SOURCE_DIR}) project(project VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) ecbuild_find_package(NAME foo VERSION 1.33 REQUIRED) ecbuild_add_executable( TARGET project SOURCES main.cc LIBS foo::foo ) ecbuild_install_dependency_with_soversion(foo::foo) ecbuild_add_executable( TARGET project_copy SOURCES main.cc LIBS foo::foo ) ecbuild_install_dependency_with_soversion(foo::foo) ecbuild-3.16.0/examples/0000775000175000017500000000000015252726137015224 5ustar alastairalastairecbuild-3.16.0/examples/boost-python-lib/0000775000175000017500000000000015252726137020435 5ustar alastairalastairecbuild-3.16.0/examples/boost-python-lib/pythonlib.hpp0000664000175000017500000000012015252726137023147 0ustar alastairalastair#ifndef pythonlib_hpp #define pythonlib_hpp #include #endifecbuild-3.16.0/examples/boost-python-lib/CMakeLists.txt0000664000175000017500000000427315252726137023203 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( mypython VERSION 0.10.0 LANGUAGES CXX ) ############################################################################### # find extra packages # Python # Can specify non-default distribution with CMake variable PYTHON_EXECUTABLE ecbuild_find_python() ecbuild_info("PYTHON_EXECUTABLE : ${PYTHON_EXECUTABLE}") ecbuild_info("PYTHON_INCLUDE_DIRS : ${PYTHON_INCLUDE_DIRS}") ecbuild_info("PYTHON_LIBRARIES : ${PYTHON_LIBRARIES}") # Boost # Can specify non-default distribution with CMake variable BOOST_ROOT set( Boost_MINIMUM_VERSION "1.47" ) find_package( Boost ${Boost_MINIMUM_VERSION} REQUIRED COMPONENTS python ) ecbuild_info("Boost_LIBRARIES : ${Boost_LIBRARIES}" ) ############################################################################### # Contents ecbuild_add_library( TARGET mypython INCLUDES ${Boost_INCLUDE_DIR} ${PYTHON_INCLUDE_DIRS} PRIVATE_LIBS ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} SOURCES pythonlib.hpp pythonlib.cpp ) configure_file( mypython.py ${CMAKE_BINARY_DIR}/lib COPYONLY ) ############################################################################################ # Installation ecbuild_install_project( NAME python_project ) ############################################################################### # Summary ecbuild_print_summary() ecbuild_info( "" ) ecbuild_info( "To test the library:" ) ecbuild_info( "--------------------" ) ecbuild_info( "make" ) ecbuild_info( "cd ${CMAKE_CURRENT_BINARY_DIR}/lib" ) ecbuild_info( "python" ) ecbuild_info( ">>> import libmypython" ) ecbuild_info( ">>> help(libmypython)" ) ecbuild_info( "" ) ecbuild_info( "---------------------------------------------------------" ) ecbuild-3.16.0/examples/boost-python-lib/mypython.py0000664000175000017500000000026515252726137022701 0ustar alastairalastair""" API for the C++ module using boost::python mypython.py: This file can be used to do some python actions at import Module description: ... """ from libmypython import *ecbuild-3.16.0/examples/boost-python-lib/README.md0000664000175000017500000000023315252726137021712 0ustar alastairalastair# Boost::python example This example shows how to use Boost::python with ecbuild to build a python library. ## Usage ecbuild examples/boost-python-lib ecbuild-3.16.0/examples/boost-python-lib/pythonlib.cpp0000664000175000017500000000021615252726137023150 0ustar alastairalastair#include "pythonlib.hpp" BOOST_PYTHON_MODULE(libmypython) { boost::python::scope().attr("__doc__") = "Python API for my python project"; } ecbuild-3.16.0/examples/find_package/0000775000175000017500000000000015252726137017617 5ustar alastairalastairecbuild-3.16.0/examples/find_package/find_hdf5.sh0000775000175000017500000000017715252726137022011 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build hdf5 projects/hdf5 ecbuild-3.16.0/examples/find_package/README0000664000175000017500000000031215252726137020473 0ustar alastairalastairfind_package test projects The projects/ directory contains test projects for specific libraries. They serve as examples but can also be used to check these libraries by running the find_*.sh scripts. ecbuild-3.16.0/examples/find_package/find_lapack.sh0000775000175000017500000000022615252726137022411 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build lapack projects/lapack "-DENABLE_MKL=OFF" ecbuild-3.16.0/examples/find_package/find_fftw_MKL.sh0000775000175000017500000000023015252726137022622 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build fftw_mkl projects/fftw -DFFTW_ENABLE_MKL=ON ecbuild-3.16.0/examples/find_package/find_fftw.sh0000775000175000017500000000017715252726137022131 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build fftw projects/fftw ecbuild-3.16.0/examples/find_package/find_cuda.sh0000775000175000017500000000017715252726137022077 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build cuda projects/cuda ecbuild-3.16.0/examples/find_package/find_fftw_NO-MKL-1.sh0000775000175000017500000000022515252726137023276 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build fftw projects/fftw -DFFTW_ENABLE_MKL=OFF ecbuild-3.16.0/examples/find_package/find_tcmalloc.sh0000775000175000017500000000023415252726137022753 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build tcmalloc projects/tcmalloc -DENABLE_TCMALLOC=ON ecbuild-3.16.0/examples/find_package/find_mpi_fortran.sh0000775000175000017500000000021515252726137023474 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build mpi_fortran projects/mpi_fortran ecbuild-3.16.0/examples/find_package/find_jemalloc.sh0000775000175000017500000000023415252726137022743 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build jemalloc projects/jemalloc -DENABLE_JEMALLOC=ON ecbuild-3.16.0/examples/find_package/projects/0000775000175000017500000000000015252726137021450 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/hdf5/0000775000175000017500000000000015252726137022276 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/hdf5/CMakeLists.txt0000664000175000017500000000633515252726137025045 0ustar alastairalastair# Specify "HDF5_ROOT" in environment (tested with CMake 3.15) # Known issues: # ------------- # # 1. CMake 3.15 in combination with Cray did not work for Fortran # due to captilization in "HDF5.mod" file # Workaround: # - either create a symlink from "hdf5.mod" to "HDF5.mod" in the # local hdf5 installation, # - or append "HDF5.mod" to HDF5_INCLUDE_FILENAME in CMake's # FindHDF5.cmake file where Fortran is being searched # # 2. CMake 3.15 is missing "libhdf5.so" in ${HDF5_C_HL_LIBRARIES} # Workaround: # - either use both ${HDF5_C_LIBRARIES} and ${HDF5_C_HL_LIBRARIES} # in your CMake project # - or append "hdf5" to "HDF5_C_HL_LIBRARY_NAMES" in CMake's # FindHDF5.cmake file. # # Upstream CMake pull request has been submitted here addressing both issues # https://gitlab.kitware.com/cmake/cmake/merge_requests/3918 # with fixes hopefully available in 3.16 cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.0.0 REQUIRED ) project( find_hdf5 VERSION 0.0.0 LANGUAGES C Fortran ) find_package( HDF5 REQUIRED COMPONENTS C HL Fortran ) ecbuild_info( "HDF5_FOUND : ${HDF5_FOUND}" ) ecbuild_info( "HDF5_VERSION : ${HDF5_VERSION}" ) ecbuild_info( "HDF5_LIBRARIES : ${HDF5_LIBRARIES}" ) ecbuild_info( "HDF5_INCLUDE_DIRS : ${HDF5_INCLUDE_DIRS}" ) ecbuild_info( "HDF5_DEFINITIONS : ${HDF5_DEFINITIONS}" ) ecbuild_info( "HDF5_HL_FOUND : ${HDF5_HL_FOUND}" ) ecbuild_info( "HDF5_HL_LIBRARIES : ${HDF5_HL_LIBRARIES}" ) ecbuild_info( "HDF5_C_HL_LIBRARIES : ${HDF5_C_HL_LIBRARIES}" ) ecbuild_info( "HDF5_Fortran_HL_LIBRARIES : ${HDF5_Fortran_HL_LIBRARIES}" ) ecbuild_info( "HDF5_C_FOUND : ${HDF5_C_FOUND}" ) ecbuild_info( "HDF5_C_LIBRARIES : ${HDF5_C_LIBRARIES}" ) ecbuild_info( "HDF5_C_INCLUDE_DIRS : ${HDF5_C_INCLUDE_DIRS}" ) ecbuild_info( "HDF5_C_DEFINITIONS : ${HDF5_C_DEFINITIONS}" ) ecbuild_info( "HDF5_Fortran_FOUND : ${HDF5_Fortran_FOUND}" ) ecbuild_info( "HDF5_Fortran_LIBRARIES : ${HDF5_Fortran_LIBRARIES}" ) ecbuild_info( "HDF5_Fortran_INCLUDE_DIRS : ${HDF5_Fortran_INCLUDE_DIRS}" ) ecbuild_info( "HDF5_Fortran_DEFINITIONS : ${HDF5_Fortran_DEFINITIONS}" ) ecbuild_info( "HDF5_IS_PARALLEL : ${HDF5_IS_PARALLEL}" ) ecbuild_add_test( TARGET test_hdf5_c SOURCES hdf5_examples/h5_subset.c LIBS ${HDF5_C_LIBRARIES} INCLUDES ${HDF5_C_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_hdf5_f90 SOURCES hdf5_examples/h5_subset.f90 LIBS ${HDF5_Fortran_LIBRARIES} INCLUDES ${HDF5_Fortran_INCLUDE_DIRS} CONDITION HDF5_Fortran_FOUND ) ecbuild_add_test( TARGET test_hdf5_hl_c SOURCES hdf5_examples/hl_ex_lite1.c LIBS ${HDF5_C_HL_LIBRARIES} INCLUDES ${HDF5_C_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_hdf5_hl_f90 SOURCES hdf5_examples/hl_exlite.f90 LIBS ${HDF5_Fortran_HL_LIBRARIES} INCLUDES ${HDF5_Fortran_INCLUDE_DIRS} CONDITION HDF5_Fortran_FOUND ) ecbuild-3.16.0/examples/find_package/projects/hdf5/hdf5_examples/0000775000175000017500000000000015252726137025022 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/hdf5/hdf5_examples/h5_subset.c0000664000175000017500000001202315252726137027065 0ustar alastairalastair/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the COPYING file, which can be found at the root of the source code * * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * This example illustrates how to read/write a subset of data (a slab) * from/to a dataset in an HDF5 file. It is used in the HDF5 Tutorial. */ #include "hdf5.h" #define FILE "subset.h5" #define DATASETNAME "IntArray" #define RANK 2 #define DIM0_SUB 3 /* subset dimensions */ #define DIM1_SUB 4 #define DIM0 8 /* size of dataset */ #define DIM1 10 int main (void) { hsize_t dims[2], dimsm[2]; int data[DIM0][DIM1]; /* data to write */ int sdata[DIM0_SUB][DIM1_SUB]; /* subset to write */ int rdata[DIM0][DIM1]; /* buffer for read */ hid_t file_id, dataset_id; /* handles */ hid_t dataspace_id, memspace_id; herr_t status; hsize_t count[2]; /* size of subset in the file */ hsize_t offset[2]; /* subset offset in the file */ hsize_t stride[2]; hsize_t block[2]; int i, j; /***************************************************************** * Create a new file with default creation and access properties.* * Then create a dataset and write data to it and close the file * * and dataset. * *****************************************************************/ file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); dims[0] = DIM0; dims[1] = DIM1; dataspace_id = H5Screate_simple (RANK, dims, NULL); dataset_id = H5Dcreate2 (file_id, DATASETNAME, H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); for (j = 0; j < DIM0; j++) { for (i = 0; i < DIM1; i++) if (i< (DIM1/2)) data[j][i] = 1; else data[j][i] = 2; } status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); printf ("\nData Written to File:\n"); for (i = 0; i #include static const char* trans = "N"; static const int inc = 1; static const double alpha = 1.; static const double beta = 0.; int main(int argc, char* argv[] ) { int err_code = 0; double A[] = { 1., -2., -4., 2. }; double B[] = { 1., -2., -4., 2. }; double C[] = { 0., 0., 0., 0. }; double C_expected[] = { 9., -6., -12., 12. }; int m = 2; // A.rows() int n = 2; // B.cols() int k = 2; // A.cols() dgemm_( trans, trans, &m, &n, &k, &alpha, A, &m, B, &k, &beta, C, &m); for( int i=0; i<2; ++i ) { for( int j=0; j<2; ++j ) { int idx = i*2+j; if( std::abs( C[idx] - C_expected[idx] ) > 1.e-10 ) { err_code=1; std::cout << "C("< #include #include #include #include "fftw3.h" struct FFTW_Data { fftwf_complex* in; float* out; fftwf_plan plan; }; int main(int argc, char* argv[] ) { int err_code = 0; int nlats = 32; int nlons = 64; int jlonMin_ = 0; FFTW_Data* fftw = new FFTW_Data; int num_complex = ( nlons / 2 ) + 1; fftw->in = fftwf_alloc_complex( nlats * num_complex ); fftw->out = fftwf_alloc_real( nlats * nlons ); fftw->plan = fftwf_plan_many_dft_c2r( 1, &nlons, nlats, fftw->in, NULL, 1, num_complex, fftw->out, NULL, 1, nlons, FFTW_ESTIMATE ); int idx = 0; for ( int jlat = 0; jlat < nlats; jlat++ ) { fftw->in[idx++][0] = 0.; for ( int jm = 1; jm < num_complex; jm++, idx++ ) { for ( int imag = 0; imag < 2; imag++ ) { fftw->in[idx][imag] = 0.; } } } fftwf_execute_dft_c2r( fftw->plan, fftw->in, fftw->out ); for ( int jlat = 0; jlat < nlats; jlat++ ) { for ( int jlon = 0; jlon < nlons; jlon++ ) { int j = jlon + jlonMin_; double gp_value /* [jlon + nlons * (jlat + nlats )] */ = fftw->out[j + nlons * jlat]; if( std::abs( gp_value - 0. ) > 1.e-10 ) { err_code = 1.; } } } fftwf_destroy_plan( fftw->plan ); fftwf_free( fftw->in ); fftwf_free( fftw->out ); delete fftw; if( err_code == 0 ) { std::cout << "Test passed" << std::endl; } else { std::cout << "Test failed" << std::endl; } return err_code; } ecbuild-3.16.0/examples/find_package/projects/jemalloc/0000775000175000017500000000000015252726137023236 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/jemalloc/CMakeLists.txt0000664000175000017500000000150115252726137025773 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.0.0 REQUIRED ) project( find_jecmalloc VERSION 0.0.0 LANGUAGES C Fortran ) ecbuild_add_option( FEATURE JEMALLOC DEFAULT OFF DESCRIPTION "jemalloc memory handling" REQUIRED_PACKAGES Jemalloc ) if( HAVE_JEMALLOC ) # Automatically link all executables with tcmalloc set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,${JEMALLOC_LIBRARY_DIR}" ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${JEMALLOC_LIBRARIES}" ) endif() ecbuild_add_executable( TARGET main SOURCES main.c ) ecbuild_add_executable( TARGET main_f SOURCES main.F90 ) # Run executables as test ecbuild_add_test( TARGET test_main COMMAND main ) ecbuild_add_test( TARGET test_main_f COMMAND main_f ) ecbuild-3.16.0/examples/find_package/projects/jemalloc/main.F900000664000175000017500000000016215252726137024441 0ustar alastairalastairprogram main implicit none real(8), allocatable :: a(:) allocate(a(32)) a(:)=1. write(6,'(F8.6)') a(1) end programecbuild-3.16.0/examples/find_package/projects/jemalloc/main.c0000664000175000017500000000035115252726137024325 0ustar alastairalastair#include #include int main() { int length = 32; double* array = (double*) malloc( sizeof(double) * length ); for( int i=0; i #include int main (void) { PJ_CONTEXT *C; PJ *P; PJ* P_for_GIS; PJ_COORD a, b; /* or you may set C=PJ_DEFAULT_CTX if you are sure you will */ /* use PJ objects from only one thread */ C = proj_context_create(); P = proj_create_crs_to_crs (C, "EPSG:4326", "+proj=utm +zone=32 +datum=WGS84", /* or EPSG:32632 */ NULL); if (0==P) { fprintf(stderr, "Oops\n"); return 1; } /* This will ensure that the order of coordinates for the input CRS */ /* will be longitude, latitude, whereas EPSG:4326 mandates latitude, */ /* longitude */ P_for_GIS = proj_normalize_for_visualization(C, P); if( 0 == P_for_GIS ) { fprintf(stderr, "Oops\n"); return 1; } proj_destroy(P); P = P_for_GIS; /* a coordinate union representing Copenhagen: 55d N, 12d E */ /* Given that we have used proj_normalize_for_visualization(), the order of /* coordinates is longitude, latitude, and values are expressed in degrees. */ a = proj_coord (12, 55, 0, 0); /* transform to UTM zone 32, then back to geographical */ b = proj_trans (P, PJ_FWD, a); printf ("easting: %.3f, northing: %.3f\n", b.enu.e, b.enu.n); b = proj_trans (P, PJ_INV, b); printf ("longitude: %g, latitude: %g\n", b.lp.lam, b.lp.phi); /* Clean up */ proj_destroy (P); proj_context_destroy (C); /* may be omitted in the single threaded case */ return 0; } ecbuild-3.16.0/examples/find_package/projects/netcdf/0000775000175000017500000000000015252726137022713 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/netcdf/CMakeLists.txt0000664000175000017500000000773415252726137025466 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.0.0 REQUIRED ) project( find_netcdf VERSION 0.0.0 LANGUAGES C CXX Fortran ) find_package( NetCDF 4 REQUIRED COMPONENTS C CXX CXX_LEGACY Fortran ) if( NOT NetCDF_FOUND ) ecbuild_error( "NetCDF_FOUND not set" ) endif() set( suffix using_targets ) ecbuild_add_test( TARGET test_netcdf_cxx_${suffix} SOURCES netcdf_examples/test_netcdf_cxx.cc LIBS NetCDF::NetCDF_CXX ) ecbuild_add_test( TARGET test_netcdf_c_${suffix} SOURCES netcdf_examples/test_netcdf_c.c LIBS NetCDF::NetCDF_C ) ecbuild_add_test( TARGET test_netcdf_fortran_${suffix} SOURCES netcdf_examples/test_netcdf_fortran.F90 LIBS NetCDF::NetCDF_Fortran ) ecbuild_add_test( TARGET test_netcdf_f77_${suffix} SOURCES netcdf_examples/test_netcdf_f77.F LIBS NetCDF::NetCDF_Fortran ) ecbuild_add_test( TARGET test_netcdf_cxx_legacy_${suffix} SOURCES netcdf_examples/test_netcdf_cxx_legacy.cc LIBS NetCDF::NetCDF_CXX_LEGACY ) if( ECBUILD_2_COMPAT ) foreach( NETCDF NetCDF NetCDF4 NETCDF NETCDF4 ) if( NOT ${NETCDF}_FOUND ) ecbuild_error( "${NETCDF}_FOUND not set" ) endif() if( NOT ${NETCDF}_INCLUDE_DIRS ) ecbuild_error( "${NETCDF}_INCLUDE_DIRS not set" ) endif() if( NOT ${NETCDF}_LIBRARIES ) ecbuild_error( "${NETCDF}_LIBRARIES not set" ) endif() foreach( component C CXX CXX_LEGACY Fortran FORTRAN ) if( NOT ${NETCDF}_${component}_FOUND ) ecbuild_error( "${NETCDF}_${component}_FOUND not set" ) endif() if( NOT ${NETCDF}_${component}_INCLUDE_DIRS ) ecbuild_error( "${NETCDF}_${component}_INCLUDE_DIRS not set" ) endif() if( NOT ${NETCDF}_${component}_LIBRARIES ) ecbuild_error( "${NETCDF}_${component}_LIBRARIES not set" ) endif() endforeach() set( suffix using_vars_${NETCDF} ) ecbuild_add_test( TARGET test_netcdf_cxx_${suffix} SOURCES netcdf_examples/test_netcdf_cxx.cc LIBS ${${NETCDF}_CXX_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_c_${suffix} SOURCES netcdf_examples/test_netcdf_c.c LIBS ${${NETCDF}_C_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_fortran_${suffix}_Fortran SOURCES netcdf_examples/test_netcdf_fortran.F90 LIBS ${${NETCDF}_Fortran_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_fortran_${suffix}_FORTRAN SOURCES netcdf_examples/test_netcdf_fortran.F90 LIBS ${${NETCDF}_FORTRAN_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_f77_${suffix}_Fortran SOURCES netcdf_examples/test_netcdf_f77.F LIBS ${${NETCDF}_Fortran_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_f77_${suffix}_FORTRAN SOURCES netcdf_examples/test_netcdf_f77.F LIBS ${${NETCDF}_FORTRAN_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) ecbuild_add_test( TARGET test_netcdf_cxx_legacy_${suffix} SOURCES netcdf_examples/test_netcdf_cxx_legacy.cc LIBS ${${NETCDF}_CXX_LEGACY_LIBRARIES} INCLUDES ${${NETCDF}_INCLUDE_DIRS} ) endforeach() endif() ecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/0000775000175000017500000000000015252726137026054 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/test_netcdf_fortran.F900000664000175000017500000000651315252726137032376 0ustar alastairalastair! This is part of the netCDF package. ! Copyright 2006 University Corporation for Atmospheric Research/Unidata. ! See COPYRIGHT file for conditions of use. ! This is a very simple example which writes a 2D array of ! sample data. To handle this in netCDF we create two shared ! dimensions, "x" and "y", and a netCDF variable, called "data". ! This example demonstrates the netCDF Fortran 90 API. This is part ! of the netCDF tutorial, which can be found at: ! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial ! Full documentation of the netCDF Fortran 90 API can be found at: ! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90 ! $Id: simple_xy_wr.f90,v 1.7 2006/12/09 18:44:58 russ Exp $ program simple_xy_wr use netcdf implicit none ! This is the name of the data file we will create. character (len = *), parameter :: FILE_NAME = "simple_xy.nc" ! We are writing 2D data, a 6 x 12 grid. integer, parameter :: NDIMS = 2 integer, parameter :: NX = 6, NY = 12 ! When we create netCDF files, variables and dimensions, we get back ! an ID for each one. integer :: ncid, varid, dimids(NDIMS) integer :: x_dimid, y_dimid ! This is the data array we will write. It will just be filled with ! a progression of integers for this example. integer :: data_out(NY, NX) ! Loop indexes, and error handling. integer :: x, y ! Create some pretend data. If this wasn't an example program, we ! would have some real data to write, for example, model output. do x = 1, NX do y = 1, NY data_out(y, x) = (x - 1) * NY + (y - 1) end do end do ! Always check the return code of every netCDF function call. In ! this example program, wrapping netCDF calls with "call check()" ! makes sure that any return which is not equal to nf90_noerr (0) ! will print a netCDF error message and exit. ! Create the netCDF file. The nf90_clobber parameter tells netCDF to ! overwrite this file, if it already exists. call check( nf90_create(FILE_NAME, NF90_CLOBBER, ncid) ) ! Define the dimensions. NetCDF will hand back an ID for each. call check( nf90_def_dim(ncid, "x", NX, x_dimid) ) call check( nf90_def_dim(ncid, "y", NY, y_dimid) ) ! The dimids array is used to pass the IDs of the dimensions of ! the variables. Note that in fortran arrays are stored in ! column-major format. dimids = (/ y_dimid, x_dimid /) ! Define the variable. The type of the variable in this case is ! NF90_INT (4-byte integer). call check( nf90_def_var(ncid, "data", NF90_INT, dimids, varid) ) ! End define mode. This tells netCDF we are done defining metadata. call check( nf90_enddef(ncid) ) ! Write the pretend data to the file. Although netCDF supports ! reading and writing subsets of data, in this case we write all the ! data in one operation. call check( nf90_put_var(ncid, varid, data_out) ) ! Close the file. This frees up any internal netCDF resources ! associated with the file, and flushes any buffers. call check( nf90_close(ncid) ) print *, "*** SUCCESS writing example file simple_xy.nc! " contains subroutine check(status) integer, intent ( in) :: status if(status /= nf90_noerr) then print *, trim(nf90_strerror(status)) stop "Stopped" end if end subroutine check end program simple_xy_wrecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/COPYRIGHT0000664000175000017500000000265515252726137027357 0ustar alastairalastairCopyright 2018 Unidata 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. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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. ecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/test_netcdf_cxx_legacy.cc0000664000175000017500000000530715252726137033100 0ustar alastairalastair/* This is part of the netCDF package. Copyright 2006 University Corporation for Atmospheric Research/Unidata. See COPYRIGHT file for conditions of use. This is a very simple example which writes a 2D array of sample data. To handle this in netCDF we create two shared dimensions, "x" and "y", and a netCDF variable, called "data". This example is part of the netCDF tutorial: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial Full documentation of the netCDF C++ API can be found at: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx $Id: simple_xy_wr.cpp,v 1.14 2006/08/18 18:57:30 russ Exp $ */ #include #include using namespace std; // We are writing 2D data, a 6 x 12 grid. static const int NDIMS = 2; static const int NX = 6; static const int NY = 12; // Return this in event of a problem. static const int NC_ERR = 2; int main(void) { // This is the data array we will write. It will just be filled // with a progression of numbers for this example. int dataOut[NX][NY]; // Create some pretend data. If this wasn't an example program, we // would have some real data to write, for example, model output. for(int i = 0; i < NX; i++) for(int j = 0; j < NY; j++) dataOut[i][j] = i * NY + j; // Create the file. The Replace parameter tells netCDF to overwrite // this file, if it already exists. NcFile dataFile("simple_xy.nc", NcFile::Replace); // You should always check whether a netCDF file creation or open // constructor succeeded. if (!dataFile.is_valid()) { cout << "Couldn't open file!\n"; return NC_ERR; } // For other method calls, the default behavior of the C++ API is // to exit with a message if there is an error. If that behavior // is OK, there is no need to check return values in simple cases // like the following. // When we create netCDF dimensions, we get back a pointer to an // NcDim for each one. NcDim* xDim = dataFile.add_dim("x", NX); NcDim* yDim = dataFile.add_dim("y", NY); // Define a netCDF variable. The type of the variable in this case // is ncInt (32-bit integer). NcVar *data = dataFile.add_var("data", ncInt, xDim, yDim); // Write the pretend data to the file. Although netCDF supports // reading and writing subsets of data, in this case we write all // the data in one operation. data->put(&dataOut[0][0], NX, NY); // The file will be automatically close when the NcFile object goes // out of scope. This frees up any internal netCDF resources // associated with the file, and flushes any buffers. cout << "*** SUCCESS writing example file simple_xy.nc!" << endl; return 0; } ecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/test_netcdf_c.c0000664000175000017500000000653015252726137031030 0ustar alastairalastair/* This is part of the netCDF package. Copyright 2006 University Corporation for Atmospheric Research/Unidata. See COPYRIGHT file for conditions of use. This is a very simple example which writes a 2D array of sample data. To handle this in netCDF we create two shared dimensions, "x" and "y", and a netCDF variable, called "data". This example demonstrates the netCDF C API. This is part of the netCDF tutorial, which can be found at: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial Full documentation of the netCDF C API can be found at: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c $Id: simple_xy_wr.c,v 1.11 2006/09/27 13:44:36 ed Exp $ */ #include #include #include /* This is the name of the data file we will create. */ #define FILE_NAME "simple_xy.nc" /* We are writing 2D data, a 6 x 12 grid. */ #define NDIMS 2 #define NX 6 #define NY 12 /* Handle errors by printing an error message and exiting with a * non-zero status. */ #define ERRCODE 2 #define ERR(e) {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);} int main() { /* When we create netCDF variables and dimensions, we get back an * ID for each one. */ int ncid, x_dimid, y_dimid, varid; int dimids[NDIMS]; /* This is the data array we will write. It will just be filled * with a progression of numbers for this example. */ int data_out[NX][NY]; /* Loop indexes, and error handling. */ int x, y, retval; /* Create some pretend data. If this wasn't an example program, we * would have some real data to write, for example, model * output. */ for (x = 0; x < NX; x++) for (y = 0; y < NY; y++) data_out[x][y] = x * NY + y; /* Always check the return code of every netCDF function call. In * this example program, any retval which is not equal to NC_NOERR * (0) will cause the program to print an error message and exit * with a non-zero return code. */ /* Create the file. The NC_CLOBBER parameter tells netCDF to * overwrite this file, if it already exists.*/ if ((retval = nc_create(FILE_NAME, NC_CLOBBER, &ncid))) ERR(retval); /* Define the dimensions. NetCDF will hand back an ID for each. */ if ((retval = nc_def_dim(ncid, "x", NX, &x_dimid))) ERR(retval); if ((retval = nc_def_dim(ncid, "y", NY, &y_dimid))) ERR(retval); /* The dimids array is used to pass the IDs of the dimensions of * the variable. */ dimids[0] = x_dimid; dimids[1] = y_dimid; /* Define the variable. The type of the variable in this case is * NC_INT (4-byte integer). */ if ((retval = nc_def_var(ncid, "data", NC_INT, NDIMS, dimids, &varid))) ERR(retval); /* End define mode. This tells netCDF we are done defining * metadata. */ if ((retval = nc_enddef(ncid))) ERR(retval); /* Write the pretend data to the file. Although netCDF supports * reading and writing subsets of data, in this case we write all * the data in one operation. */ if ((retval = nc_put_var_int(ncid, varid, &data_out[0][0]))) ERR(retval); /* Close the file. This frees up any internal netCDF resources * associated with the file, and flushes any buffers. */ if ((retval = nc_close(ncid))) ERR(retval); printf("*** SUCCESS writing example file simple_xy.nc!\n"); return 0; }ecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/test_netcdf_f77.F0000664000175000017500000000746015252726137031157 0ustar alastairalastairC This is part of the netCDF package. C Copyright 2006 University Corporation for Atmospheric Research/Unidata. C See COPYRIGHT file for conditions of use. C This is a very simple example which writes a 2D array of C sample data. To handle this in netCDF we create two shared C dimensions, "x" and "y", and a netCDF variable, called "data". C This example demonstrates the netCDF Fortran 77 API. This is part C of the netCDF tutorial, which can be found at: C http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial C Full documentation of the netCDF Fortran 77 API can be found at: C http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77 C $Id: simple_xy_wr.f,v 1.9 2007/01/24 19:45:09 russ Exp $ program simple_xy_wr implicit none include 'netcdf.inc' C This is the name of the data file we will create. character*(*) FILE_NAME parameter (FILE_NAME='simple_xy.nc') C We are writing 2D data, a 6 x 12 grid. integer NDIMS parameter (NDIMS=2) integer NX, NY parameter (NX = 6, NY = 12) C When we create netCDF files, variables and dimensions, we get back C an ID for each one. integer ncid, varid, dimids(NDIMS) integer x_dimid, y_dimid C This is the data array we will write. It will just be filled with C a progression of integers for this example. integer data_out(NY, NX) C Loop indexes, and error handling. integer x, y, retval C Create some pretend data. If this wasn't an example program, we C would have some real data to write, for example, model output. do x = 1, NX do y = 1, NY data_out(y, x) = (x - 1) * NY + (y - 1) end do end do C Always check the return code of every netCDF function call. In C this example program, any retval which is not equal to nf_noerr C (0) will call handle_err, which prints a netCDF error message, and C then exits with a non-zero return code. C Create the netCDF file. The nf_clobber parameter tells netCDF to C overwrite this file, if it already exists. retval = nf_create(FILE_NAME, NF_CLOBBER, ncid) if (retval .ne. nf_noerr) call handle_err(retval) C Define the dimensions. NetCDF will hand back an ID for each. retval = nf_def_dim(ncid, "x", NX, x_dimid) if (retval .ne. nf_noerr) call handle_err(retval) retval = nf_def_dim(ncid, "y", NY, y_dimid) if (retval .ne. nf_noerr) call handle_err(retval) C The dimids array is used to pass the IDs of the dimensions of C the variables. Note that in fortran arrays are stored in C column-major format. dimids(2) = x_dimid dimids(1) = y_dimid C Define the variable. The type of the variable in this case is C NF_INT (4-byte integer). retval = nf_def_var(ncid, "data", NF_INT, NDIMS, dimids, varid) if (retval .ne. nf_noerr) call handle_err(retval) C End define mode. This tells netCDF we are done defining metadata. retval = nf_enddef(ncid) if (retval .ne. nf_noerr) call handle_err(retval) C Write the pretend data to the file. Although netCDF supports C reading and writing subsets of data, in this case we write all the C data in one operation. retval = nf_put_var_int(ncid, varid, data_out) if (retval .ne. nf_noerr) call handle_err(retval) C Close the file. This frees up any internal netCDF resources C associated with the file, and flushes any buffers. retval = nf_close(ncid) if (retval .ne. nf_noerr) call handle_err(retval) print *,'*** SUCCESS writing example file simple_xy.nc!' end subroutine handle_err(errcode) implicit none include 'netcdf.inc' integer errcode print *, 'Error: ', nf_strerror(errcode) stop 2 endecbuild-3.16.0/examples/find_package/projects/netcdf/netcdf_examples/test_netcdf_cxx.cc0000664000175000017500000000510515252726137031550 0ustar alastairalastair/* This is part of the netCDF package. Copyright 2006 University Corporation for Atmospheric Research/Unidata. See COPYRIGHT file for conditions of use. This is a very simple example which writes a 2D array of sample data. To handle this in netCDF we create two shared dimensions, "x" and "y", and a netCDF variable, called "data". This example is part of the netCDF tutorial: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial Full documentation of the netCDF C++ API can be found at: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx $Id: simple_xy_wr.cpp,v 1.5 2010/02/11 22:36:43 russ Exp $ */ #include #include #include using namespace std; using namespace netCDF; using namespace netCDF::exceptions; // We are writing 2D data, a 6 x 12 grid. static const int NX = 6; static const int NY = 12; // Return this in event of a problem. static const int NC_ERR = 2; int main() { // This is the data array we will write. It will just be filled // with a progression of numbers for this example. int dataOut[NX][NY]; // Create some pretend data. If this wasn't an example program, we // would have some real data to write, for example, model output. for(int i = 0; i < NX; i++) for(int j = 0; j < NY; j++) dataOut[i][j] = i * NY + j; // The default behavior of the C++ API is to throw an exception i // an error occurs. A try catch block is necessary. try { // Create the file. The Replace parameter tells netCDF to overwrite // this file, if it already exists. NcFile dataFile("simple_xy.nc", NcFile::replace); // Create netCDF dimensions NcDim xDim = dataFile.addDim("x", NX); NcDim yDim = dataFile.addDim("y", NY); // Define the variable. The type of the variable in this case is // ncInt (32-bit integer). vector dims; dims.push_back(xDim); dims.push_back(yDim); NcVar data = dataFile.addVar("data", ncInt, dims); // Write the data to the file. Although netCDF supports // reading and writing subsets of data, in this case we write all // the data in one operation. data.putVar(dataOut); // The file will be automatically close when the NcFile object goes // out of scope. This frees up any internal netCDF resources // associated with the file, and flushes any buffers. //cout << "*** SUCCESS writing example file simple_xy.nc!" << endl; return 0; } catch(NcException& e) {e.what(); return NC_ERR; } }ecbuild-3.16.0/examples/find_package/projects/mpi_fortran/0000775000175000017500000000000015252726137023770 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/mpi_fortran/main_f90.F900000664000175000017500000000031015252726137025644 0ustar alastairalastairprogram main use mpi, only : MPI_Initialized implicit none integer :: ierror logical :: flag call MPI_Initialized(flag, ierror) write(0,*) "MPI initialized: ", flag end programecbuild-3.16.0/examples/find_package/projects/mpi_fortran/main_f08.F900000664000175000017500000000031415252726137025647 0ustar alastairalastairprogram main use mpi_f08, only : MPI_Initialized implicit none integer :: ierror logical :: flag call MPI_Initialized(flag, ierror) write(0,*) "MPI initialized: ", flag end programecbuild-3.16.0/examples/find_package/projects/mpi_fortran/CMakeLists.txt0000664000175000017500000000367215252726137026540 0ustar alastairalastair# Specify "MPI_HOME" in environment cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) project( find_mpi_fortran VERSION 0.0.0 LANGUAGES Fortran ) # set(CMAKE_FIND_DEBUG_MODE TRUE) find_package( MPI REQUIRED COMPONENTS Fortran ) message( "MPI_FOUND : ${MPI_FOUND}" ) message( "MPI_Fortran_FOUND : ${MPI_Fortran_FOUND}" ) message( "MPI_Fortran_VERSION : ${MPI_Fortran_VERSION}" ) message( "MPI_Fortran_LIBRARIES : ${MPI_Fortran_LIBRARIES}" ) message( "MPI_Fortran_INCLUDE_DIRS : ${MPI_Fortran_INCLUDE_DIRS}" ) message( "MPI_Fortran_LINK_FLAGS : ${MPI_Fortran_LINK_FLAGS}" ) message( "MPI_Fortran_COMPILE_OPTIONS : ${MPI_Fortran_COMPILE_OPTIONS}" ) message( "MPI_Fortran_COMPILE_DEFINITIONS : ${MPI_Fortran_COMPILE_DEFINITIONS}" ) message( "MPI_Fortran_HAVE_F77_HEADER : ${MPI_Fortran_HAVE_F77_HEADER}" ) message( "MPI_Fortran_HAVE_F90_MODULE : ${MPI_Fortran_HAVE_F90_MODULE}" ) message( "MPI_Fortran_HAVE_F08_MODULE : ${MPI_Fortran_HAVE_F08_MODULE}" ) message( "MPIEXEC_EXECUTABLE : ${MPIEXEC_EXECUTABLE}" ) message( "MPIEXEC_NUMPROC_FLAG : ${MPIEXEC_NUMPROC_FLAG}" ) message( "MPIEXEC_MAX_NUMPROCS : ${MPIEXEC_MAX_NUMPROCS}" ) message( "MPIEXEC_PREFLAGS : ${MPIEXEC_PREFLAGS}" ) message( "MPIEXEC_POSTFLAGS : ${MPIEXEC_POSTFLAGS}" ) enable_testing() if ( MPI_Fortran_HAVE_F77_HEADER ) add_executable(main_f77 main_f77.F90) target_link_libraries(main_f77 PUBLIC MPI::MPI_Fortran) add_test(test_mpi_fortran_f77 main_f77) endif() if ( MPI_Fortran_HAVE_F90_MODULE ) add_executable(main_f90 main_f90.F90) target_link_libraries(main_f90 PUBLIC MPI::MPI_Fortran) add_test(test_mpi_fortran_f90 main_f90) endif() if ( MPI_Fortran_HAVE_F08_MODULE ) add_executable(main_f08 main_f08.F90) target_link_libraries(main_f08 PUBLIC MPI::MPI_Fortran) add_test(test_mpi_fortran_f08 main_f08) endif()ecbuild-3.16.0/examples/find_package/projects/mpi_fortran/main_f77.F900000664000175000017500000000026615252726137025663 0ustar alastairalastairprogram main implicit none #include "mpif.h" integer :: ierror logical :: flag call MPI_Initialized(flag, ierror) write(0,*) "MPI initialized: ", flag end programecbuild-3.16.0/examples/find_package/projects/cuda/0000775000175000017500000000000015252726137022364 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/cuda/main.cc0000664000175000017500000000141015252726137023613 0ustar alastairalastair#include #include #include #include "add.h" int main(void) { int N = 1<<20; float *x, *y; // Allocate Unified Memory – accessible from CPU or GPU cudaMallocManaged(&x, N*sizeof(float)); cudaMallocManaged(&y, N*sizeof(float)); // initialize x and y arrays on the host for (int i = 0; i < N; i++) { x[i] = 1.0f; y[i] = 2.0f; } // Run kernel on 1M elements on the GPU add(N,x,y); // Wait for GPU to finish before accessing on host cudaDeviceSynchronize(); // Check for errors (all values should be 3.0f) float maxError = 0.0f; for (int i = 0; i < N; i++) maxError = fmax(maxError, fabs(y[i]-3.0f)); printf("Max error: %.4f\n"); // Free memory cudaFree(x); cudaFree(y); return 0; }ecbuild-3.16.0/examples/find_package/projects/cuda/CMakeLists.txt0000664000175000017500000000455615252726137025136 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.3.0 REQUIRED ) project( find_cuda VERSION 0.0.0 LANGUAGES CXX ) macro( enable_cuda ) include(CheckLanguage) check_language(CUDA) if( CMAKE_CUDA_COMPILER ) enable_language( CUDA ) ecbuild_info( "CUDA language enabled" ) find_package( CUDAToolkit QUIET ) # Backward compatibility for CMake version < 3.17 if( NOT TARGET CUDA::cudart ) # There is no find_package(CUDART) in CMake. So we need to do that manually. # https://gitlab.kitware.com/cmake/cmake/issues/17816 find_library(CUDA_CUDART_LIBRARY cudart ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES}) mark_as_advanced(CUDA_CUDART_LIBRARY) if (NOT CUDA_CUDART_LIBRARY) message(FATAL_ERROR "Cuda runtime was not found") endif() add_library( CUDA::cudart INTERFACE IMPORTED ) set_target_properties(CUDA::cudart PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} INTERFACE_LINK_LIBRARIES ${CUDA_CUDART_LIBRARY} ) endif() if( NOT TARGET CUDA::cudart_static ) # There is no find_package(CUDART) in CMake. So we need to do that manually. # https://gitlab.kitware.com/cmake/cmake/issues/17816 find_library(CUDA_CUDART_STATIC_LIBRARY cudart_static ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES}) mark_as_advanced(CUDA_CUDART_STATIC_LIBRARY) if (NOT CUDA_CUDART_STATIC_LIBRARY) message(FATAL_ERROR "Cuda runtime was not found") endif() add_library( CUDA::cudart_static INTERFACE IMPORTED ) set_target_properties(CUDA::cudart_static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} INTERFACE_LINK_LIBRARIES ${CUDA_CUDART_STATIC_LIBRARY} ) endif() else() ecbuild_critical("CUDA enabled through find_package(CUDA) instead of enable_language(CUDA)") find_package( CUDA ) endif() endmacro() enable_cuda() ecbuild_add_library( TYPE SHARED TARGET add SOURCES add.h add.cu kernel_add.h kernel_add.cu PUBLIC_LIBS CUDA::cudart ) ecbuild_add_executable( TARGET main SOURCES main.cc LIBS add ) ecbuild-3.16.0/examples/find_package/projects/cuda/kernel_add.cu0000664000175000017500000000032015252726137025000 0ustar alastairalastair#include "kernel_add.h" // CUDA Kernel function to add the elements of two arrays on the GPU __global__ void kernel_add(int n, float *x, float *y) { for (int i = 0; i < n; i++) y[i] = x[i] + y[i]; } ecbuild-3.16.0/examples/find_package/projects/cuda/kernel_add.h0000664000175000017500000000021215252726137024620 0ustar alastairalastair#pragma once // CUDA Kernel function to add the elements of two arrays on the GPU __global__ void kernel_add(int n, float *x, float *y); ecbuild-3.16.0/examples/find_package/projects/cuda/add.cu0000664000175000017500000000016415252726137023446 0ustar alastairalastair#include "add.h" #include "kernel_add.h" void add(int n, float* x, float* y) { kernel_add<<<1, 1>>>(n, x, y); }ecbuild-3.16.0/examples/find_package/projects/cuda/add.h0000664000175000017500000000006215252726137023263 0ustar alastairalastair#pragma once void add(int n, float* x, float* y);ecbuild-3.16.0/examples/find_package/projects/tcmalloc/0000775000175000017500000000000015252726137023246 5ustar alastairalastairecbuild-3.16.0/examples/find_package/projects/tcmalloc/CMakeLists.txt0000664000175000017500000000150015252726137026002 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild 3.0.0 REQUIRED ) project( find_tcmalloc VERSION 0.0.0 LANGUAGES C Fortran ) ecbuild_add_option( FEATURE TCMALLOC DEFAULT OFF DESCRIPTION "tcmalloc memory handling" REQUIRED_PACKAGES Tcmalloc ) if( HAVE_TCMALLOC ) # Automatically link all executables with tcmalloc set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,${TCMALLOC_LIBRARY_DIR}" ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${TCMALLOC_LIBRARIES}" ) endif() ecbuild_add_executable( TARGET main SOURCES main.c ) ecbuild_add_executable( TARGET main_f SOURCES main.F90 ) # Run executables as test ecbuild_add_test( TARGET test_main COMMAND main ) ecbuild_add_test( TARGET test_main_f COMMAND main_f ) ecbuild-3.16.0/examples/find_package/projects/tcmalloc/main.F900000664000175000017500000000016215252726137024451 0ustar alastairalastairprogram main implicit none real(8), allocatable :: a(:) allocate(a(32)) a(:)=1. write(6,'(F8.6)') a(1) end programecbuild-3.16.0/examples/find_package/projects/tcmalloc/main.c0000664000175000017500000000035115252726137024335 0ustar alastairalastair#include #include int main() { int length = 32; double* array = (double*) malloc( sizeof(double) * length ); for( int i=0; i/dev/null HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" function cleanup { EXIT_CODE=$? { set +ex; } 2>/dev/null if [[ -n $BUILD_DIR ]]; then set -x rm -Rf $BUILD_DIR fi exit $EXIT_CODE } trap cleanup EXIT function build() { echo "build" export ecbuild_DIR=${HERE}/../.. _NAME="$1" _SRC="$2" _CMAKE_FLAGS="$3" echo Building project ${_NAME} TMPDIR="${TMPDIR:-$(pwd)}" BUILD_DIR="${TMPDIR}/build_${_NAME}_$(date +%Y-%m-%d_%H-%M-%S)" set -x mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR} cmake ${_CMAKE_FLAGS} ${HERE}/${_SRC} make ${MAKE_ARGS} ctest } ecbuild-3.16.0/examples/find_package/find_proj4.sh0000775000175000017500000000020115252726137022205 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build proj4 projects/proj4 ecbuild-3.16.0/examples/find_package/find_netcdf.sh0000775000175000017500000000020315252726137022414 0ustar alastairalastair#!/usr/bin/env bash HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" source ${HERE}/build.sh build netcdf projects/netcdf ecbuild-3.16.0/examples/cpp-bundle-nested/0000775000175000017500000000000015252726137020535 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle-nested/CMakeLists.txt0000664000175000017500000000120115252726137023267 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( cpp_bundle_nested VERSION 0.10.0 LANGUAGES C CXX ) ecbuild_bundle_initialize() ecbuild_bundle( PROJECT bar ) ecbuild_bundle( PROJECT baz ) ecbuild_bundle_finalize() ecbuild-3.16.0/examples/cpp-bundle-nested/bar/0000775000175000017500000000000015252726137021301 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle-nested/bar/main.cc0000664000175000017500000000026615252726137022540 0ustar alastairalastair#include extern "C" { #include "foo.h" #include "bar.h" } int main() { std::cout << "foo is " << foo() << std::endl; std::cout << "bar is " << bar() << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/bar/CMakeLists.txt0000664000175000017500000000204115252726137024036 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( bar VERSION 1.0.0 LANGUAGES C CXX ) ### targets ecbuild_bundle( PROJECT foo ) ecbuild_add_library( TARGET bar PUBLIC_LIBS foo SOURCES bar.h bar.c PUBLIC_INCLUDES $ ) ecbuild_add_executable( TARGET master_bar SOURCES main.cc LIBS bar ) ecbuild_add_test( TARGET test_bar SOURCES test.cc LIBS bar ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cpp-bundle-nested/bar/test.cc0000664000175000017500000000025715252726137022573 0ustar alastairalastair#include extern "C" { #include "bar.h" } int main() { if( bar() == 42*42 ) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/0000775000175000017500000000000015252726137022064 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/main.cc0000664000175000017500000000016515252726137023321 0ustar alastairalastair#include extern "C" { #include "foo.h" } int main() { std::cout << "foo is " << foo() << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/CMakeLists.txt0000664000175000017500000000121415252726137024622 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( foo VERSION 1.0.0 LANGUAGES C CXX ) ### targets ecbuild_add_library(TARGET foo SOURCES foo.h foo.c INSTALL_HEADERS LISTED PUBLIC_INCLUDES $ ) ecbuild_add_executable( TARGET master_foo SOURCES main.cc LIBS foo ) ecbuild_add_test( TARGET test_foo SOURCES test.cc LIBS foo ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/foo.c0000664000175000017500000000003315252726137023007 0ustar alastairalastairint foo() { return 42; } ecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/test.cc0000664000175000017500000000025315252726137023352 0ustar alastairalastair#include extern "C" { #include "foo.h" } int main() { if( foo() == 42) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/bar/foo/foo.h0000664000175000017500000000005715252726137023022 0ustar alastairalastair#ifndef foo_h #define foo_h int foo(); #endifecbuild-3.16.0/examples/cpp-bundle-nested/bar/bar.h0000664000175000017500000000005715252726137022220 0ustar alastairalastair#ifndef bar_h #define bar_h int bar(); #endifecbuild-3.16.0/examples/cpp-bundle-nested/bar/bar.c0000664000175000017500000000007015252726137022206 0ustar alastairalastair#include "foo.h" int bar() { return foo() * foo(); } ecbuild-3.16.0/examples/cpp-bundle-nested/README.md0000664000175000017500000000024015252726137022010 0ustar alastairalastair# C++ bundle example with nested sub-projects Same as ../cpp-bundle, but with a sub-project inside a sub-project. # Usage ecbuild examples/cpp-bundle-nested ecbuild-3.16.0/examples/cpp-bundle-nested/baz/0000775000175000017500000000000015252726137021311 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle-nested/baz/baz.h0000664000175000017500000000005715252726137022240 0ustar alastairalastair#ifndef baz_h #define baz_h int baz(); #endifecbuild-3.16.0/examples/cpp-bundle-nested/baz/main.cc0000664000175000017500000000026615252726137022550 0ustar alastairalastair#include extern "C" { #include "foo.h" #include "baz.h" } int main() { std::cout << "foo is " << foo() << std::endl; std::cout << "baz is " << baz() << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/baz/CMakeLists.txt0000664000175000017500000000126215252726137024052 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( baz VERSION 1.0.0 LANGUAGES C CXX ) ### targets ecbuild_find_package( NAME foo REQUIRED ) ecbuild_add_library( TARGET baz SOURCES baz.h baz.c PUBLIC_LIBS foo PUBLIC_INCLUDES $ ) ecbuild_add_executable( TARGET master_baz SOURCES main.cc LIBS baz ) ecbuild_add_test( TARGET test_baz SOURCES test.cc LIBS baz ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cpp-bundle-nested/baz/test.cc0000664000175000017500000000026215252726137022577 0ustar alastairalastair#include extern "C" { #include "baz.h" } int main() { if( baz() == 42*42*42 ) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; } ecbuild-3.16.0/examples/cpp-bundle-nested/baz/baz.c0000664000175000017500000000010015252726137022220 0ustar alastairalastair#include "foo.h" int baz() { return foo() * foo() * foo(); } ecbuild-3.16.0/examples/cxx11/0000775000175000017500000000000015252726137016170 5ustar alastairalastairecbuild-3.16.0/examples/cxx11/CMakeLists.txt0000664000175000017500000000135215252726137020731 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( cxx11 VERSION 0.0.1 LANGUAGES CXX ) ### definitions set(CMAKE_CXX_STANDARD 11) ### targets ecbuild_add_executable( TARGET compute SOURCES compute.cc ) ### finalize project ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cxx11/compute.cc0000664000175000017500000000064715252726137020162 0ustar alastairalastair#include #if __cplusplus > 199711L #pragma message "C++11 enabled" #include #define __set std::unordered_set #else #pragma message "C++11 disabled" #include #define __set std::set #endif int main() { __set s; s.insert(7); s.insert(5); s.insert(3); for(__set::const_iterator it = s.begin(); it != s.end(); ++it) std::cout << *it << std::endl; return 0; } ecbuild-3.16.0/examples/cxx11/README.md0000664000175000017500000000015615252726137017451 0ustar alastairalastairSimple example demonstrating the use of C++11 features with a fallback. Usage: ===== ecbuild examples/cxx11 ecbuild-3.16.0/examples/cpp-bundle/0000775000175000017500000000000015252726137017255 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle/CMakeLists.txt0000664000175000017500000000117015252726137022014 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( cpp_bundle VERSION 0.10.0 LANGUAGES C CXX ) ecbuild_bundle_initialize() ecbuild_bundle( PROJECT foo ) ecbuild_bundle( PROJECT bar ) ecbuild_bundle_finalize() ecbuild-3.16.0/examples/cpp-bundle/bar/0000775000175000017500000000000015252726137020021 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle/bar/baz.h0000664000175000017500000000005715252726137020750 0ustar alastairalastair#ifndef baz_h #define baz_h int baz(); #endifecbuild-3.16.0/examples/cpp-bundle/bar/main.cc0000664000175000017500000000037515252726137021261 0ustar alastairalastair#include extern "C" { #include "bar.h" #include "baz.h" #include "zingo.h" } int main() { std::cout << "bar is " << bar() << std::endl; std::cout << "baz is " << baz() << std::endl; std::cout << "zingo is " << zingo() << std::endl; } ecbuild-3.16.0/examples/cpp-bundle/bar/CMakeLists.txt0000664000175000017500000000315615252726137022566 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( bar VERSION 1.0.0 LANGUAGES C CXX ) ### targets ecbuild_find_package( NAME foo REQUIRED ) ecbuild_add_library( TARGET baz TYPE OBJECT SOURCES baz.h baz.c PRIVATE_LIBS foo PUBLIC_INCLUDES $ $ ) ecbuild_add_library( TARGET bar SOURCES bar.h bar.c OBJECTS baz PRIVATE_LIBS foo PUBLIC_INCLUDES $ $ ) ecbuild_add_library( TARGET zingo TYPE OBJECT SOURCES zingo.h zingo.c PRIVATE_LIBS foo PUBLIC_INCLUDES $ $ ) ecbuild_add_executable( TARGET master_bar SOURCES main.cc OBJECTS zingo LIBS bar foo ) ecbuild_add_test( TARGET test_bar SOURCES test.cc OBJECTS zingo PROPERTIES TIMEOUT 60 LIBS bar foo ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cpp-bundle/bar/zingo.h0000664000175000017500000000006515252726137021321 0ustar alastairalastair#ifndef zingo_h #define zingo_h int zingo(); #endifecbuild-3.16.0/examples/cpp-bundle/bar/test.cc0000664000175000017500000000045615252726137021314 0ustar alastairalastair#include extern "C" { #include "bar.h" #include "zingo.h" } int main() { if( bar() == 42*42 ) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; if( zingo() == 41*42 ) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; }ecbuild-3.16.0/examples/cpp-bundle/bar/baz.c0000664000175000017500000000007715252726137020745 0ustar alastairalastair#include "foo.h" int baz() { return foo() * foo() * foo(); }ecbuild-3.16.0/examples/cpp-bundle/bar/zingo.c0000664000175000017500000000007715252726137021317 0ustar alastairalastair#include "foo.h" int zingo() { return (foo() - 1) * foo(); }ecbuild-3.16.0/examples/cpp-bundle/bar/bar.h0000664000175000017500000000005715252726137020740 0ustar alastairalastair#ifndef bar_h #define bar_h int bar(); #endifecbuild-3.16.0/examples/cpp-bundle/bar/bar.c0000664000175000017500000000006715252726137020734 0ustar alastairalastair#include "foo.h" int bar() { return foo() * foo(); }ecbuild-3.16.0/examples/cpp-bundle/README.md0000664000175000017500000000030715252726137020534 0ustar alastairalastair# C++ bundle example A bundle is an ecbuild project that gathers sub-projects. ecbuild provides facilities to retrieve such sub-projects from git repositories. # Usage ecbuild examples/cpp-bundle ecbuild-3.16.0/examples/cpp-bundle/foo/0000775000175000017500000000000015252726137020040 5ustar alastairalastairecbuild-3.16.0/examples/cpp-bundle/foo/main.cc0000664000175000017500000000016515252726137021275 0ustar alastairalastair#include extern "C" { #include "foo.h" } int main() { std::cout << "foo is " << foo() << std::endl; } ecbuild-3.16.0/examples/cpp-bundle/foo/CMakeLists.txt0000664000175000017500000000127115252726137022601 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( foo VERSION 1.0.0 LANGUAGES C CXX ) ### targets set( FOO_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ) ecbuild_add_library( TARGET foo SOURCES foo.h foo.c INSTALL_HEADERS LISTED PUBLIC_INCLUDES $ $ ) ecbuild_add_executable( TARGET master_foo SOURCES main.cc LIBS foo ) ecbuild_add_test( TARGET test_foo SOURCES test.cc LIBS foo ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/cpp-bundle/foo/foo.c0000664000175000017500000000003215252726137020762 0ustar alastairalastairint foo() { return 42; }ecbuild-3.16.0/examples/cpp-bundle/foo/test.cc0000664000175000017500000000025215252726137021325 0ustar alastairalastair#include extern "C" { #include "foo.h" } int main() { if( foo() == 42) std::cout << "ok" << std::endl; else std::cout << "failed" << std::endl; }ecbuild-3.16.0/examples/cpp-bundle/foo/foo.h0000664000175000017500000000005715252726137020776 0ustar alastairalastair#ifndef foo_h #define foo_h int foo(); #endifecbuild-3.16.0/examples/README.rst0000664000175000017500000000165415252726137016721 0ustar alastairalastair======== Examples ======== This directory contains examples of some useful features of ecBuild: * `simple/ `_ - A simple ecBuild project * `fortran/ `_ - A Fortran project * `cxx11/ `_ - A C++11-enabled project * `transitive-dependencies/ `_ - Propagating dependencies across several projects * `find_package/ `_ - Using some popular third-party libraries * `cpp-bundle/ `_ - Bundling projects together * `cpp-bundle-nested/ `_ - Nested bundles * `boost-python-lib/ `_ - Using Boost::Python * `mix/ `_ - Mixing C++ and Fortran * `override-compile-flags/ `_ - Overriding compile flags on a per-file basis * `config-bundle/ `_ - Providing project-specific configuration ecbuild-3.16.0/examples/override-compile-flags/0000775000175000017500000000000015252726137021563 5ustar alastairalastairecbuild-3.16.0/examples/override-compile-flags/CMakeLists.txt0000664000175000017500000000121015252726137024315 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( override_compile_flags VERSION 0.1 LANGUAGES C Fortran ) ecbuild_bundle_initialize() ecbuild_bundle( PROJECT bar ) ecbuild_bundle( PROJECT foo ) ecbuild_bundle_finalize() ecbuild-3.16.0/examples/override-compile-flags/bar/0000775000175000017500000000000015252726137022327 5ustar alastairalastairecbuild-3.16.0/examples/override-compile-flags/bar/CMakeLists.txt0000664000175000017500000000117715252726137025075 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( bar VERSION 0.2 LANGUAGES C ) ### targets ecbuild_add_library( TARGET bar SOURCES bar.c ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/override-compile-flags/bar/bar.c0000664000175000017500000000001615252726137023234 0ustar alastairalastairvoid bar() {} ecbuild-3.16.0/examples/override-compile-flags/README.md0000664000175000017500000000150415252726137023042 0ustar alastairalastairAn example of a bundle containing two sub-projects, bar and foo, where foo needs to override compile flags of several source files. # Setup SRC_DIR=$(pwd) BUILD_DIR=$(pwd)/build mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR} # Standard build using preset compile flags: ecbuild --build=Debug ${SRC_DIR} make VERBOSE=1 # Use custom compile flags defined in JSON data file: ecbuild --build=Debug -DFOO_ECBUILD_SOURCE_FLAGS=${SRC_DIR}/foo/flags-cray-debug.json ${SRC_DIR} make VERBOSE=1 module switch cdt cdt/15.11 ecbuild --build=Debug -DFOO_ECBUILD_SOURCE_FLAGS=${SRC_DIR}/foo/flags-cray-8.4.1-debug.json ${SRC_DIR} make VERBOSE=1 # Use custom compile flags defined in CMake script: ecbuild --build=Debug -DFOO_ECBUILD_COMPILE_FLAGS=${SRC_DIR}/foo/flags.cmake ${SRC_DIR} make VERBOSE=1 ecbuild-3.16.0/examples/override-compile-flags/foo/0000775000175000017500000000000015252726137022346 5ustar alastairalastairecbuild-3.16.0/examples/override-compile-flags/foo/flags-cray-8.4.1-release.json0000664000175000017500000000050115252726137027351 0ustar alastairalastair{ "*.f90" : [ "=", "-ram -emf -hadd_paren -Othread1 -hflex_mp=conservative -hfp1" ], "*.c" : [ "=", "-O0 -fPIC" ], "*foo_contiguous.f90" : [ "+", "-hcontiguous" ], "*foo_intolerant.f90" : [ "=", "-ram -emf -hadd_paren -hflex_mp=intolerant -hfp1" ], "*foo_ivybridge.f90" : [ "+", "-hcpu=ivybridge" ] } ecbuild-3.16.0/examples/override-compile-flags/foo/flags-cray-8.4.1-debug.json0000664000175000017500000000064315252726137027026 0ustar alastairalastair{ "*.f90" : [ "=", "-G0 -ram -emf -hadd_paren -hflex_mp=conservative -hfp0" ], "*.c" : [ "=", "-g -O0 -fPIC" ], "*foo_contiguous.f90" : [ "+", "-hcontiguous" ], "*foo_intolerant.f90" : [ "=", "-G0 -ram -emf -hadd_paren -hflex_mp=intolerant -hfp0" ], "*foo_ivybridge.f90" : [ "+", "-hcpu=ivybridge" ], "*foo_no_debug_symbols.f90" : [ "=", "-ram -emf -hadd_paren -hflex_mp=conservative -hfp0" ] } ecbuild-3.16.0/examples/override-compile-flags/foo/foo.f900000664000175000017500000000003615252726137023450 0ustar alastairalastairsubroutine foo end subroutine ecbuild-3.16.0/examples/override-compile-flags/foo/CMakeLists.txt0000664000175000017500000000211415252726137025104 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( foo VERSION 0.1 LANGUAGES Fortran C ) ecbuild_enable_fortran ( REQUIRED MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/module ) ecbuild_find_package( NAME bar REQUIRED ) ### targets ecbuild_add_library( TARGET foo SOURCES foo.c foo.f90 foo_contiguous.f90 foo_intolerant.f90 foo_ivybridge.f90 foo_no_debug_symbols.f90 PRIVATE_LIBS bar ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/override-compile-flags/foo/foo.c0000664000175000017500000000001615252726137023272 0ustar alastairalastairvoid foo() {} ecbuild-3.16.0/examples/override-compile-flags/foo/flags-cray-debug.json0000664000175000017500000000041315252726137026353 0ustar alastairalastair{ "*.f90" : [ "=", "-G0 -ram -emf -hadd_paren -hflex_mp=conservative -hfp0" ], "*.c" : [ "=", "-g -O0 -fPIC" ], "*foo_contiguous.f90" : [ "+", "-hcontiguous" ], "*foo_intolerant.f90" : [ "=", "-G0 -ram -emf -hadd_paren -hflex_mp=intolerant -hfp0" ] } ecbuild-3.16.0/examples/override-compile-flags/foo/flags.cmake0000664000175000017500000000265515252726137024454 0ustar alastairalastairif(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") set(FOO_Fortran_FLAGS "-ram -emf -hadd_paren") # common flags for all build types set(FOO_Fortran_FLAGS_RELEASE "-hflex_mp=conservative -Othread1 -hfp1") set(FOO_Fortran_FLAGS_RELWITHDEBINFO "-G2 ${FOO_Fortran_FLAGS_RELEASE}") set(FOO_Fortran_FLAGS_DEBUG "-G0 -hflex_mp=conservative -hfp0") set(FOO_C_FLAGS_RELEASE "-O0 -fPIC") set(FOO_C_FLAGS_RELWITHDEBINFO "-g -O0 -fPIC") set(FOO_C_FLAGS_DEBUG "-g -O0 -fPIC") set_source_files_properties(foo_contiguous.f90 PROPERTIES COMPILE_FLAGS "-hcontiguous") set_source_files_properties(foo_intolerant.f90 PROPERTIES OVERRIDE_COMPILE_FLAGS_RELEASE "${FOO_Fortran_FLAGS} -hflex_mp=intolerant -hfp1" OVERRIDE_COMPILE_FLAGS_RELWITHDEBINFO "-G2 ${FOO_Fortran_FLAGS} -hflex_mp=intolerant -hfp1" OVERRIDE_COMPILE_FLAGS_DEBUG "-G0 ${FOO_Fortran_FLAGS} -hflex_mp=intolerant -hfp0") if($ENV{CRAY_FTN_VERSION} VERSION_EQUAL 8.4.1) # cdt/15.11 set_source_files_properties(foo_ivybridge.f90 PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") string(TOUPPER ${CMAKE_BUILD_TYPE} btype) string(REGEX REPLACE "-g|-G[0-2]|-Gfast" "" flags "${FOO_Fortran_FLAGS_${btype}}") set_source_files_properties(foo_no_debug_symbols.f90 PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags}") endif() elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") # ... elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") # ... endif() ecbuild-3.16.0/examples/override-compile-flags/foo/foo_ivybridge.f900000664000175000017500000000005015252726137025510 0ustar alastairalastairsubroutine foo_ivybridge end subroutine ecbuild-3.16.0/examples/override-compile-flags/foo/foo_no_debug_symbols.f900000664000175000017500000000005715252726137027065 0ustar alastairalastairsubroutine foo_no_debug_symbols end subroutine ecbuild-3.16.0/examples/override-compile-flags/foo/foo_contiguous.f900000664000175000017500000000005115252726137025724 0ustar alastairalastairsubroutine foo_contiguous end subroutine ecbuild-3.16.0/examples/override-compile-flags/foo/flags-cray-release.json0000664000175000017500000000041215252726137026704 0ustar alastairalastair{ "*.f90" : [ "=", "-ram -emf -hadd_paren -Othread1 -hflex_mp=conservative -hfp1" ], "*.c" : [ "=", "-O0 -fPIC" ], "*foo_contiguous.f90" : [ "+", "-hcontiguous" ], "*foo_intolerant.f90" : [ "=", "-ram -emf -hadd_paren -hflex_mp=intolerant -hfp1" ] } ecbuild-3.16.0/examples/override-compile-flags/foo/foo_intolerant.f900000664000175000017500000000005115252726137025704 0ustar alastairalastairsubroutine foo_intolerant end subroutine ecbuild-3.16.0/examples/fortran-compile-options/0000775000175000017500000000000015252726137022016 5ustar alastairalastairecbuild-3.16.0/examples/fortran-compile-options/CMakeLists.txt0000664000175000017500000000247115252726137024562 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../.. ) project( fortran_compile_options VERSION 0.0.0 LANGUAGES Fortran ) ####################################################################################################### ### Compilation without affecting this scope, using target_compile_options # Compile program in single precision ecbuild_add_executable(TARGET main_r4 SOURCES main.F90) target_compile_options(main_r4 PUBLIC $<$:${ECBUILD_Fortran_COMPILE_OPTIONS_REAL4}>) # Compile program in double precision ecbuild_add_executable(TARGET main_r8 SOURCES main.F90) target_compile_options(main_r8 PUBLIC $<$:${ECBUILD_Fortran_COMPILE_OPTIONS_REAL8}>) ####################################################################################################### ### Compilation affecting this scope. Warning, also targets above in this scope are affected! # We can add flags as a single argument with semi-colon separated options as given by list ecbuild_add_fortran_flags( -Dfoo;-Dbar ) # We can add flags as a expanded list ecbuild_add_fortran_flags( -Dbas -Dbaz ) # Test that we can add an empty variable set( empty ) ecbuild_add_fortran_flags( ${empty} ) ecbuild_add_executable(TARGET main SOURCES main.F90) ecbuild-3.16.0/examples/fortran-compile-options/main.F900000664000175000017500000000022315252726137023217 0ustar alastairalastairprogram main use, intrinsic :: iso_c_binding, only : c_sizeof REAL :: variable write(0,'("c_sizeof(REAL): ",I0)') c_sizeof(variable) end program ecbuild-3.16.0/examples/transitive-dependencies/0000775000175000017500000000000015252726137022040 5ustar alastairalastairecbuild-3.16.0/examples/transitive-dependencies/build-and-run.sh0000775000175000017500000000203715252726137025042 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" # Add ecbuild to path export PATH=$HERE/../../bin:$PATH # --------------------- cleanup ------------------------ $HERE/clean.sh # ----------------- build projectA --------------------- cd $HERE/projectA mkdir build cd build ecbuild --prefix=../install -- -DINSTALL_LIB_DIR=lib -Wno-deprecated ../ make install # ----------------- build projectB --------------------- cd $HERE/projectB mkdir build cd build ecbuild --prefix=../install -- \ -DprojectA_DIR=$HERE/projectA/install/lib/cmake/projectA \ -DINSTALL_LIB_DIR=lib -Wno-deprecated ../ make install # ----------------- build projectC --------------------- cd $HERE/projectC mkdir build cd build ecbuild --prefix=../install -- \ -DprojectA_DIR=$HERE/projectA/install/lib/cmake/projectA \ -DprojectB_DIR=$HERE/projectB/install/lib/cmake/projectB \ -DINSTALL_LIB_DIR=lib -Wno-deprecated ../ make install # ----------------- Run --------------------- cd $HERE projectC/install/bin/main-C ecbuild-3.16.0/examples/transitive-dependencies/projectC/0000775000175000017500000000000015252726137023611 5ustar alastairalastairecbuild-3.16.0/examples/transitive-dependencies/projectC/libraryC.h0000664000175000017500000000001715252726137025527 0ustar alastairalastairint libraryC();ecbuild-3.16.0/examples/transitive-dependencies/projectC/main.cc0000664000175000017500000000023315252726137025042 0ustar alastairalastair#include #include "libraryC.h" int main(int argc, char* argv[]) { std::cout << "libraryC = " << libraryC() << std::endl; return 0; } ecbuild-3.16.0/examples/transitive-dependencies/projectC/CMakeLists.txt0000664000175000017500000000062415252726137026353 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectC VERSION 0.1.0 LANGUAGES CXX ) find_package( projectB REQUIRED ) ecbuild_add_library( TARGET projectC SOURCES libraryC.cc libraryC.h INSTALL_HEADERS LISTED PRIVATE_LIBS projectB ) ecbuild_add_executable( TARGET main-C SOURCES main.cc LIBS projectC ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/examples/transitive-dependencies/projectC/libraryC.cc0000664000175000017500000000022615252726137025667 0ustar alastairalastair#ifndef A_EXPORT #error A_EXPORT should be exported by projectA via projectB #endif extern int libraryB(); int libraryC() { return libraryB(); } ecbuild-3.16.0/examples/transitive-dependencies/README.md0000664000175000017500000000072315252726137023321 0ustar alastairalastair# Transitive dependencies across projects This example contains 3 projects, where projectB depends on projectA, and projectC depends on projectB. Since projectB requires linking against projectA, the `projectB/projectb-import.cmake.in` file propagates the dependency (it gets included when a package calls `find_package(projectB)`). It also demonstrates PRIVATE (build requirements) and PUBLIC (usage requirements) dependency keywords. ## Usage ./build-and-run.sh ecbuild-3.16.0/examples/transitive-dependencies/clean.sh0000775000175000017500000000043515252726137023463 0ustar alastairalastair#!/usr/bin/env bash set -e HERE="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" # --------------------- cleanup ------------------------ rm -rf projectA/build rm -rf projectA/install rm -rf projectB/build rm -rf projectB/install rm -rf projectC/build rm -rf projectC/install ecbuild-3.16.0/examples/transitive-dependencies/projectA/0000775000175000017500000000000015252726137023607 5ustar alastairalastairecbuild-3.16.0/examples/transitive-dependencies/projectA/CMakeLists.txt0000664000175000017500000000072415252726137026352 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectA VERSION 1.1.0 LANGUAGES CXX ) ecbuild_add_library( TARGET projectA_Private SOURCES libraryA_Private.cc PRIVATE_DEFINITIONS A_PRIVATE PUBLIC_DEFINITIONS A_PUBLIC ) ecbuild_add_library( TARGET projectA SOURCES libraryA.h libraryA.cc INSTALL_HEADERS LISTED PRIVATE_LIBS projectA_Private PUBLIC_DEFINITIONS A_EXPORT ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/examples/transitive-dependencies/projectA/libraryA.cc0000664000175000017500000000053315252726137025664 0ustar alastairalastair#include "libraryA.h" #ifdef A_PRIVATE #error A_PRIVATE should not be exported by target projectA_private #endif #ifndef A_PUBLIC #error A_PUBLIC should have been exported by target projectA_private #endif #ifndef A_EXPORT #error A_EXPORT should be defined #endif extern int libraryA_Private(); int libraryA() { return libraryA_Private(); } ecbuild-3.16.0/examples/transitive-dependencies/projectA/libraryA_Private.cc0000664000175000017500000000023715252726137027357 0ustar alastairalastair#ifndef A_PRIVATE #error A_PRIVATE should be defined #endif #ifndef A_PUBLIC #error A_PUBLIC should be defined #endif int libraryA_Private() { return 1; }ecbuild-3.16.0/examples/transitive-dependencies/projectA/libraryA.h0000664000175000017500000000001715252726137025523 0ustar alastairalastairint libraryA();ecbuild-3.16.0/examples/transitive-dependencies/projectB/0000775000175000017500000000000015252726137023610 5ustar alastairalastairecbuild-3.16.0/examples/transitive-dependencies/projectB/projectb-import.cmake.in0000664000175000017500000000011115252726137030330 0ustar alastairalastairinclude( CMakeFindDependencyMacro ) find_dependency( projectA REQUIRED ) ecbuild-3.16.0/examples/transitive-dependencies/projectB/CMakeLists.txt0000664000175000017500000000051415252726137026350 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( projectB VERSION 0.1.0 LANGUAGES CXX ) find_package( projectA REQUIRED ) ecbuild_add_library( TARGET projectB SOURCES libraryB.cc libraryB.h INSTALL_HEADERS LISTED PUBLIC_LIBS projectA ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild-3.16.0/examples/transitive-dependencies/projectB/libraryB.h0000664000175000017500000000001715252726137025525 0ustar alastairalastairint libraryB();ecbuild-3.16.0/examples/transitive-dependencies/projectB/libraryB.cc0000664000175000017500000000053215252726137025665 0ustar alastairalastair#ifdef A_PRIVATE #error A_PRIVATE should not be exported by target projectA_private #endif #ifdef A_PUBLIC #error A_PUBLIC should not be exported by target projectA #endif #ifndef A_EXPORT #error A_EXPORT should have been exported by target projectA #endif #include "libraryB.h" extern int libraryA(); int libraryB() { return libraryA(); } ecbuild-3.16.0/examples/simple/0000775000175000017500000000000015252726137016515 5ustar alastairalastairecbuild-3.16.0/examples/simple/project_summary.cmake0000664000175000017500000000045515252726137022746 0ustar alastairalastairmessage( STATUS "---------------------------------------------------------" ) if( LAPACK_FOUND ) ecbuild_info( " LAPACK : [${LAPACK_LIBRARIES}]" ) endif() if( GSL_FOUND ) ecbuild_info( " GSL include : [${GSL_INCLUDE_DIRS}]" ) ecbuild_info( " libs : [${GSL_LIBRARIES}]" ) endif() ecbuild-3.16.0/examples/simple/CMakeLists.txt0000664000175000017500000001277015252726137021264 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) # If you plan on using cmake directly (rather than the `ecbuild` wrapper # script), make sure that ecBuild can be found, by doing at least one of these: # * Add ecBuild's `cmake` directory (`share/ecbuild/cmake` when installed) to `CMAKE_MODULE PATH` # * (CMake 3.12 or higher) Set `ecbuild_ROOT` to the ecBuild install directory # * Set `ecbuild_DIR` to ecBuild's `lib/cmake/ecbuild` directory # * Add ecBuild's `cmake` directory to `CMAKE_PREFIX_PATH` find_package(ecbuild REQUIRED) # The `project` macro is overridden by ecBuild, which is why # `find_package(ecbuild)` has to be done before `project()` project( simple VERSION 0.10.0 LANGUAGES C CXX Fortran ) # Declaring options # ================= # # `ecbuild_add_option` is an enhanced version of CMake's `add_option`. # # In this case, the `MATRIX` feature can be requested with the `ENABLE_MATRIX` # CMake variable. Unless `DEFAULT OFF` is specified, the option is on by # default (provided its `CONDITION` is empty or satisfied). # # From your CMake scripts, you can then query the feature using the # `HAVE_MATRIX` variable. # # Any option declared gets automatically advertised when the package is # installed, enabling the use of e.g. `find_package(simple COMPONENTS MATRIX)`. # It can also be queried via the `simple_MATRIX_FOUND` variable if the # component is optional. # # The `REQUIRED_PACKAGES` option is a convenience for options that depend on # certain packages being available. For each package, it expects a string that # represents a valid argument list for `ecbuild_find_package`. This behaves as # follows: # * If `LAPACK` is found, the option will be enabled, unless the # `ENABLE_MATRIX` variable is set to `OFF`. # * If `LAPACK` cannot be found, the behaviour depends on the value of # `ENABLE_MATRIX`: # * If `ON`, ecBuild will abort with a critical error # * If `OFF` or not set, the feature will be disabled ecbuild_add_option( FEATURE MATRIX DESCRIPTION "Use matrix operations" REQUIRED_PACKAGES "NAME LAPACK" ) # For more complex requirements, the `CONDITION` argument can be any expression # acceptable in an `if` statement. The same behaviour can also be achieved using # `CONDITION HAVE_MATRIX` together with `REQUIRED_PACKAGES "NAME GSL"` find_package(GSL QUIET) ecbuild_add_option( FEATURE BESSEL DESCRIPTION "Compute Bessel function" CONDITION HAVE_MATRIX AND GSL_FOUND ) # Declaring targets # ================= # # ecBuild provides wrappers around CMake's `add_library`, `add_executable`, and # `add_test`. They take care of the target's creation, as well as making sure # it gets installed and exported properly. They also provide a concise way of # adding library dependencies and declaring include directories. # # Libraries # --------- # # In `circle/CMakeLists.txt`, the library `circle` is created as a shared # library (the default), and has only one source file `area.f90`. # # ecbuild_add_library( # TARGET circle # TYPE SHARED # SOURCES area.f90 # ) # # If some header files are present in the list of source files, they can be # automatically installed by specifying `INSTALL_HEADERS LISTED`. If the # library has some dependencies, they can be declared with `PUBLIC_LIBS lib1 # [lib2...]` and/or `PRIVATE_LIBS lib1 [lib2...]`, where `PUBLIC` and `PRIVATE` # have the same meaning as for CMake's `target_link_libraries`. The same # applies for include directories using the `PUBLIC_INCLUDES` and # `PRIVATE_INCLUDES` keywords. # # Tests # ----- # # A test can be defined in the same way. Since the distinction between public # and private dependencies has less importance for tests and executable, they # can be provided using the `LIBS` and `INCLUDES` keywords. # # ecbuild_add_test( # TARGET test_area # SOURCES test_area.c # LIBS circle # ) # # Some tests may need to run a script rather than an executable target. This # can be done as well, replacing the `TARGET` keyword by `COMMAND` (and removing # `SOURCES` and `LIBS`), pointing to a script file to be run. Additional # arguments can be provided with the `ARGS` keyword, and environment variables # using the `ENVIRONMENT` keyword. # # Since tests may depend on some features being enabled, the `CONDITION` # keyword can be used, just like in `ecbuild_add_option`. # # Executables # ----------- # # The same semantics apply for executables. In `compute/CMakeLists.txt`, the # `compute` executable is made from the source file `compute.cc` with # additional preprocessor definitions fetched from `${compute_defs}`, and with # a dependency on the `circle` library. # # ecbuild_add_executable( # # TARGET # compute # # SOURCES # compute.cc # # DEFINITIONS # "${compute_defs}" # # LIBS # circle # ) add_subdirectory( circle ) add_subdirectory( compute ) # Generating pkg-config files # =========================== # # A pkg-config file will be created for the `circle` library. It will be # installed in `lib/pkgconfig/circle.pc`. ecbuild_pkgconfig( NAME circle DESCRIPTION "Functions on circles" LIBRARIES circle ) # Epilogue # ======== # # This will ensure everything gets installed in a unified way, provide # appropriate install locations, and generate a `-config.cmake` # allowing the package to be imported from other CMake projects. ecbuild_install_project( NAME ${PROJECT_NAME} ) # This will print a summary of the build environment and options to the screen # when configuration is done. ecbuild_print_summary() ecbuild-3.16.0/examples/simple/compute/0000775000175000017500000000000015252726137020171 5ustar alastairalastairecbuild-3.16.0/examples/simple/compute/CMakeLists.txt0000664000175000017500000000077315252726137022740 0ustar alastairalastairif( HAVE_MATRIX ) set( compute_defs HAVE_MATRIX_LAPACK ) endif() ecbuild_add_executable( TARGET compute SOURCES compute.cc DEFINITIONS "${compute_defs}" LIBS circle ) if( GSL_FOUND ) target_compile_definitions(compute PRIVATE HAVE_GSL) target_include_directories(compute PRIVATE ${GSL_INCLUDE_DIRS}) target_link_libraries(compute ${GSL_LIBRARIES}) endif() if( LAPACK_FOUND ) target_link_libraries(compute ${LAPACK_LIBRARIES}) endif() ecbuild-3.16.0/examples/simple/compute/compute.cc0000664000175000017500000000216715252726137022162 0ustar alastairalastair#include #include #ifdef HAVE_GSL #include #endif using namespace std; extern "C" { double area_circle_(double *); void dgetrf_( int* m, int* n, double* a, int* lda, int* ipiv, int *info ); void dgetrs_( char* trans, int* n, int* nrhs, const double* a, int* lda, const int* ipiv,double* b, int* ldb, int *info ); } int main() { double x = 12.; std::cout << "x = " << x << std::endl; double ca = area_circle_(&x); std::cout << "area_circle = " << ca << std::endl; #ifdef HAVE_GSL double cb = gsl_sf_bessel_J0(x); std::cout << "Bessel J0 = " << cb << std::endl; #endif #ifdef HAVE_MATRIX_LAPACK char TRANS = 'N'; int INFO=3; int LDA = 3; int LDB = 3; int N = 3; int NRHS = 1; int IPIV[3] ; double A[9] = { 1, 2, 3, 2, 3, 4, 3, 4, 1 }; double B[3] = { -4, -1, -2 }; dgetrf_(&N,&N,A,&LDA,IPIV,&INFO); dgetrs_(&TRANS,&N,&NRHS,A,&LDA,IPIV,B,&LDB,&INFO); std::cout << "[" << B[0] << ", " << B[1] <<", " << B[2] << "]" << std::endl; #endif return 0; } ecbuild-3.16.0/examples/simple/README.md0000664000175000017500000000171715252726137020002 0ustar alastairalastair# Simple ecBuild project ## Contents The project contains two directories. The `circle` directory contains a Fortran library and a C test of the library. The `compute` directory contains a C++ executable linking to the `circle` library as well as to LAPACK and GSL, if they can be found on the system. ## Pointing to the libraries The FindLAPACK macro provided by CMake looks for LAPACK in the system dynamic linker environment variables: * `DYLD_LIBRARY_PATH` on Apple * `LIB` on Windows * `LD_LIBRARY_PATH` otherwise The FindGSL macro provided by CMake looks for the `GSL_ROOT_DIR` environment variable. The libraries are expected to be in `$GSL_ROOT_DIR/lib` and the headers in `$GSL_ROOT_DIR/include/gsl`. On Unix, the `$GSL_ROOT_DIR/bin/gsl-config` tool will be used if it exists. ## Usage ``` SRC_DIR=$PWD # Source directory containing the main CMakeLists.txt BUILD_DIR=$PWD/build # Out-of-source build directory cd $BUILD_DIR ecbuild $SRC_DIR make -j ctest ``` ecbuild-3.16.0/examples/simple/circle/0000775000175000017500000000000015252726137017756 5ustar alastairalastairecbuild-3.16.0/examples/simple/circle/CMakeLists.txt0000664000175000017500000000024415252726137022516 0ustar alastairalastairecbuild_add_library( TARGET circle TYPE SHARED SOURCES area.f90 ) ecbuild_add_test( TARGET test_area SOURCES test_area.c LIBS circle )ecbuild-3.16.0/examples/simple/circle/area.f900000664000175000017500000000026315252726137021207 0ustar alastairalastairFUNCTION area_circle(r) IMPLICIT NONE REAL*8, PARAMETER :: Pi = 3.1415927 REAL*8, INTENT(IN) :: r REAL*8 :: area_circle area_circle = Pi * r * r RETURN END FUNCTION area_circleecbuild-3.16.0/examples/simple/circle/test_area.c0000664000175000017500000000040515252726137022070 0ustar alastairalastair#include "stdio.h" #include "math.h" double area_circle_(double *); int main() { double r = 10.; double a = area_circle_(&r); printf("%le %le %le\n", r, a, fabs(a - 100*M_PI)); if( fabs(a - 100*M_PI) > 1E-5 ) return -1; else return 0; } ecbuild-3.16.0/examples/mix/0000775000175000017500000000000015252726137016021 5ustar alastairalastairecbuild-3.16.0/examples/mix/cpp/0000775000175000017500000000000015252726137016603 5ustar alastairalastairecbuild-3.16.0/examples/mix/cpp/CMakeLists.txt0000664000175000017500000000070515252726137021345 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ecbuild_add_executable( TARGET capp SOURCES foo.cc LIBS fortbaz fortbar ) ecbuild-3.16.0/examples/mix/cpp/foo.cc0000664000175000017500000000142615252726137017700 0ustar alastairalastair#include using namespace std; extern "C" { void ir2_(int*,int *); int if3_(int *); void dr2_(double*,double *); double df3_(double *); void lir2_(int*,int *); int lif3_(int *); void ldr2_(double*,double *); double ldf3_(double *); } int main() { cout << "INT" << endl; int n = 10; int n2 = 0; int n3 = 0; ir2_(&n,&n2); cout << n << "^2 = " << n2 << endl; n3 = if3_(&n); cout << n << "^3 = " << n3 << endl; cout << "DOUBLE" << endl; double d = 4.4; double d2 = 0; double d3 = 0; dr2_(&d,&d2); cout << d << "^2 = " << d2 << endl; d3 = df3_(&d); cout << d << "^3 = " << d3 << endl; return 0; } ecbuild-3.16.0/examples/mix/fort/0000775000175000017500000000000015252726137016773 5ustar alastairalastairecbuild-3.16.0/examples/mix/fort/CMakeLists.txt0000664000175000017500000000021515252726137021531 0ustar alastairalastairecbuild_add_library( TARGET fortbar TYPE STATIC SOURCES bar/bar.f90 ) ecbuild_add_library( TARGET fortbaz TYPE SHARED SOURCES baz/baz.f90 ) ecbuild-3.16.0/examples/mix/fort/bar/0000775000175000017500000000000015252726137017537 5ustar alastairalastairecbuild-3.16.0/examples/mix/fort/bar/bar.f900000664000175000017500000000061115252726137020621 0ustar alastairalastair SUBROUTINE ir2(N,M) M=N*N RETURN END INTEGER FUNCTION if3(N) if3=N*N*N RETURN END SUBROUTINE dr2(N,M) REAL*8, INTENT(IN) :: N REAL*8, INTENT(OUT) :: M M=N*N RETURN END REAL*8 FUNCTION df3(N) REAL*8, INTENT(IN) :: N df3=N*N*N RETURN END ecbuild-3.16.0/examples/mix/fort/baz/0000775000175000017500000000000015252726137017547 5ustar alastairalastairecbuild-3.16.0/examples/mix/fort/baz/baz.f900000664000175000017500000000061715252726137020647 0ustar alastairalastair SUBROUTINE lir2(N,M) M=N*N RETURN END INTEGER FUNCTION lif3(N) lif3=N*N*N RETURN END SUBROUTINE ldr2(N,M) REAL*8, INTENT(IN) :: N REAL*8, INTENT(OUT) :: M M=N*N RETURN END REAL*8 FUNCTION ldf3(N) REAL*8, INTENT(IN) :: N ldf3=N*N*N RETURN END ecbuild-3.16.0/examples/mix/CMakeLists.txt0000664000175000017500000000155415252726137020566 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( mix VERSION 0.10.0 LANGUAGES CXX Fortran ) ### targets add_subdirectory( fort ) add_subdirectory( cpp ) ### pkgconfig exports ecbuild_pkgconfig( NAME fortbar DESCRIPTION "A fortran library bar" LIBRARIES fortbar ) ecbuild_pkgconfig( NAME fortbaz DESCRIPTION "A fortran library baz" LIBRARIES fortbaz ) ### finalize project ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/mix/flags.json0000664000175000017500000000054515252726137020014 0ustar alastairalastair{ "*" : [ "+", "-g0" ], "*.cxx" : [ "+", "-cxx11" ], "*.f90" : [ "+", "-pipe" ], "foo.c" : [ "+", "-O0" ], "foo.cc" : [ "+", "-O2", "-pipe" ], "bar/*": { "*.f90" : [ "=", "-O1" ] }, "baz/*": { "*.f90" : [ "/", "-pipe" ], "*.f90" : [ "/", "-O2" ], "*.f90" : [ "+", "-O3" ] } } ecbuild-3.16.0/examples/mix/README.md0000664000175000017500000000010615252726137017275 0ustar alastairalastairUsage: ===== ecbuild -DECBUILD_SOURCE_FLAGS=flags.json examples/mix ecbuild-3.16.0/examples/fortran/0000775000175000017500000000000015252726137016677 5ustar alastairalastairecbuild-3.16.0/examples/fortran/area_circle.h0000664000175000017500000000020115252726137021272 0ustar alastairalastairINTERFACE FUNCTION Area_Circle (r) REAL :: Area_Circle REAL, INTENT(IN) :: r END FUNCTION Area_Circle END INTERFACE ecbuild-3.16.0/examples/fortran/CMakeLists.txt0000664000175000017500000000335715252726137021447 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package( ecbuild REQUIRED ) project( compute_circle VERSION 0.10.0 LANGUAGES Fortran ) ### options ecbuild_add_option( FEATURE AREA_COMPUTER DESCRIPTION "Wether we should build the area_computer executable" ) ### lib const ecbuild_add_library( TARGET const TYPE STATIC SOURCES constants.f90 ) ### lib area_circle ecbuild_list_add_pattern( LIST area_srcs GLOB "*.f*" ) ecbuild_list_exclude_pattern( LIST area_srcs REGEX old.*f90 ^const.* .*f95 main.[fF]90 api/* ) ecbuild_generate_fortran_interfaces( TARGET intf_circ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORIES api/area api/volume DESTINATION api ) ecbuild_add_library( TARGET api_objs TYPE OBJECT SOURCES_GLOB "api/area/*.F90" "api/volume/*.F90" ) ecbuild_add_library( TARGET area_circle SOURCES ${area_srcs} OBJECTS api_objs PUBLIC_LIBS const intf_circ ) # application conditionally compiled ecbuild_add_executable( TARGET area_computer SOURCES main.F90 LIBS area_circle CONDITION HAVE_AREA_COMPUTER ) ### finalize project ecbuild_pkgconfig( NAME area_circle DESCRIPTION "A library to compute the area of a circle" LIBRARIES area_circle ) ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/examples/fortran/lolo.f950000664000175000017500000000054715252726137020177 0ustar alastairalastair!-----Area_Circle---------------------------------------------------- ! ! Function to compute the area of a circle of given radius ! !--------------------------------------------------------------------- FUNCTION Area_Circle(r) USE Circle, ONLY : Pi IMPLICIT NONE REAL :: Area_Circle REAL, INTENT(IN) :: r Area_Circle = Pi * r * r END FUNCTION Area_Circleecbuild-3.16.0/examples/fortran/main.F900000664000175000017500000000124215252726137020102 0ustar alastairalastairPROGRAM Area !--------------------------------------------------------------------- ! ! This program computes the area of a circle given the input radius ! ! Uses: MODULE Circle ! FUNCTION Area_Circle (r) ! !--------------------------------------------------------------------- USE Circle, ONLY : radius IMPLICIT NONE #include "area_circle.h" ! Prompt user for radius of circle write(*, '(A)', ADVANCE = "NO") "Enter the radius of the circle: " read(*,*) radius ! Write out area of circle using function call write(*,100) "Area of circle with radius", radius, " is", & Area_Circle(radius) 100 format (A, 2x, F6.2, A, 2x, F11.2) END PROGRAM Areaecbuild-3.16.0/examples/fortran/api/0000775000175000017500000000000015252726137017450 5ustar alastairalastairecbuild-3.16.0/examples/fortran/api/area/0000775000175000017500000000000015252726137020360 5ustar alastairalastairecbuild-3.16.0/examples/fortran/api/area/area.F900000664000175000017500000000016615252726137021553 0ustar alastairalastairSUBROUTINE Compute_Area(r, Area) REAL, INTENT(IN) :: r REAL, INTENT(OUT) :: Area END SUBROUTINE Compute_Areaecbuild-3.16.0/examples/fortran/api/volume/0000775000175000017500000000000015252726137020757 5ustar alastairalastairecbuild-3.16.0/examples/fortran/api/volume/volume.F900000664000175000017500000000017715252726137022553 0ustar alastairalastairSUBROUTINE Compute_Volume(r, Volume) REAL, INTENT(IN) :: r REAL, INTENT(OUT) :: Volume END SUBROUTINE Compute_Volume ecbuild-3.16.0/examples/fortran/circle.f900000664000175000017500000000055615252726137020466 0ustar alastairalastairMODULE Circle USE Constants, ONLY : ZOOM !--------------------------------------------------------------------- ! ! Module containing definitions of variables needed to ! compute the area of a circle of radius r ! !--------------------------------------------------------------------- REAL, PARAMETER :: Pi = 3.1415927 * ZOOM REAL :: radius END MODULE Circleecbuild-3.16.0/examples/fortran/area_circle.f900000664000175000017500000000054715252726137021456 0ustar alastairalastair!-----Area_Circle---------------------------------------------------- ! ! Function to compute the area of a circle of given radius ! !--------------------------------------------------------------------- FUNCTION Area_Circle(r) USE Circle, ONLY : Pi IMPLICIT NONE REAL :: Area_Circle REAL, INTENT(IN) :: r Area_Circle = Pi * r * r END FUNCTION Area_Circleecbuild-3.16.0/examples/fortran/README.md0000664000175000017500000000030415252726137020153 0ustar alastairalastair# Fortran example This example shows how to build a Fortran project, demonstrating how to use globbing for source files, automatic generation of interfaces... ## Usage ecbuild examples/fortran ecbuild-3.16.0/examples/fortran/constants.f900000664000175000017500000000047615252726137021242 0ustar alastairalastairMODULE Constants !--------------------------------------------------------------------- ! ! Module containing definitions of variables needed to ! compute the area of a circle of radius r ! !--------------------------------------------------------------------- REAL, PARAMETER :: ZOOM = 1 END MODULE Constants ecbuild-3.16.0/examples/fortran/old_circle.f900000664000175000017500000000054715252726137021324 0ustar alastairalastair!-----Area_Circle---------------------------------------------------- ! ! Function to compute the area of a circle of given radius ! !--------------------------------------------------------------------- FUNCTION Area_Circle(r) USE Circle, ONLY : Pi IMPLICIT NONE REAL :: Area_Circle REAL, INTENT(IN) :: r Area_Circle = Pi * r * r END FUNCTION Area_Circleecbuild-3.16.0/examples/fortran/cmake/0000775000175000017500000000000015252726137017757 5ustar alastairalastairecbuild-3.16.0/examples/fortran/cmake/fcm-make-interfaces.cfg0000664000175000017500000000137515252726137024247 0ustar alastairalastair# FCM configuration file used to auto-generate interface files # for F77 and F90 files. # Interface files will have the extention ".intfb.h" # Results will be in a directory "interfaces/include" relative to cwd # Usage: fcm make --config-file= \ # interfaces.ns-incl="" $SRC{?} = $HERE step.class[interfaces] = build steps = interfaces interfaces.target{task} = ext-iface interfaces.source = $SRC # Exclude all interfaces.ns-excl = / # Include some # interfaces.ns-incl = # Extention of interface files interfaces.prop{file-ext.f90-interface} = .intfb.h # Do not follow includes interfaces.prop{no-dep.f.module} = * interfaces.prop{no-dep.include} = * ecbuild-3.16.0/examples/config-bundle/0000775000175000017500000000000015252726137017740 5ustar alastairalastairecbuild-3.16.0/examples/config-bundle/CMakeLists.txt0000664000175000017500000000132215252726137022476 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( config_bundle VERSION 0.1 LANGUAGES C ) ecbuild_bundle_initialize() # Use command "make update" to update branches to latest develop version ecbuild_bundle( PROJECT subproj1 ) ecbuild_bundle( PROJECT subproj2 ) # Finalize ecbuild_bundle_finalize() ecbuild-3.16.0/examples/config-bundle/subproj2/0000775000175000017500000000000015252726137021506 5ustar alastairalastairecbuild-3.16.0/examples/config-bundle/subproj2/CMakeLists.txt0000664000175000017500000000122515252726137024246 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) if( SUBPROJ2_CONFIG ) set( ECBUILD_CONFIG ${SUBPROJ2_CONFIG} ) endif() project( subproj_2 VERSION 0.2 LANGUAGES C ) ecbuild_debug_var( CMAKE_C_FLAGS ) ecbuild_debug_var( CMAKE_C_FLAGS_DEBUG ) ecbuild-3.16.0/examples/config-bundle/general_config.cmake0000664000175000017500000000103215252726137023700 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( ECBUILD_TRUST_FLAGS TRUE ) set( ECBUILD_C_FLAGS "-common" ) set( ECBUILD_C_FLAGS_DEBUG "-debugopts" ) set( ENABLE_LARGE_FILE_SUPPORT OFF CACHE BOOL "" ) ecbuild-3.16.0/examples/config-bundle/subproj1/0000775000175000017500000000000015252726137021505 5ustar alastairalastairecbuild-3.16.0/examples/config-bundle/subproj1/CMakeLists.txt0000664000175000017500000000111015252726137024236 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) find_package(ecbuild REQUIRED) project( subproj_1 VERSION 0.1 LANGUAGES C ) ecbuild_debug_var( CMAKE_C_FLAGS ) ecbuild_debug_var( CMAKE_C_FLAGS_DEBUG ) ecbuild-3.16.0/examples/config-bundle/subproj2_config.cmake0000664000175000017500000000074715252726137024045 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( ECBUILD_TRUST_FLAGS TRUE ) set( ECBUILD_C_FLAGS "-common2" ) set( ECBUILD_C_FLAGS_DEBUG "-debugopts2") ecbuild-3.16.0/examples/config-bundle/README.md0000664000175000017500000000046315252726137021222 0ustar alastairalastair# Config-bundle with separate configuration for subproj2 SRC_DIR=$(pwd) BUILD_DIR=$(pwd)/build mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR} ../../../bin/ecbuild --build=debug --log=debug --config=${SRC_DIR}/general_config.cmake -- -DSUBPROJ2_CONFIG=${SRC_DIR}/subproj2_config.cmake ${SRC_DIR} ecbuild-3.16.0/examples/config-bundle/.gitignore0000664000175000017500000000000615252726137021724 0ustar alastairalastairbuild ecbuild-3.16.0/CMakeLists.txt0000664000175000017500000000455015252726137016152 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ############################################################################################ # cmake options: # # -DCMAKE_INSTALL_PREFIX=/path/to/install cmake_minimum_required( VERSION 3.18 FATAL_ERROR ) set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} ) include( ecbuild ) project( ecbuild LANGUAGES C ) ############################################################################### # local project configure_file( cmake/ecbuild_version.h.in ${CMAKE_BINARY_DIR}/ecbuild_version.h ) # contents ecbuild_add_resources( TARGET ${PROJECT_NAME}_description_files SOURCES_PACK README.rst INSTALL.rst AUTHORS NOTICE LICENSE COPYING ) add_subdirectory( bin ) add_subdirectory( share ) add_subdirectory( cmake ) add_subdirectory( doc ) add_subdirectory( regressions ) add_subdirectory( tests ) install( DIRECTORY cmake DESTINATION ${INSTALL_DATA_DIR} PATTERN "CMakeLists.txt" EXCLUDE ) if( NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR AND ECBUILD_2_COMPAT ) # Required for ecbuild-2 packages when ecbuild is added using `add_subdirectory( ecbuild ) [See ECBUILD-460]. # When adding ecbuild to your project using `add_subdirectory( ecbuild )`, and subsequently add a ecbuild-2 project # which by definition is not using `find_package( ecbuild )`, then the ecbuild-macros dir must be added to # the CMAKE_MODULE_PATH. # The `find_package( ecbuild ... )` works for the ecbuild-3-ported packages, as `ecbuild_DIR` gets defined in # `ecbuild_declare_project(ecbuild...)` of ecbuild during `add_subdirectory( ecbuild )` set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE ) endif() ############################################################################################ # finalize ecbuild_install_project( NAME ${PROJECT_NAME} ) ecbuild_print_summary() ecbuild-3.16.0/share/0000775000175000017500000000000015252726137014510 5ustar alastairalastairecbuild-3.16.0/share/ecmwf_license_header.txt0000664000175000017500000000061015252726137021361 0ustar alastairalastair/* * (C) Copyright 2011- ECMWF. * * This software is licensed under the terms of the Apache Licence Version 2.0 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. In * applying this licence, ECMWF does not waive the privileges and immunities * granted to it by virtue of its status as an intergovernmental organisation * nor does it submit to any jurisdiction. */ ecbuild-3.16.0/share/CMakeLists.txt0000664000175000017500000000122715252726137017252 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. # ecbuild_add_resources( TARGET ecbuild_share # SOURCE_PACK ecmwf_license_header.txt # DONT_PACK_DIRS ecbuild ) # install( DIRECTORY ecbuild/toolchains USE_SOURCE_PERMISSIONS DESTINATION ${INSTALL_DATA_DIR} ) install( DIRECTORY ecbuild/check_linker DESTINATION ${INSTALL_DATA_DIR} ) ecbuild-3.16.0/share/ecbuild/0000775000175000017500000000000015252726137016117 5ustar alastairalastairecbuild-3.16.0/share/ecbuild/check_linker/0000775000175000017500000000000015252726137020540 5ustar alastairalastairecbuild-3.16.0/share/ecbuild/check_linker/dso1.c0000664000175000017500000000002415252726137021546 0ustar alastairalastairvoid fun1(void) {} ecbuild-3.16.0/share/ecbuild/check_linker/CMakeLists.txt0000664000175000017500000000225315252726137023302 0ustar alastairalastaircmake_minimum_required( VERSION 3.18 FATAL_ERROR ) #[=[ From https://sourceware.org/bugzilla/show_bug.cgi?id=20535 > $ cat dso1.c > void fun1(void) {} > > $ cat dso2.c > void fun1(void); > void fun2(void) { fun1(); } > > $ cat main.c > void fun2(void); > int main(void) { > fun2(); > return 0; > } > > $ mkdir dsos > $ gcc -shared -fPIC -o dsos/libdso1.so dso1.c > $ gcc -shared -fPIC -o dsos/libdso2.so -Wl,-rpath='$ORIGIN' dso2.c -Ldsos -ldso1 > $ gcc -Wl,-rpath='$ORIGIN/dsos' main.c -Ldsos -ldso2 #]=] set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) project(test_ld_origin VERSION 1.0 LANGUAGES C) add_library(dso1 SHARED dso1.c) add_library(dso2 SHARED dso2.c) target_link_libraries(dso2 PRIVATE dso1) set_target_properties(dso2 PROPERTIES INSTALL_RPATH "$ORIGIN") add_executable(main main.c) target_link_libraries(main dso2) set_target_properties(main PROPERTIES INSTALL_RPATH "$ORIGIN/../lib") set_target_properties(dso1 dso2 main PROPERTIES LIBRARY_OUTPUT_DIRECTORY lib RUNTIME_OUTPUT_DIRECTORY bin) install(TARGETS dso1 dso2 main LIBRARY DESTINATION lib RUNTIME DESTINATION bin) ecbuild-3.16.0/share/ecbuild/check_linker/main.c0000664000175000017500000000007015252726137021625 0ustar alastairalastairvoid fun2(void); int main(void) { fun2(); return 0; } ecbuild-3.16.0/share/ecbuild/check_linker/dso2.c0000664000175000017500000000005615252726137021554 0ustar alastairalastairvoid fun1(void); void fun2(void) { fun1(); } ecbuild-3.16.0/share/ecbuild/cmake0000777000175000017500000000000015252726137020546 2../../cmakeustar alastairalastairecbuild-3.16.0/LICENSE0000664000175000017500000002477715252726137014434 0ustar alastairalastair Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS Copyright 2011- ECMWF Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ecbuild-3.16.0/NOTICE0000664000175000017500000000135015252726137014311 0ustar alastairalastairNotice ------ 1. The files FindLex and FindYacc are based on the FindBison and FindFlex macros from the original CMake code base. As requested, the License text has been preserved. The modifications are governed by the Apache License as described in COPYING. 2. FindEigen3 is based on a macro from Montel Laurent and others and distributed under the BSD 2-Clause License. 3. FindNetCDF4 is based on the macro FindNetCDF from project UCLALES from Max-Planck-Institut für Meteorologie and distributed under the Academic Free License v3.0. 4. GetGitRevisionDescription macros are based on the macro with smae name from Ryan Pavlik and Iowa State University, and distributed under Boost license. ecbuild-3.16.0/README.rst0000664000175000017500000000270415252726137015100 0ustar alastairalastair============================ ecbuild - ECMWF build system ============================ ecBuild is built on top of CMake and consists of a set of macros as well as a wrapper around CMake. Calling:: ecbuild $SRC_DIR is equivalent to:: cmake -DCMAKE_MODULE_PATH=$ECBUILD_DIR/cmake $SRC_DIR Prior knowledge of CMake is assumed. For a tutorial, see e.g. https://cmake.org/cmake/help/latest/guide/tutorial/index.html Quick start =========== ecBuild does not need to be compiled, and can be used directly from the source repository. If you want to install it, please refer to the ``_ file. 1. Retrieve the source code:: git clone https://github.com/ecmwf/ecbuild 2. Add ``ecbuild`` to your ``PATH``:: export PATH=$PWD/ecbuild/bin:$PATH Examples ======== The `examples/ `_ directory contains some sample projects that show how ecBuild can be used in various situations. For a quick introduction on how to write an ecBuild project, have a look at ``_. Building a project ================== Just like CMake, ecBuild uses out-of-source builds. We will assume that your project sources are in ``$SRC_DIR`` (e.g. ``examples/simple``), and that your build directory is ``$BUILD_DIR`` (e.g. ``$SRC_DIR/build``):: mkdir -p $BUILD_DIR cd $BUILD_DIR ecbuild $SRC_DIR # see `ecbuild --help`, you may pass CMake options as well make # add your favourite options, e.g. -j ecbuild-3.16.0/lib/0000775000175000017500000000000015252726137014154 5ustar alastairalastairecbuild-3.16.0/lib/cmake/0000775000175000017500000000000015252726137015234 5ustar alastairalastairecbuild-3.16.0/lib/cmake/ecbuild/0000775000175000017500000000000015252726137016643 5ustar alastairalastairecbuild-3.16.0/lib/cmake/ecbuild/ecbuild-config.cmake0000664000175000017500000000125615252726137022523 0ustar alastairalastair# (C) Copyright 2019- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. get_filename_component(ecbuild_MACROS_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../cmake ABSOLUTE) cmake_policy( PUSH ) cmake_policy( SET CMP0057 NEW ) if(NOT ${ecbuild_MACROS_DIR} IN_LIST CMAKE_MODULE_PATH) list(INSERT CMAKE_MODULE_PATH 0 ${ecbuild_MACROS_DIR}) endif() cmake_policy( POP ) include(ecbuild) ecbuild-3.16.0/lib/cmake/ecbuild/ecbuild-config-version.cmake0000664000175000017500000000063315252726137024204 0ustar alastairalastairinclude(${CMAKE_CURRENT_LIST_DIR}/../../../cmake/ecbuild_parse_version.cmake) ecbuild_parse_version_file(${CMAKE_CURRENT_LIST_DIR}/../../../VERSION PREFIX PACKAGE) if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() ecbuild-3.16.0/.readthedocs.yml0000664000175000017500000000053415252726137016476 0ustar alastairalastair version: 2 # Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: python: "3.12" # Build documentation in the "doc/" directory with Sphinx sphinx: configuration: doc/conf.py # Define the requirements required to build the documentation python: install: - requirements: doc/requirements.txtecbuild-3.16.0/AUTHORS0000664000175000017500000000042715252726137014461 0ustar alastairalastaireckit Authors ============= eckit is mainly developed at the "European Centre for Medium-Range Weather Forecasts" (ECMWF, http://www.ecmwf.int). See attached LICENSE file for copyright. Developers: =========== Tiago Quintino Baudouin Raoult Willem Deconinck Florian Rathgeber ecbuild-3.16.0/.ci/0000775000175000017500000000000015252726137014057 5ustar alastairalastairecbuild-3.16.0/.ci/manifest.toml0000664000175000017500000000721715252726137016571 0ustar alastairalastair# SPDX-FileCopyrightText: 2009- European Centre for Medium-Range Weather Forecasts (ECMWF) # SPDX-License-Identifier: Apache-2.0 [generated] header = """ # SPDX-FileCopyrightText: 2009- European Centre for Medium-Range Weather Forecasts (ECMWF) # SPDX-License-Identifier: Apache-2.0 """ [package] name = "ecbuild" prefix = "ecbuild" repo = "ecmwf/ecbuild" compiler-inputs = [] visibility = "public" [[matrix.build.include]] build-type = "Release" runs-on = "arc-runner-normal" container = "eccr.ecmwf.int/public-ci-images/ubuntu24.04-base:latest" platform = "ubuntu-24.04" [[matrix.build.include]] build-type = "Release" runs-on = "ubuntu-24.04" platform = "gh-ubuntu-24.04" [[matrix.build.include]] build-type = "Release" runs-on = "arc-runner-normal" container = "eccr.ecmwf.int/public-ci-images/rocky8-base:latest" platform = "rocky-8" [[matrix.build.include]] build-type = "Release" runs-on = "arc-runner-normal" container = "eccr.ecmwf.int/public-ci-images/debian11-base:latest" platform = "debian-11" [[matrix.build.include]] build-type = "Release" runs-on = ["self-hosted", "platform-builder-macosx-13.4.1-arm64"] platform = "macos-13-arm" [[matrix.build.include]] build-type = "Release" runs-on = ["self-hosted", "platform-builder-macosx-13.4.1-x86_64"] platform = "macos-13-x86" [matrix.build] triggers = ["rebuild-request"] action = "./.github/actions/build-ecbuild" forwarded-inputs = ["build-type"] needs = [] [[matrix.test.include]] build-type = "Release" runs-on = "arc-runner-normal" container = "eccr.ecmwf.int/public-ci-images/ubuntu24.04-gfortran13:latest" platform = "ubuntu-24.04" # No `triggers`: ci.yml-only, nothing rendered into cross-repo-trigger.yml. [matrix.test] publishes = false action = "./.github/actions/test-ecbuild" forwarded-inputs = ["build-type"] needs = ["build"] [[matrix.build-hpc.include]] build-type = "Release" runs-on = "hpc-submit" container = "eccr.ecmwf.int/private-ci-images/ubuntu24.04-internal-tools:latest" site = "hpc-batch" platform = "hpc-atos-gnu" # gcc/old, not a version number: as of now gives you 8.5.0 # `module avail gcc` lists no 8.5.0 to pin directly. modules = ["load prgenv/gnu", "unload gcc", "load gcc/old", "load cmake", "load python3/3.13.13-01"] cc = "gcc" cxx = "g++" time = "00:30:00" tests = true [[matrix.build-hpc.include]] build-type = "Release" runs-on = "hpc-submit" container = "eccr.ecmwf.int/private-ci-images/ubuntu24.04-internal-tools:latest" site = "hpc-batch" platform = "hpc-atos-intel" modules = ["load prgenv/intel-llvm", "unload intel", "load intel/2025.3.1", "load cmake", "load python3/3.13.13-01"] cc = "icx" cxx = "icpx" time = "00:30:00" tests = true [[matrix.build-hpc.include]] build-type = "Release" runs-on = "hpc-submit" container = "eccr.ecmwf.int/private-ci-images/ubuntu24.04-internal-tools:latest" site = "hpc-batch" platform = "hpc-atos-aocc" modules = ["load prgenv/amd", "unload aocc", "load aocc/4.0.0", "load cmake"] cc = "clang" cxx = "clang++" time = "00:15:00" tests = false [[matrix.build-hpc.include]] build-type = "Release" runs-on = "hpc-submit" container = "eccr.ecmwf.int/private-ci-images/ubuntu24.04-internal-tools:latest" site = "hpc-batch" platform = "hpc-atos-nvidia" modules = ["load prgenv/nvidia", "unload nvidia", "load nvidia/24.11", "load cmake"] cc = "nvc" cxx = "nvc++" time = "00:15:00" tests = false [matrix.build-hpc] execution = "hpc" container-credentials = true job-script = "./.ci/hpc/build.sh.j2" triggers = ["rebuild-request"] needs = [] [[trigger-downstream]] repo = "ecmwf/eckit" ref = "develop" [[trigger-downstream]] repo = "ecmwf/eccodes" ref = "develop" [[trigger-downstream]] repo = "ecmwf/ecflow" ref = "develop" [downstream-gate] label = "run-downstream-CI" ecbuild-3.16.0/.ci/hpc/0000775000175000017500000000000015252726137014631 5ustar alastairalastairecbuild-3.16.0/.ci/hpc/build.sh.j20000664000175000017500000000212315252726137016574 0ustar alastairalastair#!/bin/bash {% if not tests %} # This recipe runs no tests! {% endif %} #SBATCH --qos=nf #SBATCH --gres=ssdtmp:10G #SBATCH --time={{ time }} #SBATCH --nodes=1 #SBATCH --ntasks=2 {% for m in modules %} module {{ m }} {% endfor %} echo "Using: $(command -v {{ cc }}) ($($(command -v {{ cc }}) --version | head -1))" cmake -S "$CI_SOURCE_DIR" -B "${TMPDIR:-/tmp}/build" \ -DCMAKE_BUILD_TYPE={{ build_type }} \ -DCMAKE_C_COMPILER={{ cc }} \ -DCMAKE_CXX_COMPILER={{ cxx }} \ -DCMAKE_INSTALL_PREFIX="$CI_INSTALL_PREFIX" \ -DENABLE_TESTS={{ "ON" if tests else "OFF" }} {% if tests %} cmake --build "${TMPDIR:-/tmp}/build" --parallel "${SLURM_NTASKS:-8}" ctest --test-dir "${TMPDIR:-/tmp}/build" --output-on-failure -j "${SLURM_NTASKS:-8}" {% endif %} cmake --install "${TMPDIR:-/tmp}/build" # The fetcher takes the artifact from CI_INSTALL_ARCHIVE, not from the install # tree; .part + mv so it only ever appears complete. mkdir -p "$(dirname "$CI_INSTALL_ARCHIVE")" tar -cf - -C "$CI_INSTALL_PREFIX" . | zstd -T0 -q -o "$CI_INSTALL_ARCHIVE.part" mv "$CI_INSTALL_ARCHIVE.part" "$CI_INSTALL_ARCHIVE" ecbuild-3.16.0/COPYING0000664000175000017500000002620015252726137014441 0ustar alastairalastair Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2007-2013 European Centre for Medium-Range Weather Forecasts (ECMWF) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ecbuild-3.16.0/bin/0000775000175000017500000000000015252726137014156 5ustar alastairalastairecbuild-3.16.0/bin/CMakeLists.txt0000664000175000017500000000007315252726137016716 0ustar alastairalastairinstall( PROGRAMS ecbuild DESTINATION ${INSTALL_BIN_DIR} ) ecbuild-3.16.0/bin/ecbuild0000775000175000017500000003165315252726137015523 0ustar alastairalastair#!/bin/bash --noprofile # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. set -eua CMAKE_MIN_REQUIRED=3.11 CMAKE_BUILD_VERSION=3.18.3 usage() { echo "Usage: ecbuild [--help] [--version]" exit $1 } help() { cat < ecbuild [option...] [--] [cmake-argument...] DESCRIPTION: ecbuild is a build system based on CMake, but providing a lot of macro's to make it easier to work with. Upon execution, the equivalent cmake command is printed. ecbuild/cmake must be called from an out-of-source build directory and forbids in-source builds. SYNOPSIS: --help Display this help --version Display ecbuild version Available values for "option": --cmakebin= Set which cmake binary to use. Default is 'cmake' --prefix= Set the install path to . Equivalent to cmake argument "-DCMAKE_INSTALL_PREFIX=" --build= Set the build-type to . Equivalent to cmake argument "-DCMAKE_BUILD_TYPE=" can be any of: - debug : Lowest optimization level, useful for debugging - release : Highest optimization level, for best performance - bit : Highest optimization level while staying bit-reproducible - ...others depending on project --log= Set the ecbuild log-level Equivalent to "-DECBUILD_LOG_LEVEL=" can be any of: - DEBUG - INFO - WARN - ERROR - CRITICAL - OFF Every choice outputs also the log-levels listed below itself --static Build static libraries. Equivalent to "-DBUILD_SHARED_LIBS=OFF" --dynamic, --shared Build dynamic libraries (usually the default). Equivalent to "-DBUILD_SHARED_LIBS=ON" --config= Configuration file using CMake syntax that gets included Equivalent to cmake argument "-DECBUILD_CONFIG=" --toolchain= Use a platform specific toolchain, containing settings such as compilation flags, locations of commonly used dependencies. should be the path to a custom toolchain file. Equivalent to cmake argument "-DCMAKE_TOOLCHAIN_FILE=" --cache= (advanced) A file called "ecbuild-cache.cmake" is generated during configuration. This file can be moved to a safe location, and specified for future builds to speed up checking of compiler/platform capabilities. Note that this is only accelerating fresh builds, as cmake internally caches also. Therefore this option is *not* recommended. --get-cmake[=] Automatically download CMake binaries from version $CMAKE_BUILD_VERSION. Requires an internet connection. If no prefix is given, install into $PWD/.local/. --build-cmake[=] Automatically download and build CMake version $CMAKE_BUILD_VERSION. Requires an internet connection and may take a while. If no prefix is given, install into $PWD/.local/. --dryrun Don't actually execute the cmake call, just print what would have been executed. Available values for "cmake-argument": Any value that can be usually passed to cmake to (re)configure the build. Typically these values start with "-D". example: -DENABLE_TESTS=ON -DENABLE_MPI=OFF -DECKIT_PATH=... They can be explicitly separated from [option...] with a "--", for the case there is a conflicting option with the "cmake" executable, and the latter's option is requested. ------------------------------------------------------------------------ NOTE: When reconfiguring a build, it is only necessary to change the relevant options, as everything stays cached. For example: > ecbuild --prefix=PREFIX . > ecbuild -DENABLE_TESTS=ON . ------------------------------------------------------------------------ Compiling: To compile the project with threads: > make -j To get verbose compilation/linking output: > make VERBOSE=1 Testing: To run the project's tests > ctest Also check the ctest manual/help for more options on running tests Installing: To install the project in location PREFIX with "--prefix=PREFIX" or "-DCMAKE_INSTALL_PREFIX=PREFIX" > make install ------------------------------------------------------------------------ ECMWF" EOF exit $1 } INSTALL_DIR="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )" export ecbuild_ROOT="$( cd "$INSTALL_DIR/.." && pwd -P )" export ecbuild_DIR=$ecbuild_ROOT # for versions of CMake < 3.12 ECBUILD_MODULE_PATH="" # If there is a directory share/ecbuild/cmake relative to the parent directory # (as in an install tree), add it to CMAKE_MODULE_PATH if [ -d $INSTALL_DIR/../share/ecbuild/cmake ]; then ECBUILD_MODULE_PATH="$( cd "$INSTALL_DIR/../share/ecbuild/cmake" && pwd -P )" # If there is a cmake subdirectory relative to the script directory (as in a # tarball), add it to CMAKE_MODULE_PATH elif [ -d $INSTALL_DIR/../cmake ]; then ECBUILD_MODULE_PATH="$( cd "$INSTALL_DIR/../cmake" && pwd -P )" fi # Fail if we couldn't find ecBuild modules if [ ! -f "$ECBUILD_MODULE_PATH/ecbuild_system.cmake" ]; then echo "FATAL: ecBuild modules could not be found in either $INSTALL_DIR/../share/ecbuild/cmake or $INSTALL_DIR/../cmake" >&2 exit 1 fi ADD_ECBUILD_OPTIONS="-DCMAKE_MODULE_PATH=$ECBUILD_MODULE_PATH" version() { ecbuild_version=$(cat ${ECBUILD_MODULE_PATH}/VERSION) echo "ecbuild version ${ecbuild_version}" command -v cmake >/dev/null 2>&1 || { exit 0; } cmake --version | head -1 exit 0 } log() { log_level=$(tr "[a-z]" "[A-Z]" <<< "$1") ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_LOG_LEVEL=${log_level}" } prefix() { ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_INSTALL_PREFIX=${1/#\~\//$HOME/}" } config() { arg=${1/#\~\//$HOME/} if [ -f $arg ]; then config_file=$arg config_file="$( cd $( dirname "${config_file}" ) && pwd -P )/$( basename ${config_file} )" else echo "Error:" echo " Config file [$arg] is not found or is not a file." exit 1 fi ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_CONFIG=${config_file}" } toolchain() { arg=${1/#\~\//$HOME/} if [ -f $arg ]; then toolchain_file=$arg fi if [ -z ${toolchain_file+x} ]; then echo "Error toolchain $arg is not valid" exit 1 else ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_TOOLCHAIN_FILE=${toolchain_file}" fi } cache() { arg=$1 if [ -f $arg ]; then cache_file=$arg cache_file="$( cd $( dirname "${cache_file}" ) && pwd -P )/$( basename ${cache_file} )" else echo "Error:" echo " Cache file [$arg] is not found or is not a file." exit 1 fi ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_CACHE=${cache_file}" } if test $# -eq 0; then usage 1 fi while test $# -gt 0; do # Split --option=value in $opt="--option" and $val="value" opt="" val="" case "$1" in --*=*) opt=`echo "$1" | sed 's/=.*//'` val=`echo "$1" | sed 's/--[_a-zA-Z0-9-]*=//'` ;; --*) opt=$1 ;; # -D*) # ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS $1" # ;; *) break ;; esac # echo "debug opt: $opt $val" # Parse options case "$opt" in --help) help 0 ;; --version) version ;; --dryrun) dryrun="yes" ;; --cmakebin) cmakebin="$val" ;; --prefix) prefix "$val" ;; --build) ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_BUILD_TYPE=$val" ;; --log) log $val ;; --static) ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=OFF" ;; --dynamic) ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=ON" ;; --shared) ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=ON" ;; --toolchain) toolchain $val ;; --config) config $val ;; --cache) cache $val ;; --get-cmake) get_cmake="bin" if [[ -n $val ]]; then cmake_prefix="$val" fi ;; --build-cmake) get_cmake="src" if [[ -n $val ]]; then cmake_prefix="$val" fi ;; --) shift break ;; *) echo "unknown option: $opt" usage 1 ;; esac shift done # If no arguments remain, set srcARG to "." if [ $# -eq 0 ]; then srcARG="." fi if [ -z ${toolchain_file+x} ]; then if [ -z ${ECBUILD_TOOLCHAIN+x} ]; then : else toolchain ${ECBUILD_TOOLCHAIN} echo "ecbuild toolchain set using environment variable ECBUILD_TOOLCHAIN" fi fi src=${srcARG:=""} cmake=${cmakebin:=cmake} dryrun=${dryrun:=no} get_cmake=${get_cmake:=""} cmake_prefix=${cmake_prefix:=$PWD/.local} cmake_found="" cmake_version_sufficient="" # Check that version $1 satisfies $2 # CMake versions have no more than 4 fields # Version sort (sort -V) is not available on all platforms version_gte() { [ "$2" = "$(echo -e "$1\n$2" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 -g | head -n1)" ] } # Download a CMake tarball # $1: version # $2: suffix (optional) download_cmake() { tarball=cmake-$1${2:-""}.tar.gz if [[ ! -r $tarball ]]; then shortver=$(echo $1 | cut -d. -f1-2) url=http://www.cmake.org/files/v$shortver/$tarball # -N Download only if the remote version of the file is newer # --continue Continue an interrupted download # -T 60 Time out a download attempt after 60 seconds # -t 3 Only make 3 download attempts wget -N --continue -T 60 -t 3 $url || { echo "Failed to download CMake release $1." >&2 echo "Please download from $url" >&2 echo "and place $tarball in $PWD" >&2 exit 1 } fi echo $tarball } # Use already built CMake if any if [[ -x "${cmake_prefix}/bin/cmake" ]]; then echo "Using already built CMake in ${cmake_prefix}/bin/cmake" >&2 cmake="${cmake_prefix}/bin/cmake" # Get a CMake binary if requested and no sufficient version found elif [[ $get_cmake = "bin" ]]; then plat=$(uname -s) arch=$(uname -m) if [[ "${plat}" != "Linux" ]] && [[ "${plat}" != "Darwin" ]] ; then echo "Cannot download CMake binaries for this platform." >&2 echo "Please use --build-cmake to build from source." >&2 exit 1 fi if [[ "${arch}" != "x86_64" ]] ; then echo "Cannot download CMake binaries for this architecture." >&2 echo "Please use --build-cmake to build from source." >&2 exit 1 fi echo "Downloading CMake version ${CMAKE_BUILD_VERSION} binaries and installing into ${cmake_prefix} ..." >&2 tarball=$(download_cmake "${CMAKE_BUILD_VERSION}" "-${plat}-${arch}") mkdir -p "${cmake_prefix}" tar xzf $tarball -C "${cmake_prefix}" --strip-components=1 cmake="${cmake_prefix}/bin/cmake" # Build CMake from source if requested and no sufficient version found elif [[ $get_cmake = "src" ]]; then echo "Building CMake version ${CMAKE_BUILD_VERSION} and installing into ${cmake_prefix} ..." >&2 tarball=$(download_cmake "${CMAKE_BUILD_VERSION}") tar xzf $tarball ( mkdir -p build_cmake cd build_cmake ../cmake-${CMAKE_BUILD_VERSION}/bootstrap --prefix="${cmake_prefix}" && make && make install ) cmake="${cmake_prefix}/bin/cmake" fi # Check if the cmake version is sufficient if $(command -v $cmake >/dev/null 2>&1); then cmake_found="yes" cmake_version=$($cmake --version | head -n1 | awk '{ print $3 }') echo "Found CMake version $cmake_version" >& 2 if version_gte $cmake_version $CMAKE_MIN_REQUIRED; then cmake_version_sufficient="yes" fi fi # Fail if we don't have a sufficient CMake if [[ ! $cmake_version_sufficient ]]; then if [[ ! $cmake_found ]]; then echo "CMake is required and cannot be found in the PATH." >&2 else echo "CMake version $CMAKE_MIN_REQUIRED is required but only $cmake_version was found." >&2 fi echo "" >&2 echo " Try 'module load cmake', specify a CMake binary with --cmakebin=/path/to/cmake" >&2 echo " or let ecbuild download and build CMake with the --build-cmake option." >&2 exit 1 fi echo "" echo "$cmake ${ADD_ECBUILD_OPTIONS} $@ $src" echo "" if [ ${dryrun} == "yes" ]; then echo "[DRYRUN] -- not executing" exit 0 fi $cmake ${ADD_ECBUILD_OPTIONS} "$@" $src ecbuild-3.16.0/ecbuild.sublime-project0000664000175000017500000000121315252726137020040 0ustar alastairalastair{ "folders": [ { "file_exclude_patterns": [".tags", ".tags_sorted_by_file", ".gemtags","CMakeLists.txt.user*"], "follow_symlinks": true, "path": "." } ], "build_systems": [ { "working_dir": "${project_path}/../../build/ecbuild", "cmd": [ "make" ], "file_regex": "([/\\w\\-\\.]+):(\\d+):(\\d+:)?", "name": "ecbuild" } ], "SublimeLinter": { "linters": { "cpplint": { "filter": "-whitespace/line_length,-whitespace/blank_line,-runtime/references" }, } } } ecbuild-3.16.0/tox.ini0000664000175000017500000000002715252726137014720 0ustar alastairalastair[flake8] ignore = E501 ecbuild-3.16.0/ecbuild_3.4_release_notes.rst0000664000175000017500000003317215252726137021051 0ustar alastairalastair========================= ecBuild 3.4 Release Notes ========================= Main changes ============ Minimal CMake version --------------------- The minimal CMake version required is 3.11, from ecBuild 3.4. However, we strongly encourage using the latest version. A good compromise is to aim for a minimum of **CMake 3.12** Including ecbuild ----------------- There is now a more modern way to include the ecbuild macros, which is more inline with modern CMake 3. This uses a standard find_package and avoids all the explicit initialising of ecbuild. You will only need to call the project macro and it will take care of the ecbuild init. In case you intend to distribute your package inside a tarball using ``make package_source``, you will need to update ``CMAKE_MODULE_PATH`` before calling ``find_package(ecbuild)``. Example:: cmake_minimum_required( VERSION 3.12 FATAL_ERROR ) find_package( ecbuild 3.4 REQUIRED HINTS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild ) # Before project() !!! project( eckit LANGUAGES CXX ) Project version --------------- CMake 3.0 (via policy `CMP0048 `_) requires a project version to be provided to the ``project`` command. Therefore, the use of ``VERSION.cmake`` files is not supported anymore. You have 2 options: * Recommended: if you use the above way to initialise ecbuild, then you just need a VERSION file with the version string inside, eg: ``1.4.5-rc2`` * You can provide the VERSION in the project function call, as in standard CMake. This however does not support adding *suffixes* to the version (eg -rc2) and is limited up to 4 version numbers. Backwards compatibility ----------------------- From ecBuild 3.4, backwards compatibility wil be disabled by default. If you want to build a project that requires backwards compatibility, you need to pass ``-DECBUILD_2_COMPAT=ON`` on the CMake / ecBuild command line. Library dependencies -------------------- Modern CMake relies on properties to provide information about libraries (include directories, preprocessor definitions, dependencies...), and most of those properties can have specific visibility: * ``PRIVATE``: the property is visible only when building the library (build requirement) * ``INTERFACE``: the property is visible only in targets depending on the library (usage requirement) * ``PUBLIC``: same as using both ``PRIVATE`` and ``INTERFACE`` For convenience, ``ecbuild_add_library`` now supports the following arguments: * ``PRIVATE_LIBS``, ``PUBLIC_LIBS``: the library depends on those libraries (see *Public (interface) vs. private dependencies* if you are not sure which one to use), ``PUBLIC`` means that further dependencies will need to have those available as well (see *Transitive public dependencies*) * ``PRIVATE_INCLUDES``: those include directories are needed to build the library (note that you do not need those that come with a library target that declares them as ``INTERFACE`` or ``PUBLIC``) * ``PUBLIC_INCLUDES``: those include directories are needed to use the library * ``PRIVATE_DEFINITIONS``: those ``#define`` are needed to build the library * ``PUBLIC_DEFINITIONS``: those ``#define`` are needed to use the library As a consequence, the ``LIBS``, ``INCLUDES``, and ``DEFINITIONS`` keywords should not be used anymore. ecbuild_use_package  -------------------- The ``ecbuild_use_package`` macro should not be used anymore. It had two distinct use cases: * Include a package as a sub-project: use ``add_subdirectory`` instead * Look for a package: use ``ecbuild_find_package`` or ``find_package`` instead (see also *ecbuild_find_package vs. find_package*) For example:: # change this ... ecbuild_use_package( PROJECT eckit VERSION 1.9 REQUIRED ) # ... to this: ecbuild_find_package( NAME eckit VERSION 1.9 REQUIRED ) Feature Variable names ---------------------- Feature names are now always with the original package name (not capitals). So you may need to adapt the code as in this example:: ecbuild_find_package( NAME metkit VERSION 1.4 REQUIRED ) # OLD code, note the capitals if( NOT METKIT_HAVE_GRIB ) ... # NEW code if( NOT metkit_HAVE_GRIB ) ... **Note:** that this may imply changes in the generated header files ``package_config.h.in`` Version Variables ----------------- Variables that have the package in the name, e.g. ``_VERSION`` are now with the exact capitalisation as in the project name (no longer FULLCAPS), similar to the feature variables mentioned above. They also follow the CMake 3 convention for version variables with ``_VERSION_MAJOR`` instead of ``_MAJOR_VERSION`` So code and generated files need to be adapted.  For example, in the ``package_version.h``:: # change this ... #define ECKIT_MAJOR_VERSION @ECKIT_MAJOR_VERSION@ #define ECKIT_MINOR_VERSION @ECKIT_MINOR_VERSION@ #define ECKIT_PATCH_VERSION @ECKIT_PATCH_VERSION@ # ... to this: #define eckit_VERSION_MAJOR @eckit_VERSION_MAJOR@ #define eckit_VERSION_MINOR @eckit_VERSION_MINOR@ #define eckit_VERSION_PATCH @eckit_VERSION_PATCH@ get_target_property LOCATION ---------------------------- In previous versions, we still allowed an old CMake policy of using target LOCATION. This is now deprecated and highly discouraged in new CMake 3 code. You will need to change the code, especially in tests where you use targets just built to use ``$``:: # BEFORE get_target_property( odc_bin odc LOCATION ) ecbuild_add_test( NAME odc_test_foo COMMAND ${odc_bin} ... ) # AFTER simply call ecbuild_add_test( NAME odc_test_foo COMMAND $ ... ) # OR better, if the command is the result of add_executable or ecbuild_add_executable: ecbuild_add_test( NAME odc_test_foo COMMAND odc ... ) **Note:** If you use target properties in generated scripts (eg for testing), you will need to both ``configure_file()`` and then take that and use ``file(GENERATE...)`` to obtain the ``$`` expansions in the script.  There is a very convenient ``ecbuild_configure_file()`` that does exactly that.:: ecbuild_configure_file(mir-test.sh.in mir-test.sh @ONLY) # where mir-test.sh.in contains $ where needed Options and required packages ----------------------------- Options can be declared with specific package requirements, in order to replace boilerplate:: ecbuild_add_option( FEATURE FOOBAR REQUIRED_PACKAGES "NAME foo VERSION 1.3" "NAME bar VERSION 4.2 COMPONENTS FOO" ) Every item specified in ``REQUIRED_PACKAGES`` will be passed to ``ecbuild_find_package`` unchanged, and therefore must be a suitable argument list. There used to be special cases for packages ``MPI``, ``OMP``, ``Python``, and ``LEXYACC``. This is not the case anymore. If you need those special cases, please call the corresponding ``ecbuild_find_`` macro directly and add a ``CONDITION _FOUND`` to ``ecbuild_add_option``. GNU-compliant install directories --------------------------------- The default values for ``INSTALL_{BIN,INCLUDE,LIB}_DIR`` now use the `GNUInstallDirs `_ CMake module to honour the GNU coding standards, in particular on 64-bit platforms the default directory for the libraries is now ``lib64`` instead of ``lib``. Pitfalls ======== Public (interface) vs. private dependencies ------------------------------------------- It may be tempting to declare all library dependencies ``PUBLIC`` to avoid having to make the dependency graph explicit. However, this is not advised (think of the CMake equivalent of a header file that ``#include`` all the needed headers, both your own and the ones from external libraries, and that you would include from every single file). Here are some guidelines to help you choose the appropriate type of dependency for every package. * The dependency is an implementation detail that is not visible outside of the library: ``PRIVATE`` * The dependency is a component of the library, and it makes no sense to use the library without it: ``PUBLIC`` * The dependency is used within the library, but a user of the library should not assume that it will always be the case: ``PRIVATE`` * Any user of the library will have to use the dependency in their code as well (for instance, to create objects that need to be passed to the library API): ``PUBLIC`` * It has been decided that the library will expose the dependency as a convenience: ``PUBLIC`` Declaring public build interfaces --------------------------------- In order to allow building software against dependencies that are in build directories (necessary for developers daily work and for building bundles for operations), **libraries** need to publish their build interface:: ecbuild_add_library( NAME eccodes ... PUBLIC_INCLUDES $ $ ... ) Transitive public dependencies ------------------------------ Suppose package ``packA`` exports a library ``libA``, and package ``packB`` defines the following:: find_package(packA REQUIRED) ecbuild_add_library( NAME libB # ... PUBLIC_LIBS libA ) Any package using ``libB`` from ``packB`` will therefore have to look for ``libA``, and therefore ``packA`` as well. One solution is to require the user to look for both packages:: find_package(packA REQUIRED) find_package(packB REQUIRED) But this is error-prone and inconvenient in case of API changes: How do you know ``packB`` will always require ``packA``. The *recommended approach* is the to use the macro that CMake provides for such cases: `find_dependency `_. To use that macro in conjunction with ecBuild, add the following to a file ``packB-import.cmake.in``:: include(CMakeFindDependencyMacro) find_dependency(packA) # you may want to specify HINTS as well, e.g. @packA_DIR@ # Optional: further variables packB exports for use set(PACKB_LIBRARIES @PACKB_LIBRARIES@) This will make sure that ``find_package(packB)`` fails with an appropriate error message if ``packA`` cannot be found. For example, metkit depends on eckit and optionally on eccodes and odc, when the respective features are enabled, so the file metkit-import.cmake.in looks like:: set( metkit_HAVE_GRIB @metkit_HAVE_GRIB@ ) set( metkit_HAVE_ODB @metkit_HAVE_ODB@ ) include( CMakeFindDependencyMacro ) find_dependency( eckit HINTS ${CMAKE_CURRENT_LIST_DIR}/../eckit @eckit_DIR@ ) if( metkit_HAVE_GRIB ) find_dependency( eccodes HINTS ${CMAKE_CURRENT_LIST_DIR}/../eccodes @eccodes_DIR@ ) endif() if( metkit_HAVE_ODB ) find_dependency( odc HINTS ${CMAKE_CURRENT_LIST_DIR}/../odc @odc_DIR@ ) endif() **Note:** when following this recommended way and assuming we drop the support for ecbuild 2, then you can remove all the _TPLS exports of variables.  ``ecbuild_find_package`` vs. ``find_package`` --------------------------------------------- ``ecbuild_find_package`` is a wrapper around ``find_package`` with some extra functionality to help locating packages. In particular, ``ecbuild_find_package(pkgA)`` will search the following locations, in this order: * ``pkgA_BINARY_DIR``, which is defined if ``pkgA`` is a sub-project * ``CMAKE_MODULE_PATH``, for ``FindpkgA.cmake`` * ``pkgA_DIR``, ``pkgA_ROOT`` (including for CMake < 3.12), ``pkgA_PATH``, ``PKGA_PATH`` in the CMake scope * ``pkgA_ROOT``, ``pkgA_PATH``, ``PKGA_PATH`` in the environment * ``CMAKE_PREFIX_PATH`` in the CMake scope * ``pkgA_DIR``, ``CMAKE_PREFIX_PATH`` in the environment What to put into ``-import.cmake`` ------------------------------------------- If your source tree contains a file named ``-import.cmake`` or ``-import.cmake.in``, it will be installed alongside your package, and included by a call to ``find_package()``. You can use that to specify additional variables, define macros, etc. The following are strongly recommended: * ``find_dependency`` calls for packages that are usage requirements (see *Transitive public dependencies*) The following may be useful: * Extra variables defining paths to resources (note that ``_BASE_DIR`` will point to the project build or install directory, depending on whether the project is included in the current CMake project or already installed on the system) * ``include`` calls for files containing macros or functions (``_CMAKE_DIR`` will point to the appropriate ``lib/cmake`` directory) The following are not recommended, but may be provided as a convenience: * ``_LIBRARIES``: a list of targets to link against in order to use the project. The user should be responsible for linking against the appropriate targets rather than relying on this variable The following are deprecated and should not be provided: * ``_INCLUDE_DIRS``: a list of include directories. Those should be declared as ``PUBLIC_INCLUDES`` when defining your library targets. * ``_FOUND``: this will be set by CMake when ``find_package`` succeeds. :: include( CMakeFindDependencyMacro ) # for find_dependency # package foo is required find_dependency( foo HINTS @foo_DIR@ ) # add hints as needed # package bar is optional, triggered by feature BAR set( example_HAVE_BAR @example_HAVE_BAR@ ) if( example_HAVE_BAR ) find_dependency( bar HINTS @bar_DIR@ ) endif() # additional resources in /share/example set( example_RESOURCES ${example_BASE_DIR}/share/example ) # some CMake macros include( ${example_CMAKE_DIR}/example_macros.cmake ) ecbuild-3.16.0/doc/0000775000175000017500000000000015252726137014153 5ustar alastairalastairecbuild-3.16.0/doc/generate.py0000664000175000017500000000142415252726137016320 0ustar alastairalastair#!/usr/bin/env python """Generate sphinx documentation tree for ecBuild CMake macros.""" from glob import glob from os import makedirs, path import sys TOC = [('macros', 'ecbuild*.cmake'), ('find', 'Find*.cmake'), ('contrib', 'contrib/*.cmake')] CWD = path.abspath(path.dirname(__file__)) def generate(basedir): for section, pattern in TOC: section = path.join(CWD, section) if not path.exists(section): makedirs(section) for m in sorted(glob(path.join(basedir, pattern))): base = path.splitext(path.basename(m))[0] with open(path.join(section, base) + '.rst', 'w') as c: c.write('.. cmake-module :: %s\n' % path.relpath(m, section)) if __name__ == '__main__': generate(sys.argv[1]) ecbuild-3.16.0/doc/index.rst0000664000175000017500000000034415252726137016015 0ustar alastairalastair.. title:: ecBuild Documentation ecBuild Documentation +++++++++++++++++++++ .. toctree:: :maxdepth: 2 macros find contrib .. only:: html Index and Search ################ * :ref:`genindex` * :ref:`search` ecbuild-3.16.0/doc/find.rst0000664000175000017500000000015515252726137015626 0ustar alastairalastairecBuild find package helpers ############################ .. toctree:: :maxdepth: 1 :glob: find/* ecbuild-3.16.0/doc/conf.py0000664000175000017500000000302315252726137015450 0ustar alastairalastair#============================================================================= # CMake - Cross Platform Makefile Generator # Copyright 2000-2013 Kitware, Inc., Insight Software Consortium # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= import sys import os import re def parse_version(ver_str): return re.sub("^((([0-9]+)\\.)+([0-9]+)).*", "\\1", ver_str) here = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(0, here) source_suffix = '.rst' master_doc = 'index' project = 'ecBuild' copyright = 'ECMWF' with open(os.path.join(here, '..', 'VERSION'), 'r') as f: release = f.readline().strip() # full version string version = parse_version(release) # feature version primary_domain = 'cmake' exclude_patterns = [] extensions = ['cmake'] templates_path = [os.path.join(here, 'templates')] nitpicky = True html_show_sourcelink = True html_static_path = [os.path.join(here, 'static')] html_theme = 'sphinx_rtd_theme' html_title = 'ecBuild %s Documentation' % release html_short_title = '%s Documentation' % release html_favicon = os.path.join(here, 'static', 'ecbuild.ico') # Extract the docs from the .cmake files from generate import generate generate(os.path.join(here, '..', 'cmake')) ecbuild-3.16.0/doc/CMakeLists.txt0000664000175000017500000000765615252726137016731 0ustar alastairalastair#============================================================================= # CMake - Cross Platform Makefile Generator # Copyright 2000-2013 Kitware, Inc., Insight Software Consortium # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= option(SPHINX_MAN "Build man pages with Sphinx" OFF) option(SPHINX_HTML "Build html help with Sphinx" OFF) option(SPHINX_SINGLEHTML "Build html single page help with Sphinx" OFF) option(SPHINX_QTHELP "Build Qt help with Sphinx" OFF) option(SPHINX_TEXT "Build text help with Sphinx (not installed)" OFF) find_program(SPHINX_EXECUTABLE NAMES sphinx-build DOC "Sphinx Documentation Builder (sphinx-doc.org)" ) set(SPHINX_FLAGS "" CACHE STRING "Flags to pass to sphinx-build") separate_arguments(sphinx_flags UNIX_COMMAND "${SPHINX_FLAGS}") mark_as_advanced(SPHINX_TEXT) mark_as_advanced(SPHINX_FLAGS) if(NOT SPHINX_MAN AND NOT SPHINX_HTML AND NOT SPHINX_SINGLEHTML AND NOT SPHINX_QTHELP AND NOT SPHINX_TEXT) return() elseif(NOT SPHINX_EXECUTABLE) message(FATAL_ERROR "SPHINX_EXECUTABLE (sphinx-build) is not found!") endif() set(doc_formats "") if(SPHINX_HTML) list(APPEND doc_formats html) endif() if(SPHINX_MAN) list(APPEND doc_formats man) endif() if(SPHINX_SINGLEHTML) list(APPEND doc_formats singlehtml) endif() if(SPHINX_TEXT) list(APPEND doc_formats text) endif() if(SPHINX_QTHELP) find_package(PythonInterp REQUIRED) find_program(QCOLLECTIONGENERATOR_EXECUTABLE NAMES qcollectiongenerator DOC "qcollectiongenerator tool" ) if (NOT QCOLLECTIONGENERATOR_EXECUTABLE) message(FATAL_ERROR "QCOLLECTIONGENERATOR_EXECUTABLE (qcollectiongenerator) not found!") endif() list(APPEND doc_formats qthelp) set(qthelp_extra_commands # Workaround for assistant prior to # https://codereview.qt-project.org/#change,82250 in Qt 4. COMMAND ${CMAKE_COMMAND} "-DCSS_DIR=${CMAKE_CURRENT_BINARY_DIR}/qthelp/_static" -P "${CMAKE_CURRENT_SOURCE_DIR}/apply_qthelp_css_workaround.cmake" # Workaround sphinx configurability: # https://bitbucket.org/birkenfeld/sphinx/issue/1448/make-qthelp-more-configurable COMMAND ${CMAKE_COMMAND} "-DQTHELP_DIR=${CMAKE_CURRENT_BINARY_DIR}/qthelp/" "-DCMake_VERSION=${CMake_VERSION_MAJOR}${CMake_VERSION_MINOR}${CMake_VERSION_PATCH}" -P "${CMAKE_CURRENT_SOURCE_DIR}/fixup_qthelp_names.cmake" # Create proper identifiers. Workaround for # https://bitbucket.org/birkenfeld/sphinx/issue/1491/qthelp-should-generate-identifiers-for COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/create_identifiers.py" "${CMAKE_CURRENT_BINARY_DIR}/qthelp/" COMMAND ${QCOLLECTIONGENERATOR_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qhcp ) endif() set(doc_format_outputs "") set(doc_format_last "") foreach(format ${doc_formats}) set(doc_format_output "doc_format_${format}") set(doc_format_log "build-${format}.log") add_custom_command( OUTPUT ${doc_format_output} COMMAND ${SPHINX_EXECUTABLE} -c ${CMAKE_CURRENT_SOURCE_DIR} -d ${CMAKE_CURRENT_BINARY_DIR}/doctrees -b ${format} ${sphinx_flags} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${format} > ${doc_format_log} # log stdout, pass stderr ${${format}_extra_commands} DEPENDS ${doc_format_last} COMMENT "sphinx-build ${format}: see doc/${doc_format_log}" VERBATIM ) set_property(SOURCE ${doc_format_output} PROPERTY SYMBOLIC 1) list(APPEND doc_format_outputs ${doc_format_output}) set(doc_format_last ${doc_format_output}) endforeach() add_custom_target(documentation ALL DEPENDS ${doc_format_outputs}) ecbuild-3.16.0/doc/static/0000775000175000017500000000000015252726137015442 5ustar alastairalastairecbuild-3.16.0/doc/static/ecbuild-logo-16.png0000664000175000017500000005171315252726137020750 0ustar alastairalastair‰PNG  IHDR€€Ã>aËS’IDATx^í}˜$Uµÿ¯Bçé‰9ìlÎ9Ãr³€ééß,àSQ@Ÿ‚ (ú*JP‚J ’Ó.»°yÙ<;³“sì™îéPUÿSç»Ý·:Ì(«ìSŸó}ç;·ª«›ð;1Ü[ŠeYø÷ßÿ]Rñï¿ À¿éßðoú?Jú¿"eµ×ê¦ÍvP�®©^Ÿ+ßëÑóÝn-èvëAUU�H˜!¢‘„a„q3�CáH¼Å0Ìýjìiývÿbþ ^ à$¢“=n}]uuþŒªÊ|½¨Ð·G݃˥AÓ¦Ó°˜'צiÂ0,"â&s áp££1¢(úÂñá¡H=,lð"ÑK$íÿ€ÿÀ]Î!:Ûçu�R]]0sRmˆ£¬$¦E 2À‚ó5“x|Ÿ�'2MZ3gˆÅ ôö�b`0ŒÁÁ1ºNÀ ÃÄ냴~‘øS°ð$ Düßð×S€¨–¨Œ¨�¨˜¨ˆÈC¤ 2‰z‰Ú‰Z/zϯŠ_ÛØxqEyðƒ T×M*D©œ9aG<xæ‘Ôrû¾ÔzSX2ÿ8Ò<€öÎaþ.X?,Æq"æ¦ãÚdÞKô;Zÿ¦»ù¿¶þ[r“—hº>�¨G×ç—-©-X¹|‚ù^躊¼ôD€tÐs €™¹f©“÷‰‹õ ñÛèúÇ]G¾Ù÷QT¢:¢j¢N¢¢ñü¤›H™µð»eá/‘™ÿÔq«'ûÉÔCÓT˜Âõ°À\\ƒL›\„Šò<4·ã`C†GbBûs|+À&¿Ÿ,ɾý0& ¤ü»ÃÄc|ðÍŒû6—Â@œï�Ò½;hýƒ®Æo¶ÿ_ÖzxãÀ»ˆòî¾o ®þ꣟¡ˆýš³Îœã#­fÂÝŠµ¸ŸsJë0½®ˆ©�4yOC/Ú»G…Ep€oH!è ã@C?Æ O ñ°� ¶¸f°³µ_ ‚p ¼ŽÝHtsWÃõÑe ?ßEÔ?Ás~¢‚%«nYÖÖ>t뢅Õ3Ï=k.ü~·à-q�~OÇñÁäª|Ì™^Â`½¾«­Ý#Róï飾e€­Ò‡àN�³L»X ¶¼Î^Ëû‡ˆ¦³þºgÿ �¨\øù± žË¿ó×›æ|ë†?Ùïs_rÁù 0cz©Ö4Z[̳@®-!&À[ê*‚X³¨ ä6’ ŒÅ €Ž¾0šèž%AŸ(º—k§¦§›y"yO’™þY¶ <@üK$íÿ*à'*Ñ}l‚çŠþßçzÏãOí¹qõÊÉŧœ4šK%øb­€ûÚ¢µBëÜVAø|¾Nú|—¦bÍ T—ðÜ–6¼þVZºCÐ%àÒß;µ›oä6ó€#Ü¿Vúi}EÇÁkûg]€?@4nÉôùÝqçë·nì»ü¢ó¢¢"˜©é °Eœï‹5ƒœäŠ"ãÐZra ²kµe¬_X‰-zðà‹ ˆÄŽt.;�“æ<ŸÎ×›{#×3÷ 3ù�Ðõ×:]ÿgE˜þèDš¿üøN§íÃTlY@&ß.ÏJ0ÓÀVäZ‘k~ÎùŸ 2w¤}\8Ø6„hÌd gWñáS¦áp{w?_O÷� ýüĦ<˜ríà9-Œ¬gˆ_Ð~à¯þ3 €N”˜üw•—å=pÉÅK<µµ°�­Õ’B¡òµƒ’n ¹FZšhðeé—‹=h t0ާi¸[Uð¾u“Q]ìÃ?¶¡ÑØÄ g�¶F.€¥v¿Ýë1Û´ïÿú£x‡ÿ´o~ó›ø;üY€™ú{¿øÙ]Ô¥Cܰ$� R ›6'‚¦)®×ìÏT&hâZá5ß“¤07BÓ5Ã`$…žUé3æâ™�Mƒ( ¸ð�¦bwóÂq“ÓÈ$�I\+ ’“ü ñ›JЇb:C1¨ô ƒ¨)PS€Ú\Å¡ÎÄ&>~Æ Z‡0Nä7àl¡H¿7ñ5ð>STZ^øƒÛ^ _õÙõÿ¹B$ø7}òãÇcÞÜJ´u 0éæ(°Hi0s(I®0'äÒ€�vG)\Z¥ŽK»�aš[߯óZÁ†ú �%ð¥wÍÅ/ŸoÀ®Æ~X†-H&‘"ŸuÜcn*€a $mÎ)s(Ⱦ†ã>l>ÁgòþM5ónDÛÞknþg6ûš¦ÞôÁ÷-Gmmv 73‚;¶`^kªÜÉâBX„Hbp!}(Ð3’t�5>=Ww^KpßjÁOž9ŒÏœ1ÜäÆ+{ºøYÑV”à˜€JdD¬ñÀ×& 4Àœ¯5pd~‡yò;¶ô�Üõ�.ð¸óÂw-@™ý@ЃP8éùr-5^p+åó…Ùç{Ì™ 8À¤ˆR ÐÌHÂÀ(�¦êÝvn­¥µbòZz”ú]œ–>±½—�4ëç”bÛ0ün-E>�†‘G×8ˈD�ʼnˆGœ<ΆçÛÂ82G̰’èB¬ä‚×ʵÌÜ€’ àfÒGNœ‚×õsoá¯�`[�°Äã&ÚºBØA`ph Óꊰrq úÃ�ĜϞùÃÛ_½çÊO¯ýo¹€[Ýn½øôÓfÃH¶Ö" œREFª�H¿/¸Lñĵ¢"•(Šl k–…YA ]ˆ$,Ô�$°©;†PÜàn_8f"nZâ;²Z§ÎÁ£%î«,rÍÀð3-yßK¼*/ŽZ_µhEïáv\µÆ‹¾Qâ–†pÌÂÞŽ8vµÆH@¬ìß&[Q“.ÀùÏH3ë’«éÏ´v…8HœTĉ¤dÍ-ƒØ¼­…cz¶PoðÞc,¬ý§xÏú¦#@æÊ1YÅ ¸=:†ÇÆÄ}Bp‡¤®ÕtÁ¯¡Í.б Ø�¾¨…:£h�pçNn𰀑„Å€ÊLr�›+,²´ËXRXJôÖô£Ú‡ÇãA~A>òóó‘@Ó4LS””ž°ŽFãØ|`¿}µ1ËÌ-X™‚�ýÌ8‚N;žÚ�e *ñ®3ç`ã›Í 1:ØÔ.üÞ�­»¿úì1ßàö2òùË–Nâ.›þ”…Ux;�`I(µSpËiùà»U`^‰óŠ=è ÀŸj� 7f9¦€xÍD�SÍL‹ª8AGºX¹„‚¸K5°ØÛƒ¹¾!¢¦v ~?k°šj kå0ï}îÒ5œ±Ôƒus ñû×:ñôö�,‹À\ÉñŒ%Ÿaž%P8ËÙ´½Å¬XRƒÚªlÛÙ†X4~; ÁB‚è±²_&-šyÚ©³¤Öù>˜<�Séýg lgaǧ©XPéÇ,¿…Ìü£M#LX2�dðEuœÂa4n$,'þ�WÈ;ÃB€y™:‚ã]ÍÈwS§LAyy9ø$øÄEÃ'3Ê)òd:jÂïóàŠS'aÙ´BÜðPcšÛ‘Á‚—&JÖ3´P¥kpþNWß(ž~±óg–áô“f`ãM3úÃ_ð�wVdàwͼùU¼Ï”f?% ¬Å.cŽ©ªŽV§*�ÁL™k¯®aIm3ø†¡þxh#œš€s0”8üh‚Ǿ�šip²qIj|²¢”‡(ŽWëQ𗇹sçÂçó2ðDBûUÙAL×~vGL|¥ÂïñÀï÷crÝdÌ™\‚ßòff"×Ç!RX²-»�ûºPÑÂq”-lÚÚòõÚEßÿU뮯´¿Óà*—Çå[»f Nm…ùgôÁ`y ü˜ N*åQ¤–ò3¥é%>¬žœ�ú�(Ø7€°™1X6·á´V”Ô¬$a¦ÍòKTÆa‡`€n%°"±^0oÞ\x}>hü4!�æ_j¿_Ót¸\.¸Ýn~¾§¯Ï¿´Ï<õ�wÏb°­´TÆ!\ͲÙßQ6b]”foÝÝ�e‹ª½õ|ÀgÞ1àíZŠòÉdz¼> –~áSm.®]¬ýºïð{5¬›YL£áÉè�²·o2@~²+´_,øÅL 3÷F@ÜûK†�íCaÌŸ¿>_U5ž�B@׬ýÂ(I¯ÂŸøß"-|/¿ôz:0fº1äšÊîÞ´ø{Y æwBàsZÚºÎE£…sÊ?úů?þ½Ýp^Ë;e¾ êj`Þ¼JAj¾e9‚¯[C„@’Aœiv%1S‹ðVç(vv†a �ÞÜk‡J$SK“×2øã"�…,ð¥òóå„K…ñÇ{1uÖL””–2Øš¦ î¾JæìFFF°uÇnìܾm­-ôö™…è÷®DØU(.‡ûCî¬Dµ$ðŽìdbà­4a!â-n÷y�_Q÷_>Fdþ€µ?H~ðs%¥y }{Òü[ŠÓŠáN–x="~.Ïë sK9b~tW7b¦, [ŽíW ¸mÞÕ”ö3ø“aqäïZ¬³-�ü,Sè~I´“?ŸLAk¼|�¸"ἺaEß»0:؇X,†Ñ˜‰˜V€×{,À]Ý£@3ÃPuÕ XÒ}Hs?‘ùŸPXƎΞì=Ø}ñ[ûº~¾`nÅæ¿·øE× çέE‡ÙWl.�*e ²iIíŸ_›�¥ïl awÇLÑH¥‡"È’¿'\›þô 0&júQé˜S®j 7cP2Ö‰‚’6ý ²STÁ5MÆâßkã†×0Á¾ÆNj%!0Uœ´¸¾„�þÑ\þB¸|…нùÐ\Í @Ëtb>Q¬0¾U +�ÿ›¶ðæëÏjÐýwÒþ�PÕÓ¦”pÆ%\iÕYÑþÕu•%àÖpò’*õO[:¸]k©šš‘b0–ÒTͤP‡Ô~ñ¹Á¦Å‰¿´ù¼„c?$þŠ'o¬®DÕU³íO €ÂœI¸�”@dO¿ºû7A� ð³:^ßÁ‚ièî€�Â2ÄÆ¨Ð!š]ŒæÛ‚¿êyEXQÃ2¹éõü+‡Ïð{±CË:z�æ¹êÖçO�VÝ¥ÉÔÎLZ�hܶ* òÜ8sE-´‡°­iP6�t<Â&ff^Ù… S±9RÅÇÙ6ݹÍK®�²!Ÿ³òÃ� fyE¹Èñmð�C£|Oú¡ý‰D{Ô'Õ‚Ÿ±Ôú ´tª˜”Ÿ�#CƒP54—–›H÷]³²ã0ÿšµ|bðƒ~7j+ó±ç@ S±Ï9˜}ÇoÞ˜òÉËWµh9z�Ú¹BÀÍœQƒÁ#› ˜C¹ÑRá  0σ³WÔ`ó¡>èa‹Sh½"ž5…‰Z8»uÎþL‘]RÄÖ/#Ý¥�ã„@d» ƒ¸G^¬ûyŽâÓ ÌH¡1 ƒùèèH9�&„¥µ kª+0æ•V Rd*5™ÕÈìy�íX!ßK»¬vîíd6Åoüü7o®'hþ[€‡=T—ö~¿ß…‚"„ €Ш*ñcrE~õÌ!´ Œ‰ÙMµ„@š}Ý`p®/A·Î&¤+ C#K r1Ž%�À„i0ã1#¨¬­ä?.b’ù[ (òûáM'Ì5›XÓUÝMä�æö£}Ô�õK§à™=ah./T—‹Ÿç¼]ôõÇ«NZ�à�k�®ý5•AœKÙ7v´Á’‚bw/»»0ß[ ïè-€¢œCÚ_j›õ­Tw^º¤65Ÿ`ªàt&0FÍ(E{Í}aSl”‚"¸L¥Ö³°€cG€”+P”œu <˜çØë/6a&ðŽ @‡�ÒÒ2xbqƒ-ÀX4.²ȘB±f=ùÜ�À9§Í…°öŸDI,ŒÀÞ†~ª=ë< PôøMà�èu÷�¡$ß�Ö�ˆ0Û¢¼+|>$ø\ †LýR½EM¾˜#¹f4»¾—æÒÏô3@”€–#O3Hx Øô���ÙÖ€kù¥dXè�¦ýÒ5ˆšÅòy30­êºPÝågð‘rKa¿£aW‡å3Kñæ�^i ›,%YIpZ i >§®™Â1c±iKËœÙÅý�¼µ€ ýèbU‘æß¾":röœÜœ)ÅxfS3I`‚süd€×ÑAU©Fã }GšQÍ %>§’¬5¦¨ ð]ç@­4•ÉN"¤”gö�%hRL®üÙæ?�¢Ä4—Æ]¿(ùÿ‘м^/iQ±h .—ž­ý@ |“¸®©xïòR<p…\b7&Íd˜óð¦V\¼¦[H’0—xÂXQ9ˆý]n4æ€Dï´~–"µYÜü€‡µ_IÃ#Q©nàð‘þ•^;* Ö ð…O”<˜çƧÌÀ¯݋јaÚ(�CƒŠ¶¾Q,�YÂR EnÞä¢�*´SeÆZe&…KXÅdÆ\Z–‡k”~RÖøÓ�CªÇÀþ¥ÖˆÝ¯g—aí×t A$�ª2Ó X2… ØýþyQoÀ–ÈLÎn§€ck}�H2‰¬@1º[°v ¹Ÿ†¾�8LSs•åÛr®T…‹k+VñÙcQ“ñ�IóŸáN(8\@{ÛP>åz]së3R «\áS·/¡¹´7¨}¸uªKçÞ|EY}¦1Ð�ƒc(ð»xÂ;ÊÇ´¨B’EEp¾/&`$ŠÂdF¤u“¾RûsºÖ~&€ mEEÕÜÄQ�„!À}|šýK|$ 附ɜ�`’,€k,‚×~lž†Ón@aâÕM›qr ˜^‚‘‘Qr5ƒèŽ€lן;.à¬j5i?Y ߀€ƒ·«Y°rÄ\6ŸJŸ»òî·# öT"—¢fÏÂ�¹n:†Fưqg;4ŸnsÚÖ3вb?t�+a¢k0‚²/ŽôFDÓˆ•ù¾©7E€i1°HY éû9pþÏÉ5÷5žýcÓH /BУBwéœþæ1ð‚Xxk¹Åš7?sX±›HAee%ZÛZQìNw7bS_Úc…ð¨q¬®ã”ù¥()*D(ÂÐÐÂá0[™Xxc‰B™­`¼q6 ¤¢eÅ>>3–0X?ñôH8–³n ,£ëÕMMugŸ:sãÛU™-M>R¥Ï%ó*Q]ž‡{žÜ%#O&º ô`Ð ŸÏ…6¾ªÈ�ÃÝ£ ƒU4Ž,æ £Ë@9\çÜrJX2�@;Œnî´�µÖ0`Å ”a˜S¿XlÌ:Z“À³ Îåáx"¿ÏÏ‹'èù¨ˆœVÀä‚ήN†*OfÄ·cV°ï¿à42èD züÐh˜…ª7ê‡Å‘iú‹•[²¹d½tN M4jH£Èg¥Êúc!Vq°¡×€·(ÊlEMßçscÝÊI¸�ÀOØRèÊr-Œc(Ì4ÐÔ3‚y“ a$÷ñ‰r*GÚ¶Ÿ×Ät‡âŒØ6È2¥\*ó\Ù`F‡�[Ç[€Ju”Ò¿jôôu¡¶fƒŸNn†`ç®ýxô‰'86øÊU_B„À“.@Z]×ìR2 €ÝßÔÊ<”—•§€àËud á<Ä£p꨺¥� PU@i¡�´aYê[áH<ÝE:b‰¼€ MýUÞ¶ ˜ gà…ªNUØs¨CÃc9Ág寸´¿e§/«æµ¢¦ÉÅ$Z'ý¾<æKȾèH s‘’1W˜Û ¤ãª'"(õ$`²ÖY¨(¯LÓþáÐ0øÃ³xéåWȧ†ÐÖÖÁéáG/¿ .]ç�À >×$ƒHðgk©O“¹Á#BSæ04wž8¾FŸø?àXÐY¼¡TçV¼CÆâ,ðJ* –® ˜çA{W¨ÀÛ¶5©Ú2k¿Ž¹TþÝ{'XuÃB‚>—·® 7DÛ•ÁÀËJ—ø^úæ[EdÓôl˜ÈHí�“ö›ƒ’ùïèCuumJã÷î;€§Ÿ{NrÅû1:ÆóÏ¿ˆ®ÎÜÿƒ¸âò#2&âеÉ.ex˜k,l<^_x&§ Œ‘ô…âèí„î³1Ò‰\Dê�:cËGÙ¿ôf Vί@i�–·å* 2NQ�ïE{ÇpÉÛ~kážïDzÙÂjì«ïÅh8žw'ŽÆLKï(¦•ç±VËI-GÞ0A”ã°F©ÁY'sË{ü<“lûJ ,Qþ�îĤI“ÜÔMšŒ§þü >õ¹/âáGÿ„Å g㳟þisw%gÍœ 7 ÇæÍoâž{îNy#apåÐ0 ¢×\±ÎÅÓÁnâx'ø\têë@s÷âcÃ0ãc,œ€õÇØ3Ù»‰·íëÂÁæÖzr\"žkk#[°òÒÚ:‡½Gc‚Âär@7›=½\ U’  ¦Ÿ¾ûÈ –M+Æ®æ!(DZKÿoÊÜ_úxéû%Oë‹HWŸƒ„°p°FÚ_U !ÅÌ™³¹ðÚÆ×$_íÆÐÀ0™ýQ̘>�ؾs+~/úûú˜ž|òIœqÆéL …$ìà0c!0 H]÷qI”ËpL00F,JÀn1‘nÊ­‰åÀîþ±åÙ±¿›,Y3'Š”0!QWätqyI€3’ÀQò!Ê¢‹)ò§Y3>ECÕµqô_æÍŠ%…b Å P1Ä­)ˆ õv±&æÈý•Œmôr*F\Kápä¼9Ì‘%,4KïÇ´iÓÐÑÙ†ã�[Ëæÿ¢ Þ…o}û;èëDz¥KñÖžÝX¼h ¦O›ÉmâeË–áò+.Ç�ûñ§?ý \púúû¸tLÀÀÇcñ¤ðœ€.FÇ2Àç,¢¿o¼ÕŒ…³ë@ºEs‰™U‚—3�)qÀï¦ß‹ñ¦�¦ö! †Æ¨[Ä�ËŽÔT壓,ŽäE%P *¼^3¦ã‘grlCO�\³OJ›È �Æq¤k &`{ã �¬ šI§Î KSè¨þ‰ Q\ó lYd8n=€]„‘@Ð aR¾Á‚4Þ;àc8ç¬3qãw¿Çãܤh¾€3�í4âÝ×ÛÏn «£Ï>ó,ÉÇïÝ»•dÆû¤ŠÅ¶6Äé^ |â£P¶a×ÁòÿcÜ1¬® b0á �¢eö5rZXš¨f ÐÇ'‡ðQ¸üΤ­oE¡)J¶oWÞVNó�<Š,€¥³g”¢þH?ûœÌÈŸ!‘Ý~(r'M(Þ<Ø‹Uô;Ûœ¦_¬t^3ÐÎÈDnùÎ*ÉÊiŽùaiLÃÀ½S§Neͬ¨¨LUýˆ“8÷ýî>tu÷`”\u9…[°`!¶lÛÌiªæv³¿ÿ�qݵß@ÃáÃ\BN0øÂ!p»]8r¤‘-�ÏãcMMÍ8ÒÖ�M=Ð}諘7½ ›,ÉØVjö'I<êUôrÍŸŸ“‚ÁÚŸë{³Èe‡F¢,$€r4€Ñ%iÍÇÎ}]™B*Á·Òƒ>+…­•ôù\ï‰S9# Y�$ðÒdºdøüœ1€ôÿY­T?�…Zf5µ5È äIð¨ŸøøÇñýï}ímíX°più[P,@]ÝcY�ë¾ñu<øÐd¶ÙA¸�|ðÐÁ `ó¢Q½d=�<ž1Ø·o?Úºú°yרž!åç¹9õ“‡CdɻӲö/§ ýÙ—ëÿ¦}Ãn·Vð»ÐÝ7 ¨ª®¼–~?y�Ü ARÊ5�¥S‹°ñ@¯¬ðsrÞ¦šÖàbP¶É�"&‹²]€¬Û/qµaQAëÖ��=%ºÎr���œxâ‰ØøúëØ±c ÍñÇ­C}ýA´´´²”í!ÓßÒÚ‰ÓN;�µ\QTÛZð‚ÇXŒ„Ýš�àpÃa² èê¢~I# {¡yl¢ð!fy1ojö·E³¬Í+Âz 0ík²)Ÿ›�æÎ(åZMwïhRq‡�FB•åÁÒŽ®Gžª:qЗ¾IÀÿ½ymž¨Äâ0Ç©�«¦ÅAR¦ðä ¤•q®@jVBÆËÝ­XXÇÚµë�À3O‚¿e˼ùæ›ôÌ:lÚü†Ù·o~cšš[±uëNøý>œAÀŸsÖÙèèèÀ+¯¾l·ŒðÄ9ˆ#FDœ�3Lû÷@}S'5÷@Ñ<¬ù.o�Ø,R€Æž8æM+Ç�ö6§Mdq]RȯÊÃ@(šÕøÊN!-îr®Z\ƒ'ž?è´ä¡£²Å…>ÖþÜA_Ú°}zô/óñh;úñ‘Óg ßçâcÚ®ƒLÝ;Aär’¿+»‚b>}…»‹KwÜZ€�ƒ³ö²lÚ´ÉÖx´ªªJL›> ‡&­ á™ç^aÐ/ûàØ*õ÷÷c×®] 1ðô; 6׸Ëi&ÇÈùÞÈ(5ɶíãC%)àãAQi>��ùmÈCÇ �ã–J»Ä:«�hªÂ‡At\}ü+Îg_0«œ­EW¯Äí¨-€×££§?’+è“þÞJré÷‰‹.e’yli; ÁŠéÅxawWzŠ™ú)©“ÐÚÏ#Õ�@F@Èà›XbÄÒŠ V¯^ÍàXÜ~}ôÑGø /¼�ƒ³�;w&7z0?õ”S°ƒî�tâI˜T[Ã|OO·h¼Dù;ÔÑcs/‚0ñ Z“ïêÀáæôö‰±9<&î °Ö»Åpû‹y­¹hH ¶"ŸS3aIו±‰±¼ÔϾ¿w Œ•”ö¬X±‚5�jóì³?úÑ�Rî^† èØQ.oÊ‘|{{{ªÜL@³¦SµNTöL¼›4úPc 7µ"*†.`‹KUôKTÞ$¢h6ø>°Ù÷ø%pJØ÷«º—Ÿ44ð“ËóÐÒÊÞÒnYÔ÷/`ëèeíÏŽÓoñœÀ’¹øõ;2„©íhà€iÈ�• �#åãûé~ŸH®À”RašÀ#¯7ã¢5“pÓö¤çþp®™zîöw£8Îß„U3+°dÉhšÆ&¿¡¡ŸúÔ§0uÚøü^n熹fo¡««‹>›-i½ :w-÷:‚moD$p+)ÀÐŽ¦–&w©¾­ù.ûy�̽ÛÏ~_€ïcáH¦}M�£ü^C C‚j1¡´È‡ª’¶ïïfí—bå”�â/Χ~ÿý�ïåjmqਠž0dÓ]€.ëüV–ßw Rq€CLàµÝ]$“…’ÍAÓidz,ñvN˚Ќ1œPØŽU³k±€rw äž={på•WbÎÜYÂD!êhïÀYg�EA_¥x- 8åõ¬õ�­]ؼ}/ú‡@h³.@f°YØbk˜.4Þ%5Ÿw ùYxk¸'×yl\–6‰š;‡±fA¹@3Åàvi”"’…êÁàpTï´ÿøxßyóðÒæf´³;É�åÑYSøw(ÒïK•¾4_üLZqÍSCxøõ&{Z–­€efuìÒª€b-æüÝÆN-ïÃÊyS0‹ü7i2Gë›7oÆý×aÁ¢yüCa¡ùÝ]=ôÜl\{íµÑ“ÿ·-×ïzò%òçýXs\cn'öÿ%ÁvÛš.÷ªâZ÷0iº—7‰hD|Os3ø„û©s;™öñ6ôxÌH Á‚i%ü9�±,�ÏÊåâ¢Óç ¹c˜™Îª ÉG!ÔûÔ4UO˜–Ì$ðÒï§ÝS„ÿ¶r—}aá•��¸èø¤ñóé� qL?,x�!œU3L“±3¸Ä+Àäï§?ý)-YÓdÓΚßÓÓ‹ü`>n¿ývÔ××Û‚ÂχFFqï#Ï‘–�  t°¹áÓ%ת½Öx-5__Ó¼�-Bj£AŸ¾{Y ÌÐ9ÊüBˆ¶!¾?©<€ª2êTnkó™£îH»X¿²ŽÏ~ð‰½â–ü‚dâåÝoWÚö]“¸ø²{Zò|î©£Ñô†�•ÓïKÓ/žqš~‡øK+°v¾ÿàôIðs ƒXÈKôá¼1¬X855œ®q5ïþûï§ríƒX²lwèHëÙï÷÷ °%ùío‹îîn´¶¶r:784Œ»záh‚S5�wöú éD¼?UÖhwR›™dv :¬Ðt‹ˆAgÈU9§›vœ�Ôâ#�!= öžK·ŽÅ3Ëp¸e�‹>i8fz̤.àš¥5¸ýî-0L‡hdwEë�¼yUâ(\ƒ½ÕïwM‰:ƒ> 8~?Ëô+é@Vÿøòå¸h-Y�ª<ÔwŒ¤›ýT3HÖù Ì\<_¥Á”…¼���$­¿6nÀâÅ yÒ—´ÞöûìÛGGÃxðÁÙߦ&7|ñ›?>ƒHܾZ�/—7(„ ÀÚ.,ƒžŒ@\…›¸HIy-ìd¦¢dœW 뎞QNõ`ÙkË�%°ïHVPheøÿé“ ñ¾sçÑÇnnÉçsI6e/€ /îK¤ÿ—i_vʇœ¦_q6~3€‰„‰G64á’u“ñÝûwK[ïLÅ–ðRtà’%~,]´EEE)3~Ã�7 ±±óæÏÅXdLh~,C¸óÎ;ùyªú1øþ=?�HÌŸÀ(²‰svÝàÊ/L<8úç¸@F¦PÒ̲j‰¢+‰ ¸ƒKl9b÷¸4Ì @í3žÞØ”´Ùæ_ð%sÊñ®“gà·Ú�¦ÖA§•�°§ßxñ¨ž,z  ­Ï¡±Bã™g™~9¿gZòè•^ØÑŽ‹ÖM!+$+räÿRó«Õ6\º²ˆ†5ò&wØìík_Cd,ŒY³g°Æ'S½ðh˜ûù7ÜpæÌ™C]¼íl z{{ñû'^Áp8Öv<ù%ðËÀeZº§ºüD.öálÞ¡È&˜ ¬Ãß²¼ËØKÄ@éÀËψKÍæ—Nå\X1§ »íaÛ�l÷¦=+øI«&a-™ýŸÿ~;Ÿ–eósg /µ<ô›6^tÙ=M……¾Éüÿ,wÊ'¯¥é—Ñ¿£Æ+ûþ�ˆ›¼�üÒõSpãý»ƒ ü]LqµâÝ«Ë üE<ÆEÅ€«®ºŠóûIu“ì8@Oá0øŸþô§qòÉ'SSf?§zƒ$?÷:zF|*Ìøe6q¡Æå/°ý¾0õ¸9fÎdljÁI •,íξζ'ôf×á©�GðVCŸ–èrkè…§ÎÀ zö¶»·‚NþÈ^ ¤dÌyãÊ‰ŽŽýËÍè¡ÐØ«e%�$Ð’gù5¦ŒAM¤ ‚•$G¿àùmí˜D~pÞ¤ñ™ Ó01Û}ï[[ÍãZ>OÕPþÎàQU] ÖúQ¡ýôõãÌ3ÏÄ?øA.Qàǵ�'^ÜŒ–ÎA ~A¹M¬ýlþ=Aú””ÉwŒiÉé²Ìƒ)ÇÈ% Îïs£gõüJNŸ£EÄfj¥«*.¿`>j*‚øoüÐXúˆNaÉ iþ�V::C*ÈóÀëVËt©Î=éK:Br¼¡;7pç“ð©óæðø¸iXh"«0Õ®îq1§©© Äg>óÒú.å†ÃrôšÖõþ™÷/áû?ûÝv>À¡ÝúñàS³„Bc�Qsa`ʤât ×Ù ó5óœ÷Àkyýæ¾nlÂ%kkq|q .>qEõ‹¹[väÈ.ÞpuoÞ,óƒiÀgðKŠKð£ýˆµ¾³³“K¾Ûުǖ½�нüür&­¹DëöC“åY©åNm4sœ>&Z<Ÿ¾¼Î®_R�IyxâÕFXÈÐffà7‰]}ùJnÝE¥ÎRÃ%w W¦ÿï%zòo>(²õ­¯Å§-¿åÞåKk> ¸y6]D¼ò|03G˜\Ò‡šò�["àKÍwÝõøn¼wñ.8iW÷6ãÁÓðæ�Xºl1t—.ü=ï²a>48·Ë�_þò—é“ö3ø ÍxfÃnʸƒìÁÚŸlËŠò,T‘«§‡Ûr™\3w+×oì¤toÁô<òòaNÅ,�Pð@ÇYk¦à„åµø# ânÜÑÆàf’Óü‹P%ÓÿÿŽüüoµL±Xâ.;å˜1¥8éåÁ� "Ò­€)(Wl�vÍïìƒnE±¦²ófOÇìÙ³¹´K&Ÿ7¾Kà/_±š®;4ŸÁ箟a˜vºÇùxss3§€=}C¸ÿÉ×àòæ³�÷äøÁrZódƒ¯¸ä1u&àæÞ 3ÂýÕàK9j1Ö.ªbŸßÜâÏ#cqxt•›\Ä5[…ºÊ||çŽM¼û:3%´rVåyÌÉšº¥â7·³‚éU$['-¹iOIq`¾]�:Ô<މœÔ™®–ˆäæ3»>ÅßåHßPàÓÃ8wv§®_iïÜáNÝ¡C‡ð:Íéýìg?ÊUË€dšftdc‘(—)×·]Gü]Ý}øõCÏÚûî8½sÛ�Eû.Ò|jÐpWNnÇâ6µÃ„"÷AS‚K!Éu0åÄajUg_‡×(õÝÛЗŒôy[}Àçb­_»¸ ÷?}›vµ©¤ÓÌ‹ïf ép*ž´º{š^ÿÒ¶¿›”½ÿPÏ-+)­,  »? �?TÈñl9 &R¾£_€Át…qÁb'¯[Í]:JãXó_zé%.ß®:nŒ„!€gŸ/Æ­y û•wÓ§O·5Ÿ­AgW7~õÐ305/Üäãü`9÷åuƒ/úøªZ8"o¹v=îq´Ù÷rŸQXQìÃE'MÇ[‡ûðú®Ž4__RàÅÕ—-ç÷+_ÿÓ�<Ê�«”íæ•Ô†PY:±’ë»þÎï `ð~A`|cÏþîÂåübh‹Oº¹¿¨à‰C¤eã'Çè›\”xødµ '¬]�ÒÒRÛt³æ?óÌ3øÃÿÀàóÞ;Zj>ñH˜‹=ŸøÄ'°fÍN©!Äÿ}�¼„H\!Í'ðóJá ”�{ò¾Fà«v¤UjµW¶»åZ ¤¯3€Æw¥…^¼ÿôYhëÁŸ76%?ãM—Pn¿zA%¾ùó�xó­N ²ÔôÇßËÍ4¦ãÌIKJÉ áVï7ÿ~@ï¢ ‘¸md$víν]X¹´{I¢»ÆdáN%.-�¹÷�/ •y!¼ï„B¬!�É|se�:u<»÷ç??�•döÉd|D¬ýÜ׿ôÒK9Ø#³ÏQÿžÞˆîÁ1QÚcXaö]^©ù�»’³š-NÆ Hà'å}ç½É•yxïi³x¨ó¡çqOB×Tœ°´笛Š#íCxòµF¿+»nà´šR&ÒF¡$ßÖ’¶=ÿ'ͯ|~„ïþÝßbZ?&?såàP8ð&(kVÔa_cÚzÂiž½jZùWIí­¯+ÆO«Äê•˹´K…[ó¹i³aÃkìóÇÆ¢¬éRë™Û~Ÿ‡?¾ô¥/qi—Ì>óç)Ú?ÜÒ.éæ•Š�möƒ)Ÿ°ÙÏ 6� úÄ™€Óüçvó§ãÝ'OǾÆ~<ôü!.è�Ÿ§8`2ÉÜßþû\ ^CA!Ò—ÙD±'BFýÌRßÕ<Þ¿cï jÙõ•¾º%7ÝAÀ^iotÎT>i3ØÌàß{ï=ØI¹þ2ŠöÉœgÏ‚À»w««ªñ=ÚÉÃýüPˆÍþ–݇°yWƒ]Û'*±µŸ}¾ÆfŸ5_|2PÍ}ÚxÐ�tàsÈÍÂJœ³f2|xyk Î];§¯žÌÊrËo·¤2€Yu…ݼñM?ä«å,yd.’·�¢‚_|øäOõ]Xÿ,ëÿÁ°|¶<ÿjQIóLªÜí:Ôƒ¦¶PòA(0…´&° j~×\,Y¼˜§ri(“Íþ¯~õ+ÞI³xÉBÙÑ“s:Ë�Ïõ½í¶ÛìáMÎ÷Ùr4¶Q™w›½.a¿ïö—pÀ§»|bë•âøÌ KÀ3ndŸDž®ýYîAp6¿n±�êµ¢0èÆ-_\�í¤7ܹ™Ç¼¦ž£ÿáPLf¹,AfõGIj?+W*°&Ñ<ú¾Iè_ÿN¾6®eçWÚë–Þt#,óÛ„,Œ„;&híÅÚµÔ«.Âæ·:øôJΕ‘ÀŠºA\vÑ2ÌŸ?ŸK»µsþç?ÿº{z°pÑü”¦³HßOà�²µ¸ýöŸre�4ŸÍ~[g/îþãKÐ}ù º'PB¼˜¯U<†¥¦¦•&TŠì,@ðœ™@.KÀµý÷ž>Ëf—q�ç’S§cóîN\û3jBõ‡s6‹ü^Cc7�’¦ÞùÆR%]0Dëý{‡_øLû1ys¨eâf(Öe¦aÍTʼn^ýƒa<ùJÏ­ä~5Ÿdq¸kg àÃÏÕ=ßžé'?ù FÃ#<¼Iàç øBày=^~ÖçóÙ›ýžÞüϽOAóä‘öóè5q[óíé[¿8xI•š¤X¹—”5u+×2íÊ^^—úqõ‡–bÖ$6é<Íû?ï&p£v ýÍô|ÖçÒî¥þ”>A-Ü+=_ﮩ¸YŠê;,-;ÿ3Z·ìæÏòÏÀgþ*Ì„‰�û:ÑÜ9„õK+±¼º§žpç꺮ãÀ�\ÞýᎠfÉ^¾0÷I+ÀG¹¸t?KÍ;àcèëÀ÷< Cõ±Æ{Øç‹¹{·O–w%¨+¿…¿tÜlvA@¾ß�åsÊ(¢¯Áq *0Šâ¿ïß�—·´ò¼0qÉXX>?!K8D¥Už’"çø¦Á6?uŠ¢©Ÿ]tÉ{£ŽåÛÛ·}ùÙºå7?`šÖ{TÄ¥›`�$ � Ñ¿g_tW÷4M³Çµü›o¹�€u¢—Ÿ+à%®i:•�¿‹ÚÚZû>‡�4nÜô&<^?b® € ¾Ð|k>+£¶ÿ6 ÖÄA!ƒ¾bn·q§TçÛ>�‹<¯loÃm¿ßÉÚ�  �œà³ö{\¶ ˆ8ÀOÙ÷Ôi¡â…PâZÔZÄñº¢�ñPÝËŸ}öA!jÇLÀÒ©|I±¬ÓË,v,ù^·�s—Eñ¾‹NçêI/wóü›oFqIªkªÔì€�'zØ×ýë_ÇÌ™3“‚ÁŸ‡߀ξN_·›ë5ƒ"Ï÷ƒ7fp!"|e"гo8•^S€šŠ<̬-Ä*jâL«É§@·/okEKgާhãÎÜÿÌ>ºU|y¢ô0Õ<«­ò1/†Ðæö@êX¾´sš…'3ý R¾~Wž÷Ê2B—‚ÿŽ©´l¹º}òÒ›?j(ÊÚf!à1qÞ—\x–=¸É@nÛ¶Íöù ~UM%*++’f?3àcŸûÜçx@ìÍãÞþó¯íÂþÆnÖøún¿d-~û\ ÏæCÑäH:L8s%å¯À_%ª* `iöTAu~ïà¨çßlÁ-÷ô ®2ˆ+Î�Ã8~öÐ.ì<Ø WepâÎamyö5ô©sŸ I³Ïiï=° &¨ºö±ê¯|¢mþ˰¬c. ‹æ¥�OZºôGA·òÅ‹Nvã]çŸI)[1Kío¼Á©Þ~ðL™6™ßË“1ÂåŒþ‘+®¸'PÜ öìqÿ�í°aë!;¿ç ¯±GÃ�“úåëpëý{މý°g%çZn¼,+ôbŠš@·�eÞØ>Œ¢Mour¥Ž�`³—®p=ÿ´Uu4cÐÅGåÒP§9´¹-�Ï­#àw¡ƒçúÄC¾þ³çœuªnïÁ€�7ÚEâfÍ™‰¢¢BaꉜQ¿¸&s†‹/¾çŸ>Ø}Žø[Ú:°w=V,š‰`qò Ëá ” ny`À…Ÿüç)øÕ£ûÑ9áÿiöÌBÐï²slâ´¸�çcÎ×ù7×áû‡£8Ò1Ì€ÿá…Ãć¸2—Z`!ùØóù»ÿC£ØoìéÌý~"Œ_v B%i;ïúM¦w6S¥ÉšŸ:Ù©ù "Ó|³àÄù×À_†/ÇN$øp}ãß8oÊ”)¿¦!L�J»•¾öÚkvÄÏ…›ù æ‚îg|Ò °?;…öèàH GP¡‡ÀïÂw?‹`A /óÃeà×ó�ŸD}K…Á¾ú‘غ¯Ç>7ŸN‹³vöE(# ñ½‘HLð8·`sÒoéš‚óOš†ó¨n¿»¾7ݵ…­„[‚:qŸ =UØÕàpën©`ÀèâE”JÚþ Óx»Òjƒ®Bÿû N99ê üŽ™8Á§vì‡)Å»�L¶‡7Ù_¿üòË<�ûÓŸý”7kø~„�½üŒ”Ï0 ÞÖM»y9[`z¸¯ÿß¿| –ÄH"€Ø¨C¦…–¡04Wu�5å�çê©�^��]¸€‚±ƒØs¸/-}+y1Qþï¸7oj1ÞÖlŠòý¸ëÑ=TÒm·J(�ÏN�±F{<›ÿ»¤‹7“jIðÙìË1|ÃßbàM"âcŠÏ}ñ‰×}ôHõrXrÞûX€_#rÑ&ÌÏÓôÎ Ô’Õ’¯\yñÅyþ/~ñ ªë/Ý'àã{|äÊܹsñå/|V¿e‰J_?n#ðM5—¯n_ \Þ"¨|¸²S»¬!¦‚ ÛÛa�­_ù¡eø�õ:EæŒÁ„Çïå¶s ø‹O™Á|û�nÜzï6ô D&h1k§e°µR;î ¢º"ýc` UE€/v)BóM‘¦?$ Cq»>´ôéÿxeàAX¿X.–¿…’´¿ø¤æ»I󯡡ͯ­\¹R%�¹>ÿÜsÏa÷îÝøÍo~cwô¸ê‰Œðñ¾É“'ss‡Ž\·µŸküÍ--¸ý®'ɧÇ|;Ï'òñ@tÝ˼òP†´“Â8�ûÚÇVñ°åÔfÍý—S*øÝGï¦þüüé%Ù?ôìA~ŠÔôqšE©¦—È`c#{O€"äUå<®¢þÿÖ½ü‚mž£|AœÞñ˜pmÅâ0bĉèÙÿ¨ýŸOþºl L§éÇ@‚Ϛ鈴ëëHë¿LG©*¤µ ê³Ï>Ëçîüî÷¿ÃªÕ+ LÕ|fÀá¢Nuu5nºé&®ò‰#]x›×}�mÀþ#<¿ïò—‘ösgŠæãâ�M®H@h© ŒŠó½¸æã«±ã`î}r¯0½ãÿÍ&à/9m¦¾>{ˆ7h¦Ï[g\f˜øôÃËYóÁ{ùRvÓê a|r*¾'QdðÙÜ3™QŸÈŠÓµ¢|}Ù¯?ysO=Œ—N’࿳� ¾ç+_ùÊõ'�tÒU¤ýŠÇãáÒìŸÿüg>ríá‡ÆêãWñÃÂÄç ø¨ãÇ5Ÿ_¹B„Ó=*Qgo+6ìl†‹:ÊE•�›;иī9�¥Ë˜ä•hø¼.\ýáåìÝù'Þ@™çÍš\„KiRgáÌRì8`��wd’C#l̳Žõ—9'k:@j¶ÐròûôÏ,ÆîÆ~–¬ë 8…¹O™PHû£‘(¬˜øs¿÷É›CË üÌâö;HðùÏW¿úÕëè°Ä«¨£ÇšOûíxO>ÊÀS<ǯ]Í��ð9£žúö·¿�òòr÷ÁÛ¶ßÜÝ@à7Á,Oóä÷ss‡g÷“ÿcUSÎí+¦Ü¥,«lü&M|�"öwŸ6ßûüzÜýä>¯n·gyëøEU˜Z“ÏÀý'øäk«3,`|ÅŽå$pDûu <p¨xÑ3×tS©QÄïRAžˆ8‡™<ÖÞ„ÂѸ ¾¡hê§çÜø¿nÌóÁAŸÿ�³ÙàSYöÚ3Î8ãj ú|ÊÏùušÄåTïÔÓOf3žÑÑËÊûí�Ü*((°]…ìÚ×€ÿyè¸xv¿<ÈÉ[¶@rטJz«ÔÌXçˆÄWΩÀç޻Ȯp©ºhŒóø—¶¶q*–3B�É<3^Ëâ�ðÝÌ…—¯ÚQø òÐÞ–§žqzÈy½ð÷| G‰FU·þáÙßþøÃ þr˜ß|À—0>ø^Ê󯥼«f̘ÁàS´Ïóú°q•Ž¢~⬩©F /�^Ú•Ö€k$H ÂV€RFþþá#­¸éOð(—»°2µs‡�Ts‰µUç9EÈØ á¼Fj wåìR¬ž[Ž)•A®ŒŽ%ø §wQïÕÙ¹¿ôárÔšÑDð¨�šÏÜb¼e[0gð‹ƒäû]h² ?–Ã×ðãqø5>?ƒý£ƒJÀ{é’Û?òrC×; >“>NޝyéL�oœ{î¹WQ´®hšÆÒlçûd @×ì»)úg�¾ûî»ÑÜÔÂ�¾Hº`ð¿øÅ/rÊGeb|‘ë÷àiÚµ»bÁt(þRÄôbŒ ¦+ˆ¸Jà«zZ7 ÒÿrÕ¯$èFy¡•DöÉZDÕ~I¾CúŠæï}±‘·�Ù‚^SÀgÌÄŠy¸ûÙzô‡¢Y �Ð’oñâ.À©�0ûB>y혊DaÀ ¿OGs¯­ù¼J‚7|3–@ЭA§Ïú†"[Ü%šÿý÷4ôÔÂ8ÿ—TéËH÷Þ) àÔ|‘÷[ßúÖ5ç�wÞ—)Pc™~å•W8J§ÆŒE¾^¡@ŽOÞ$�æšÿÖ­[ñãÿ˜ÝƒiNÍçîõë×sw7wÚÚ;ð�[îçW±×M™‚Y³gbÎì©(¦¬ÀŸ—ǯl1 ÚJ�˜arÚ#"à t* ø€%Ʀ?ãÂJ× š{Fq¸}fæ¡JBpÎXV…“Wâé-mذ§›Œ±Óÿ;-2ÖN“‘ûó Ï¯KEïp¦x—¤Ö3YÑ8 ý.¸ƒ®�ðOª/9þšÉ'Ï��g5Oz™Àÿ¦ôfÇBÔ¤Ù§ íJªÉ_Góú �e{Û´aÆÚ±3@Ó9*ÝN%ÍŸI'sª´f ò/ûxqÒ&¿Péýï?È…ð™>â„n»µkÞzÛ¯Þlíõ-rû+|®@¿‰Û[PŒêšr òH¼<ðûuø½n"�É–Óžá(º‡¢ vïð¦ Ý¥þAÞãuÚ’¬†g/¯æƒª6Q^þ•’FcÍÜ‘�\ËKYê/7Éóê8…c¢vo°Ös5/fÀŒÅYã+ <0ãÆP÷Hü“So¸ìá¸#Ò ó%ߺ^ÿŽ �Ÿ øô2Úœ±‘4¼Òò‘G1¨Â÷øc�=Ö"ÜCJP(‡/¢£XO'ív“vs-à�ü#žzê)ŽðÉ‚àÝï~7êêê€Ë¾Ô´~{÷ÝϾðü [u_éPAõ™çzòk×Û{öTŸš×Íí"î‚ârCu«Pt^Sˆ4‘?I_+|tÖæ3ùñƒ…ÖÍ-ÃòiE|nák{{ÐDDn¸GrìÑÖ…´^ã7{F£\·OåöfÌ ‡M ( £"ß‹Á¡±'¼¾Ï•öÂÖöÀzðR™ç J«ðåÑ.Û÷ ·‘¯ç¦¥y¯Üzë­¯ˆE‰"F’˜zÙe—�O±‚B ®RÊÈçë_~ùå|”›®ëñ“ ±…cÃ}÷Ý÷ !Ö¬¨êŠ,Û+g|t�˜ümÍ垦èš[݇æq§µK‡ê"®iòUö´H[Ì™ dÃ-ï�GÜ!\FBpü¬ŒÅ lØ×‹·ZÄ»ÿ3å Ç ¨¦ªÞÆm$làE7np~�˜‰’<U…>ûóÖÞˆq¥ï?ßýhd ™|Àr{ÇŠœ¿Ÿ¨ˆÌü}T¥;ž5»¥!o‡ …„hDA¢2¢j:¯çCÔЩ%°í¦µk×ò‹š(=äŒ�4ßÎÞ¢Ù€Ç45Z\jŸ¯¼|¤¨îLÕ­,ø¢¢jW«ºî³�W x&·Å¥¹ ê*‘gaà\[œÙË\¦_é¢þWkŸ\vÜÌ.[z#hë� } Â-瑱Dz{WÔp&Ø>ž_Uk2ð…^E~ÊÈÜ�Åz÷G¦–ß`Ôª£A·žÅZ[>ö1Ž- Ç’tg™—(�´©ŽÀçÍ”òu à;ˆº‰†„%P‰‚B ìÖyóæÕŠL��k'ð¹ÁCfŸÏö¡í[Gü'´jŒ~Ä�‘ÈÐPÂÕô´i¿qSAþÙ÷¹ã•ŸW ÷å)ûM—5NÄ`À"nºu¨zºE€f%'(�/›–.‚¯ÿ²4ØêÁ¡öžÛ«.öRváŲ©…([\aŒœÏw Dxod"nÀ {‰„ |šŸ®À«©(ðéüæŽÎ®Pô@ýÀïz�Ьš¡æHûöxt‹ 4¸1iî4-Ç’d™—¨ˆ¨†¢ýg©H“O`ΰé _øÂ�X[�.xœH. ”h2xæ¸ß!+`T3à1nŠ!øÀªôuÐv®»Åïað�>¢°( ^¯ ØÊîwéA�î/ZUá®ú˜î^F@m À ;­‚CÔdW�¹œ¥ËtÎ9ûñ_‚˜aæåq0 j%ùï²|7{üZznÛˆFâ øÐPÃD½}£¡Hdøž˜Õxg8ÚЉÈ@̈ ÆcÝ£Æh|Ѐ®›”yS¸ëØ[ØyHƒ=ažÊÕìZ}™0ÿCüQ¢„xÞßÉ'MQÐgÑŸBàsôO>?yªWßÕW_}�Ðú&¢aUÆÄohLcc6×czÂeÆ5Wtð™è�ëå_zƒ“ʯ<ë·¯â\K÷La+ '`F x¨D¦¦¦„B ¬´n›³ 3¡dNûÈ-ïv8Šþî,Ã"2Ä�†(è$D~oŒ5Å£ýOŒ l|0:ÚÔgŽ…cf4ê1âE1 -F¦Q?2ˆÁE&ªS!�þ_hóO<ñ €%â_d”&}.Àõ²ÆÊiQÑ$j}jݺuWPÁGÂÃà SèNJ øíDýB�L)„L.Anæªê"=Љ+š‡4Ÿ*ÄëæŠ—œâòW¯èî<…ã[ëYÀךû¾°©˜ ™=d¶’‘Uedlj ¸i 9”IZ/'uñ‘x¤gc8´ïù‘ÞM{ÍèXԌŢ–�R?? “ÂAÓ´§\câ‚2˜Ž±%Ð3‚öì5Så¯ÄöÝ”æ¾ÿýïŸKÿÜéQ39ÕÎI¾…}TãS6pWðà ¾,:é :_{xmš.¦ Õ J¡Ü­/t µ¿ôÕå2¿â„ÅÞ‚éóÜþòéš+X]áéC×ÀÀëÂ(Šgï�™’½;Ø9Åk¦¸,äkýH_,ÜW?6Ò¸g¤gÃ#µâ±¨a^ •,„JÀkô¤F<@s�*HŠ`:áØ €ôAåò[(µ[*^¹bŸ»÷™ßÿþ÷¤79à“‚À€yisç•3”‹—'rðHÂ3F¡»¨èS Yú|Ö|C–›‰¤ÖKB ÁmÚœ\LÃm'sëhzâ0ÝUó¸ýUEþ¢S=ùS&Qa©’悊ª“<(05Ñ’u¯Žodsɹ&¢H/ŽEº:¢#ÍÍ‘�= ±Ñö>9jš‰¨b˜Šeÿ»šKŒÐ`[rÆ�7™LRû•c- ¾7Jgî¼J9ü(} Øý~Ñ}ï½÷>÷ÐC}äºë®{Ù‘øüñ»¨¶¿ÖnêPæ m2¢·ÜrË]üíšßFÔC4â Uò,ÒÒׂ,‹¹Å;>*LE%‡i¯•h¼)n®'�h†B.Csy]�êB[0h¨$èr—ækî G¡ ¹M¥RQÝ*]k\¾%ël1Ã0c†Ee:ˈ'ŒØH$ë‘YЇ;ûãáŽARâ1‹‚iD-ËŒrÚGdY<Ÿ¦ÚDˆ³fÓ:SÓå:›IÇöÏYÊ'ª"švÑE�óùÏþãva‡„€»w‹-²à^* ï!s_E�ÞTÒv7âÈæ‘Ì¿Mc4~'µ‰°æKð‡SÑ~¶¿—Ÿ}=ñ=EI¹…׊ ¯]ân¨tÍǾֈk̹- 85Ñ`µ,üžk^³¯&°ãŠ…˜Í‹€§û–£5ݳ¢B)b|OÌâ‚;ïÅ&¸Ž;bóXŲ$Á:¢©äû¿Dùü|€Ô –(ݧt†S/Q�|÷Îð�7Þø êò5heà;"~•)#àËŽäZ~žEÙ¿¡(|O„ÎËæD ðM!nÉ·8(òÔ_…ƒ0 a1Vq\…œyêZ’ó^T®sRÜ ¾ ëX €æ°•D“m¢þýǨѳÈÖÒ|nð8_·FN–Á'aèüÎw¾ó þÚ…Ö·;À�È4G¦œrIÊuÜ{Ù¤'¹$E BÏ4Ã2)”¾X ™™`$˜,"‡@ä& üÄ÷$ed¦Sû�e3( Š�¨HÁ$¢š÷¼ç='�}öÙ§ÐΟ .k$ ma°ÈÏwSmÿ9êì€wuŠ”1$4?îì¶çô[(&^3ÏM0.ðã½°ßtÃÙ‚À”È& ¤s=ñ½ìÔO�%µÿØgQTh­&À2xà�§‰Þ q°:ªïÏ¢8ÀöùaÊ ¨¹Ó!ŠD}¢TÜ#R½~Âi΄Ï53ü®ÆÏe „ä€Ì<ÇZÍ™nIž-|æYÑy¶ 0Ï^gßËünÆïZ’»ü?÷@ˆ }” «$òŠg ˜�Æ�}�ײ¼+ÁÏš:’îg‚¬@ËäÙ”ýœ\gý¦2A´�[²×F6—4Á禤lгµþØ €Gj“GÔûóùY8¤ÄØ£‚ÂRë' d²Ar'©Y<›”Ü×’ç¤Ü^g�™µÎ ¤9ÈŽBë�ÁP¨Ô"]¦`ÂçJ³™ÈŒd�¦”)AP6Hã[Œ‰ ¹¯%ß ÈõßHȱ– ÿüýiø(°•9IEND®B`‚ecbuild-3.16.0/doc/static/cmake-favicon.ico0000664000175000017500000000217615252726137020647 0ustar alastairalastair h(    ,ÿ� ÿxÿdÿaÿ^ÿZÿUÿPÿKÿHÿHÿNÿUÿ>3ÿ+ÿ&ÿu4(ÿbë`ÿçÿÍÿÅÿ¾ÿ¸ÿ¬ÿ ÿŸÿ¡ÿd?ÿ4@–ÿ==¯ÿ %ÿ–t77ÿ{ÿtÙsÿNíNÿ â ÿ×ÿÍÿÍÿ�(ÿ Gfÿ79°ÿIIáÿKKßÿ ^ÿ– ÿ¼LLÿmÿf·fÿ=ì=ÿ â ÿ (ÿ>ÿ^;NÿPPËÿÿ ÿ‡{ddÿç““ÿªBBÿ^C_ÿ·ÿ=ÿˆÿß§§ÿ¹LLÿ`Mrÿ�ÿ ÿ†}hhÿ×[[ÿ_RŒÿGÿˆÿÝzzÿE:†ÿ ÿ�vTTÿ)Nÿ“'ÿ ÿ*oac€ €3À8À5àxà7ð5ðiø)øü?ü?þecbuild-3.16.0/doc/static/cmake.css0000664000175000017500000000034515252726137017236 0ustar alastairalastair/* Import the Sphinx theme style. */ @import url("default.css"); /* Wrap sidebar content even within words so that long document names do not escape sidebar borders. */ div.sphinxsidebarwrapper { word-wrap: break-word; } ecbuild-3.16.0/doc/static/ecbuild.ico0000664000175000017500000030657615252726137017566 0ustar alastairalastair hf Î00 ¨%Þ  ¨†2€€ (.C@@ (BVK(    <<<,€€€ÊHHH[ÿÿÿ?p§µ…T ÿÿÿÿÿÿÿÿÿttt‰˜˜˜f¥¥¥ôCCCK‹1ŸO(†®e0IJl0î´n3ï¶wC̱oA“�Q;ÿÿÿÿÿÿÿÿÿÿÿÿªªª)¡¡¡îGHHÿ{{{ü‘_=ò¿�Kÿ¾€MÿŠ]ÿ¹vDÿ´n4ÿ¹s6ÿµp8ì¥X/Uÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯*†††þ243ÿ}{ÿ�Z=ÿ¹}[ÿ´rMÿ¶vRÿ®jCÿ£W.ÿ¨^5ÿ©]-ÿ�L)dÿÿÿÿÿÿÿÿÿ�#Ÿ]Bó’’‘ÿ=?>ÿ€}zÿ•Z/ÿ±k7ÿµsBÿ¹zPÿ¼‚\ÿ­gAÿŸQ+ÿŸO*ñ‘;"ÿÿÿÿÿÿŽ9)ª˜D(ÿ¤`9ÿœ›™ÿJKJÿytpÿ¡h4ÿ¸v<ÿµq:ÿ²m9ÿ¹|Uÿ³sOÿ�M)ÿ–B%¨ÿÿÿÿÿÿŽ7&æ�M)ÿ¯i:ÿºOÿ£¡œÿYZZÿqjcÿ‹^/ÿ­r9ÿ¶s:ÿ¶tEÿ°kBÿªdCÿ—E'æÿÿÿ|�:&ÿ¡S,ÿ»}Mÿ¿€@ÿÄ�Iÿ©¥�ÿ�Ž�ÿqqoÿnjfÿZJ;ÿ´wHÿ­g9ÿ¤X1ÿ U7ÿŽ7 |0�;)ÿ£V.ÿ¿ƒOÿÇŒEÿКKÿÑžOÿ´³°ÿhkiÿ   ÿ¦§¦ÿqZHÿ­e4ÿ¨_9ÿŸS6ÿ“@+2|Š1$ù®kJÿ‡PÿΗJÿÙ§QÿÜ«Sÿž•‚ÿÒÓÒÿáááÿ¬˜€ÿ¡Œzÿ¬d4ÿº�dÿ¥^EúÇ�“ ÿÿÿ•GAÔÁŽ|ÿÈ•gÿ×§]ÿâµWÿä¸XÿÃ¥iÿÛÜÜÿÒÐÎÿuV3ÿµq9ÿ©`2ÿ S1ÿ¦bMÔÿÿÿÿÿÿ–HBrº…}ÿǘzÿÜ´ÿìÉrÿêÁ\ÿà²Vÿ½¹±ÿÖ××ÿø¬ÿ¯i6ÿ£V.ÿ˜G)ÿ•C2jÿÿÿÿÿÿÿÿÿ±wsξŒ�ÿËœzÿ༃ÿã¾sÿÙ«`ÿÏ�]ÿÄ›sÿ·yKÿ¬d>ÿ T6ÿ“@,¹ÿÿÿÿÿÿÿÿÿÿÿÿ�:3¹…�Þ¼‰‚ÿÃ�yÿÅ’jÿ½Jÿº|Mÿ¯j@ÿ¡T0ÿ”?$ÿˆ.È}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéØ×´}xœºˆ„ú¹†€ÿ®qcÿ‘<'ÿ‹2ÿ…(÷|y|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ�� ©idF¤`[}žVQy‚%5|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÀÀÀð(, �  BBB~MMM¢ ÿÿÿ&?[rq^E-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVV5®®®ã¯¯¯Ð€€€Ý .Q#‚F³m8Öq<ÚI$¼ ‘eDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥¥G„„„µ***NžžžþwwwÓ‘ÿ³tPÿ¯lFÿµxUÿ®jDÿ¢V-ÿ¡T+ÿªb7ÿ¬d2ÿ§Z-ö“?!8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†8+ ¬•�óprqÿ.0/ÿ���ÿdQFÿ·\ÿ´sJÿ¶vMÿ·xPÿ½ƒ_ÿ¼‚`ÿ¥Y/ÿ¢T-ÿ¥[9ÿ¢T+ÿ¢R)Û�9!ÿÿÿÿÿÿÿÿÿÿÿÿŽ8&�¡U5ÿ¨‹ÿz{{ÿ354ÿ‰ˆˆÿ_F3ÿ®i6ÿ±l7ÿ±k7ÿ¯h6ÿµsFÿÃ�oÿ´uQÿªc?ÿ�N*ÿœK)ÿ˜D%�ÿÿÿÿÿÿÿÿÿ€"'”@+ý˜G'ÿ¢T-ÿ¨‡sÿ†ˆ‡ÿ;=<ÿ�Œ‹ÿ_D,ÿµt:ÿ·t;ÿµq9ÿ²m7ÿ®h6ÿº~Xÿº€_ÿ¨_;ÿ›K)ÿ˜D%ý�9!'ÿÿÿÿÿÿ�ÿ²ŽhÿžŸŸÿRTSÿ‡†„ÿ@0ÿ\>ÿ~S*ÿ¡f4ÿ²l7ÿ¸zRÿ­h@ÿ£V3ÿ¤Z>ÿ’=#˜ÿÿÿÿÿÿŽ:,Ï–B%ÿ¥Y/ÿ¹zKÿ¾�HÿÂ…BÿÇ�Fÿ¶’bÿ­­¬ÿ   ÿuvvÿ‚�~ÿrpnÿJA:ÿƒQ)ÿ¹|Rÿ¬e<ÿ¢V/ÿ¢W9ÿ—E,Îÿÿÿÿÿÿ�:/ë–C%ÿ§\0ÿ¿†VÿÀƒAÿÉ�GÿΗJÿКLÿ¸™jÿÎÎÍÿgkiÿjkkÿÃÅÄÿšš™ÿYRJÿ¬l=ÿ©_2ÿ¥Z4ÿ�O/ÿœO8ëÿÿÿÿÿÿ�$½�P7ÿ¨_3ÿÁˆUÿÅŠDÿϘJÿÔ¡NÿפPÿÒ¢Sÿ­®­ÿ£¤¢ÿ¢£ ÿÊÌËÿ¯¯­ÿ™—•ÿ c6ÿ©_2ÿµwXÿ³v^ÿšJ3Àÿÿÿÿÿÿ|ˆ�P;ÿ¸}\ÿÇ’dÿÌ•PÿÔ¡NÿÛ«SÿÝ®TÿÛ«Sÿ¤ž’ÿÐÑÐÿìíìÿ¿¸­ÿÀ…Iÿ¶”vÿªmAÿ¨]1ÿ«eCÿ¿�zÿšJ4Žÿÿÿÿÿÿ‚%W­odÿƘ‚ÿË›rÿÑ¡bÿÜ®^ÿâ´Xÿã·Xÿá³Wÿ»¡pÿÚÛÚÿòóòÿqh^ÿdI.ÿ°o8ÿ®g5ÿ¥Z/ÿ�M)ÿ«iSÿ›N=^ÿÿÿÿÿÿ|¤`\ðÁ‘�ÿÉšzÿÙ²„ÿá¹pÿêÄiÿéÀ\ÿä¸YÿÚ­Vÿ¾ÿäåäÿÉÇÃÿ³ŸŒÿ°n9ÿªa2ÿ¡S,ÿ˜F&ÿ”A+ë—J<ÿÿÿÿÿÿÿÿÿ™MHd¼‹…ÿÅ–�ÿУ{ÿãÂŽÿòÖŽÿîÊoÿã·XÿÚªRÿÉ cÿÅ»®ÿÑÎÉÿͶ¢ÿ­g7ÿ¤X.ÿ�M+ÿšJ2ÿ–F5\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«lhÁÖ�ÿǘ‚ÿÑ¥ÿÞ¶}ÿäÁÿݳiÿÖ§bÿПbÿÑ¥xÿ¾‚Oÿ·yNÿ¯lGÿ¦_@ÿšK3ÿ‰0ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚&°uqØ¿�‹ÿÄ•„ÿÊœ}ÿΠvÿÇ‘ZÿÀ„JÿŠZÿ°j6ÿ«b5ÿ¡S,ÿ˜F'ÿ�9!ÿ‡,Åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾�ж€}—»‰†ú½‹‚ÿ¾ŠyÿÅ–�ÿ´wYÿŸQ+ÿœK)ÿ–C%ÿ�9!ÿ‰/ö�#r|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ³zv;·�}»¾ŽŠä±wsü«mfÿ˜J?ÿ†, ú€!Î|š|&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…*$˜LGA›PKB³{w ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||<€À À €€€€€€€€€À ààà<ðüÿ‡ü(0` $  ÿÿÿ*;1ÿÿÿÿÿÿ "'+.00-+'" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKJJJ¯“““è}}}Ô'''{/ (5BNZeow~‚‚~xpf[OC4% ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0‹‹‹×ªªªþ±±±ö©©©þ———ú000�3 "2DUev…•£±» Ã½²¦–‡ygVD3"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,,,b³³³ý···Í666‚‚‚X°°°ð   ÷"""ˆ1 0AQa s>žh2Ëz;ß…A!ë‘H#ôœO'ü�P&ü“K%õˆE"ì}>àk6ÌB$  weTB2!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒŒŒ ÀÀÀú666=ŒŒŒ¼ÈÈÈÿ¤¤¤õ€. %d.d†= ²™I&í£T*ÿª^,ÿ°f/ÿ³l1ÿ´m1ÿ¶o2ÿ¶o3ÿ¶n2ÿµm1ÿ³k0ÿ¯e.ÿ©\,ÿŸS(îŽF"´k:h '  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ‡‡‡qÅÅÅø[0E€€€Óµµµÿ¹¹¹ÿœœœò y+ �@%7”C"¾�M&ÿ¨[+ÿ°f/ÿµm1ÿ¸r2ÿºu3ÿ»w4ÿ»w4ÿ¼x4ÿ¼x4ÿ¼x5ÿÈ�Yÿ˘eÿÈ“`ÿÅ�Zÿ‡Uÿ¼~Qÿ³rKÿ¯mLÉ«lIDšš3€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRRR(ÙÙÙþ‡‡‡Ùœ<<<À£££ø^^^ÿ000ÿ½½½ÿ”””í �s1´—E%þ¦Z,ÿ²k6ÿ»x@ÿ¹t4ÿ¹t3ÿºt3ÿ»v4ÿ»v4ÿºw4ÿ¼{;ÿÌ™iÿÌ›jÿ¿�Dÿ»v4ÿºv3ÿ¹t3ÿ¹s3ÿ¹t7ÿµm2ÿ®e.ÿªb8þªdD²¨Y1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹uÝÝÝüµµµüÂÂÂÿœœœÿ-..ÿ ÿ===ÿ¿¿¿ÿ‹„‚ýjJ:ÿ¨z\ÿÅ“lÿʘmÿÊ—iÿТzÿÑ¥€ÿÓ©„ÿÏ¡{ÿ»|FÿÄ‹]ÿÆ’hÿ³n7ÿ³l2ÿ´m2ÿ´m3ÿ´n2ÿµn1ÿµn1ÿµo1ÿºw<ÿ¸s8ÿ°g/ÿª].ÿ¥[9ê¤Y1>ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ………iÜÜÜû§§§ÿ;=<ÿ?B@ÿ&('ÿÿLLLÿ¼¼¼ÿ�xrÿi>ÿ›\*ÿ®g0ÿ°g1ÿ­b/ÿª_/ÿ©\-ÿ²qIÿ×´ ÿϨ‘ÿÃ�rÿ§\3ÿ¥X-ÿ¦Y-ÿ¦Y-ÿ§[.ÿ¨\-ÿª_.ÿ­b/ÿ¯g/ÿ·u@ÿ³k3ÿ°f0ÿª^-ÿ¢T-ø›K&`ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„„„]ÙÙÙù›››ÿHJIÿ@CAÿ')(ÿÿ]]]ÿ¸¸¸ÿxldÿh:ÿ’P'ÿ¡V+ÿ£V,ÿ£V-ÿ¯kHÿÀŒqÿ¤V0ÿ¢V.ÿ¬hCÿÉœ„ÿÁŽtÿ£Y3ÿ¢T-ÿ¡T,ÿ¡R,ÿ¡S+ÿ¢S,ÿ¤V,ÿ¦[-ÿ´rGÿ¬b.ÿ­c.ÿ©]-ÿŸN'ÿšE%yÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÖÖÖö¨¨¨ÿHJIÿADBÿ(*)ÿÿmmmÿ²²²ÿl\Tÿe4ÿ�J(ÿŸU,ÿ´vVÿ¾‡iÿ¤X/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¯jFÿÊ�…ÿ¹€aÿ£U-ÿ¢T-ÿ¡T,ÿŸR,ÿŸP+ÿ P*ÿ§^:ÿ§]7ÿ¦Y,ÿ©\,ÿ¦X,ÿ�K'þšG#Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿc\hÏËÊþµµµÿIKJÿBECÿ)+*ÿÿÿ¬¬¬ÿfYSÿxT@ÿ¶ŽzÿÊŸ‡ÿ¾‡fÿÀŠjÿÁ‹kÿÁ‹lÿÂ�nÿÃ�qÿ»�^ÿ¬f<ÿ¸|ZÿÈš�ÿ¨_7ÿ£V.ÿ¢T-ÿ R,ÿŸP+ÿ�N+ÿ¬hJÿžM(ÿ¢S)ÿ¥W+ÿ£T*ÿšG&ô—I*0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€$Ž8!ß�R;ÿÈÃÀÿÁÁÁÿKMLÿBECÿ*,+ÿ!"!ÿ���ÿ¥¥¤ÿ^MCÿ|XBÿ˜U-ÿ§^1ÿªa2ÿ«b3ÿ«b3ÿ«b3ÿªa3ÿ±nCÿ¾‡dÿÄ‘qÿÇ—zÿÓ­—ÿµxUÿ¤X.ÿ£U-ÿ¡S,ÿŸQ+ÿ®kMÿ�K*ÿœK(ÿžO)ÿ Q)ÿžM(ÿ–C%à P0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰2…‘;!ÿ¢X9ÿ¥qZÿý¹ÿÊÊÊÿPQPÿBEDÿ+-,ÿ(((ÿ���ÿ��œÿT>/ÿsC#ÿœ[/ÿªd3ÿ®f5ÿ®f5ÿ®f5ÿ­e4ÿ­e4ÿ¬d4ÿ«b3ÿªa2ÿµuNÿÒ«”ÿЩ“ÿ¯kFÿ£V.ÿ¡T-ÿ«hFÿ£V4ÿ›L)ÿšI(ÿ›I(ÿœJ'ÿ˜F&ÿ”?$‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰'�6!õ¥^Fÿ¤X;ÿ›J(ÿ”S6ÿ¾µ°ÿÓÓÓÿUVUÿBEDÿ,.-ÿ/0/ÿ©©©ÿ”“’ÿO7&ÿwG$ÿŸ`1ÿ¯j6ÿ±k7ÿ°j6ÿ°j6ÿ¯i6ÿ¯h5ÿ®f5ÿ­e4ÿ«c3ÿªa2ÿ¸|XÿΤŒÿÂŽrÿ¯mIÿ©b>ÿªcBÿ�M*ÿ›J(ÿšG(ÿ™G&ÿ™F&ÿ”@#õ›@$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ/›ŸUAÿ˜D'ÿ™G'ÿ›K)ÿŸP+ÿœY6ÿ·«¥ÿÙÙÙÿ[]\ÿCEDÿ-/.ÿ888ÿ±±±ÿŽŒŠÿM4!ÿzL&ÿ¤e3ÿ±n7ÿ³n8ÿ³n8ÿ²m8ÿ±k7ÿ°j6ÿ¯h6ÿ®f5ÿ¬d4ÿ«b3ÿ´tMÿÃ�qÿµwUÿÃ�vÿ¸}_ÿŸP+ÿœL)ÿšI(ÿ™F'ÿ—D%ÿ•@$ÿ’="œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰'˜J8ü”@'ÿ–C%ÿ™I'ÿžN*ÿ¢T-ÿ¥Y/ÿ£`7ÿ±¤›ÿÜÜÜÿdeeÿBEDÿ.1/ÿBBBÿ²²²ÿ‡„‚ÿJ1ÿ~P(ÿ§j5ÿµr:ÿµr:ÿµq9ÿ´o9ÿ³n8ÿ±l7ÿ°j6ÿ®g5ÿ­e4ÿ«b3ÿ²qIÿ¾‡gÿ¥Z0ÿÉœ…ÿ·|_ÿžN*ÿ›K)ÿ™G'ÿ–D%ÿ”A$ÿ’=#ü�Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–H8q’@,ÿ’=#ÿ—E&ÿœK)ÿ R,ÿ¤X.ÿ¨]1ÿ«b3ÿ®mAÿ±¦ŸÿÞÞÞÿopoÿCEEÿ.1/ÿOOOÿ±±±ÿ|yÿL2ÿ‚T*ÿªn7ÿ·u<ÿ·u;ÿ¶s:ÿµq:ÿ´o9ÿ²m8ÿ±k7ÿ¯h5ÿ­e4ÿ«b3ÿµvOÿ¹}[ÿ¹~^ÿ©a=ÿ½†mÿ£W6ÿšI(ÿ—D&ÿ•A$ÿ’=#ÿ�: jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšL?ÁŽ6 ÿ”?#ÿ™G'ÿžO*ÿ£U-ÿ§\0ÿ«a3ÿ®g5ÿÍ ÿ³s?ÿ¨•…ÿÞÞÞÿz{{ÿDGFÿ/10ÿ]]]ÿ«««ÿvrmÿL2ÿ„W,ÿ«o8ÿ·v<ÿ¸w<ÿ·u;ÿ¶s:ÿ´p9ÿ³n8ÿ±k7ÿ¯h5ÿ­e4ÿªa3ÿ¹~ZÿÂ�rÿ£V.ÿ¡S-ÿ»‚iÿ¤[<ÿ˜F'ÿ•B%ÿ“=#ÿ�9!¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªbV”B1ú�8!ÿ•A%ÿ›J(ÿ R,ÿ¥Y/ÿ©`2ÿ­e4ÿ¸xHÿɘqÿ¶s:ÿ¸x=ÿ¦�{ÿÜÜÜÿ………ÿEHFÿ032ÿnnnÿ¤¤¤ÿkf`ÿK2ÿ|S)ÿ™e3ÿ¦l7ÿ­p9ÿ²r:ÿ´r9ÿ´q9ÿ²n8ÿ±k7ÿ®g5ÿ¬d4ÿ°lAÿÅ”wÿ¨`9ÿ¢T-ÿŸP+ÿµz`ÿ¦^Bÿ–C%ÿ“>#ÿ�:!úˆ3"ÿÿÿÿÿÿÿÿÿÿÿÿ—Iÿ½~?ÿ¦�sÿÚÚÚÿ‘‘‘ÿGIHÿ365ÿ~~~ÿžžžÿ`YQÿ:'ÿI1ÿ_? ÿwN'ÿŒ[.ÿšc2ÿ e3ÿ¥g4ÿ­j6ÿ¯i6ÿ­f5ÿ¹{Tÿ²oHÿ¹}[ÿ£V.ÿ Q,ÿ�M*ÿ²u[ÿŸR6ÿ”?$ÿ‘;"ÿŽ7 Oÿÿÿÿÿÿÿÿÿÿÿÿ˜LBx�5"ÿ’<"ÿ˜F'ÿžO+ÿ¤X.ÿ©`2ÿ®g5ÿ¸yHÿÊ™oÿ¹x<ÿ¼|>ÿ¿€@ÿÁƒAÿÂ…Bÿ§ŒlÿÖÖÖÿžžžÿHKIÿ799ÿŽŽŽÿ’’’ÿfa\ÿ?4)ÿ0 ÿ7%ÿ>)ÿG/ÿW8ÿmE#ÿ�Y.ÿ§f4ÿ®g5ÿÂ�jÿ©a3ÿ­f=ÿ°mJÿ¡S,ÿžN*ÿ›I(ÿ³u^ÿ–D(ÿ‘;"ÿŽ6!lÿÿÿÿÿÿÿÿÿÿÿÿ™MB’�6"ÿ“=#ÿ™H'ÿ Q,ÿ¦[0ÿ«c3ÿ°j6ÿÍ zÿºx>ÿ¼|>ÿ¿�@ÿ„BÿćCÿÅŠDÿÆ‹Eÿ¬�gÿÑÑÑÿª«ªÿIKJÿz{{ÿ™™™ÿ���ÿ„„„ÿyyxÿgd`ÿRMFÿ6+ÿ,ÿ6"ÿR4ÿƒP)ÿ¥c3ÿÃ�nÿªa3ÿ§]1ÿ°mIÿ¤Y4ÿžO+ÿ›J(ÿšH)ÿ­lVÿ‘<"ÿ�7 †ÿÿÿÿÿÿÿÿÿÿÿÿŒ3(£–G4ÿ“>#ÿšI(ÿ¡S,ÿ§]1ÿ­f4ÿ³n9ÿΡyÿ»{>ÿ¿€@ÿÂ…BÿʼnDÿÇŒEÿÈŽFÿÉ�GÿÊ‘Gÿµ“eÿÌÌËÿëëëÿóóóÿ���ÿRRRÿQSPÿ„…ƒÿ›››ÿ�‚�ÿsttÿmnnÿb`^ÿ3$ÿO1ÿŒU,ÿÀ�mÿ«c3ÿ¨^1ÿ¦[1ÿ­iFÿŸP+ÿœK)ÿ˜F&ÿ¡W>ÿœN6ÿŽ8  ÿÿÿÿÿÿÿÿÿÿÿÿ„%¸�Q@ÿ“?#ÿ›J(ÿ¢U-ÿ©_1ÿ¯h6ÿÃŒ^ÿÊWÿ¾?ÿ„BÿʼnDÿÈ�FÿÊ�GÿË“HÿÌ”IÿÍ–IÿÍ–Jÿ·“`ÿÅÅÅÿòòòÿëëêÿ(*)ÿ…‹‰ÿÏÑÐÿYZXÿº»ºÿ™›šÿŒŽ�ÿƒ„„ÿyzxÿ>.!ÿmI-ÿ¬yUÿ«c4ÿ©_1ÿ¦Z/ÿ©a<ÿ¡S/ÿœK)ÿ˜F'ÿ•A$ÿ§cNÿŽ6 ·ÿÿÿÿÿÿÿÿÿÿÿÿ‚$¬¡XHÿ”@%ÿ›J(ÿ£V.ÿªa2ÿ°j7ÿÍŸxÿ¼{>ÿÀƒAÿĈDÿÈŽFÿË’HÿÍ•IÿΗJÿÏ™KÿКKÿКKÿ͘Jÿ¢–‚ÿÎÏÎÿšš—ÿ[^[ÿÒÖÔÿœ žÿ??>ÿÉÊÊÿ¶¸·ÿ¦§§ÿ¦§¦ÿ¨¨¨ÿzzxÿVC5ÿŒT,ÿ§a3ÿ©_2ÿ¦[0ÿ£V.ÿ¥Z7ÿžO.ÿ¢W:ÿ•A$ÿŸT>ÿ–D0°ÿÿÿÿÿÿÿÿÿÿÿÿ€#“�9'ÿ¤\Fÿ›J(ÿ£V.ÿ«b3ÿ²l7ÿÍŸvÿ¾~?ÿÆCÿÇŒEÿË’HÿΖJÿКKÿÑœLÿÒžMÿÓžMÿÓžMÿÒ�Mÿ³‘_ÿ«­¬ÿŸžœÿeheÿÑÒÑÿƒ…ƒÿšš™ÿÊÌËÿÇÈÈÿ¯±°ÿ£¥£ÿÁÁÁÿ———ÿnbYÿ‚O(ÿ¤`1ÿ¨`2ÿ¦[0ÿ¢U-ÿ¨`>ÿ¾Štÿ°pXÿ”@$ÿ”@'ÿ¤^L¡ÿÿÿÿÿÿÿÿÿÿÿÿ~ yˆ-ÿ¨eQÿ�M-ÿ£V.ÿ«b3ÿ¼NÿÉ–hÿÁƒDÿʼnDÿÊ�GÿÍ–JÿÑ›LÿÓžMÿÔ¡NÿÕ¢OÿÖ£OÿÖ£OÿÕ¢OÿËšMÿŸŸ›ÿ¼½½ÿÝÝÝÿ»»ºÿ|{xÿÙÚÚÿÓÕÔÿÏÑÐÿ¢¤£ÿ—™™ÿÚÚÚÿ±±±ÿ‹ƒ|ÿ›`3ÿ©c3ÿ©`2ÿ¦Z/ÿ£V/ÿÇ™ƒÿË¡�ÿ·iÿ”?$ÿ�9!ÿ§eUŠÿÿÿÿÿÿÿÿÿÿÿÿ{_†*ÿ’=%ÿ´w`ÿ£V/ÿ³qGÿÌ�yÿËVÿÅŠLÿÉ�JÿÌ”IÿКKÿÓŸNÿÖ£Oÿ×¥PÿاQÿÙ§QÿاQÿئQÿÔ¢OÿŸŽqÿ´¶¶ÿÉÉÉÿÝÞÞÿâãâÿßààÿÜÝÝÿÆÇÆÿ“�‡ÿ³�Nÿ¸—xÿ¸¶³ÿž�œÿœpOÿ¬e4ÿ©_2ÿ¥Z/ÿ¢T-ÿ¶{_ÿÕ²¤ÿÁ�}ÿ“>#ÿ�8!ÿ§eUqÿÿÿÿÿÿÿÿÿÿÿÿ}1ƒ%ÿ�5ÿ¡V;ÿÅ”{ÿ»€ZÿЦ…ÿÄŒWÿÈ‘UÿÍ—TÿЛQÿÓŸNÿÖ£OÿÙ§QÿÛªRÿÛ«SÿÜ«SÿÛ«SÿÚ©RÿئQÿ²‘Yÿ·¹¸ÿ¸¸¸ÿáááÿèéèÿèèèÿåææÿ®§œÿ¸€Cÿ½~?ÿËUÿÇ“fÿª[ÿ¥qKÿ¬d4ÿ©_1ÿ¥Y/ÿ¡S,ÿŸQ-ÿÕ²¤ÿÊ ’ÿ’<"ÿŽ7 ÿ¹~tFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ á�6#ÿ°q\ÿÃ’{ÿÌŸ„ÿѨˆÿÇ‘^ÿË—^ÿÐ�[ÿÔ¢YÿצWÿÚ©TÿܬSÿÞ®TÿÞ°UÿÞ°UÿÞ¯TÿÝ­TÿÚªSÿÈšMÿ©ª¨ÿÉÉÉÿêëêÿïïïÿðñðÿêëêÿzY2ÿ˜h4ÿ¨p8ÿÆŸzÿµs:ÿ³n8ÿ¯i6ÿ¬c3ÿ¨]1ÿ¤X.ÿ R,ÿœL)ÿ±t\ÿÕ³¨ÿ‘;"ÿ�5áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}‘¨eZÿ¶}mÿ»ƒkÿÇ—|ÿÞÁ«ÿÉ–gÿΜfÿÓ£dÿרbÿÛ­`ÿÞ±]ÿà²Zÿá³Vÿá´Wÿá´Wÿà³Vÿß°UÿÝ­TÿÕ¥Pÿ�•ˆÿÔÕÔÿëìëÿòòòÿ÷øøÿãââÿ9(ÿI1ÿgK.ÿ”oMÿ«l7ÿ±m8ÿ®g5ÿ«a3ÿ§\0ÿ£V.ÿŸP+ÿ›J(ÿ—D&ÿÊ “ÿ�8 ÿšL;™ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~A ZRÿ¸�tÿ¼†rÿÀŒpÿÖ²™ÿÚ¹›ÿÑ£qÿÕ§kÿÚ®jÿÞ³hÿá·fÿäºbÿåº]ÿä¸Yÿä¸Xÿã¶Xÿá³VÿÞ°UÿÛ«Sÿ§‘kÿרØÿèéèÿðððÿ÷÷÷ÿðïïÿ.!ÿ4$ÿTD5ÿvL&ÿ¥g4ÿ°k7ÿ­e4ÿ©`2ÿ¥Y/ÿ¡T-ÿ�M*ÿ™H'ÿ•A%ÿ›M7ÿ�5ÿ°sfVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUŠ5.ß¹„{ÿ¼ˆxÿÁŽvÿÒ«“ÿÌ�xÿÞ¾œÿݹ‹ÿܲqÿá¹pÿå¾nÿèÁkÿéÁgÿç¾]ÿæ¼Zÿå¹Yÿâ¶Wÿà±VÿÝ­TÿÅ¡^ÿÀÁÁÿãããÿéêêÿðððÿîîîÿ™”�ÿtj`ÿ€^>ÿŸe3ÿ°l8ÿ°i6ÿ¬c3ÿ¨]1ÿ¤W.ÿŸQ+ÿ›K)ÿ—E&ÿ“>#ÿ�8!ÿ–F4ÞïÞÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}V®rlÿ¾‹ÿÁ�}ÿÒª–ÿËœzÿУyÿܸŒÿèÌ£ÿåÁ€ÿçÃuÿëÇsÿìÈoÿëÄeÿè¿[ÿæ»Zÿã·Xÿà²VÿÝ­TÿاQÿ­¢Žÿר×ÿâãâÿçèèÿëìëÿîïïÿììëÿÐÍÊÿ¤–‹ÿ±l7ÿ®f5ÿª`2ÿ¥Z/ÿ¡T-ÿ�M*ÿ™G'ÿ•A$ÿ‘;"ÿ•D0ÿŸWGcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�=7о�…ÿÁ‘ƒÿЩ™ÿÉ›ÿÏ£~ÿÕ«~ÿÛµÿêÏŸÿðاÿðÒ‡ÿðÎxÿîÌsÿêÂ_ÿç¼Zÿã·Xÿà²VÿܬSÿئQÿÑ Tÿ¶¨•ÿÎÏÏÿÞßßÿâããÿäåäÿäåäÿáààÿд�ÿ¯i6ÿ«b3ÿ§\0ÿ£V.ÿŸP+ÿ›I(ÿ–C%ÿ’=#ÿ›O:ÿ™K:Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|@§e`ÿÁ’‰ÿÏ©�ÿÈ›…ÿÍ¡ƒÿÓ¨‚ÿÙ±‚ÿà»�ÿçÅ‚ÿóÜ¡ÿ÷â©ÿôÚ•ÿìÈoÿæ»ZÿâµWÿÞ¯UÿÚ©RÿÖ£OÿÒœLÿΖJÿ™dÿÀª�ÿÊļÿɺ¬ÿȬ“ÿ¹Pÿ°j7ÿ¬d4ÿ¨^1ÿ¤X.ÿ Q,ÿœK)ÿ˜E&ÿ™J0ÿ¥_Lÿ‘<)ÿ‡,@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡/(�»ˆ„ÿͦžÿÇš‹ÿÊž‡ÿϤ†ÿÔ¬„ÿÛµ…ÿã¾…ÿêÉ…ÿñÒ…ÿñÔ�ÿñÙ¢ÿíГÿæÁyÿÜ­XÿפPÿÒžMÿΗJÿÊ‘GÿÆ‹EÿÖ­�ÿÄŠQÿ¹x<ÿµr:ÿ±k7ÿ­e4ÿ©_1ÿ¥X/ÿ R,ÿ�M+ÿ¨bGÿ©eOÿŸT?ÿŒ3ÿ‡,Šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€’?9½Â•‘ÿˤ›ÿÈœŒÿË¡ŠÿЦˆÿÕ­‡ÿÛ´†ÿ༅ÿåÄÿçÄ€ÿåÁzÿá¹nÿݰcÿá¼�ÿß»„ÿܶ�ÿذ|ÿÑ¢kÿÙ´ŒÿÍ�mÿ»}Cÿ¶s<ÿµsAÿ´rFÿ³rJÿ·yXÿ·|_ÿ´w\ÿ¯pWÿšK1ÿ�9!ÿŒ3ÿˆ-´€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€šNHÝË¥¢ÿÆš�ÿÈœ�ÿÌ ‹ÿϦ‰ÿÔ«‡ÿر…ÿÛµƒÿÝ·€ÿݶ{ÿܳuÿÔ¡YÿÍ–IÿÊ‘GÿÇŒEÿÈDÿÖ®…ÿΞqÿÆ�aÿÇ“jÿÅ�kÿ¾…`ÿ·yUÿ°mJÿ¥[7ÿœK)ÿ˜E&ÿ“?#ÿ�9!ÿ‹2ÿ‡,Õ€$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¥d^ÜÆœ™ÿÆš’ÿÇœ�ÿÊŸŒÿÍ¢‰ÿЦ†ÿÓ©ƒÿÔª€ÿÔª{ÿÔ¨vÿÑ£mÿÅŠIÿÁƒAÿ¿€AÿÒ§~ÿ¿ƒMÿµq9ÿ±k7ÿ­f4ÿª`2ÿ¦Z/ÿ¢U-ÿžO*ÿšI(ÿ–C%ÿ’=#ÿŽ7 ÿŠ1ÿ†+΀$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ §e`¿Â”‘ÿŘ’ÿÆš�ÿÈœŒÿÊ�‰ÿËŸ…ÿÌ �ÿÍŸ}ÿÌžxÿË›rÿÆ’eÿ¿ƒSÿ΢ÿ¶tBÿ¯h6ÿ¬d4ÿ©_2ÿ¦Z/ÿ¢U-ÿŸP+ÿ›K)ÿ˜E&ÿ”?$ÿ�9!ÿŒ4ÿˆ.ÿ†)ª€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÀÀÀ YT’¶{ýדÿÄ—�ÿÅ—‹ÿÅ—†ÿÆ—‚ÿÆ–~ÿÅ”xÿÄ’uÿÒ«”ÿÌŸ„ÿ©a4ÿ§\0ÿ¥Y/ÿ£V-ÿ R,ÿ�M*ÿšI(ÿ—D&ÿ”?$ÿ�:!ÿ�5ÿ‰/ÿ†*û‚$~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ˜JF/£_Z¿¾Ž‹ÿÁ“�ÿÁ’ŠÿÁ‘…ÿÁ’ƒÿΧšÿѬŸÿÀŽyÿ¹�jÿ°pUÿœK*ÿšH'ÿ˜F&ÿ–C%ÿ”?$ÿ‘;"ÿŽ7 ÿ‹3ÿˆ.ÿ…)ÿ‚#­|!'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ “A9BªkgÏĘ•þ̧¤ÿ̦¡ÿ½‹„ÿ¹‚xÿ¶~rÿ´{lÿ±ufÿ§bQÿ’?)ÿ�4ÿ‹2ÿ‰/ÿ‡,ÿ…(ÿ‚%ý ½}9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ*ÿÿÿŽ99�UOw¥b]Ǫkgú´|xÿ²zvÿ°toÿ¬ohÿ©ibÿ¤aYÿ”E<ÿ‡-$ÿ~ø|µ|ezÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq y&Œ6/E‘Aÿ¹yGÿºzOÿ¿†^ÿÍ¡„ÿ¼�\ÿ§[.ÿ©^/ÿ«`/ÿ¬a0ÿ¯e0ÿ´m3ÿ·u<ÿ°g0ÿ¨]/ù™I(cÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSSSººº«‘’‘ÿILKÿ')(ÿ111ÿª¨¨ÿ^C1ÿ”N(ÿ¡S-ÿ¦[4ÿº�aÿ¨_7ÿ±nJÿ½ƒfÿ¹`ÿ£W.ÿ¢U,ÿ¡S,ÿ¢S+ÿ©_3ÿ®g8ÿ­c/ÿ£T*ÿ–@%uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«œš¼žŸŸÿLNMÿ)+*ÿ???ÿ¥¤£ÿ_D7ÿ«x[ÿÆ—}ÿ¸{Wÿ¹|Yÿ¹}Yÿ´sMÿ­h?ÿÁŒnÿªb:ÿ£V.ÿ¡T,ÿ Q,ÿ§`>ÿ¡R)ÿ§Z,ÿŸN(ý—B$Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„,Ž8!ñ¤€pÿ©©©ÿOQPÿ*,+ÿPPPÿœš™ÿdK<ÿžY/ÿ«c3ÿ¬d4ÿ¬d4ÿ±m@ÿ¹|Uÿ¼‚]ÿË …ÿ¸|Yÿ¤X/ÿ¢U-ÿ©cAÿžM*ÿœM)ÿ Q)ÿšH&ò”:)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ0¢ŸS9ÿ¤[>ÿ�veÿ´´´ÿRUTÿ,.-ÿ```ÿ’��ÿ[9!ÿ£b2ÿ°k7ÿ°j7ÿ°j6ÿ¯h6ÿ®f5ÿ¬d4ÿÁŒjÿÉšÿ´tQÿ­hEÿ Q-ÿœM)ÿ›H'ÿ›H&ÿ’<$£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…%0—H4þ˜E'ÿšJ(ÿ R,ÿŸv]ÿ¾¾¾ÿWYWÿ/10ÿrrrÿ†‚ÿ^< ÿ¨i5ÿ´q9ÿ´p9ÿ³n8ÿ±l7ÿ°i6ÿ­f4ÿ±nBÿ¿‰hÿ»�aÿ¶xZÿžO+ÿ›J(ÿ˜E'ÿ•A$þ‘>1ÿÿÿÿÿÿÿÿÿÿÿÿ”D6œ‘;$ÿ—E&ÿžO*ÿ¤X.ÿª`2ÿ©‚iÿÅÅÄÿ\]\ÿ243ÿ���ÿ{wrÿ`? ÿ­o8ÿ·v<ÿ·t;ÿµq:ÿ³n8ÿ±k7ÿ®g5ÿ±nBÿ·zUÿ¸}\ÿ³sUÿ�M)ÿ™G'ÿ–@%ÿ‘;!”ÿÿÿÿÿÿÿÿÿÿÿÿ“?/ä’<"ÿšH(ÿ¡T-ÿ¨^1ÿ®f5ÿÄ�hÿª}WÿÉÉÉÿ`baÿ888ÿ���ÿpkeÿfC"ÿ­r9ÿµw;ÿ¶u;ÿµs:ÿ´o9ÿ±k7ÿ­f5ÿ»�[ÿ²rLÿ¥[4ÿ³uYÿ�O/ÿ–B%ÿ’<"âÿÿÿÿÿÿÿÿÿ‘E;4Ž8&ÿ”?$ÿ�M)ÿ¥Y/ÿ¬c3ÿ½�Tÿ½Jÿ»z=ÿ°‚VÿÌÊÉÿhiiÿ=@>ÿ–––ÿe^WÿH0ÿiF#ÿˆY-ÿ£i5ÿ®n7ÿ¯m7ÿ°i6ÿ¹}Uÿ´tMÿ¦\3ÿ Q,ÿ°pUÿ™H*ÿ’=#ÿŽ9-ÿÿÿÿÿÿ—IAYŒ4 ÿ–B%ÿŸP+ÿ¨]1ÿ¯i6ÿÅ�dÿ»z=ÿ¿€@ÿÂ…Bÿµ‡TÿÉÇÆÿprqÿEFEÿ   ÿpliÿTLDÿ8*ÿ/ÿD,ÿvJ&ÿ©g4ÿ»�Yÿªa3ÿ±oIÿ¡S,ÿœM*ÿªeKÿ“>#ÿ�8!Nÿÿÿÿÿÿ‰3)l�=)ÿ—D&ÿ¡S,ÿªa3ÿ·vDÿËXÿ¿€@ÿÇCÿÇŒEÿÉ�Gÿ¼�RÿÇÄÀÿ«««ÿ¬¬¬ÿgffÿ�‚�ÿ‹‹‹ÿ{{{ÿlljÿ:."ÿh@!ÿ¸�Yÿ«c3ÿ©`5ÿ¨`:ÿ�M*ÿ U7ÿœN5ÿ�6 gÿÿÿÿÿÿ~y˜I7ÿ—D&ÿ£U-ÿ­e4ÿÅŽaÿ½}?ÿÇCÿÈŽFÿË“HÿÍ–JÿϘJÿÕSÿÁÀ¾ÿååäÿRTSÿßààÿ___ÿ°²±ÿ–˜—ÿŒ�ŒÿH;1ÿ¤tRÿ«c4ÿ§]1ÿ§^8ÿ�N*ÿ˜G(ÿ¢XAÿŽ9"zÿÿÿÿÿÿ|g˜I8ÿšJ-ÿ£V.ÿ®g5ÿÅ�aÿÀ‚AÿÇŒEÿÌ”IÿКKÿÒ�MÿÓžMÿÒ�Mÿ¥—ÿªª©ÿjnkÿŽ’Žÿ›œšÿÉÊÊÿ¦§¦ÿ¿¿¿ÿ�}ÿqG)ÿ¨b2ÿ¨]1ÿ£V/ÿ¯mQÿ§`Eÿ–C*ÿ VErÿÿÿÿÿÿ|N‡,ÿ§aJÿ£V.ÿµuGÿÆ�`ÿÈDÿË’HÿЛLÿÔ NÿפPÿ×¥PÿפPÿ½˜[ÿ¹º¹ÿÙÙÙÿ®¯¬ÿÛÜÛÿÓÔÔÿ•–“ÿÇÅÁÿ«««ÿ“oSÿ¬e4ÿ§]1ÿ«eAÿΦ”ÿ¯oXÿ’<"ÿ§bP]ÿÿÿÿÿÿ}-ƒ%ÿ™I1ÿ¶z\ÿÅ‘lÿÅŽZÿÊ’PÿÏ™NÿÕ¡NÿÙ§QÿÛ«SÿÜ«SÿÛªRÿÒ¢Nÿ¦¤¡ÿÃÃÃÿçèçÿèèèÿÇÅÂÿ¯�PÿÊTÿ·”vÿ�|_ÿ¬d4ÿ§\0ÿ¡S,ÿÇ™†ÿ¸€lÿ�9!ÿ¬p`<ÿÿÿÿÿÿÿÿÿ~â¤]LÿÁ�xÿÑ©�ÿÇ‘_ÿΛ]ÿÕ£[ÿÙªWÿÝ®Tÿà²Vÿà²VÿÞ°UÿÚ«Rÿ¨œ‡ÿÐÐÐÿîïîÿôôôÿ�~mÿŒ`0ÿ½�cÿµs:ÿ±k7ÿ«b3ÿ¥Z/ÿ Q+ÿ¥[>ÿÀ�ÿ�9#âÿÿÿÿÿÿÿÿÿÿÿÿˆ1*š³yoÿº‚mÿϦ�ÿÓ«ˆÿÑ¡jÿÙ¬gÿß´dÿã¹`ÿä¸Yÿä¸XÿâµWÿÞ°Uÿµ™hÿ×××ÿìììÿ÷÷÷ÿtlbÿ7(ÿaF,ÿ­l7ÿ¯h6ÿ©`2ÿ£W.ÿ�M*ÿ—D&ÿ¡WAÿ™I7›ÿÿÿÿÿÿÿÿÿÿÿÿz0 ZTþ»†wÿËŸ‰ÿÊ›vÿݹ’ÿݵxÿã¼pÿéÂlÿêÁbÿç½[ÿä¸Yÿà²VÿרUÿº¸µÿãããÿìììÿÆÅÃÿ§Ÿ“ÿšnEÿ²n8ÿ­e4ÿ§[0ÿ R,ÿšI(ÿ”@$ÿ’>(þ¦]Q<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ1*¨»ˆ€ÿÉŸ�ÿÈ™|ÿѤ{ÿà¿‘ÿëÍ•ÿïÑ…ÿïÌqÿêÁ]ÿåºYÿà²VÿÚ©RÿãpÿÆÆÃÿÝÞÞÿãääÿçççÿÖÌÃÿ¯i6ÿ©_2ÿ£V.ÿ�L)ÿ–C%ÿ—G0ÿ™I8ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{¦e`õÅš‘ÿÇ›ˆÿÍ¡�ÿÖ­€ÿá¼�ÿðÓ�ÿôÜšÿîÐ…ÿã·YÿÝ­TÿÖ¤PÿКKÿÉ’KÿÈ­ŽÿÆ­“ÿ¾�eÿ±k7ÿ«b3ÿ¤X/ÿžO*ÿ¡U9ÿ T>ÿ�:'ò„,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹5/P´|xþÈž•ÿÈš‡ÿÏ£„ÿׯƒÿß»‚ÿæÃÿåÁ{ÿã¾yÿÞµsÿØ­nÿÓ¥jÿÕªzÿÌœkÿ¸w?ÿ¸xHÿ¸zRÿ³sPÿ­kLÿ©dIÿ˜G.ÿŒ3ý†)Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†.(x¼Š†ÿÄ–�ÿÈ›‰ÿÍ¡…ÿÒ¨‚ÿ×­ÿØ®xÿÓ£eÿÈŽFÿĈDÿÌšfÿÅŽ\ÿ»}Kÿ¼�Vÿ°mDÿ¤W0ÿ�M*ÿ—D&ÿ‘;"ÿ‹2ÿ„(rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜KDl»ˆ…ûÕ�ÿ؉ÿÈš…ÿÊœÿË�yÿÊšqÿÀ†UÿÇ”iÿ·uDÿ®f5ÿ©_2ÿ¤X.ÿŸP+ÿ™H'ÿ”?$ÿŽ7 ÿˆ.ø‚&^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿŸVPHªjf㾎‹ÿÀ‘‰ÿÁ�‚ÿÁ�{ÿÈ›…ÿË ‹ÿ¬gCÿ¡S,ÿŸO+ÿ›J(ÿ—D&ÿ“>#ÿŽ7 ÿ‰/ÿ„'×}9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÁ’@:s±wsðÇœ™ÿÅš–ÿ»ˆÿ´{nÿ°sdÿœN;ÿŽ7"ÿ‹2ÿˆ.ÿ…(ÿ�#æ}h€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÒÒ ”B?D›QJ›œTNΟZUä¢^Yö YTö–JDáƒ( Ä}‹};€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?€ÀàààÀÀÀ€€€€€€€ÀÀÀààðøô?òøÿþÿÿÿÿÿ(€   ÿÿÿÿÿÿÿÿÿÿÿÿ  !  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&2<BDA;1& ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !#$%&'())**)))('&%#"! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  3EVckmjbVG5% ÿÿÿÿÿÿÿÿÿÿÿÿ  #&(+-02479:<>?@ABBBBAA@>=;98641/,*'$! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#9Rhz'''˜bbb¾TTT¾RRR´!!!’yjWA,ÿÿÿÿÿÿ "&*.269=@CGJMORUWYZ\]^^_^^][ZXVTQOLIFB?;740,($! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 8UpVVV°ŸŸŸò¼¼¼ÿÀÀÀÿ¶¶¶ÿ«««ÿ¢¢¢þ………è<<<¤vaH0 $)-27;@EINRVZ^bfilpruwy{||}||zywtrnkhea]YUQLGC>950,'" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0On{{{ѽ½½ÿ¾¾¾ÿ¬¬¬ÿ£££ÿ›››ÿœœœÿ›››ÿ���ÿšššÿ‡‡‡ç �gL2 !&+16<AFLQW\afkpty}�…‰Œ�’•—™™š™˜–”’Ž‹ˆ„€|wsnid_ZUOJD?:4/)$ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$Bc‰‰‰ÔÀÀÀÿ´´´ÿšššÿ™™™ÿ©©©ÿ¼¼¼ÿ²²²ÿŸŸŸÿ›››ÿ›››ÿ˜˜˜ÿŽŽŽñ‹jN2 $*/6<AHMSY_ekpu{€†‹�•™Ÿ£§ª­°²³´³²¯¬©¥¢�™”�‰„ytnic]WQLF?:4.(" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/QQQQ›¿¿¿ÿ¬¬¬ÿ   ÿ±±±ÿßßßþÑÑÑê¿¿¿¿ÇÇÇØÓÓÓùÃÃÃÿ¤¤¤ÿ¢¢¢ÿšššÿ’’’÷ “lN3 #*06<CIOU[bhntz€†‹‘˜�¢§­² ¶ » ¾ Á Ä Æ Æ Å Ä Á ½ º µ ± ¬ §¢œ—�‹…xrlf`YTMGA:4.(! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 8]°°°ôµµµÿ©©©ÿ¿¿¿ÿÖÖÖø‚‚‚Y ´´´ÃÆÆÆþ°°°ÿ¬¬¬ÿžžžÿ›››ø'''—mN3%,28?EKRX^ekqw~„Š�—� ¢ ª) ºB ËW*Øk0æx6í~9ò„=õŠ?!ù�A"û–D#þ–E$þ‘C#û‹@"ø…>õ<ðz9ìn3ã\-ÖG$Ç/ µ¥� — � ‰ƒ|vpjc\VPIC=60*# ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ?lllš¾¾¾ÿ°°°ÿµµµÿÐÐÐù111<  #žžž©¼¼¼ÿ···ÿµµµÿ¥¥¥ÿ¢¢¢÷•mN3 #*06<CIOU[bhou|‚ ‰$ šP$»p2؇< ð•C#ý™E$ÿšG&ÿ›J&ÿ�L&ÿžM'ÿŸN'ÿŸO'ÿ Q(ÿ¡R(ÿ¡R(ÿ¡S(ÿ¡S(ÿ¡R(ÿ¡R(ÿ Q(ÿŸP'ÿŸN'ÿžM'ÿ�L&ÿœJ&ÿ˜G&ý�A"ïv8ÖX,¸- –ƒ | u nhaZSMGA:4.(! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"B›››Îºººÿ···ÿÊÊÊÿ‰‰‰Ž& 7­­­é»»»ÿ¿¿¿ÿ¿¿¿ÿ´´´ÿ›››õ‘lM3!$*/6<AGMTZa g pQ$Ÿt3ÉŠ=!ì—B$ÿ˜F$ÿšH&ÿ�L&ÿŸN'ÿ¡R(ÿ£U(ÿ¤V*ÿ¦Y+ÿ§Z+ÿ¨\,ÿ©],ÿª^,ÿª_,ÿ«`-ÿ«`-ÿ«`-ÿ«`-ÿª_,ÿª^,ÿ©],ÿ¨\,ÿ§Z+ÿ¦Y+ÿ¥W*ÿ£U(ÿ¡R(ÿŸO'ÿ�L&ÿ›I&ÿ�D$ì|:È[.�  mb [ T NGA:4.(" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"Aµµµì¿¿¿ÿÀÀÀÿ¿¿¿ôC$ 7wwwŸ³³³ÿÇÇÇÿÈÈÈÿËËËÿ²²²ÿ™™™ñ �lM3!!&,16=B I OI"xy4º‘>"ó—B#ÿ™F$ÿ›J&ÿžM'ÿ¡Q(ÿ£U)ÿ¦X+ÿ¨[,ÿª_,ÿ¬a-ÿ®d.ÿ¯e.ÿ°f/ÿ±h/ÿ±i0ÿ²j0ÿ³k0ÿ³k0ÿ³l0ÿ³l0ÿ³k0ÿ³k0ÿ²j0ÿ±i0ÿ±h/ÿ°f/ÿ¯e.ÿ®d.ÿ­a-ÿª_,ÿ¨[,ÿ¦X+ÿ¤U*ÿ¡R(ÿŸN'ÿœJ&ÿ—F%ó‚= ¹Y0v! LE> 70+% ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ =ÃÃÃøÇÇÇÿÄÄÄÿ©©©ÜI* !?n¥¥¥þÐÐÐÿÅÅÅÿÑÑÑÿÉÉÉÿ¯¯¯ÿ–––ìŠlL2  % *1/ @w3”ŽÿÇ�XÿÏ qÿׯ‰ÿÞ½žÿܹ˜ÿÒ¦~ÿÉ•eÿ‡Rÿ¿‚Nÿ½~KÿºzGÿ¹zJÿº}Sÿ»�\ÿ½„dÿÁ�sÿ¹dÿ¬hLø Y;Ÿ“V',„q&uf XXBB!55ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÅÅÅÆßßßÿÛÛÛÿ¡¡¡ö{m\OHKXm‡yyyã­­­ÿÎÎÎÿœœœÿjjjÿ¥¥¥ÿÇÇÇÿÌÌÌÿÁÁÁÿ���ÿsssÓ‡hJ/ b9Ž: ‚‘ÿ²rWÿ¯nTã¬e@UÿÛIÿß`ÿÿ@ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !ÎÎÎçãããÿÝÝÝÿŽŽŽüMMM°“•—›£´wwwù´´´ÿÍÍÍÿžžžÿLLLÿÿ ÿWWWÿªªªÿÈÈÈÿÈÈÈÿÅÅÅÿ¡¡¡þDDC¹† w]$Ây2ÿˆ: ÿ’C"ÿ›K%ÿ Q(ÿ¥Y+ÿ«^,ÿ­d.ÿ±h/ÿ²k0ÿµn1ÿ¶o1ÿ·q2ÿ·r3ÿ¸r3ÿ¸s3ÿ¹s3ÿ¹t4ÿ¹t4ÿ¹t4ÿºt4ÿ¹t3ÿ¹u3ÿ¹u4ÿ¹u4ÿºu4ÿºu4ÿºu4ÿºu4ÿºu4ÿºu4ÿ¿€DÿÔ©€ÿå˳ÿÙ³�ÿĉSÿ¹t4ÿ¹t4ÿ¹u3ÿ¹t3ÿ¹t3ÿ¹t3ÿ¹t3ÿ¹t4ÿ¹t4ÿ¹s3ÿ¸s3ÿ¸s3ÿ¸r3ÿ·r3ÿ¸s6ÿ»x>ÿ¸t8ÿµm1ÿ²j0ÿ±h/ÿ®d.ÿ«^,ÿ¦Z+ÿ¢S)ÿ¦^:ÿ®lQÿ¦]Aµ¯e0"ÿÑFÿÕUÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒƒƒ€ÐÐÐþäääÿÏÏÏÿ‡‡‡þuuuß:::½¬ ·LLLØoooý¥¥¥ÿçççÿ´´´ÿ���ÿÿ ÿÿ ÿeeeÿ­­­ÿÈÈÈÿÈÈÈÿ···ÿœœœý:/+ÈCöZ%ÿo0ÿ�= ÿ“L(ÿ©gBÿµvOÿ½‚YÿÄ�dÿÈ—nÿΟxÿÒ§‚ÿÖ¯Œÿ×°�ÿТxÿÉ“bÿÁƒKÿ¹u7ÿ¸s3ÿ¸r3ÿ¸s3ÿ¹s3ÿ¸s4ÿ¸s3ÿ¸r3ÿ¸s3ÿ¸s3ÿ¸r3ÿ¸r4ÿ¸r4ÿ¸r3ÿ¿‚KÿÙµ”ÿæÍ¸ÿÒ¦€ÿ½}Dÿ·r3ÿ¸r3ÿ·r3ÿ·r3ÿ·r3ÿ·r3ÿ¸r3ÿ¸r3ÿ·r3ÿ¸r3ÿ¸r3ÿ¸r3ÿ¸q3ÿ¸r3ÿ¸q2ÿ·r2ÿ·q2ÿ·r4ÿ»z@ÿ¼yAÿ¶o2ÿ´k1ÿ±i0ÿ¯f/ÿ¬b-ÿ©\,ÿ¤V*ÿ¢U.ÿ©dEÿ¦_Cð¡S-WÿØNÿÛIÿ¿@ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���‰ÍÍÍþåååÿåååÿ§§§ÿ†††ÿqqqþoooÿ„„„ÿÔÔÔÿÿÿÿÿÉÉÉÿ–––ÿ'''ÿÿÿ ÿÿ ÿrrrÿ¯¯¯ÿÈÈÈÿÈÈÈÿ³³³ÿš™˜ÿC%ÿS0"ÿsP@ÿ˜wfÿ¹žŽÿ̱ ÿؽªÿÞİÿàÄ­ÿàÁ©ÿÞ¾£ÿܺœÿÚ¶–ÿÛ·˜ÿâÇ®ÿêÖÅÿìÚÉÿìÚÊÿæÍ¸ÿÞ¾£ÿÖ®ŒÿΞuÿÉWÿµo4ÿµo2ÿµn2ÿµm2ÿ´m2ÿ´m2ÿµn4ÿΠzÿæÏ»ÿË›sÿµp8ÿ³l2ÿ³l2ÿ´m1ÿ´m2ÿ´l2ÿ³l2ÿ´m2ÿ´m2ÿ´m2ÿµn2ÿµn2ÿµn2ÿµo2ÿ¶o2ÿ¶o2ÿ¶o2ÿ¶p2ÿ¶o2ÿ¶p3ÿ¶o2ÿ¶o2ÿ»x?ÿ½}Gÿ¶o3ÿ´l1ÿ²j/ÿ°g/ÿ®c.ÿª^,ÿ¦Y*ÿ¡R)ÿ¦\9ÿ¥[>ÿ›J'“ÔžA ÿß`ÿ¿@ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ŠÈÈÈþçççÿëëëÿïïïÿóóóÿ÷÷÷ÿúúúÿôôôÿ°°°ÿ‰‰‰ÿ,,,ÿÿ%'&ÿÿÿ ÿÿ ÿ~~~ÿ²²²ÿÆÆÆÿÂÂÂÿ­­­ÿ–•”ÿVG@ÿgQFÿ{[Gÿ�_Aÿ™_5ÿ¦d3ÿ­f.ÿ±j0ÿ³m1ÿµn1ÿµn2ÿµo2ÿµn2ÿµn2ÿ¶o4ÿ¼|GÿÄŒ]ÿÌœuÿÕ­ŒÿÞ¾¥ÿçпÿîÞÒÿèÓÃÿÔ­�ÿ¿„Xÿ°g2ÿ¯f1ÿº|Lÿ߬ÿÙ·ŸÿµrBÿ®e0ÿ®e0ÿ®e0ÿ®d0ÿ®d0ÿ®e0ÿ¯e0ÿ®f0ÿ®f1ÿ¯f0ÿ¯g0ÿ°f0ÿ°h1ÿ±i1ÿ²i1ÿ±j0ÿ²j1ÿ³k1ÿ³l2ÿ³l1ÿ´m1ÿ´m1ÿµm2ÿ´m1ÿºxAÿ¾�Mÿµn3ÿ´k1ÿ²i0ÿ°g/ÿ®d.ÿ«_-ÿ§Z+ÿ£T)ÿ¦Z6ÿ¤Y:ÿ˜F'Ë©Z*'ÿãUÿÿ@ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||‹ÄÄÄþèèèÿîîîÿéééÿ±±±ÿ¦¦¦ÿ���ÿfffÿÿ-/.ÿ8;9ÿ/10ÿ&''ÿÿÿ ÿÿÿ‰‰‰ÿ´´´ÿÅÅÅÿÁÁÁÿ«««ÿ�‹ˆÿD%ÿX1ÿpAÿ†O$ÿ™[)ÿ¦c-ÿ­h/ÿ²k0ÿ³m1ÿ³l1ÿ³k1ÿ³k1ÿ²j1ÿ±i1ÿ°h1ÿ°g0ÿ¯f0ÿ®e0ÿ®d0ÿ­c0ÿ¶uGÿÊœ|ÿàųÿíÝÓÿçÒÅÿãʺÿê×ËÿÂ�kÿ©].ÿ¨].ÿ¨].ÿ¨\.ÿ¨\.ÿ¨].ÿ¨].ÿ©].ÿ©]-ÿ¨].ÿ©^.ÿ©^.ÿª^.ÿª_/ÿª`/ÿ«a/ÿ¬b/ÿ­b/ÿ­d0ÿ®d0ÿ®f/ÿ°f0ÿ±h0ÿ±i0ÿ²i0ÿ²j0ÿ³k1ÿºxCÿ¿‚Qÿ²k2ÿ²j0ÿ±i0ÿ°g/ÿ®d.ÿ¬`-ÿ¨[+ÿ£V*ÿ¤Y4ÿ¡U4ÿ–C$ïžN%DÿãUÿÌ3ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ {{{ŠÁÁÁþèèèÿîîîÿÜÜÜÿ’’’ÿrrrÿÿFJHÿKOMÿBECÿ9;:ÿ/20ÿ&('ÿÿÿ ÿÿÿ“““ÿ¶¶¶ÿÅÅÅÿ½½½ÿ¦¦¦ÿ„}xÿF)ÿ[6ÿsDÿ‰Q%ÿš\*ÿ¥c.ÿ«g.ÿ¯h/ÿ¯h0ÿ°f0ÿ¯e0ÿ®d0ÿ­c/ÿ¬a/ÿ«`/ÿª_.ÿ©].ÿ¨].ÿ¨\.ÿ§[.ÿ§[-ÿ¦Z-ÿ½‚bÿëÙÏÿðäÜÿîà×ÿæÑÅÿΦ�ÿ³sOÿ¤W,ÿ¤W,ÿ¤W,ÿ¤W,ÿ¤W,ÿ¤W-ÿ¤W-ÿ¥W,ÿ¤W-ÿ¤W-ÿ¥X-ÿ¥X,ÿ¥Y-ÿ¦Z-ÿ§Z-ÿ§[.ÿ¨\-ÿ©]-ÿ©^.ÿª_/ÿ¬a.ÿ¬b/ÿ®d/ÿ®e/ÿ¯f/ÿ°g0ÿ¼}Mÿ»|Jÿ±i0ÿ±i/ÿ±g/ÿ°f/ÿ®e.ÿ¬a-ÿ¨\+ÿ¥V*ÿ¥Y3ÿžO-ÿ—C$ø›I&UÿÌMÿÌ3ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ xxx‹¼¼¼þçççÿíííÿÞÞÞÿ–––ÿ___ÿÿMQOÿKOMÿBEDÿ9<:ÿ021ÿ&('ÿÿÿ ÿÿÿ›››ÿ¸¸¸ÿÂÂÂÿ»»»ÿŸŸŸÿxmeÿH*ÿ^7ÿsCÿ‰O$ÿ˜Y*ÿ¢],ÿ¨`/ÿªa.ÿªa.ÿª_/ÿ©].ÿ¨\-ÿ§Z-ÿ¦Y.ÿ¥Y-ÿ¥X-ÿ¤X,ÿ¤V,ÿ£V-ÿ¥Y1ÿÉ�„ÿåÎÃÿ¼„fÿ¢T,ÿ­hDÿÅ”{ÿÞ´ÿìÝÕÿ×¶¥ÿ±pOÿ¡S,ÿ¡S,ÿ¡S,ÿ¢T,ÿ¢T,ÿ¢S,ÿ¡S,ÿ¡T+ÿ¢S,ÿ¢T+ÿ¡S,ÿ¢T,ÿ£U+ÿ¢U+ÿ£V,ÿ¤V,ÿ¤X-ÿ¥X,ÿ¦Y,ÿ§[-ÿ¨\-ÿ©^-ÿ«_.ÿ¬a.ÿ®e1ÿ¾ƒYÿµr@ÿ¯f/ÿ¯f0ÿ°f/ÿ¯f/ÿ®c-ÿ¬`-ÿ¨\,ÿ¥W*ÿ¤W1ÿœK'ÿ—C$ü™F%fÿÌMÿÌ3ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ www‹···þæææÿíííÿáááÿšššÿfffÿÿLOMÿLONÿCFDÿ9<;ÿ021ÿ')(ÿÿÿ ÿÿÿ¢¢¢ÿºººÿÂÂÂÿ¼¼¼ÿšššÿgYOÿI*ÿ]5ÿsAÿ†K$ÿ”R(ÿ�W*ÿ¢Y-ÿ¥Y-ÿ¤X,ÿ¤W-ÿ£W-ÿ£U,ÿ¢U,ÿ¢T,ÿ¢T,ÿ¢S,ÿ¡T,ÿ¦\5ÿÙ¹©ÿÕ±Ÿÿ¨`;ÿ¡T-ÿ¡S-ÿ¡S-ÿ¡S,ÿ¡S,ÿ²rRÿØ·§ÿìÜÔÿ×µ¤ÿ±pOÿ¡S,ÿ¡R,ÿ¡R+ÿ¡R,ÿ R,ÿ R,ÿ R+ÿ¡Q+ÿ Q,ÿ R+ÿ Q+ÿ Q+ÿ Q+ÿ¡Q+ÿ R+ÿ¡R+ÿ¡T,ÿ£U+ÿ£U+ÿ¤W,ÿ¥X,ÿ§Z,ÿ¨\-ÿ­f8ÿ¿…^ÿ­d1ÿ­c.ÿ®d/ÿ®d.ÿ­c.ÿ­b.ÿ«_-ÿ§[,ÿ¥W+ÿ¡R,ÿšI%ÿ—C$ÿ˜D$zÿÌMÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ zzz‰´´´þæææÿìììÿâââÿ���ÿnnnÿÿJMKÿLPNÿCFDÿ:<;ÿ032ÿ')(ÿÿÿ ÿÿÿ¨¨¨ÿ»»»ÿÀÀÀÿ¶¶¶ÿ•••ÿZH;ÿI(ÿ\3ÿq=ÿƒF$ÿ‘M'ÿšP(ÿžS+ÿ¡S,ÿ¡T,ÿ¢S,ÿ¡S,ÿ¡R,ÿ¡S+ÿ¡S-ÿ¡S,ÿ©a>ÿàŸÿËŸˆÿ¡U-ÿ¡T,ÿ¡T-ÿ¡T-ÿ¡T-ÿ¡T-ÿ¡T-ÿ¡T-ÿ¡T-ÿ³tTÿظ¨ÿëÛÓÿÖµ¤ÿ±pOÿ¡S,ÿ¡R,ÿ R,ÿ R,ÿ R,ÿ R+ÿ Q+ÿ Q+ÿ Q+ÿŸP+ÿŸP+ÿŸP*ÿŸO+ÿŸP*ÿŸP*ÿ P*ÿŸQ+ÿ¡R*ÿ¡R+ÿ¢S+ÿ£U+ÿ¥W,ÿµuNÿµuMÿ©^-ÿª_-ÿ¬a.ÿ¬a-ÿ¬a-ÿ«`-ÿª^,ÿ§Z+ÿ¤V*ÿŸO(ÿšH%ÿ—C$ÿ˜D#zÿãUÿ¿@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €€€„¯¯¯ýäääÿìììÿåååÿ¡¡¡ÿtttÿÿHKIÿMPNÿCGEÿ:=;ÿ132ÿ(*)ÿ ÿÿ ÿÿ&&&ÿ®®®ÿ¼¼¼ÿ¿¿¿ÿ´´´ÿ——–ÿM7+ÿG&ÿ[/ÿo9ÿ�B"ÿ�I&ÿ—M*ÿ�Q+ÿŸQ+ÿ R,ÿ¡S,ÿ¡S,ÿ¡T,ÿ¡S,ÿ®kJÿäÎÃÿÑxÿ¢U-ÿ¢U-ÿ¢U-ÿ¢U-ÿ¢U-ÿ¢U-ÿ£U-ÿ£U-ÿ£U-ÿ¢U-ÿ¢U-ÿ¢U-ÿ´uUÿظ¨ÿëÛÓÿ×µ¤ÿ±pPÿ¡T-ÿ¡S,ÿ¡S,ÿ¡R,ÿ R,ÿ Q,ÿ Q+ÿŸP+ÿŸP+ÿžP+ÿŸP*ÿŸO*ÿžN+ÿžO)ÿžO*ÿžN*ÿžO)ÿŸO)ÿŸQ*ÿ¡R*ÿ¤X0ÿ¼„fÿ¨]3ÿ¦Y,ÿ¨[,ÿ©]-ÿª^-ÿ«_-ÿª^-ÿ¨\,ÿ§Y+ÿ£T)ÿžN(ÿšH%ÿ–B$ÿ˜D$eÿß@ÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ‚‚‚w©©©üãããÿëëëÿæææÿ¥¥¥ÿ{{{ÿÿEIGÿMQOÿDGEÿ:=<ÿ142ÿ(*)ÿ ÿÿ ÿÿ111ÿ³³³ÿ¼¼¼ÿ»»»ÿ¯¯¯ÿ•““ÿC*ÿG$ÿZ.ÿo8ÿ�B$ÿ�I&ÿ™N*ÿœQ+ÿ R,ÿ S,ÿ¢T-ÿ¢T-ÿµwWÿçÓÉÿ¼…gÿ£V.ÿ£V.ÿ£W.ÿ£W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ£W.ÿ£W.ÿ£V.ÿµwWÿÙ¹©ÿëÚÒÿÕ³¡ÿ«e@ÿ¢T-ÿ¢T-ÿ¡S,ÿ¡S,ÿ¡R,ÿ R,ÿ Q,ÿŸQ+ÿŸP+ÿŸO+ÿžO*ÿžO*ÿžN*ÿžM)ÿ�N*ÿžM*ÿ�M)ÿ�N)ÿŸN*ÿ®jJÿ´tUÿ¢S*ÿ£U+ÿ¥X,ÿ§Z,ÿ¨[-ÿ©\,ÿ©\,ÿ§Z+ÿ¥X+ÿ¢S)ÿžM'ÿ™G%ÿ•A$ü™E$SÿÿUÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€e£££øáááÿëëëÿçççÿ¨¨¨ÿ€€€ÿÿCFEÿMQOÿDGFÿ;><ÿ243ÿ(*)ÿ! ÿÿ ÿ ÿ>>>ÿ¶¶¶ÿ»»»ÿ¼¼¼ÿ§§§ÿ��Œÿ<"ÿI%ÿ\/ÿp:ÿƒC$ÿ‘K(ÿšP+ÿŸR,ÿ¡T-ÿ¢V-ÿ¼…hÿèÕËÿ·zYÿ¤W.ÿ¤X.ÿ¤X.ÿ¤X/ÿ¤X/ÿ¥X/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥X/ÿ¤X/ÿ¤X/ÿ¤X.ÿ¤X.ÿ¤W.ÿ¶xXÿÝÀ±ÿçÒÈÿ¾ˆlÿ¢U-ÿ¢U-ÿ¢T-ÿ¡T-ÿ¡S,ÿ¡S,ÿ R,ÿ Q,ÿŸQ+ÿŸP+ÿžO+ÿžO*ÿ�N*ÿ�N*ÿ�M)ÿ�L)ÿœL(ÿ�L)ÿ S0ÿ¼†nÿ Q+ÿŸP)ÿ¡R*ÿ£U+ÿ¤W+ÿ¥X,ÿ§Z+ÿ§Z,ÿ¦Y+ÿ¤V*ÿ¡Q(ÿ�K'ÿ˜E$ÿ”?#÷™G#AÿÌfÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||TœœœóÝÝÝÿêêêÿèèèÿ¬¬¬ÿ………ÿÿADCÿNQPÿDHFÿ;>=ÿ243ÿ)+*ÿ ! ÿÿ  ÿ ÿNNNÿ¸¸¸ÿ¼¼¼ÿ»»»ÿ£££ÿ‰…ƒÿ>$ÿQ3%ÿiE3ÿ„ZEÿ›nWÿ¯hÿ½ŽvÿÆšƒÿÞÄ·ÿòéãÿÝÀ°ÿ×µ¢ÿÒ«–ÿÍ£‹ÿÈš€ÿÑuÿ¿ˆiÿº~]ÿ´uQÿ¯kEÿªb9ÿ¦Z/ÿ¦Z/ÿ¦Z/ÿ¦Z/ÿ¥Z/ÿ¥Z/ÿ¥Y/ÿ¥Y/ÿ¥Y/ÿ¥X/ÿ¦[3ÿÈš€ÿéÖÌÿÕ²Ÿÿªb=ÿ£V.ÿ¢U-ÿ¢U-ÿ¢T-ÿ¡S,ÿ¡S,ÿ R,ÿ Q,ÿŸQ+ÿŸP+ÿžO+ÿžN*ÿ�M*ÿ�L)ÿœM)ÿœL)ÿœL)ÿ·|cÿ¨`@ÿ�L)ÿ�N(ÿŸP)ÿ¡R*ÿ¢T*ÿ¤U+ÿ¥W*ÿ¥W+ÿ¤V*ÿ¢T*ÿ O(ÿ›I&ÿ—C$ÿ“>"ï�N'#ÿ¿@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzusI—’�ûÚÚÚÿêêêÿêêêÿ°°°ÿ‹‹‹ÿÿ>A?ÿNRPÿEHFÿ7ÿaNEÿz`Rÿ�p^ÿ£{fÿ°‚hÿÓ·§ÿæÖÍÿ¾ˆkÿµwSÿ¶xUÿ¼ƒbÿÁ�oÿÆ–zÿÌ ‡ÿÑ«”ÿ×´ ÿÜ¿­ÿâɺÿèÔÈÿêØÎÿãʼÿÕ±œÿÇ—{ÿ¹|Zÿªb9ÿ¦[0ÿ¦[0ÿ¦Z/ÿ¦Z/ÿ¥Z/ÿ¥Y/ÿ³sPÿÞ³ÿäÍÁÿ»‚dÿ£W.ÿ£V.ÿ£U-ÿ¢U-ÿ¢T-ÿ¡S,ÿ¡S,ÿ R,ÿ Q+ÿŸP+ÿŸO+ÿžO*ÿ�N*ÿ�M*ÿœL)ÿœK)ÿ¬hJÿ³v]ÿœJ(ÿœK(ÿœL(ÿžM(ÿŸO)ÿ Q)ÿ¢S*ÿ£U*ÿ¤U*ÿ£T)ÿ R)ÿ�M'ÿšG%ÿ–A#ÿ“>"ʾ}1 ÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU†1�ŒH8ÿ’Љÿ×××ÿéééÿêêêÿ´´´ÿ���ÿÿ"�ÿÕUÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ0O‹4ÿ’B+ÿ�I3ÿ�ƒÿÓÓÓÿèèèÿêêêÿ¸¸¸ÿ•••ÿ ÿ8;9ÿOSQÿFIGÿÿ364ÿ*,+ÿ!""ÿÿÿÿ}}}ÿ¼¼¼ÿ¸¸¸ÿ²²²ÿ———ÿaSLÿ>"ÿQ,ÿuVCÿ«œ”ÿ’X6ÿ™T,ÿ¡Y/ÿ¥\0ÿ§]1ÿ¨^1ÿ¨^1ÿ©_1ÿ©_1ÿ©_1ÿ©_2ÿ©_2ÿ©_2ÿ©_2ÿ©_2ÿ©_2ÿ©_1ÿ©_1ÿ©_1ÿ©_3ÿ´sLÿÂ�nÿЧ�ÿÞÁ°ÿêØÎÿâȺÿÓ®˜ÿ¾‡gÿ©`6ÿ¶xTÿÞôÿáȺÿ¸}]ÿ¤W.ÿ£W.ÿ£V.ÿ¢U-ÿ¢T-ÿ¡T-ÿ¡S,ÿ R,ÿ Q+ÿŸP+ÿžO+ÿžN*ÿ�M*ÿœL)ÿ»ƒlÿ¨aCÿšJ(ÿ›I'ÿšI(ÿšI'ÿ›J'ÿœK(ÿ�L(ÿŸN(ÿ P(ÿ Q(ÿ O(ÿžM'ÿšH&ÿ—C$ÿ“>"ÿ•A#Pÿ¿@ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹3Œ3í�7!ÿ“?(ÿ“?#ÿ’I,ÿ‹~wÿÏÏÏÿèèèÿéééÿ¼¼¼ÿšššÿ%%%ÿ687ÿOSQÿFIHÿ=@>ÿ365ÿ*,+ÿ!#"ÿÿÿÿŒŒŒÿ¾¾¾ÿ¶¶¶ÿ¬¬¬ÿ���ÿTC:ÿG0"ÿtlgÿpH0ÿ}F%ÿŽP*ÿ›W-ÿ¢[0ÿ¦^1ÿ¨`2ÿª`2ÿª`2ÿª`2ÿªa2ÿªa2ÿªa2ÿªa2ÿªa2ÿªa2ÿªa2ÿª`2ÿª`2ÿª`2ÿª`2ÿ©`2ÿ©_2ÿ©_1ÿ©_1ÿ©`4ÿµvOÿÅ’tÿÛ¼ªÿé×ÌÿÖ²žÿ¿ŠkÿΤ�ÿæÑÆÿΤ�ÿ§^6ÿ¤W.ÿ£W.ÿ£V.ÿ¢U-ÿ¢T-ÿ¡S,ÿ¡R,ÿ Q,ÿŸP+ÿŸO+ÿžO*ÿ�M*ÿ¯mPÿ·|cÿ›J(ÿšI(ÿšI'ÿšI'ÿšI&ÿšI'ÿ›I'ÿœK'ÿ�M'ÿžN(ÿžN(ÿžM(ÿœJ&ÿ™F%ÿ•A#ÿ’=!íšH&ÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ2©�4ÿ�8 ÿ“?"ÿ•C$ÿ˜G%ÿ—L+ÿŠyqÿÊÊÊÿçççÿêêêÿÀÀÀÿžžžÿ)*)ÿ354ÿPSRÿFJHÿ=@?ÿ465ÿ+-,ÿ!#"ÿÿÿÿ™™™ÿ¿¿¿ÿ¶¶¶ÿªªªÿ��ŽÿYURÿJ3&ÿU0ÿk< ÿ€H&ÿ‘R+ÿ�Y.ÿ¤^0ÿ¨_2ÿªb3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿ«b3ÿªa3ÿªa2ÿªa2ÿª`2ÿª`2ÿ©`2ÿ©_2ÿ©_1ÿ¨^1ÿ®h?ÿÑsÿÛ¼ªÿéÖÊÿÝÁ°ÿçÓÇÿÚ¼ªÿ«d=ÿ¤X.ÿ¤W.ÿ£V.ÿ¢U-ÿ¢T-ÿ¡T-ÿ¡S,ÿ R,ÿŸQ+ÿŸP+ÿžO*ÿ¢V4ÿÆ–‚ÿ�M+ÿ›J(ÿšI(ÿšH'ÿšH'ÿ™G'ÿ™G'ÿšH&ÿ›J'ÿ�K'ÿ�L(ÿ�M'ÿœK'ÿšG&ÿ–C$ÿ“?#ÿ’!ÿ‚K'ÿ“T,ÿž\/ÿ¦`1ÿªb2ÿ«d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬c3ÿ¬c3ÿ«c3ÿ«c3ÿ«b3ÿ«b3ÿ«a3ÿªa2ÿª`2ÿª`2ÿ©_2ÿ©_1ÿ¨^1ÿ¨^1ÿ®h?ÿÃ�rÿÞÁ°ÿõíèÿîàØÿÂ�rÿ¦[3ÿ¤W.ÿ£W.ÿ£V-ÿ¢U-ÿ¡T-ÿ¡S,ÿ R,ÿŸQ+ÿŸP+ÿžO*ÿ‘{ÿ¦\<ÿœK)ÿ›J(ÿšI(ÿ™H'ÿ™H'ÿ™F&ÿ™F'ÿ™G&ÿšH'ÿœJ'ÿœJ'ÿœK&ÿšH&ÿ˜E%ÿ•@#ÿ’"GÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰.Š1Ú�4ÿ�9 ÿ“="ÿ–C$ÿšI'ÿ²rVÿÄ•€ÿ­lNÿ—I(ÿ†mbÿ¿¿¿ÿåååÿêêêÿÇÇÇÿ¤¤¤ÿ888ÿ,.-ÿPTRÿGKIÿ>A?ÿ576ÿ+.,ÿ"$#ÿÿ  ÿÿ­­­ÿ¾¾¾ÿ²²²ÿŸŸŸÿЇ†ÿ:$ÿE(ÿY3ÿoA"ÿ„L(ÿ•V-ÿ¡^0ÿ¨b2ÿ«d3ÿ¬e4ÿ­e4ÿ­f4ÿ­f4ÿ­f4ÿ­f4ÿ­e4ÿ­e4ÿ­e4ÿ­e4ÿ­e4ÿ­d4ÿ¬d4ÿ¬d4ÿ¬c3ÿ«c3ÿ«c3ÿ«b3ÿ«a3ÿªa2ÿª`2ÿ©`2ÿ©_1ÿ¨^1ÿ¨]1ÿ§]1ÿ±mFÿâɺÿòæàÿëÚÑÿÍ£Œÿ«f?ÿ¤W.ÿ£V.ÿ¢U-ÿ¢T-ÿ¡S,ÿ R,ÿŸQ+ÿŸP+ÿ¾‰qÿ«gIÿœL)ÿœK)ÿ›J(ÿšI(ÿ™H'ÿ˜G'ÿ™F&ÿ™F&ÿ™F&ÿ™G&ÿšH'ÿšH&ÿšH&ÿ™F%ÿ–B$ÿ”>#ÿ‘;!Û¨V' ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰0|‹3ÿŽ7 ÿ‘:!ÿ”?#ÿ S6ÿ¼‡qÿ¹€iÿ T2ÿ›J(ÿšI(ÿ—I'ÿ‡h[ÿ¹¹¹ÿäääÿéééÿËËËÿ¨¨¨ÿ?@@ÿ*+*ÿQUSÿGKIÿ>A@ÿ586ÿ,.-ÿ#$$ÿÿÿÿµµµÿ¾¾¾ÿ±±±ÿ›››ÿƒ|ÿ9!ÿG*ÿ\5ÿqC#ÿ†O)ÿ—Z.ÿ¢`1ÿ©d3ÿ¬f4ÿ­g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®f5ÿ®f5ÿ­f4ÿ­e4ÿ­e4ÿ­d4ÿ¬d4ÿ¬c3ÿ«c3ÿ«b3ÿ«b3ÿªa2ÿª`2ÿ©`2ÿ©_1ÿ¨^1ÿ¨]1ÿ©_4ÿΤ‹ÿã˽ÿض¤ÿçÓÈÿϦ‘ÿ­hCÿ£V.ÿ¢U-ÿ¢T-ÿ¡S,ÿ R,ÿŸQ+ÿº‚gÿ²sVÿ�M*ÿœL)ÿœK)ÿ›J(ÿšH(ÿ™G'ÿ˜F&ÿ˜F&ÿ˜E&ÿ˜F&ÿ™F&ÿ™F&ÿ™G&ÿ˜E%ÿ—C$ÿ”@#ÿ’;"ÿ‘;!~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ.Š1ö�4ÿ�8 ÿ“>$ÿ«iRÿ½ˆtÿ¨cFÿ›H'ÿ›I'ÿšI(ÿšJ)ÿ›J(ÿ™K(ÿ‰dTÿ²²±ÿáááÿéééÿÏÏÏÿ«««ÿIIIÿ&'&ÿPTRÿHKJÿ?B@ÿ587ÿ,.-ÿ#%$ÿÿÿ ÿ¼¼¼ÿ½½½ÿ¯¯¯ÿ———ÿysoÿ9"ÿI+ÿ^8ÿtE#ÿ‰Q*ÿ™[/ÿ¤b3ÿªf5ÿ­h5ÿ¯i6ÿ°i6ÿ¯i6ÿ¯i6ÿ¯i6ÿ¯h6ÿ¯h6ÿ¯h6ÿ¯h5ÿ®g5ÿ®g5ÿ®g5ÿ®f5ÿ­f5ÿ­e4ÿ­e4ÿ¬d4ÿ¬d4ÿ¬c3ÿ«b3ÿ«b3ÿªa2ÿª`2ÿ©_2ÿ©_1ÿ¨^1ÿ¨^2ÿÇ—{ÿàÆ·ÿÄ�tÿÊ�„ÿæÑÆÿѪ•ÿ®jGÿ¢U-ÿ¢T-ÿ¡S,ÿ R,ÿ¶z]ÿ¹~dÿžN*ÿ�M*ÿœL)ÿ›K)ÿ›I(ÿšH'ÿ™G'ÿ˜E&ÿ˜E&ÿ—E&ÿ—D&ÿ˜E%ÿ˜F%ÿ™E%ÿ—C$ÿ•@#ÿ“="ÿ‘:!ö”A#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰/�‹2ÿŽ7ÿ˜F/ÿµ{gÿ±r[ÿœK-ÿ™G&ÿšH&ÿšI'ÿšJ(ÿœK(ÿ›L)ÿ�M*ÿœN*ÿŒbOÿ­¬«ÿÞÞÞÿéééÿÒÒÒÿ­­­ÿQRRÿ#$#ÿPTRÿHLJÿ?BAÿ687ÿ-/.ÿ#%$ÿÿÿ)))ÿÄÄÄÿºººÿªªªÿ”””ÿkc\ÿ:#ÿK-ÿ`9ÿvG$ÿ‹T+ÿ›]/ÿ¥c4ÿ¬h5ÿ°j7ÿ°k7ÿ±k7ÿ°j7ÿ°j6ÿ°j6ÿ°j6ÿ°j6ÿ°i6ÿ°i6ÿ¯i6ÿ¯h6ÿ¯h5ÿ®g5ÿ®g5ÿ®f5ÿ­f4ÿ­e4ÿ­d4ÿ¬d4ÿ¬c3ÿ«b3ÿ«a3ÿªa2ÿª`2ÿ©_2ÿ¨^1ÿ¨]1ÿÀŠkÿßĵÿÆ”yÿ©a:ÿÆ—}ÿåÎÂÿÒ­™ÿ¯mKÿ¢T-ÿ¡S,ÿ±qRÿ¿‹rÿžO+ÿžN*ÿ�M*ÿœL)ÿ›J(ÿšI(ÿ™H'ÿ™F'ÿ˜E&ÿ˜E&ÿ—D&ÿ—D%ÿ—D&ÿ—D%ÿ—C$ÿ•A$ÿ“?"ÿ‘;"ÿ�: Žÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ-Š0ôŒ4ÿ–E.ÿ´yhÿ¡X?ÿ—C$ÿ˜E%ÿ™G&ÿšH'ÿšI(ÿ›J(ÿœK)ÿ�M*ÿŸO+ÿŸP+ÿžR+ÿ�bIÿ¨¦¤ÿÛÛÛÿèèèÿÕÕÕÿ°°°ÿ[[[ÿ ÿPTRÿILJÿ?CAÿ698ÿ-/.ÿ$&%ÿÿÿ<<<ÿÊÊÊÿ···ÿ¦¦¦ÿ���ÿ\QIÿ<$ÿM/ÿb<ÿyJ&ÿ�V,ÿ�_1ÿ¨f4ÿ®i6ÿ±k7ÿ±l7ÿ±l7ÿ±l7ÿ±l7ÿ±k7ÿ±k7ÿ±k7ÿ±k7ÿ°j6ÿ°j6ÿ°i6ÿ¯i6ÿ¯h6ÿ¯h5ÿ®g5ÿ®f5ÿ­f4ÿ­e4ÿ¬d4ÿ¬d4ÿ«c3ÿ«b3ÿªa2ÿª`2ÿ©_2ÿ¨^1ÿ¨]1ÿº\ÿÝÀ¯ÿËŸ†ÿ¦\2ÿ¨^6ÿÄ’wÿãË¿ÿÔ°žÿ±pPÿ­iGÿÆ—�ÿŸP+ÿžO+ÿžN*ÿ�L)ÿœK)ÿ›J(ÿšI(ÿ™G'ÿ˜F&ÿ—D&ÿ—D%ÿ–D&ÿ—C%ÿ—C$ÿ—B$ÿ–A#ÿ”?"ÿ’<"ÿ�9 ô—?#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰/‚‹1ÿ–C.ÿ°tcÿ�Q9ÿ•@#ÿ—C%ÿ˜E&ÿ™G'ÿ™H(ÿ›I(ÿ›K)ÿ�M*ÿžO*ÿŸQ+ÿ¡S,ÿ¡U-ÿ U-ÿ“aEÿ£Ÿ�ÿ×××ÿèèèÿ×××ÿ³³³ÿeeeÿÿOSQÿIMKÿ@CAÿ798ÿ-0.ÿ$&%ÿÿÿYYYÿËËËÿ´´´ÿ¤¤¤ÿŒŒŒÿOA6ÿ=%ÿN0ÿd=ÿ{K&ÿ�X-ÿŸb2ÿ©h5ÿ¯k7ÿ²m8ÿ²n8ÿ³m8ÿ²m8ÿ²m8ÿ²m7ÿ²l7ÿ±l7ÿ±l7ÿ±k7ÿ±k7ÿ°j6ÿ°j6ÿ°i6ÿ¯h6ÿ¯h5ÿ®g5ÿ®f5ÿ­f4ÿ­e4ÿ¬d4ÿ¬c3ÿ«b3ÿ«a3ÿªa2ÿ©`2ÿ©_1ÿ¨^1ÿ´vPÿÚº§ÿϧ�ÿ§]4ÿ¤X/ÿ¦[3ÿÀŒqÿáÈ»ÿÒ®›ÿЩ–ÿ Q+ÿŸP+ÿžO*ÿ�M*ÿœL)ÿ›K)ÿ›I(ÿšH'ÿ™G'ÿ˜E&ÿ—D&ÿ—C%ÿ–C%ÿ–B%ÿ–B$ÿ•A#ÿ”?#ÿ’="ÿ�:!ÿ�8!ƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ- ‰0ï‘=*ÿ­m]ÿšL6ÿ“>#ÿ•A$ÿ—C%ÿ˜F%ÿ™F'ÿšI'ÿ›J(ÿœL)ÿžN*ÿŸP+ÿ¡R,ÿ¢T-ÿ£V.ÿ£X.ÿ£Y.ÿ™aAÿž˜•ÿÓÓÓÿçççÿÚÚÚÿµµµÿoooÿÿNRPÿIMKÿ@CBÿ7:8ÿ.0/ÿ%&%ÿÿÿvvvÿËËËÿ°°°ÿ¤¤¤ÿ‰‰‰ÿE5)ÿ>'ÿP2ÿf? ÿ~M(ÿ‘Z.ÿ¡c3ÿ«i6ÿ°l8ÿ³n9ÿ³o9ÿ³o8ÿ³o8ÿ³n8ÿ³n8ÿ³m8ÿ²m8ÿ²m7ÿ²l7ÿ±l7ÿ±k7ÿ°j7ÿ°j6ÿ°i6ÿ¯h6ÿ¯h5ÿ®g5ÿ®f5ÿ­e4ÿ­d4ÿ¬d4ÿ«c3ÿ«b3ÿªa2ÿ©`2ÿ©_1ÿ¨^1ÿ°nEÿ×µ¡ÿÌ¡ˆÿ¦Z1ÿ¤X/ÿ¤W.ÿ¦[4ÿÊžˆÿñåàÿ·}`ÿŸQ+ÿŸP+ÿžN*ÿ�M*ÿœL)ÿ›J(ÿšI(ÿ™G'ÿ˜F'ÿ—E&ÿ–C%ÿ–C%ÿ–A%ÿ•B#ÿ•@$ÿ”?#ÿ’="ÿ�;"ÿ�8 ï‘= ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ.sŒ4 ÿ§eUÿ›M8ÿ‘;"ÿ”>#ÿ–B$ÿ—D&ÿ˜E&ÿšH'ÿšI(ÿœK)ÿ�N*ÿŸP+ÿ R,ÿ¢T-ÿ£V.ÿ¤X.ÿ¥Y/ÿ¥[0ÿ¦\0ÿœa>ÿš’�ÿÎÎÎÿçççÿÞÞÞÿ¸¸¸ÿxxxÿÿMQOÿJMLÿADBÿ7:9ÿ.0/ÿ%'&ÿÿÿ‘‘‘ÿÊÊÊÿ¬¬¬ÿ›››ÿ…„ƒÿ=,ÿ@(ÿR3ÿiB!ÿ€P(ÿ“\.ÿ¢e3ÿ¬k6ÿ±n8ÿ´p9ÿ³p9ÿ´p9ÿ´p9ÿ´o9ÿ´o9ÿ³o8ÿ³n8ÿ³n8ÿ²m8ÿ²l7ÿ±l7ÿ±k7ÿ±k7ÿ°j6ÿ°i6ÿ¯h6ÿ®g5ÿ®g5ÿ­f4ÿ­e4ÿ¬d4ÿ«c3ÿ«b3ÿªa2ÿª`2ÿ©_1ÿ¨^1ÿ±pHÿØ·£ÿÅ”xÿ¥Y/ÿ¤X/ÿ¤W.ÿ£V-ÿÙ¹©ÿÞõÿϨ•ÿ¥[8ÿžO+ÿžN*ÿ�L)ÿœK)ÿ›J(ÿšH(ÿ™G'ÿ˜E&ÿ—D&ÿ–B%ÿ–B$ÿ•@$ÿ•@$ÿ”?"ÿ“=#ÿ‘;"ÿ�9 ÿ�7!tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰/Ô¡YHÿ WEÿ�9 ÿ’="ÿ”?$ÿ–B%ÿ—D%ÿ™F&ÿšH'ÿ›J(ÿ�M*ÿžO+ÿ Q,ÿ¡S,ÿ£U-ÿ¤W.ÿ¥Y/ÿ¦[0ÿ¨]1ÿ¨_1ÿ©_2ÿ c;ÿ—Œ†ÿÉÉÉÿæææÿàààÿ»»»ÿ‚‚‚ÿÿKOMÿJNLÿADCÿ8;9ÿ/10ÿ%'&ÿÿÿ§§§ÿÉÉÉÿ©©©ÿ›››ÿƒ€ÿ8%ÿB)ÿT5ÿjC"ÿ�R)ÿ”^/ÿ£g4ÿ­l7ÿ²o9ÿ´q:ÿ´r:ÿµq:ÿµq9ÿ´p9ÿ´p9ÿ´p9ÿ´o9ÿ³n8ÿ³n8ÿ²m8ÿ²m7ÿ±l7ÿ±k7ÿ°j7ÿ°i6ÿ¯i6ÿ¯h5ÿ®g5ÿ®f5ÿ­e4ÿ¬d4ÿ¬c3ÿ«b3ÿªa2ÿª`2ÿ©_1ÿ¨^1ÿµwRÿØ·¤ÿ¾‡hÿ¥Y/ÿ¤X.ÿ£W.ÿѪ–ÿ«eAÿÆ–~ÿߏÿ¸}bÿžO*ÿ�M*ÿœL)ÿ›J(ÿšI(ÿ™H'ÿ˜F'ÿ—E&ÿ–C%ÿ•B%ÿ•A$ÿ”@#ÿ“?$ÿ’=#ÿ‘#ÿ”A$ÿ–D%ÿ˜E&ÿšH'ÿ›K)ÿ�M*ÿŸP+ÿ R,ÿ¢T-ÿ£V.ÿ¥X/ÿ¦[0ÿ§\0ÿ¨^1ÿª`2ÿ«b3ÿ¬c3ÿ¬e4ÿ­f5ÿ®oDÿ¢ž›ÿ¿¿¿ÿåååÿäääÿÂÂÂÿ’’’ÿÿGJIÿKOMÿBECÿ9;:ÿ/20ÿ&('ÿÿÿÆÆÆÿÅÅÅÿ£££ÿŒŒŒÿrmiÿ5"ÿD+ÿW8ÿlE#ÿƒT*ÿ•`0ÿ¥i5ÿ­o8ÿ³r:ÿ¶s;ÿ¶t;ÿ¶s:ÿ¶s:ÿ¶r:ÿµr:ÿµq:ÿµq9ÿ´p9ÿ´o9ÿ³o8ÿ³n8ÿ²m8ÿ²l7ÿ±k7ÿ°j7ÿ°i6ÿ¯h6ÿ®g5ÿ®f5ÿ­e4ÿ¬d4ÿ¬c3ÿ«b3ÿªa2ÿ©`2ÿ©_1ÿ¨]1ÿ¾‡fÿÕ±œÿ²rMÿ¥X/ÿÚº©ÿ¤X/ÿ¢T-ÿ¡S,ÿ¢U/ÿÁ�wÿݵÿ·|cÿœL)ÿ›K)ÿšI(ÿ™G'ÿ˜F'ÿ—D&ÿ–C%ÿ•A%ÿ”@$ÿ“?#ÿ’>"ÿ‘<"ÿ�9!ÿ�8 ÿŽ6 ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†+›M=î VFÿ�5ÿ�8 ÿ‘;"ÿ“>#ÿ•A$ÿ—D&ÿ™G'ÿ›I(ÿœL)ÿžO*ÿ Q+ÿ¡S,ÿ£V-ÿ¤X.ÿ¦Z/ÿ§\0ÿ¨^1ÿª`2ÿ«b3ÿ¬c3ÿ­e4ÿ®g5ÿ¯h6ÿÛ»¤ÿЭ’ÿ“pÿºººÿåååÿåååÿÅÅÅÿšššÿÿBFDÿKOMÿBEDÿ9<:ÿ021ÿ&('ÿÿ)))ÿÐÐÐÿÀÀÀÿ£££ÿ‹‹‹ÿe]Wÿ6#ÿC+ÿV8ÿlF#ÿ‚T*ÿ•`0ÿ¥j5ÿ®p9ÿ´s;ÿ¶t:ÿ¶u;ÿ·t;ÿ·t;ÿ¶s:ÿ¶s:ÿ¶r:ÿµq:ÿµq9ÿ´p9ÿ´o9ÿ³n8ÿ²m8ÿ²l7ÿ±l7ÿ±k7ÿ°i6ÿ¯i6ÿ¯h5ÿ®g5ÿ­e4ÿ¬d4ÿ¬c3ÿ«b3ÿªa2ÿ©`2ÿ¨^1ÿ¨]1ÿÂŽpÿÒ«•ÿ°mHÿÙº¨ÿ£W.ÿ¢U-ÿ¡T-ÿ¡R,ÿ Q+ÿ«fFÿ×¶§ÿÃ’|ÿœL*ÿ›J(ÿšH'ÿ™G'ÿ˜E&ÿ—D&ÿ–B%ÿ•@$ÿ“?#ÿ’=#ÿ‘<"ÿ�:!ÿ�8!ÿŽ7 ë�5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽ8(R¦aTÿŽ9&ÿŽ6ÿ�9!ÿ’<"ÿ”?$ÿ–B%ÿ˜E&ÿšH'ÿ›K)ÿ�M*ÿŸP+ÿ¡R,ÿ¢U-ÿ¤W.ÿ¥Y/ÿ§[0ÿ¨]1ÿ©`2ÿ«a3ÿ¬c3ÿ­e4ÿ®g5ÿ¯h6ÿÅ‘kÿêØÊÿ´r>ÿ°m7ÿ”{hÿ¶¶¶ÿãããÿåååÿÈÈÈÿ¦¦¦ÿÿ>A@ÿLONÿCFDÿ9<;ÿ021ÿ')(ÿÿ@@@ÿÖÖÖÿ»»»ÿ¢¢¢ÿ‰‰‰ÿWMEÿ6#ÿC,ÿV8ÿlF#ÿ‚T+ÿ•`0ÿ¤j5ÿ®p8ÿ´t:ÿ¶u;ÿ·v<ÿ·u;ÿ·u;ÿ·t;ÿ¶s:ÿ¶s:ÿµr:ÿµq9ÿ´p9ÿ´o9ÿ³o8ÿ³n8ÿ²m7ÿ±l7ÿ±k7ÿ°j6ÿ¯i6ÿ¯h5ÿ®g5ÿ­e4ÿ¬d4ÿ¬c3ÿ«b3ÿªa2ÿ©_2ÿ¨^1ÿ¨^3ÿÆ”xÿѪ“ÿÚº©ÿ¤W.ÿ£V.ÿ¢U-ÿ¡S,ÿ R,ÿŸP+ÿ¢W3ÿЪ™ÿÉ�Šÿ�M,ÿšI(ÿ™G'ÿ˜F&ÿ—D&ÿ–C%ÿ•A$ÿ”?$ÿ“>#ÿ’<"ÿ‘:!ÿ�9!ÿŽ7 ÿ�5Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›PA£ŸUEÿŒ3ÿŽ7 ÿ�:!ÿ’=#ÿ•@$ÿ–C%ÿ˜F'ÿšI(ÿœL)ÿžO*ÿ Q+ÿ¡T-ÿ£V.ÿ¥X/ÿ¦[0ÿ¨]1ÿ©_2ÿªa2ÿ¬c3ÿ­e4ÿ®g5ÿ¯h6ÿ²m:ÿìÛÏÿÂŒbÿ³n8ÿ³p9ÿ³p8ÿ•yaÿ³³³ÿàààÿçççÿÌÌÌÿ±±±ÿ###ÿ9<;ÿLPNÿCFEÿ:<;ÿ032ÿ')(ÿÿ\\\ÿØØØÿ···ÿ›››ÿˆˆˆÿND9ÿ6#ÿC,ÿU7ÿkF#ÿ€T*ÿ”`1ÿ£j6ÿ®p9ÿ²t:ÿµu;ÿ·v;ÿ·u<ÿ·u;ÿ¶u;ÿ·t;ÿ¶s:ÿ¶r:ÿµr:ÿµq9ÿ´p9ÿ³o8ÿ³n8ÿ²m8ÿ±l7ÿ±k7ÿ°j6ÿ¯i6ÿ¯h5ÿ®f5ÿ­e4ÿ¬d4ÿ«c3ÿ«a3ÿª`2ÿ©_1ÿ¨^1ÿ©_4ÿΣ‹ÿæÑÅÿ§]5ÿ£W.ÿ¢U-ÿ¢T-ÿ¡S,ÿ Q+ÿŸP+ÿ Q.ÿÉ�ŠÿΦ•ÿŸP0ÿ™H'ÿ˜F'ÿ—E&ÿ–C%ÿ•A%ÿ”@$ÿ“>#ÿ’<"ÿ‘;"ÿ�9!ÿ�7 ÿ�6˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£]Pà”B0ÿ�4ÿ�8 ÿ‘;"ÿ“>#ÿ•A%ÿ—D&ÿ™G'ÿ›J(ÿ�M*ÿŸP+ÿ¡S,ÿ¢U-ÿ¤X.ÿ¥Z/ÿ§\0ÿ¨^1ÿªa2ÿ«c3ÿ­e4ÿ®f5ÿ¯h6ÿ°j6ÿÌŸ}ÿáÆ²ÿ³o8ÿ´p9ÿµq:ÿµs:ÿµs:ÿ™x[ÿ¯¯®ÿÝÝÝÿçççÿÎÎÎÿ¹¹¹ÿ,,,ÿ465ÿMPNÿCGEÿ:=;ÿ132ÿ(*)ÿÿ}}}ÿÙÙÙÿ±±±ÿ›››ÿ……„ÿF;/ÿ6#ÿB,ÿU7ÿjE#ÿS*ÿ’_0ÿ¡i5ÿªo8ÿ°r:ÿ³t;ÿµt;ÿ¶u;ÿ¶u;ÿ·t;ÿ¶t;ÿ¶t;ÿµs:ÿµr:ÿµq9ÿ´p9ÿ´o9ÿ³n8ÿ²m8ÿ±l7ÿ±k7ÿ°j6ÿ¯h6ÿ®g5ÿ®f5ÿ­e4ÿ¬d4ÿ«b3ÿªa2ÿ©`2ÿ©_1ÿ¨]1ÿ¶xTÿäÍÁÿÄ“xÿ¤Y/ÿ£V.ÿ¢U-ÿ¡S,ÿ R,ÿŸP+ÿžO*ÿžN+ÿÁ�zÿÒ­žÿ¡U7ÿ™G'ÿ˜E&ÿ—D&ÿ–B%ÿ•@$ÿ“?#ÿ’=#ÿ‘;"ÿ�9!ÿ�8 ÿŽ6 Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤^S!¥aSÿ‹2 ÿ�5ÿ�8!ÿ’<"ÿ”?$ÿ–B%ÿ˜E&ÿšH(ÿœK)ÿžN*ÿ Q+ÿ¡T-ÿ£V.ÿ¥Y/ÿ¦[0ÿ¨^1ÿª`2ÿ«b3ÿ¬d4ÿ®f5ÿ¯h5ÿ°j6ÿ²o:ÿìÛÍÿÁ‰]ÿ´p9ÿµr:ÿ¶s:ÿ·t;ÿ·u;ÿ·u<ÿœwVÿ­¬«ÿÚÚÚÿçççÿÒÒÒÿÁÁÁÿ:::ÿ021ÿMQOÿDGEÿ:=<ÿ142ÿ')(ÿÿ˜˜˜ÿØØØÿ§§§ÿ”””ÿÿA4'ÿ5#ÿB,ÿS6ÿfD"ÿ{Q)ÿŒ\.ÿ™e3ÿ£j5ÿ¨o7ÿ­p9ÿ±r:ÿ²r:ÿ´t:ÿ´t:ÿ´s:ÿµs:ÿµr:ÿµq:ÿ´q9ÿ³p9ÿ³o9ÿ³n8ÿ²m8ÿ±l7ÿ±k7ÿ°i6ÿ¯h6ÿ®g5ÿ­f5ÿ­e4ÿ¬c3ÿ«b3ÿªa2ÿ©_2ÿ¨^1ÿ·zVÿÓ¯šÿË ˆÿ·{[ÿ¤W.ÿ¢U-ÿ¢T-ÿ¡R,ÿŸQ+ÿžO+ÿ�N*ÿœL)ÿ¹�iÿÔ²¤ÿ¤[>ÿ˜F&ÿ—D&ÿ–B%ÿ•A$ÿ”?$ÿ“=#ÿ‘<"ÿ�:!ÿ�8!ÿŽ7 ÿ�5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤_SkžTDÿ‹2ÿŽ6ÿ�9!ÿ’=#ÿ”@$ÿ—C%ÿ™G'ÿ›J(ÿ�M)ÿŸP+ÿ¡R,ÿ¢U-ÿ¤X.ÿ¦Z/ÿ§]0ÿ©_2ÿªa3ÿ¬d4ÿ­f4ÿ¯h5ÿ°i6ÿ±k7ÿÌŸ|ÿáDzÿ´p9ÿµr:ÿ¶s:ÿ·u;ÿ¸v<ÿ¹w<ÿ¹x=ÿ¹x=ÿ xQÿª¨¥ÿÖÖÖÿçççÿÕÕÕÿÅÅÅÿJKJÿ)*)ÿLPNÿDGFÿ;><ÿ243ÿ%'&ÿÿ°°°ÿÓÓÓÿ£££ÿ“““ÿ€ÿ;- ÿ5#ÿ@*ÿO5ÿ`@ ÿqK&ÿ€T*ÿ‹[.ÿ•b1ÿœf3ÿ¡i5ÿ¦l7ÿªn7ÿ­o8ÿ¯p9ÿ±p9ÿ±p9ÿ²p9ÿ²p9ÿ²o9ÿ²o8ÿ³n9ÿ²m8ÿ±m8ÿ°l7ÿ±k7ÿ°i6ÿ¯h6ÿ®g5ÿ­e4ÿ¬d4ÿ«c3ÿ«a3ÿª`2ÿ©_1ÿ»�_ÿΤŒÿ¶xTÿÊž…ÿ«d=ÿ£V.ÿ¢T-ÿ¡S,ÿ Q,ÿŸP+ÿžN*ÿ�M)ÿœK)ÿ±rXÿÕ³¦ÿ¨bHÿ—D&ÿ–C%ÿ•A$ÿ”?$ÿ“>#ÿ’<"ÿ‘:!ÿ�9!ÿŽ7 ÿ�5Zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢\P«˜I9ÿŒ3ÿŽ7 ÿ�:!ÿ“>#ÿ•A$ÿ—D&ÿ™H'ÿ›K)ÿ�N*ÿŸQ+ÿ¡T-ÿ£V.ÿ¥Y/ÿ§\0ÿ¨^1ÿª`2ÿ«c3ÿ­e4ÿ®g5ÿ°i6ÿ±k7ÿ³o;ÿëÚËÿ‹^ÿ¶r:ÿ·t;ÿ·u;ÿ¸v<ÿ¹x<ÿºy=ÿ»z=ÿ»{>ÿ»{>ÿ¦yMÿ¨¤ŸÿÑÑÑÿæææÿÙÙÙÿÉÉÉÿ^__ÿ#%$ÿLONÿDHFÿ;>=ÿ243ÿ#%$ÿÿÂÂÂÿÌÌÌÿžžžÿ���ÿ~}|ÿ6)ÿ3"ÿ<(ÿH0ÿT8ÿaA ÿnI%ÿwO'ÿ‚U+ÿ‰Z-ÿ�^/ÿ–b1ÿœe3ÿ g4ÿ£i5ÿ§k5ÿ©k7ÿ«l6ÿ­l7ÿ®m8ÿ®l7ÿ°l8ÿ¯l7ÿ°l7ÿ°k7ÿ¯j6ÿ¯i6ÿ¯h5ÿ®f5ÿ­e4ÿ¬d4ÿ«b3ÿªa2ÿ©`2ÿÀŠjÿËŸ…ÿ¦[0ÿÀ‹lÿÂ�tÿ¤X/ÿ¢U-ÿ¡T-ÿ R,ÿŸP+ÿžO*ÿ�M*ÿœL)ÿ›J(ÿªfKÿÔ²¤ÿ§`Eÿ–C%ÿ•A%ÿ”@$ÿ“>#ÿ’<"ÿ‘;"ÿ�9!ÿŽ7 ÿ�5›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£]QÞ“?/ÿŒ4ÿ�7 ÿ‘;"ÿ“>#ÿ–B%ÿ˜E&ÿšH(ÿœL)ÿžO*ÿ R,ÿ¢U-ÿ¤X.ÿ¦Z/ÿ§]1ÿ©_2ÿ«b3ÿ¬d4ÿ®g5ÿ¯i6ÿ±k7ÿ²m7ÿÌŸzÿáDZÿ¶r:ÿ·t;ÿ¸u;ÿ¹w<ÿ¹x<ÿºy=ÿ»z>ÿ¼|>ÿ½}?ÿ½~?ÿ½~?ÿªzKÿ¤ž—ÿËËËÿæææÿÜÜÜÿËËËÿtttÿ ÿJNLÿEHGÿ)ÿG/ÿP5ÿY;ÿbA!ÿjF#ÿrK&ÿzO(ÿ€T*ÿ‡X,ÿ�[.ÿ“^0ÿ—a0ÿ›c2ÿŸe3ÿ¡e3ÿ¤f5ÿ¦g5ÿ¨h4ÿ«i5ÿ¬i5ÿ®i6ÿ®i5ÿ®i6ÿ­g5ÿ­f5ÿ­e4ÿ¬c3ÿ«b3ÿª`2ÿËŸƒÿÂŽoÿ§\0ÿªa8ÿÆ•{ÿ¶xXÿ£V-ÿ¢T-ÿ¡S,ÿ Q+ÿŸO+ÿ�N*ÿœL)ÿ›J(ÿšI(ÿªgLÿѬžÿ�O3ÿ–B%ÿ•@$ÿ“?#ÿ’="ÿ‘;"ÿ�9!ÿ�7 ÿ�5Öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…(¥aTû�6#ÿŒ4ÿ�8 ÿ‘<"ÿ”?$ÿ–C%ÿ˜F'ÿ›I(ÿ�M)ÿŸP+ÿ¡S,ÿ£V.ÿ¥Y/ÿ§[0ÿ¨^1ÿªa2ÿ¬c3ÿ­f4ÿ¯h5ÿ°j6ÿ²l7ÿ´p;ÿëØÊÿÄŒ_ÿ·t;ÿ¸u;ÿ¹w<ÿºx=ÿ»z=ÿ»{>ÿ¼|>ÿ½}?ÿ¾~?ÿ¾@ÿ¿€@ÿ¾€@ÿ¯}Hÿ¡˜�ÿÅÅÅÿæææÿÞÞÞÿÎÎÎÿ†††ÿÿHKIÿEIGÿÿ¢U-ÿ¡S,ÿ Q,ÿŸP+ÿžN*ÿ�M)ÿœK)ÿšI(ÿ™G'ÿ¶{dÿÈ›‹ÿ—D(ÿ•@$ÿ“?#ÿ’=#ÿ‘;"ÿ�9!ÿ�8 ÿŽ6úŒ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)%¨eXÿ‹3 ÿ�5ÿ�8!ÿ’<"ÿ”@$ÿ—D&ÿ™G'ÿ›J(ÿ�N*ÿŸQ+ÿ¢T-ÿ¤W.ÿ¥Z/ÿ§]1ÿ©_2ÿ«b3ÿ­e4ÿ®g5ÿ°i6ÿ±l7ÿ³n8ÿÌŸyÿâDZÿ·t;ÿ¸u;ÿ¹w<ÿºx=ÿ»z=ÿ¼{>ÿ½}?ÿ½~?ÿ¾@ÿ¿€@ÿ¿�@ÿÀ‚AÿÀƒAÿÀ‚Aÿ´Gÿ¡•Šÿ¿¿¿ÿåååÿâââÿÐÐÐÿ™™™ÿÿEIGÿFIGÿÿ364ÿÿBBBÿÛÛÛÿ­­­ÿšššÿˆˆˆÿ{{zÿ;1&ÿ)ÿ,ÿ.ÿ1!ÿ3"ÿ7%ÿ;(ÿ@*ÿE-ÿJ1ÿO4ÿU7ÿ[;ÿ`>ÿfB!ÿlD#ÿrH$ÿyL&ÿ€P(ÿˆT+ÿ‘Y-ÿš^0ÿ¡b2ÿ§e4ÿ¬g5ÿ­g4ÿ­f5ÿ­e4ÿ¬c3ÿ­e7ÿã˼ÿ«c6ÿ¨]1ÿ§\0ÿ¦Z/ÿ»€aÿ¿‰lÿ£W/ÿ¡T-ÿ R,ÿŸP+ÿžO*ÿ�M*ÿœK)ÿ›I(ÿ™H'ÿ˜F'ÿÁ�}ÿ»…qÿ•A$ÿ”?$ÿ“=#ÿ‘;"ÿ�:!ÿ�8 ÿŽ6 ÿŒ4%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)L¨gZÿŒ3ÿ�5ÿ�9!ÿ’=#ÿ•A$ÿ—D&ÿ™H'ÿœK)ÿžO*ÿ R,ÿ¢U-ÿ¤X/ÿ¦[0ÿ¨^1ÿªa2ÿ¬c3ÿ®f5ÿ¯h6ÿ±k7ÿ²m8ÿµq<ÿëØÉÿÄ�_ÿ¸u;ÿ¹w<ÿºy=ÿ»z=ÿ¼|>ÿ½}?ÿ¾~?ÿ¿€@ÿ¿�@ÿÀ‚AÿÁƒAÿÁƒAÿ„BÿÂ…BÿÁ…Bÿ¹‚EÿŸ’ƒÿ¹¹¹ÿåååÿåååÿÔÔÔÿ©©©ÿÿADCÿFIHÿ=@>ÿ465ÿÿ^^^ÿØØØÿ¢¢¢ÿ˜˜˜ÿŠŠŠÿ{{{ÿb]Xÿ8,!ÿ)ÿ)ÿ+ÿ,ÿ.ÿ0 ÿ2!ÿ6#ÿ9%ÿ<'ÿ@*ÿD,ÿI/ÿN2ÿS5ÿY8ÿa=ÿkB"ÿwJ&ÿ…R*ÿ’Y-ÿ�_1ÿ¥c3ÿªe4ÿ¬f4ÿ¬e4ÿ¬d4ÿ·yQÿÛ½©ÿ©_2ÿ¨^1ÿ§\0ÿ¦[0ÿ¨^5ÿÀŠmÿ´uTÿ¢T-ÿ¡R,ÿŸQ+ÿžO+ÿ�M*ÿœL)ÿ›J(ÿšH'ÿ™F'ÿšJ,ÿÉž�ÿ­lUÿ”?$ÿ“=#ÿ’<"ÿ�:!ÿ�8 ÿŽ6 ÿ�4Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)s«k_ÿ‹3ÿ�6ÿ�:!ÿ“=#ÿ•A%ÿ˜E&ÿšI(ÿœL)ÿŸP+ÿ¡S,ÿ£V.ÿ¥Y/ÿ§\0ÿ©_2ÿ«b3ÿ­e4ÿ®g5ÿ°j6ÿ²l7ÿ³o8ÿÌžxÿâȱÿ·u;ÿ¹w<ÿºx=ÿ»z=ÿ¼|>ÿ½}?ÿ¾?ÿ¿€@ÿÀ�AÿÀ‚AÿÁƒAÿ„BÿÂ…BÿÆCÿÇCÿćCÿÇCÿ¼…Dÿ��~ÿ´´´ÿäääÿçççÿØØØÿ¶¶¶ÿÿ>@?ÿFJHÿ=@?ÿ475ÿÿ¿¿¿ÿ­­­ÿšššÿ–––ÿŒŒŒÿyyyÿwwwÿusrÿUNHÿ/"ÿ( ÿ(ÿ)ÿ*ÿ+ÿ,ÿ.ÿ0 ÿ2!ÿ5"ÿ8$ÿ;&ÿ@(ÿF,ÿO1ÿ[9ÿkB!ÿ|L'ÿŒV,ÿ›^0ÿ¤b2ÿªe3ÿ¬e4ÿ¬e4ÿÅ‘oÿЦŒÿª`2ÿ¨^1ÿ§]1ÿ¦[0ÿ¥Y/ÿ­iCÿ¿Šnÿ©b=ÿ¡S,ÿ Q+ÿŸO+ÿ�N*ÿœL)ÿ›J(ÿšH(ÿ™G'ÿ˜E&ÿŸR7ÿË£•ÿ¡W>ÿ“>#ÿ’<"ÿ�:!ÿ�8 ÿŽ6 ÿ�4sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)š¬naÿŒ4 ÿŽ6 ÿ�:!ÿ“>#ÿ–B%ÿ˜F&ÿ›I(ÿ�M*ÿŸP+ÿ¡T-ÿ¤W.ÿ¦Z/ÿ¨]1ÿª`2ÿ¬c3ÿ­f5ÿ¯i6ÿ±k7ÿ³m8ÿ´q:ÿê×ÇÿÅŽ`ÿ¸v<ÿºx=ÿ»z=ÿ¼|>ÿ½~?ÿ¾@ÿ¿€@ÿÀ‚AÿÁƒAÿ„BÿÂ…BÿÆCÿÇCÿĈCÿĈDÿʼnDÿÅŠDÿĉDÿÁˆFÿžŽ{ÿ°°°ÿäääÿèèèÿÛÛÛÿÂÂÂÿ$$$ÿ9<;ÿGJHÿ>A?ÿÿÖÖÖÿ³³³ÿ™™™ÿ˜˜˜ÿ–––ÿ���ÿ‰‰‰ÿzzzÿuuuÿsssÿtsrÿea\ÿH@7ÿ,!ÿ' ÿ( ÿ( ÿ) ÿ*ÿ*ÿ,ÿ-ÿ/ÿ4!ÿ:$ÿC*ÿR3ÿd=ÿwI%ÿŠT+ÿ™\/ÿ£a2ÿ©d4ÿ¬d4ÿЩŽÿÃ�nÿª`2ÿ©_1ÿ¨]1ÿ§\0ÿ¦Z/ÿ¤X/ÿ´wUÿº€bÿ¢U.ÿ Q,ÿŸP+ÿžN*ÿœL)ÿ›K)ÿšI(ÿ™G'ÿ˜E&ÿ—C%ÿ¦`HÿÈ��ÿ˜G.ÿ’<"ÿ�:!ÿ�8!ÿŽ6 ÿ�4šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)µ©i\ÿ’>+ÿŽ6 ÿ‘;"ÿ“?#ÿ–B%ÿ˜F'ÿ›J(ÿ�N*ÿ Q+ÿ¢U-ÿ¤X.ÿ¦[0ÿ¨^1ÿªa3ÿ¬d4ÿ®g5ÿ°j6ÿ²l7ÿ³o8ÿÅ�eÿå̸ÿ¸v<ÿ¹x<ÿ»z=ÿ¼|>ÿ½~?ÿ¾@ÿ¿�@ÿÀ‚AÿÁƒAÿÂ…BÿÆCÿÇCÿĈCÿʼnDÿʼnDÿÅŠDÿÆ‹EÿÆ‹EÿÆŒEÿÆ‹EÿÊFÿ�Œxÿ®®®ÿäääÿéééÿßßßÿÊÊÊÿ...ÿ+-,ÿ(*)ÿAAAÿÚÚÚÿ   ÿ˜˜˜ÿ˜˜˜ÿ———ÿ–––ÿ•••ÿ���ÿ‰‰‰ÿƒƒƒÿzzzÿtttÿpppÿpppÿqpoÿedbÿSNHÿ9.%ÿ& ÿ' ÿ' ÿ' ÿ( ÿ* ÿ.ÿ4!ÿ>'ÿM0ÿa;ÿwH%ÿŠS+ÿ›]0ÿ¤a2ÿ©d4ÿÝÁ¯ÿ·yOÿªa2ÿ©_2ÿ¨^1ÿ§\0ÿ¦[0ÿ¥Y/ÿ¦Z2ÿ¹€bÿ¬iGÿ R,ÿŸP+ÿžN*ÿ�M)ÿœK)ÿšI(ÿ™G'ÿ˜E&ÿ—D&ÿ•B%ÿ±t_ÿ»…tÿ’<"ÿ‘:!ÿ�8!ÿŽ7 ÿ�5µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)Ã¥aTÿ˜H7ÿŽ7 ÿ‘;"ÿ”?#ÿ–C%ÿ™G'ÿ›K)ÿžN*ÿ R,ÿ£U-ÿ¥Y/ÿ§\0ÿ©_2ÿ«c3ÿ­e4ÿ¯h6ÿ±k7ÿ³n8ÿ´p9ÿÛº�ÿФ~ÿ¹w<ÿºy=ÿ¼{>ÿ½}?ÿ¾@ÿ¿�@ÿÀ‚AÿÁ„BÿÂ…BÿÆCÿćCÿĈDÿÅŠDÿÆŠEÿÆ‹EÿÇŒEÿÇŒEÿÇ�FÿÈ�FÿÈŽFÿÇ�FÿÅ�FÿŸŒvÿ¬¬¬ÿãããÿéééÿãããÿÓÓÓÿ………ÿ‰‰‰ÿÙÙÙÿÐÐÐÿ˜˜˜ÿ˜˜˜ÿ———ÿ———ÿppoÿAA?ÿ�€ÿœœœÿ’’’ÿ���ÿŽŽŽÿ‡‡‡ÿ~~~ÿqqqÿlllÿkkkÿkkkÿiiiÿggfÿ_\ZÿNHCÿ5* ÿ& ÿ' ÿ+ÿ2ÿ=&ÿM/ÿb<ÿyI&ÿŽU,ÿ�]0ÿ©g9ÿãÏÀÿ¬e5ÿ«a3ÿª`2ÿ¨^1ÿ§]0ÿ¦[0ÿ¥Y/ÿ¤W.ÿ®kGÿ·{]ÿ¡T.ÿŸP+ÿžO*ÿ�M*ÿœK)ÿ›I(ÿ™G'ÿ˜F&ÿ—D&ÿ–B%ÿ–C'ÿƘŠÿ�P9ÿ‘:!ÿ�8!ÿŽ7 ÿ�5Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)СZLÿžUCÿŽ7 ÿ‘;"ÿ”?$ÿ—C%ÿ™G'ÿœK)ÿžO+ÿ¡S,ÿ£V.ÿ¥Z/ÿ¨]1ÿª`2ÿ¬d4ÿ®g5ÿ°i6ÿ²l7ÿ´o9ÿ·u>ÿíÜÎÿ¾�Jÿºy=ÿ»{>ÿ½}?ÿ¾@ÿ¿�@ÿÀ‚AÿÁ„BÿÂ…BÿÇCÿĈDÿʼnDÿÆŠDÿÆ‹EÿÇŒEÿÇ�FÿÈŽFÿÈŽFÿÈ�FÿÉ�GÿÉ�GÿÉ�GÿÈ�GÿÇ�Gÿ©•{ÿªªªÿâââÿèèèÿèèèÿçççÿèèèÿøøøÿÿÿÿÿÇÇÇÿ———ÿ———ÿ–––ÿ..,ÿÿ**'ÿ/.*ÿsrpÿ¥¤¤ÿ£££ÿ‘‘‘ÿ���ÿ~€ÿz{zÿtutÿoppÿlmmÿjjjÿhihÿiiiÿghhÿdddÿXVTÿ/$ÿ+ÿ1ÿ=&ÿP1ÿg? ÿ~L'ÿ’X-ÿ­xSÿÕ¸¤ÿªc3ÿªb3ÿª`2ÿ©_1ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤X.ÿ¤X1ÿ¶xYÿ«eBÿŸQ+ÿžO*ÿ�M*ÿœK)ÿ›I(ÿ™H'ÿ˜F&ÿ—D&ÿ–B%ÿ”@$ÿªgRÿ¹�qÿ‘:!ÿ�8!ÿŽ7 ÿ�5Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)Þ˜J:ÿ©hYÿŽ7 ÿ‘;"ÿ”@$ÿ—D&ÿ™H'ÿœL)ÿŸP+ÿ¡S,ÿ¤W.ÿ¦[0ÿ¨^1ÿªa3ÿ­e4ÿ¯h5ÿ±k7ÿ³m8ÿ´p9ÿÉ—mÿáÆ­ÿ¹x<ÿ»z=ÿ¼|>ÿ¾~?ÿ¿€@ÿÀ‚AÿÁ„Bÿ†BÿÇCÿĈDÿÅŠDÿÆ‹EÿÇŒEÿÇ�FÿÈŽFÿÈ�FÿÉ�GÿÉ�GÿÊ�GÿÊ‘GÿÊ‘GÿÊ‘HÿÊ’HÿÉ‘HÿÈ‘Hÿ¬—zÿ§§§ÿâââÿèèèÿîîîÿõõõÿûûûÿÿÿÿÿÿÿÿÿËËËÿ–––ÿ~}}ÿ ÿ786ÿmrpÿ–š˜ÿz|yÿKIFÿTSPÿ˜—–ÿ»»»ÿ¢¢¢ÿ‰‹Šÿƒ„„ÿÿyzzÿuvuÿpqqÿklkÿfggÿfffÿ`a`ÿYYXÿA:4ÿ,ÿ3ÿA(ÿV4ÿnB"ÿ†P)ÿ°ˆlÿÄž„ÿ©b3ÿªb3ÿªa2ÿ©_2ÿ¨]1ÿ§\0ÿ¥Z/ÿ¤X/ÿ£V.ÿ«fBÿ³tTÿ¡S-ÿžO+ÿ�M*ÿœK)ÿ›J(ÿ™H'ÿ˜F&ÿ—D&ÿ–B%ÿ”@$ÿ”A&ÿ‘ƒÿœN8ÿ�8!ÿŽ7 ÿ�5Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)ë‹4"ÿ¶rÿ�9"ÿ‘;"ÿ”@$ÿ—D&ÿšH'ÿœL)ÿŸP+ÿ¢T-ÿ¤X.ÿ§[0ÿ©_1ÿ«b3ÿ­e4ÿ¯i6ÿ±l7ÿ³o8ÿµr:ÿÞ¿¤ÿΠwÿºy=ÿ¼|>ÿ½~?ÿ¿€@ÿÀ‚AÿÁ„Bÿ†BÿćCÿʼnDÿÆŠDÿÆ‹EÿÇ�FÿÈŽFÿÉ�FÿÉ�GÿÊ�GÿÊ‘GÿÊ’HÿË’HÿË’HÿË“HÿË“HÿË“HÿË“HÿÊ’HÿÉ‘Gÿ¬–wÿ¥¥¥ÿáááÿèèèÿîîîÿôôôÿûûûÿÿÿÿÿÿÿÿÿÎÎÎÿBBBÿ ÿEIFÿqvtÿÎÐÏÿÎÑÐÿ­±°ÿ®²°ÿrsqÿ.-*ÿppnÿÈÈÈÿ¼¼¼ÿ‰‹Šÿ„†…ÿ€�€ÿ{|{ÿuwvÿpqpÿlmmÿcccÿ€�€ÿ^^^ÿOKGÿ.ÿ6"ÿG,ÿ^9ÿwH%ÿµ��ÿ®|Zÿ§a2ÿ©b2ÿ©a2ÿ©_2ÿ¨^1ÿ§\0ÿ¦Z/ÿ¥X/ÿ£W.ÿ£W/ÿ±pPÿ¨`>ÿŸO+ÿ�M*ÿœL)ÿ›J(ÿšH'ÿ˜F'ÿ—D&ÿ–B%ÿ•@$ÿ“>#ÿ§bMÿ¶}mÿ�8!ÿŽ7 ÿ�4ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)ùˆ.ÿ±ugÿšL8ÿ‘<"ÿ”@$ÿ—D&ÿšH(ÿ�M)ÿŸQ+ÿ¢T-ÿ¤X/ÿ§\0ÿ©`2ÿ¬c3ÿ®g5ÿ°j6ÿ²m8ÿ´p9ÿ¹yBÿíÜÌÿ½Fÿ»{>ÿ½}?ÿ¾@ÿÀ‚AÿÁƒAÿÂ…BÿćCÿʼnDÿÆŠEÿÇŒEÿÈ�FÿÈŽFÿÉ�GÿÊ�GÿÊ‘HÿË’HÿË“HÿÌ“HÿÌ”IÿÌ”IÿÌ”IÿÌ•IÿÌ•IÿÍ•IÿÌ•IÿË”IÿÇ‘Gÿª“sÿ£££ÿØÙØÿäääÿíííÿôôôÿúúúÿÿÿÿÿßßßÿÿÿuyvÿ’˜–ÿ¾ÄÂÿôõôÿÉÎÍÿ°µ²ÿœ�œÿFIGÿ,,+ÿÎÎÎÿº»»ÿ”–•ÿ�‘�ÿŠŒ‹ÿ…‡†ÿ€�€ÿz|{ÿ~~ÿwxwÿ£££ÿŒ�ŒÿcccÿPLHÿ0ÿ<%ÿO0ÿnH,ÿ­ž“ÿ—[0ÿ£_1ÿ©a2ÿªa3ÿ©`2ÿ¨^1ÿ§\0ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¨`<ÿ®kLÿ P-ÿ�N*ÿœL)ÿ›J(ÿšH'ÿ˜F'ÿ—D&ÿ–B%ÿ•@$ÿ“>#ÿ“>$ÿ¾‹|ÿšL7ÿŽ6 ÿ�4ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)ùˆ-ÿ£]MÿªiWÿ‘;"ÿ”@$ÿ—D&ÿšI(ÿ�M*ÿ Q+ÿ¢U-ÿ¥Y/ÿ§]0ÿª`2ÿ¬d4ÿ®g5ÿ±k7ÿ³n8ÿµq9ÿÌ�uÿßÀ¥ÿºz=ÿ¼|>ÿ¾~?ÿ¿�@ÿÁƒAÿÂ…BÿÇCÿʼnDÿÆŠEÿÇŒEÿÈŽFÿÉ�FÿÉ�GÿÊ‘HÿË’HÿË“HÿÌ”IÿÌ”IÿÍ•IÿÍ•IÿÍ–JÿÍ–JÿΖJÿΖJÿΖJÿΖJÿÍ•JÿË”IÿÅ�Fÿ£’|ÿ½½½ÿ¿ÁÀÿçççÿíííÿôôôÿúúúÿ{{zÿ!" ÿILJÿˆŒŠÿ¾ÂÀÿÔ×Öÿîðïÿ·¾»ÿ‹�Žÿ!!ÿÿ^]\ÿÚÚÚÿ§¨¨ÿŸ Ÿÿš››ÿ•––ÿ�‘�ÿŠŒ‹ÿ„†…ÿ‰Œ‹ÿ—˜˜ÿ¬¬¬ÿ���ÿ‹ŒŒÿhhhÿRMHÿ5!ÿD*ÿkTCÿ�vcÿŽT+ÿž\0ÿ§a2ÿªa3ÿ©`2ÿ¨^1ÿ§\0ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¢T.ÿ­hHÿ¦\:ÿ�N*ÿœL)ÿ›J(ÿšH'ÿ˜F'ÿ—E'ÿ–B%ÿ”@$ÿ“>#ÿ’<"ÿ¤^Iÿ³xhÿŽ6 ÿ�4ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…(ëˆ-ÿ�9&ÿ¼‰{ÿ–C,ÿ”@$ÿ—D&ÿšI(ÿ�M*ÿ Q,ÿ£U-ÿ¥Y/ÿ¨]1ÿªa2ÿ­e4ÿ¯h6ÿ±l7ÿ³o8ÿ¶r:ÿàêÿËœoÿ»{>ÿ½}?ÿ¿€@ÿÀ‚Aÿ„BÿÇCÿĈDÿÆŠEÿÇŒEÿÈŽFÿÉ�GÿÊ�GÿË’HÿË“HÿÌ”IÿÌ•IÿÍ–IÿÍ–JÿΗJÿΗJÿΗJÿϘJÿϘJÿϘJÿϘJÿϘJÿϘJÿÌ–IÿÈ“Hÿ·ŽTÿœœœÿ½¿¾ÿÏÐÐÿæææÿíííÿíííÿ.,)ÿÿ^baÿ“—•ÿÐÕÒÿÁÄÃÿ¬°®ÿÇËÊÿŒ��ÿÿ ÿ³³³ÿÊËÊÿ­¯®ÿ©«ªÿ¤¦¥ÿŸ¡ ÿšœ›ÿ”–•ÿ’“’ÿŒŽŽÿ¸¸¸ÿ¶¶¶ÿ¦¦¦ÿ———ÿ†‡‡ÿijjÿJ@8ÿ=&ÿi^UÿvS9ÿ…O)ÿ™Z.ÿ¤_2ÿ¨`2ÿ©`2ÿ©_1ÿ§]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿ¥[8ÿªdDÿžO+ÿœL)ÿ›J(ÿšI(ÿœM/ÿ�N2ÿ–C&ÿ”@$ÿ“>#ÿ’<"ÿ‘<#ÿº„uÿ—F2ÿŒ4ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„(Þˆ-ÿ‹1ÿªhWÿ®n\ÿ”@$ÿ—D&ÿšI(ÿ�M*ÿ R,ÿ£V.ÿ¥Z/ÿ¨^1ÿ«b3ÿ­e4ÿ°i6ÿ²l7ÿ´p9ÿ»}GÿìÚÊÿ¼}Cÿ¼|>ÿ¾?ÿÀ�@ÿÁ„BÿÆCÿĈDÿÅŠDÿÇŒEÿÈŽFÿÉ�GÿÊ‘GÿË’HÿÌ“HÿÌ”IÿÍ–IÿΖJÿΗJÿϘJÿϘKÿÏ™KÿÏ™KÿЙKÿКKÿКKÿКKÿКKÿЙKÿΘKÿÌ—JÿÄ�GÿŸ‘ÿ¾¾¾ÿ£¦¥ÿÞÞÞÿæææÿ¦¥£ÿ*($ÿ+*(ÿ„‰‡ÿŸ¥¢ÿÏÓÑÿôõôÿ¾ÄÁÿ¢¦¤ÿ`a`ÿ8:9ÿ===ÿÝÝÝÿÀÂÁÿ¸º¹ÿ´¶µÿ¯±°ÿª««ÿ¤¦¥ÿŸ¡ ÿ¤¦¤ÿŽ��ÿº»»ÿ¿¿¿ÿ°°°ÿ   ÿ‘‘‘ÿ„……ÿgffÿE3&ÿcZSÿc;ÿ~K&ÿ”W-ÿ¡^1ÿ§`2ÿ©`2ÿ©_1ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡T-ÿ S-ÿ¨`>ÿ¢W5ÿœL)ÿœL+ÿ£Y:ÿ´ybÿ¥]Cÿ–C&ÿ”@$ÿ“>#ÿ’<"ÿ�:!ÿ©fSÿ¥_MÿŒ4Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„'Ї,ÿŠ1ÿ’>(ÿÁ‘ƒÿ™I/ÿ—D&ÿšI(ÿ�M*ÿ R,ÿ£V.ÿ¦Z/ÿ¨^1ÿ«b3ÿ®f5ÿ°j6ÿ²m8ÿµq9ÿÏ¢{ÿܺ�ÿ»z=ÿ½}?ÿ¿€@ÿÀƒAÿÂ…BÿćCÿÅŠDÿÆŒEÿÈŽFÿÉ�GÿÊ‘GÿË’HÿÌ”IÿÍ•IÿΖJÿΗJÿϘKÿÏ™KÿКKÿКKÿЛLÿÑ›LÿÑ›LÿÑ›LÿÑ›LÿÑ›LÿÑ›LÿÑ›LÿÏšLÿΘJÿÉ•Hÿ±�Yÿœœœÿ²´³ÿ·¹¸ÿßßßÿXVRÿ==9ÿSXUÿŠ�ŒÿÌÐÎÿÜßÞÿÜßÞÿ©°­ÿptrÿÿÿŽŽŽÿÓÔÔÿÃÅÄÿÂÄÃÿ¾À¿ÿº»»ÿ´¶µÿ¯±°ÿ¥§¦ÿ±³²ÿ‹�Œÿ¸¹¹ÿÈÈÈÿ¹¹¹ÿªªªÿšššÿ‹‹‹ÿxxxÿc_\ÿ[J=ÿa:ÿyH%ÿ‘U,ÿŸ\0ÿ¦`2ÿ©`2ÿ¨_1ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ£U-ÿ¡T-ÿ R,ÿ¢V3ÿ¤[:ÿžO,ÿ«fJÿ»…oÿ½ˆsÿ©dKÿ—C'ÿ”@$ÿ“>#ÿ’<"ÿ�:!ÿ›M8ÿ±ueÿŒ4Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ&Ç+ÿŠ0ÿ�5ÿ®o\ÿ²uaÿ—D&ÿšI(ÿ�M*ÿ R,ÿ£V.ÿ¦[0ÿ©_1ÿ«c3ÿ®g5ÿ°j7ÿ³n8ÿµr:ÿߨÿʘkÿ¼{>ÿ¾~?ÿÀ�@ÿÁ„BÿÆCÿʼnDÿÆ‹EÿÈ�FÿÉ�GÿÊ‘GÿË“HÿÌ”IÿÍ–IÿΗJÿϘJÿÏ™KÿКKÿЛLÿÑ›LÿÑœLÿÑœLÿÒœLÿÒ�MÿÒ�MÿÒ�MÿÒ�MÿÒ�MÿÒœLÿÑœLÿÏ›KÿË—JÿÁ�Fÿ™�ƒÿ½½½ÿ�”“ÿÕÕÕÿ‘�ŽÿMKFÿegdÿ˜ž›ÿ×ÛÚÿ¹¼ºÿ¬¯®ÿÈËÊÿhjgÿÿÿØØØÿËÍÌÿÇÈÈÿÅÇÆÿÄÆÅÿÂÄÃÿ¿ÁÀÿ¹»ºÿ¨©¨ÿ­¯®ÿˆŠ‰ÿµ¶¶ÿÑÑÑÿÂÂÂÿ³³³ÿ¤¤¤ÿ”””ÿ‡‡‡ÿmmmÿcQCÿe=ÿ{I&ÿ�U,ÿŸ]0ÿ¦`1ÿ©`2ÿ¨_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ£U-ÿ¡T-ÿ Q,ÿ R-ÿ¥]<ÿ´w\ÿÀ�wÿÁ�{ÿÀ�{ÿ­kSÿ–C'ÿ”@$ÿ“=#ÿ‘<"ÿ�9!ÿ�9"ÿ·qÿ�:&Åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ%µ†+ÿŠ0ÿ�5ÿ”B*ÿÆ™ŠÿœN1ÿšI(ÿ�M*ÿ R,ÿ£V.ÿ¦[0ÿ©_2ÿ¬c3ÿ®g5ÿ±k7ÿ³o8ÿ¶r:ÿêÖÅÿ¾‚Iÿ¼}?ÿ¾@ÿÀ‚AÿÂ…BÿĈCÿÆŠDÿÇŒEÿÈ�FÿÊ‘GÿË“HÿÌ”IÿÍ–IÿΗJÿϘKÿКKÿÑ›LÿÑœLÿÒœLÿÒ�MÿÒžMÿÓžMÿÓžMÿÓžMÿÓŸMÿÓŸMÿÓžMÿÓžMÿÓžMÿÒžMÿÑœMÿΚKÿÆ“Hÿ©‹`ÿ   ÿœ žÿ¶¸·ÿ×××ÿÝÞÞÿ¶µ´ÿqqlÿrqnÿ­¯­ÿ­²¯ÿ£¦¤ÿbcaÿIKJÿ{zyÿØÙÙÿËÍÌÿÊÌËÿÉÊÊÿÇÉÈÿÆÇÆÿÄÆÅÿÂÄÃÿ¨ª©ÿ¨ª©ÿ„‡†ÿ°±°ÿÛÛÛÿËËËÿ¼¼¼ÿ­­­ÿžžžÿŽŽŽÿ~€€ÿogaÿsE$ÿƒN(ÿ“W-ÿ ]0ÿ¦`2ÿ©`2ÿ¨_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿ¡R.ÿ¥[9ÿ¼†nÿÅ•‚ÿÅ•�ÿÄ•‚ÿÄ•ƒÿ°qZÿ–C(ÿ”?$ÿ“=#ÿ‘;"ÿ�9!ÿŽ7 ÿ¬k[ÿžRA½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚$š†*ÿ‰/ÿ�4ÿ�9!ÿ±uaÿ¶{fÿšH(ÿ�M*ÿ R,ÿ£V.ÿ¦[0ÿ©_2ÿ¬c3ÿ¯h5ÿ±l7ÿ´o9ÿ¾‚OÿçѼÿ½~Cÿ¿€DÿÀ�BÿÁ„BÿÆCÿʼnDÿÆŒEÿÈŽFÿÉ�GÿË’HÿÌ”IÿÍ–JÿΗJÿÏ™KÿКKÿÑ›LÿÒœLÿÒ�MÿÓžMÿÓŸMÿÔŸNÿÔ NÿÔ NÿÔ NÿÔ NÿÔ NÿÔ NÿÔ NÿÔŸNÿÓŸNÿÒžMÿÑœLÿʘJÿ¹�Kÿ””“ÿ¯±°ÿšž�ÿÐÐÐÿ×××ÿÝÝÝÿåååÿר×ÿ’‘ŽÿTRNÿGGBÿ.,'ÿ0.)ÿÐÑÐÿÔÕÕÿÏÐÏÿÍÏÎÿÌÎÍÿÊÌËÿÉËÊÿÇÉÈÿ¶¸·ÿ¥§¦ÿ¤¦¥ÿ�ƒ‚ÿ§©©ÿäääÿÕÕÕÿÆÆÆÿ¶¶¶ÿ§§§ÿ˜˜˜ÿˆ‰ˆÿtttÿƒX8ÿ�V,ÿ›\/ÿ¤_1ÿ¨a2ÿ©`2ÿ¨_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡T-ÿªcBÿÂ�yÿÇ™…ÿÈœ‰ÿÈ›‰ÿÈ›ŠÿÈ›Šÿ´ycÿ–C'ÿ”?$ÿ’=#ÿ‘;"ÿ�9!ÿŽ7 ÿ¤]Lÿ§dTªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�#s…)ÿˆ.ÿŒ3ÿ�9!ÿ˜F,ÿÊ ‘ÿ¢V7ÿ�M*ÿ R,ÿ£V.ÿ¦[0ÿ©_2ÿ¬d4ÿ¯h5ÿ²l7ÿ¶s>ÿÍŸwÿݾ¡ÿ¿‚HÿÁƒGÿÂ…FÿÇEÿĈDÿÆŠEÿÇ�FÿÉ�GÿÊ’HÿÌ”IÿÍ–IÿΗJÿÏ™KÿЛLÿÑœLÿÒ�MÿÓžMÿÓŸNÿÔ NÿÔ NÿÕ¡NÿÕ¡OÿÕ¢OÿÕ¢OÿÕ¢OÿÕ¢OÿÕ¢OÿÕ¡OÿÕ¡NÿÔ NÿÔ NÿÒžMÿÌšKÿ‘Gÿ˜Žÿ²²²ÿ›Ÿ�ÿ¸º¹ÿÏÏÏÿÖÖÖÿÝÝÝÿäääÿêëëÿéëëÿ¸¸·ÿmmiÿrrnÿãååÿÓÔÔÿÒÓÓÿÑÒÑÿÏÑÐÿÎÏÏÿÌÎÍÿÊÌËÿ©«ªÿ ¢¡ÿ ¢¡ÿ~�ÿŸ¡ ÿíííÿÞÞÞÿÏÏÏÿÀÀÀÿ°°°ÿ¡¡¡ÿ’’’ÿƒ�~ÿ„jWÿ�^0ÿ¢`1ÿ¨b2ÿ©b2ÿ©a2ÿ©_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡T-ÿ­iHÿÉœˆÿË �ÿË¡�ÿË¢‘ÿË¢’ÿË¢’ÿ¹�mÿ—D'ÿ“?#ÿ’="ÿ‘;"ÿ�8!ÿŽ6 ÿ�Q?ÿ´{n�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€"L„'ÿˆ-ÿ‹2ÿ�8 ÿ’=#ÿ­kUÿÈ›Šÿ Q.ÿ Q,ÿ£V.ÿ¦[0ÿ©_2ÿ¬d4ÿ¯i7ÿ·vDÿ¼MÿÙ´–ÿÕ¬‡ÿÀ…Kÿ†JÿÈIÿÅŠHÿÆ‹HÿÆ�FÿÈŽFÿÊ‘GÿË“HÿÍ•IÿΗJÿÏ™KÿÑ›LÿÑœLÿÒžMÿÓŸMÿÔ NÿÔ¡NÿÕ¢OÿÕ¢OÿÖ£OÿÖ£OÿÖ£OÿÖ£PÿÖ£PÿÖ£OÿÖ£OÿÖ£OÿÖ¢OÿÕ¢OÿÕ¢OÿÓ MÿÏœLÿÆ”Iÿ£ŒgÿŸŸŸÿ§ª©ÿ¨¬ªÿÈÈÈÿÏÏÏÿÕÕÕÿÝÝÝÿãããÿæææÿàâáÿêëëÿêììÿÝÞÝÿÖØ×ÿÕ×ÖÿÔÕÕÿÓÔÓÿÑÓÒÿÏÑÐÿÇÈÇÿ›�œÿ›�œÿ›�œÿ{}|ÿ“‰~ÿר×ÿçççÿØØØÿÉÉÉÿºººÿªªªÿ›››ÿ‹Šˆÿxtpÿ¦e5ÿ©d3ÿªc3ÿªb3ÿªa2ÿ©_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿ¢T/ÿÀŒtÿΦ”ÿϧ—ÿϨ˜ÿϨ™ÿΨšÿ¾Šwÿ—C'ÿ“>#ÿ’<"ÿ�:!ÿ�8 ÿŽ6ÿ–F3ÿÆš�vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ %ƒ&ÿ‡,ÿ‹1ÿŽ7 ÿ’<"ÿ•A%ÿ¼…pÿÁ�zÿŸQ+ÿ£V.ÿ¦[0ÿ©_2ÿ®g8ÿ¸yMÿ¼€Qÿ¾‚PÿâȱÿË›nÿ‡NÿĉMÿÅŠLÿÆ�LÿÇŽKÿÈ�JÿÊ�IÿË’HÿÌ”IÿΗJÿÏ™KÿЛLÿÒœLÿÓžMÿÔŸNÿÔ NÿÕ¢OÿÖ¢OÿÖ£OÿפPÿפPÿ×¥Pÿ×¥Pÿ×¥Pÿ×¥Pÿ×¥Pÿ×¥PÿפPÿפPÿÖ£PÿÖ£OÿÔ¡OÿÒŸNÿÉ™Jÿ±ŒRÿ“““ÿ¯°¯ÿª®¬ÿ»¼¼ÿÇÇÇÿÎÎÎÿÕÕÕÿÜÜÜÿÞÞÞÿÜÝÜÿÝÞÝÿáããÿÛÜÛÿÚÛÚÿÙÚÙÿ×ÙØÿÖ××ÿÔÖÕÿÓÔÓÿ³´´ÿ—™˜ÿ—™˜ÿ••�ÿ¬‚Xÿ¼|>ÿ¶|Dÿ¬”{ÿÀ¿½ÿÐÐÐÿÃÃÃÿ´´´ÿ¤¤¤ÿ•••ÿ~{xÿœlIÿ¬f4ÿ¬e4ÿªc3ÿªa2ÿ©_1ÿ§]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸR,ÿ©dCÿϧ•ÿÒ®žÿÒ® ÿÓ®¡ÿÒ®¡ÿÔƒÿ–D(ÿ“>#ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿ”A-ÿÚ¼¶Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~‚%ú†*ÿŠ0ÿ�6ÿ‘;"ÿ•A$ÿ™I)ÿÉœ‰ÿ¹€eÿ¢U-ÿ¦Z/ÿ­g<ÿ¹|Sÿ¼€Vÿ½‚UÿÀ†UÿëØÈÿÃŒYÿÊRÿÅŒPÿÇ�PÿÈ�OÿÉ‘NÿÊ’MÿË”LÿÍ•KÿÍ–KÿϘKÿКKÿÑœLÿÓžMÿÔ NÿÕ¡NÿÕ¢OÿÖ£OÿפPÿ×¥PÿئPÿئQÿئQÿاQÿاQÿاQÿئQÿئQÿئQÿØ¥Pÿ×¥PÿפPÿÕ£PÿÓ¡NÿÍœLÿ¾�Fÿ‘�†ÿ«««ÿ²µ´ÿµ¶¶ÿÀÀÀÿÆÆÆÿÍÍÍÿÖÖÖÿßàßÿßààÿßàßÿßàßÿÞßÞÿÝÞÞÿÜÝÝÿÛÜÛÿÙÛÚÿØÙØÿÕÖÖÿ›œœÿ’”“ÿ”�†ÿ¶�Kÿ½~?ÿ¼|>ÿ»z=ÿºx=ÿ¶v?ÿ±šƒÿ±²¯ÿ¹ººÿ®®®ÿžžžÿŒ…~ÿšpQÿ­g5ÿ­e4ÿ«c3ÿªa2ÿ©_1ÿ§]0ÿ¦[0ÿ¥Y/ÿ£W.ÿ¢T-ÿ¡R,ÿŸP+ÿ Q.ÿ¾‰rÿÕ²¤ÿÖ´§ÿÖµ¨ÿÖ¶ªÿÉž�ÿ–D(ÿ“=#ÿ‘;"ÿ�9!ÿŽ7 ÿ�5ÿ”A.úùôó:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�#Ö…)ÿ‰/ÿ�4ÿ�:!ÿ”?$ÿ˜E&ÿ¡U5ÿÒ­›ÿ²qPÿ¯kEÿº~Yÿ»€Yÿ¼�Xÿ¾„WÿÈ–mÿæÎ¹ÿÊUÿÅ�UÿÆ�TÿÈ�SÿÊ’SÿË”QÿÌ•QÿÍ—PÿΘOÿÏ™NÿЛLÿÑœLÿÒžMÿÔ NÿÕ¡OÿÖ£OÿפPÿ×¥PÿئQÿاQÿÙ§QÿÙ¨QÿÙ¨QÿÙ¨RÿÚ¨RÿÙ¨RÿÙ¨QÿÙ¨QÿÙ§QÿÙ§QÿئQÿئPÿ×¥PÿÕ£OÿÏžMÿÔHÿœŠoÿšššÿ¸»ºÿº½»ÿ¹¹¹ÿ¾¾¾ÿÆÆÆÿ×××ÿâãâÿâãâÿâãâÿâãâÿáââÿàááÿßààÿÞßßÿÝÞÝÿÛÜÜÿÆÆÆÿŒ�Žÿ—Šwÿ¼�Cÿ¾@ÿ½~?ÿ¼|>ÿ»z=ÿºx=ÿ¸v=ÿèÒÀÿÈ—nÿ¦{Xÿ¡›“ÿ¤¤¤ÿ““‘ÿ›rTÿ®g5ÿ­e4ÿ«c3ÿª`2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X/ÿ£V.ÿ¢T-ÿ R,ÿŸP+ÿžO+ÿ¤[;ÿÓ¯ ÿÙ»¯ÿÙ»°ÿÚ¼±ÿÏ©›ÿ—D)ÿ’=#ÿ‘;"ÿ�9!ÿŽ6 ÿ�4ÿ•D1Ùÿÿÿ5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€!›„'ÿˆ-ÿŒ3ÿ�9!ÿ“>#ÿ—D&ÿ›I(ÿ®kLÿÜ¿±ÿ¿ˆkÿº\ÿ¼‚[ÿ¾„[ÿ¿†ZÿÓ©ˆÿݽ¡ÿÄŒXÿÆŽWÿÇ�WÿÉ’VÿÊ•UÿË–Uÿ͘TÿΙSÿÏ›SÿÑ�QÿÒ�PÿÓžOÿÔŸNÿÕ¡OÿÖ£OÿפPÿئPÿاQÿÙ¨QÿÚ¨RÿÚ©RÿÚ©RÿÚªRÿÛªRÿÛªRÿÚªRÿÚªRÿÚ©RÿÚ©RÿÚ¨RÿÙ¨QÿÙ§QÿئQÿÕ¤OÿÒ NÿȘJÿ¨‹[ÿ���ÿ·¸·ÿÂÅÄÿ¶··ÿ···ÿ½½½ÿàààÿäååÿåæåÿåæåÿåæåÿäååÿäåäÿãäãÿáââÿàáàÿÞßßÿ§¨§ÿ›‚dÿ¹~>ÿ½€@ÿ¾?ÿ¼~?ÿ»|>ÿ»z=ÿºx=ÿËšpÿèÓÁÿ¶r;ÿ´p9ÿ³n8ÿ¨sJÿ˜‹~ÿžtVÿ®f5ÿ¬d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¦Z/ÿ¤X.ÿ£V.ÿ¡T-ÿ R,ÿŸP+ÿ�M*ÿžN,ÿº‚kÿÛ½²ÿݸÿÝùÿÕ´©ÿ–D)ÿ’<"ÿ�:!ÿ�8 ÿŽ6ÿŒ4ÿšL;£ÿÿÿ2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZƒ%ÿ‡+ÿ‹1ÿŽ7 ÿ’=#ÿ–C%ÿœK*ÿ²sWÿÊŸ‰ÿÝÀ±ÿ¾†dÿ½„^ÿ¿†]ÿÀˆ]ÿÜ»¡ÿÔ­ŠÿÅŽ[ÿÇ‘ZÿÈ“ZÿÊ•YÿÌ–XÿÍ™WÿΚWÿМVÿÑ�UÿÒŸSÿÔ SÿÔ¢RÿÖ¢QÿÖ£PÿפPÿئQÿÙ§QÿÚ¨RÿÚ©RÿÛªRÿÛ«SÿÛ«SÿÜ«SÿÜ«SÿÜ«SÿÛ«SÿÛ«SÿÛ«SÿÛªRÿÚªRÿÚ©RÿÙ¨RÿÙ§Qÿ×¥QÿÕ¢OÿÌœLÿ·�Kÿ���ÿ®¯¯ÿÊÌËÿÂÄÃÿ¯¯¯ÿÂÂÂÿæçæÿçèçÿèèèÿèéèÿèéèÿèèèÿçèçÿæçæÿåæåÿãääÿÜÜÛÿ“uPÿ©u9ÿ³z=ÿ¸|>ÿº|>ÿ¹|>ÿº{=ÿºy=ÿ¹x>ÿçÒÀÿÊ™oÿ¶r:ÿ´p9ÿ³n8ÿ²l7ÿ°j6ÿ¯h7ÿ®f5ÿ¬d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¥Z/ÿ¤X.ÿ£U-ÿ¡S,ÿ Q+ÿžO+ÿ�M*ÿœK)ÿ T5ÿÔ²¤ÿàǾÿáÊÁÿÜÀ·ÿ–D*ÿ’<"ÿ�9!ÿ�7 ÿ�5ÿŒ3ÿ¬l^nÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}�#ÿ…)ÿ‰/ÿ�5ÿ‘;"ÿ•B%ÿ®mTÿ¸}dÿ¹cÿÖ³ ÿÚ»¨ÿÀ‰eÿ¿ˆaÿŠ`ÿäʵÿΟwÿÆ�_ÿÈ“]ÿÊ•]ÿË—\ÿÍ™\ÿΛZÿÐ�ZÿÑžYÿÓ XÿÔ¡WÿÕ£VÿÖ¤Uÿ×¥TÿØ¥SÿاRÿÙ¨QÿÚ©RÿÛªRÿÛ«SÿܬSÿܬSÿÝ­TÿÝ­TÿÝ­TÿÝ­TÿÝ­TÿÜ­TÿܬSÿܬSÿÛ«SÿÛªRÿÚªRÿÚ¨RÿاQÿÕ¥PÿПMÿÁ“Hÿ�Š�ÿŸŸŸÿÑÓÒÿÒÔÓÿ­­­ÿÑÒÒÿèéèÿéêêÿêëëÿëìëÿëìëÿëìëÿêëëÿéêêÿèééÿçççÿ¸²¨ÿ†\.ÿ˜i4ÿ£o8ÿ«t:ÿ°v;ÿ³w<ÿµw<ÿ¶w;ÿÉšnÿçÒÀÿ¶t<ÿµr:ÿ´p9ÿ³n8ÿ±l7ÿ°j6ÿ¯h5ÿ­f5ÿ¬d4ÿ«b3ÿ©`2ÿ¨]1ÿ§[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸQ+ÿžO*ÿ�L)ÿ›J(ÿ›J*ÿ´xaÿáÉÁÿåÐÉÿâËÄÿ–E,ÿ‘;"ÿ�9!ÿŽ7 ÿ�4ÿ‹2ÿØ»µBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€!Ù„'ÿˆ-ÿŒ4ÿ�9!ÿ©eOÿ·}hÿ¹gÿº�fÿ¼…hÿÙ¸¥ÿÞòÿÄ�kÿÂŒcÿæÐ¾ÿË›pÿÈ“aÿÉ•aÿË—`ÿÍ™_ÿΛ_ÿÐ�^ÿÑŸ]ÿÓ¡\ÿÔ¢[ÿÖ¤ZÿÖ¥Zÿ×§YÿÙ¨XÿÙ©VÿÚªTÿÚªTÿÛ«SÿܬSÿÜ­TÿÝ®TÿÝ®TÿÞ®TÿÞ¯TÿÞ¯TÿÞ¯TÿÞ®TÿÝ®TÿÝ®TÿÝ­TÿܬSÿܬSÿÛ«SÿÚªRÿÚ©Rÿ×§PÿÒ¡OÿƘJÿ™ŠpÿŒŒŒÿÖ××ÿÚÛÛÿ¿À¿ÿåååÿêêêÿëììÿíííÿîîîÿîïîÿîïîÿîîîÿíííÿìììÿêëêÿvbKÿlK%ÿ}V*ÿ‰^/ÿ”d2ÿ�i4ÿ£m6ÿ©o8ÿ­q9ÿÝʸÿÅ–mÿ³r:ÿ´q:ÿ³p9ÿ³n8ÿ±l7ÿ°j6ÿ¯h5ÿ­e4ÿ¬c3ÿªa3ÿ©_2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ£W.ÿ¢T-ÿ R,ÿŸP+ÿžN*ÿœL)ÿ›J(ÿ™G'ÿœL.ÿÓ¯£ÿèÕÏÿæÒËÿ›L4ÿ�;"ÿ�8 ÿŽ6ÿŒ4ÿ‹1Ùÿÿÿ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~˜ƒ%ÿ‡+ÿ‹1ÿ¢ZFÿ·~kÿ¸kÿº�jÿ»ƒiÿ¼…hÿ¾‡iÿÖ³�ÿäÌ»ÿÉ—sÿèÔÃÿʘlÿÉ•dÿÊ—cÿÌ™cÿΜbÿОaÿÑ aÿÓ¢aÿÔ£_ÿÕ¥_ÿÖ§^ÿب]ÿÙ©[ÿÚªZÿÛ«YÿÛ¬XÿÜ­WÿÝ­VÿÝ®UÿÞ®TÿÞ¯UÿÞ°Uÿß°Uÿß°Uÿß°Uÿß°Uÿß°UÿÞ°UÿÞ¯UÿÞ®TÿÝ®TÿÝ­TÿܬSÿÛ«SÿÚªRÿÙ¨RÿÕ¤OÿËœLÿ¦�bÿŠŠŠÿÊËËÿáãâÿÐÐÐÿéééÿëìëÿíîíÿïïïÿðððÿñññÿñòñÿñññÿðñðÿïïïÿÔÓÑÿE0ÿQ9ÿ^A ÿjH$ÿuP(ÿ€V+ÿ‰[.ÿ“a0ÿªƒ]ÿμ«ÿªm7ÿ®o8ÿ±o9ÿ³o9ÿ²m8ÿ±k7ÿ°i6ÿ®g5ÿ­e4ÿ«c3ÿªa2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X/ÿ£V.ÿ¡T-ÿ R,ÿŸO+ÿ�M*ÿœK)ÿšI(ÿ™G'ÿ˜E(ÿ«iQÿèÖÐÿéØÓÿŸT=ÿ�:"ÿ�7 ÿ�5ÿŒ3ÿ�:'›ÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}O�#ÿ…)ÿšM>ÿ¶}oÿ·nÿ¸�nÿºƒlÿ»…lÿ½‡lÿ¿‰kÿÁ‹jÿÔ¯•ÿèÓÃÿîÝÏÿÈ–iÿÊ—gÿË™fÿÍ›fÿÏ�eÿПdÿÒ¡dÿÓ¤cÿÕ¦bÿ×§bÿتaÿÙ«`ÿÚ¬_ÿÛ®^ÿÜ®]ÿݯ\ÿݰ[ÿÞ°Yÿß°Xÿß±Vÿß±Uÿà²Vÿà²Vÿà²Vÿà²Vÿà²Vÿà²Vÿß±Uÿß°UÿÞ°UÿÞ¯UÿÝ®TÿÝ­TÿܬSÿÛ«SÿÙ©RÿצQÿРNÿ¸“Tÿ‰‰‰ÿ¹¹¹ÿéêêÿ×××ÿéêêÿìììÿîïîÿðñðÿòòòÿóôôÿôôôÿôõôÿôôôÿòòòÿÐÐÏÿ5%ÿ<*ÿD/ÿL4ÿV:ÿ`@ ÿjG#ÿvN(ÿ£•ˆÿ�xWÿ›c2ÿ¥h5ÿ¬l6ÿ°m8ÿ±l8ÿ±k7ÿ¯i6ÿ®g5ÿ­d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¥Z/ÿ¤X.ÿ¢U-ÿ¡S,ÿ Q+ÿžO*ÿ�M)ÿ›J(ÿšH'ÿ˜F'ÿ—D&ÿ˜G,ÿΧ›ÿìÝØÿ¤\Gÿ�;#ÿŽ6 ÿŒ4ÿ‹2ÿ­pbdÿÿÿ*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ| ë‡.!ÿµ|qÿ·rÿ¸€qÿ¹ƒpÿ»„oÿ¼†oÿ¾ˆnÿ¿ŠmÿÁ�mÿÃŽlÿÓ¬�ÿ÷ïéÿÒ©‡ÿʘjÿËšiÿÎ�hÿПhÿÑ¡gÿÓ¤gÿÔ¦fÿÖ¨fÿتeÿÙ¬dÿÛ­cÿܯbÿܰbÿÞ±`ÿÞ²^ÿß²]ÿß³\ÿà³Zÿá´Yÿà´Xÿá³Vÿá³Wÿá´Wÿá´Wÿá³Vÿá³Vÿà²Vÿà²Vÿß±Uÿß°UÿÞ¯UÿÝ®TÿÝ­TÿܬSÿÛªSÿبQÿÔ¤OÿÉ›LÿŒ‰…ÿ¤¥¥ÿãããÿçççÿéêêÿìììÿïïïÿñññÿóôóÿõöõÿ÷÷÷ÿ÷ø÷ÿ÷÷÷ÿõööÿÝÞÝÿ-ÿ0!ÿ3#ÿ8&ÿ>*ÿE.ÿO4ÿcL7ÿƒynÿyN(ÿ‹Y-ÿœc2ÿ¨i5ÿ®l6ÿ±k7ÿ¯j7ÿ¯h6ÿ®f5ÿ¬d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡R,ÿŸP+ÿžN*ÿœL)ÿ›I(ÿ™G'ÿ˜E&ÿ–C%ÿ•B%ÿ£ZCÿé×Òÿ¨dQÿ�:"ÿ�5ÿŒ3ÿŠ1ë÷ñï:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}’‚$ÿ¬mbÿ·�uÿ¹‚tÿº„sÿ¼†sÿ½ˆqÿ¿ŠqÿÀŒpÿÂŽoÿÄ�oÿÉ™wÿëØÊÿëÙÊÿÙ´“ÿÍœlÿΟkÿРkÿÒ£jÿÔ¦jÿÖ¨iÿתiÿÙ¬hÿÚ­gÿܰgÿݱeÿÞ³dÿß´cÿàµbÿà¶aÿâ¶`ÿá·^ÿâ·]ÿâ¶[ÿâµXÿâµWÿâµWÿâµWÿâµWÿâ´Wÿá´Wÿá³Vÿà²Vÿà±Vÿß°UÿÞ¯UÿÝ®TÿÜ­TÿÛ«SÿÚ©Rÿ×¥QÿÏ Nÿ˜Œvÿ���ÿÕÕÕÿæçæÿéééÿëììÿîïïÿñññÿôôôÿöööÿùùùÿúúúÿúúúÿùùùÿêëëÿ)ÿ*ÿ+ÿ-ÿ1!ÿ6$ÿ>+ÿ]WQÿ_H1ÿlF#ÿƒT*ÿ—^0ÿ¤f4ÿ­j6ÿ¯k6ÿ¯j6ÿ¯h5ÿ­e4ÿ¬c3ÿªa2ÿ©_1ÿ§]0ÿ¦[0ÿ¤X/ÿ£V.ÿ¢T-ÿ R,ÿŸO+ÿ�M*ÿœK)ÿšI(ÿ™G'ÿ—D&ÿ–B%ÿ”@$ÿ–B(ÿÔ‡ÿ«jXÿ�9#ÿ�4ÿ‹2ÿ”A0—ÿÿÿ<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|3€!ÿ—I=ÿ¸‚xÿº„wÿ»†vÿ¼‡uÿ½‰tÿ¿‹tÿÁ�sÿÃ�rÿÄ‘rÿÌžÿä̺ÿÐ¥�ÿìÙÈÿß¿¡ÿÏ oÿÑ¢nÿÓ¥mÿÕ§mÿשlÿجkÿÚ®kÿܰkÿݲiÿÞ´hÿßµhÿá¶gÿá¸fÿã¸eÿã¹cÿã¹bÿã¹`ÿä¹_ÿä¸[ÿã·Xÿã·Xÿã·Xÿã¶Xÿã¶XÿâµWÿâ´Wÿá³Wÿà²Vÿà±Vÿß°UÿÞ¯TÿÝ®TÿܬSÿÛ«SÿبQÿÔ£Oÿª’jÿŠŠŠÿÒÓÒÿåæåÿèèèÿêëëÿíîîÿðñðÿóóóÿöööÿùùùÿûûûÿýýýÿüüüÿöööÿ*ÿ*ÿ+ÿ-ÿ/ ÿ4#ÿF=3ÿTH=ÿX9ÿmF$ÿ„T+ÿ˜`1ÿ¦g5ÿ­j6ÿ¯j6ÿ¯i6ÿ®g5ÿ­e4ÿ«c3ÿª`2ÿ¨^1ÿ§\0ÿ¥Z/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸQ+ÿžO*ÿœL)ÿ›J(ÿ™H'ÿ˜E&ÿ–C%ÿ•A$ÿ“?#ÿ’=#ÿ—G0ÿ¥_LÿŽ8!ÿŒ3ÿ‹1ÿÉ ˜Zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}Ô„'ÿµ}tÿº„yÿ»‡xÿ½ˆxÿ¾ŠwÿÀŒvÿÁŽvÿÃ�tÿÄ’tÿΣ†ÿâȵÿÊ™rÿÏ£}ÿèÓ¾ÿéÔ½ÿÖ­ÿÓ¦pÿÖ¨oÿ׫oÿÙ®nÿÛ°nÿܲmÿÞ´mÿà¶lÿá·kÿâ¹iÿãºhÿä»gÿå¼fÿå¼eÿå¼cÿå¼aÿå»`ÿä¸Zÿä¸Yÿä¸Yÿä¸Xÿã·Xÿã·Xÿâ¶XÿâµWÿá´Wÿà²Vÿß±UÿÞ°UÿÝ®TÿÜ­TÿÛ«SÿÙ©Rÿ×§Pÿœ\ÿŒŒŒÿ¼¼¼ÿãääÿæççÿéêéÿìììÿïïïÿñòòÿôõõÿ÷÷÷ÿúúúÿüüüÿüüüÿúúúÿND8ÿ/!ÿ1!ÿ3#ÿ7%ÿD3$ÿ[UPÿW: ÿhC"ÿ{O(ÿ�Z-ÿŸc2ÿ©h6ÿ®j7ÿ°j7ÿ¯h6ÿ®f5ÿ¬d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ£W.ÿ¢T-ÿ R,ÿŸP+ÿ�M*ÿœK)ÿšI(ÿ™G'ÿ—D&ÿ–B%ÿ”@$ÿ“>#ÿ‘;"ÿ�:"ÿ�9"ÿ�5ÿ‹2ÿ”B1Øÿÿÿ:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|s€!ÿ¢]Rÿ»†{ÿ»‡zÿ½‰zÿ¾‹yÿÀ�xÿÁŽwÿÑwÿÅ”wÿЧ�ÿàıÿÊšuÿÌ�uÿΠtÿß¿ŸÿïáÐÿâÄ¡ÿÖ«tÿØ­rÿÚ¯qÿܱqÿÞ´pÿß¶pÿá¸nÿâºnÿä»mÿä¼lÿå¾kÿæ¾jÿç¿hÿæ¿gÿç¿eÿç¾cÿæ¼]ÿåºYÿåºYÿå¹Yÿä¹Yÿä¸Xÿã·Xÿâ¶Xÿâ´Wÿá³Vÿà²Vÿß°UÿÞ¯UÿÝ­TÿܬSÿÛªRÿاRÿÕ¤Pÿ•�‡ÿ¢£¢ÿâãâÿäååÿçèçÿêëêÿíííÿïððÿòòòÿõõõÿ÷÷÷ÿùùùÿúúúÿùùùÿ‚�€ÿvtqÿ^SHÿK7#ÿM5ÿkd]ÿhO6ÿoH$ÿR)ÿ�[.ÿ�c2ÿ§h5ÿ­k6ÿ°k6ÿ¯j6ÿ¯h5ÿ­e4ÿ¬c3ÿªa2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X.ÿ£V-ÿ¡S,ÿ Q+ÿžO*ÿ�M)ÿ›J(ÿšH'ÿ˜F&ÿ—C%ÿ•A$ÿ”?#ÿ’="ÿ‘:!ÿ�8 ÿ�6ÿŒ3ÿŒ2ÿ·€t’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ| }ï‹4)ÿ»‡~ÿ¼ˆ}ÿ½Š|ÿ¿Œ{ÿÀ�zÿÁ�zÿÃ’yÿÅ”xÿÒ«“ÿÝÀ¬ÿË›wÿÍžwÿÏ wÿÑ£vÿ×®‚ÿë×ÀÿîÛÅÿÝ·…ÿÛ±tÿܳsÿÞ¶sÿà¸rÿáºrÿã¼qÿä½qÿå¿oÿçÀnÿçÁmÿèÁkÿèÁjÿèÁhÿèÁfÿçÀcÿæ¼Zÿæ»Zÿæ»ZÿåºYÿå¹Yÿä¸Yÿã·XÿâµWÿá´Wÿà³Vÿß±UÿÞ¯UÿÝ®TÿܬSÿÛªRÿÚ¨RÿצQÿ­˜tÿ“““ÿÙÚÙÿâããÿåæåÿèèèÿêëëÿíîíÿïððÿòòòÿôôôÿõööÿö÷÷ÿö÷÷ÿ¾¼ºÿ��ˆÿ}}}ÿwwwÿuqlÿ}qfÿ|S-ÿ‹Y-ÿ–`1ÿ¡f4ÿ¨j6ÿ®l7ÿ¯k7ÿ°k7ÿ°i6ÿ®g5ÿ­d4ÿ«b3ÿª`2ÿ¨^1ÿ§[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡R,ÿŸP+ÿ�N*ÿœK)ÿšI(ÿ™G'ÿ—E&ÿ–B%ÿ”@$ÿ“>#ÿ‘;"ÿ�9!ÿŽ7 ÿ�4ÿ‹2ÿŸUEñèÖÓ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|‚ ÿ®qgÿ¼Š€ÿ¾‹ÿ¿�~ÿÀŽ}ÿÂ�|ÿÄ“|ÿÅ”{ÿÑ«•ÿÝ¿«ÿËœzÿÌŸyÿΡyÿФxÿÒ¦xÿÔ©xÿâÄŸÿóåÓÿèͧÿÞµxÿß·vÿá¹uÿâ»uÿä¾tÿå¿sÿçÁrÿèÃqÿéÃpÿéÄoÿêÄmÿéÄlÿéÃjÿéÂhÿç¾^ÿç½[ÿç¼Zÿæ»ZÿåºYÿä¹Yÿä¸Xÿã¶XÿâµWÿá³Vÿà²VÿÞ°UÿÝ®TÿܬSÿÛªSÿÚ¨RÿاQÿÅŸaÿ”””ÿ¹ººÿàáàÿãããÿåææÿèèèÿêëëÿìííÿïïïÿñññÿòòòÿóôóÿôôôÿõöõÿ÷÷÷ÿëëëÿ¾»¸ÿ‹Š‰ÿnnnÿkhfÿ{fSÿ•hAÿ«m7ÿ°n7ÿ±n7ÿ±l7ÿ°j6ÿ¯h5ÿ­f4ÿ¬c3ÿªa2ÿ©_1ÿ§]0ÿ¦Z/ÿ¤X.ÿ£V-ÿ¡S,ÿ Q+ÿžO*ÿ�M)ÿ›J(ÿšH'ÿ˜F&ÿ—C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿŒ3ÿ—G6ÿµ{oŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|}ô–G=ÿ½‹‚ÿ¾Œ�ÿ¿Ž€ÿÀ�ÿ‘ÿÓ~ÿÅ•}ÿÎ¥�ÿàÅ´ÿÊœ|ÿÍŸ|ÿÏ¢|ÿѤ{ÿÓ§zÿÕªzÿ׬zÿܶ„ÿîÛÀÿñâÊÿäÂŒÿá»xÿã¾wÿåÀwÿçÁvÿèÃuÿéÅtÿêÅsÿêÆrÿëÆpÿëÇnÿëÆmÿëÅkÿéÃeÿè¾[ÿç½[ÿç¼Zÿæ»ZÿåºYÿä¸Yÿã·XÿâµWÿá´Wÿà²Vÿß°UÿÝ®TÿܬSÿÛªSÿÚ¨RÿاQÿÖ¤Qÿ¨™‚ÿ™™™ÿÌÍÍÿàááÿãããÿåæåÿçèèÿéêêÿìììÿíîîÿïïïÿðððÿðññÿðññÿòòòÿôôôÿ÷÷÷ÿøøøÿéèèÿ»µ°ÿyuqÿ```ÿf^Xÿ„cIÿ¯n9ÿ±k7ÿ°i6ÿ®g5ÿ­e4ÿ«b3ÿª`2ÿ¨^1ÿ§[0ÿ¥Y/ÿ¤W.ÿ¢T-ÿ R,ÿŸP+ÿ�N*ÿœK)ÿšI(ÿ™G'ÿ—D&ÿ–B%ÿ”@$ÿ“=#ÿ‘;"ÿ�9!ÿŽ7 ÿŒ4ÿ”B0ÿªj]÷³zoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|��"ÿ¸‚zÿ¿�„ÿ¿�ƒÿÁ�‚ÿÂ’�ÿÄ”�ÿÅ–€ÿÊžˆÿãʼÿÊ�~ÿÍŸ~ÿÏ¢}ÿÐ¥}ÿÒ§}ÿÕª}ÿ×®|ÿÙ°|ÿÛ´|ÿçÊŸÿõéÖÿîØ²ÿæÄ„ÿæÁzÿçÃyÿéÅxÿëÆxÿëÈwÿìÈuÿìÉtÿìÈrÿíÉpÿìÇnÿëÆlÿéÀ_ÿè¾[ÿç½[ÿç¼Zÿæ»Zÿå¹Yÿä·Xÿâ¶Xÿá´Wÿà²Vÿß°UÿÝ®TÿܬSÿÛªSÿÚ¨RÿئQÿפPÿÑ¡Sÿ£›Žÿ¢¢¢ÿרØÿàáàÿâããÿäååÿæççÿèééÿêëêÿëììÿìííÿíîíÿíîîÿíîíÿìííÿëììÿïïïÿôôôÿúúúÿüüüÿêéçÿ°©¤ÿc`^ÿ¯l7ÿ°j7ÿ¯h5ÿ­f4ÿ¬c3ÿªa2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X.ÿ£U-ÿ¡S,ÿ Q+ÿžO*ÿœL)ÿ›J(ÿ™H'ÿ˜E&ÿ–C%ÿ•A$ÿ“>#ÿ’<"ÿ�:!ÿ�7 ÿ�5ÿ–E2ÿ¬m_ÿ—H8•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||ö–H?ÿ¿�‡ÿÀ�†ÿÁ‘…ÿ“„ÿÄ•ƒÿÅ–‚ÿÈ™‚ÿäÎÂÿÊ��ÿÌŸÿ΢ÿÐ¥ÿÓ¨ÿÕ«ÿ×­ÿÙ±~ÿÛ´~ÿÞ·~ÿ⾆ÿïÚ¶ÿ÷íÚÿñÞ¸ÿëʈÿêÇ|ÿëÉzÿìÊyÿíËxÿíËwÿîËuÿîÊsÿîÊqÿìÈoÿëÄhÿé¿\ÿè¾[ÿç½[ÿæ»ZÿåºYÿä¸Xÿã¶Xÿá´Wÿà²Vÿß°UÿÝ®TÿܬSÿÛªRÿÙ¨QÿئQÿפPÿÕ¢OÿÌŸZÿ¢Ÿšÿ®®®ÿ×××ÿßààÿáââÿãääÿåæåÿçççÿèéèÿéêéÿêëêÿêëëÿêëëÿêëêÿéêéÿèéèÿçççÿçççÿîîîÿøøøÿÿÿÿÿæßÚÿ±k7ÿ°i6ÿ®g5ÿ­d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ£W.ÿ¢T-ÿ R,ÿŸP+ÿ�M*ÿœK)ÿšI(ÿ˜F'ÿ—D&ÿ•B%ÿ”?$ÿ’=#ÿ‘;"ÿ�8!ÿŽ6ÿ˜I6ÿ¯reÿ’?-÷ˆ-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||}ÿ°umÿÀ�ˆÿÁ’‡ÿ“†ÿÄ•…ÿÅ—„ÿÇ™ƒÿâɼÿÍ¢‰ÿÌŸ�ÿÍ¢�ÿФ€ÿѧ€ÿÔ«�ÿÖ­€ÿÙ±€ÿÛ³€ÿÝ·€ÿߺ€ÿâ½ÿæÄˆÿñÜ´ÿùïÚÿõã½ÿîÑ�ÿíÍ}ÿîÍ{ÿïÎzÿïÎyÿïÍwÿïËuÿîËrÿìÉpÿéÁ_ÿé¿\ÿç½[ÿæ¼ZÿåºYÿä¸Yÿã¶Xÿá´Wÿà²Vÿß°UÿÝ®TÿܬSÿÚªRÿÙ§Qÿ×¥PÿÖ£OÿÕ¡NÿÓŸMÿÆ�aÿ¨¢šÿ¨¨¨ÿÈÉÉÿÞßßÿàáàÿâãâÿãääÿåæåÿæçæÿçççÿçèçÿçèèÿçèçÿçççÿæçæÿåååÿãääÿâãâÿàáàÿÓÀ²ÿ²l7ÿ°j6ÿ¯h5ÿ­e4ÿ¬c3ÿªa2ÿ¨^1ÿ§\0ÿ¥Z/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸP+ÿžN*ÿœL)ÿ›I(ÿ™G'ÿ˜E&ÿ–B%ÿ”@$ÿ“>#ÿ‘;"ÿ�9!ÿ�:$ÿ¥_Oÿ±ugÿ’?-ÿˆ-|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||ÚŠ2)ÿÀ�‰ÿÁ“‰ÿÔˆÿÄ•‡ÿÅ—†ÿÇ™†ÿÞµÿϧ’ÿËŸ„ÿÍ¡ƒÿϤƒÿѧ‚ÿÔª‚ÿÕ­‚ÿذ‚ÿÚ³�ÿܶ�ÿߺ�ÿâ½�ÿäÁ�ÿçÄ�ÿéɇÿóÞ±ÿúðÛÿ÷çÂÿñÖ‘ÿðÐ}ÿðÏ{ÿðÏyÿïÎwÿïÍuÿîËsÿìÆjÿé¿\ÿè¾[ÿæ¼ZÿåºYÿä¸Xÿã¶Xÿá´Wÿà²VÿÞ¯UÿÝ­TÿÛ«SÿÚ©RÿاQÿפPÿÕ¢OÿÔ NÿÒžMÿÑ›LÿÍšPÿ¸ ÿ©©¨ÿ¹¹¹ÿÔÕÔÿÞßßÿàáàÿáââÿâããÿãääÿäåäÿäååÿäååÿäåäÿãääÿâããÿáââÿÛÚØÿÞ€ÿ²m8ÿ±k7ÿ¯i6ÿ®f5ÿ¬d4ÿ«a3ÿ©_2ÿ¨]1ÿ¦[0ÿ¤X/ÿ£V.ÿ¡T-ÿ Q+ÿžO*ÿ�L)ÿ›J(ÿ™H'ÿ˜E&ÿ–C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ›L8ÿ´{lÿ¨dTÿ�5"ÿˆ.Ú‡,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|E|ÿ£_Wÿ”ŒÿÕ‹ÿÄ–ŠÿÅ—‰ÿÆ™ˆÿÚ¼®ÿÒ­šÿËŸ†ÿÍ¡…ÿΤ…ÿѦ„ÿÓ©„ÿÕ¬„ÿׯƒÿÚ²ƒÿܶƒÿß¹ƒÿἃÿãÀƒÿæÄƒÿéǃÿë˃ÿîχÿôà®ÿúòÚÿùëÇÿôÚ–ÿñÑ|ÿðÐ{ÿïÎxÿîÌuÿíÊsÿêÁ`ÿè¾[ÿæ¼ZÿåºYÿä·XÿâµWÿá³Vÿß±UÿÞ¯TÿܬSÿÛªRÿÙ¨QÿئQÿÖ£PÿÕ¡OÿÓŸNÿÒ�MÿКKÿϘJÿÍ–IÿƘ[ÿ´§•ÿ¯¯¯ÿ¶¶¶ÿÄÅÄÿÒÓÒÿÝÞÞÿàááÿáâáÿáâáÿáââÿáâáÿßßÞÿÚØÓÿ˱œÿµt>ÿ³n8ÿ±l7ÿ°i6ÿ®g5ÿ­e4ÿ«b3ÿª`2ÿ¨^1ÿ¦[0ÿ¥Y/ÿ£W.ÿ¢T-ÿ R,ÿŸP+ÿ�M*ÿœK)ÿšH(ÿ˜F'ÿ—D&ÿ•A%ÿ”?$ÿ’=#ÿ”?'ÿ¬kYÿ·€rÿ™K8ÿŠ1ÿ‰/ÿ‡,Eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|©€!ÿ»ˆ�ÿÕ�ÿÄ–ŒÿŘ‹ÿÆ™ŠÿÖµ¨ÿÔ±¡ÿËŸˆÿÌ¡‡ÿΣ‡ÿЦ†ÿÒ¨†ÿÔ«…ÿÖ®…ÿÙ²…ÿÛµ„ÿݸ„ÿໄÿâ¿…ÿåÄÿèÇ„ÿêÊ…ÿíÎ…ÿðÑ„ÿñÔ‡ÿöâ«ÿûòØÿúîÏÿöâ«ÿòÓ†ÿïÎyÿíËvÿëÅlÿç½[ÿæ»Zÿå¹Yÿã·Xÿâ´Wÿà²Vÿß°UÿÝ®TÿÜ«SÿÚ©RÿÙ§QÿפPÿÕ¢OÿÔ NÿÒžMÿÑ›LÿÏ™KÿΗJÿÌ”IÿË’HÿÉ�GÿÆ�NÿÀ˜gÿ¼¡ƒÿº­Ÿÿ¼º¸ÿÄ¿ÿ·¬ÿŶ§ÿİ�ÿ¿—sÿ¹{Eÿ¶s:ÿµq9ÿ³o8ÿ²l7ÿ°j6ÿ¯h5ÿ­e4ÿ¬c3ÿªa2ÿ¨^1ÿ§\0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸP+ÿžN*ÿœK)ÿšI(ÿ™G'ÿ—D&ÿ–B%ÿ”@$ÿ“=#ÿ V@ÿ¼ˆyÿ¬k[ÿ�9$ÿ‹1ÿ‰/ÿˆ-©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||í”D<ÿÖ�ÿÄ—ŽÿŘŽÿÆš�ÿÓ°£ÿ×µ¨ÿÊžŠÿÌ¡‰ÿÍ£ˆÿÏ¥ˆÿѧˆÿÓª‡ÿÕ­‡ÿذ†ÿÙ³†ÿÜ·†ÿߺ†ÿ⽆ÿäÁ†ÿçņÿéɆÿí͇ÿïчÿòÕ‡ÿôÖ…ÿó׆ÿöÞžÿøé¾ÿûóÝÿøìÌÿóݧÿîÍ�ÿè¿`ÿåºYÿä¸Yÿâ¶Xÿá³Wÿß±UÿÞ¯TÿܬSÿÛªRÿÙ¨QÿØ¥PÿÖ£OÿÔ¡NÿÓžMÿÑœLÿКKÿΗJÿÍ•IÿË“HÿÊ�GÿÈŽFÿÆŒEÿʼnDÿÇCÿÖ­€ÿîÝÌÿÈLÿ½~?ÿ¼{>ÿºy=ÿ¸v<ÿ·t;ÿµr:ÿ´o9ÿ²m8ÿ±k7ÿ¯h6ÿ­f5ÿ¬d4ÿªa2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X.ÿ¢U-ÿ¡S,ÿŸQ+ÿžN*ÿœL)ÿ›J(ÿ™G'ÿ˜E&ÿ–C%ÿ”@$ÿ¡W@ÿµ{jÿ½Š|ÿ›O:ÿ�4ÿ‹2ÿŠ0ÿˆ-í†+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|M|ÿ°vpÿĘ‘ÿÅ™�ÿÆš�ÿÍ¥™ÿÜÀ¶ÿÉžŒÿË ‹ÿÍ¢ŠÿΤŠÿЧ‰ÿÒ©ˆÿÔ¬ˆÿÖ®ˆÿرˆÿÚµ‡ÿݸ‡ÿ༇ÿ㿈ÿåÈÿèȈÿë̈ÿîЈÿòÔˆÿõ؉ÿôׇÿóÕ„ÿòÓ‚ÿðÑ�ÿóÙšÿöå¼ÿúñÛÿöèÆÿíÑ’ÿå¼fÿá´Wÿà²VÿÞ¯UÿÝ­TÿÛ«SÿÚ¨RÿئQÿÖ¤PÿÕ¡OÿÓŸNÿÒœLÿКKÿϘJÿÍ–IÿË“HÿÊ‘GÿÈŽFÿÇŒEÿÅŠDÿćCÿСmÿñãÔÿÇ�Wÿ½~?ÿ¼|>ÿºy=ÿ¹w<ÿ·t;ÿ¶r:ÿ´p9ÿ²m8ÿ±k7ÿ¯i6ÿ®f5ÿ¬d4ÿ«b3ÿ©_2ÿ§]1ÿ¦[0ÿ¤X/ÿ£V.ÿ¡S,ÿ Q+ÿžO*ÿœL)ÿ›J(ÿ™H'ÿ˜E&ÿ›M0ÿ¯pZÿÓ„ÿ¾Œ|ÿ§cPÿ�;%ÿ�5ÿ‹2ÿŠ0ÿˆ.ÿ‡+Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|Œ„("ÿ½Œ†ÿÅ™’ÿÆš‘ÿÇ›�ÿݺÿ̤•ÿÊ �ÿÌ¡ŒÿÍ£‹ÿÏ¥‹ÿѨŠÿÓªŠÿÕ­‰ÿ×°‰ÿÙ³ˆÿÛ¶‰ÿÞ¹‰ÿὈÿãÀˆÿæÅˆÿéɈÿì͈ÿîщÿòÔ‰ÿòÖˆÿòÕ†ÿðÒƒÿïÏ�ÿîÍ~ÿíË{ÿëÈ{ÿîÒ–ÿòݰÿ÷ìÔÿóá¼ÿéËŽÿà´cÿÛ«SÿÚ©RÿئQÿפPÿÕ¢OÿÔŸNÿÒ�MÿКLÿϘKÿÍ–IÿÌ“HÿÊ‘GÿÉ�FÿÇŒEÿÅŠDÿĈCÿË—]ÿñãÔÿÌ™fÿ¾~?ÿ¼|>ÿºz=ÿ¹w<ÿ·u;ÿ¶r:ÿ´p9ÿ³n8ÿ±k7ÿ°i6ÿ®g5ÿ¬d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥X/ÿ£V.ÿ¡T-ÿ Q,ÿžO+ÿ�M)ÿ›J(ÿ›I(ÿ©eJÿ½ŠwÿÊ ‘ÿ¶|iÿžQ:ÿ�:!ÿ�7 ÿ�5ÿŒ3ÿŠ0ÿˆ.ÿ‡,Œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||ÈŠ4.ÿ•�ÿÆš“ÿÇ›’ÿÕ³«ÿÓ°¥ÿÊŸ�ÿË¡ŽÿÍ¢�ÿΤ�ÿЦŒÿÑ©‹ÿÓ«‹ÿÕ®Šÿ×±ŠÿÚ´ŠÿÜ·‰ÿÞº‰ÿὉÿãÁ‰ÿæÄ‰ÿèȉÿëˉÿíΉÿïЈÿïІÿîЄÿíÍ‚ÿìËÿëÉ}ÿéÆzÿèÄwÿæ¿qÿà³ZÿæÂ}ÿîÖªÿõéÑÿôæÎÿí×°ÿæÇ“ÿÞ¶vÿÖ¥ZÿÒ�MÿКLÿϘKÿÍ–IÿÌ“HÿÊ‘GÿÉ�FÿÇŒEÿÅŠDÿĈCÿÇ�QÿïßÎÿÒ¦xÿ¾~?ÿ¼|>ÿºz=ÿ¹w<ÿ·u;ÿ¶s:ÿ´p9ÿ³n8ÿ±k7ÿ°i6ÿ®g5ÿ­d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ£V.ÿ¢T-ÿ Q,ÿžO+ÿ£X7ÿ­kOÿ¹�jÿͤ•ÿÄ•„ÿ¬jSÿ–D(ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿŒ3ÿŠ1ÿ‰.ÿ‡,È…)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||î”D>ÿÅš•ÿÆ›”ÿ̦�ÿÙ¼´ÿÉŸ‘ÿÊ �ÿÌ¡�ÿÍ£ŽÿÏ¥�ÿШ�ÿÒªŒÿÔ¬‹ÿÕ¯‹ÿ×±ŠÿÚ´ŠÿÜ·ŠÿÞº‰ÿཉÿâÀ‰ÿåÉÿçÆ‰ÿéɈÿêˇÿëˆÿëË…ÿëʃÿêÈ€ÿéÇ~ÿçÄ{ÿæÂxÿå¿vÿà¶dÿܬSÿÚªRÿÙ¨QÿÜ®aÿá»}ÿçÉšÿí×µÿóæÑÿñàÈÿèϪÿà¼�ÿÖªoÿÍ—QÿÈŽFÿÇŒEÿÅŠDÿćCÿÅŠJÿêÖÀÿÙ´�ÿ¾~?ÿ¼|>ÿºz=ÿ¹w<ÿ·u;ÿ¶r:ÿ´p9ÿ³n8ÿ±k7ÿ°i6ÿ®g5ÿ­d4ÿ«b3ÿ©`2ÿ¨]1ÿ¦[0ÿ¥Y/ÿ§^8ÿ²rQÿ½†lÿÇ™…ÿÒ®žÿÓ¯ ÿÅ—„ÿ·}gÿ¡V:ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿŒ3ÿŠ1ÿ‰.ÿ‡,î†*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|=|÷žXRÿÆœ–ÿÇœ•ÿÚ¾¸ÿË£˜ÿÊŸ’ÿÊ¡‘ÿÌ¢�ÿͤ�ÿϦŽÿШ�ÿÒª�ÿÓ¬ŒÿÖ®Œÿ×±‹ÿÙ´‹ÿÛ¶ŠÿÞ¹Šÿ༉ÿΈÿãÁˆÿåÈÿçŇÿèÆ†ÿèÆ„ÿèÆ‚ÿçÅ€ÿæÃ~ÿæÂ|ÿä¿zÿã½wÿáºsÿÚ«VÿئQÿפPÿÕ¢OÿÔ NÿÒ�MÿÑ›LÿÏ™LÿÔ£_ÿÚ²{ÿâÁ˜ÿéÒµÿñâÏÿíÚÃÿçϲÿãÆ¦ÿáãÿóçÚÿêÕÀÿФwÿÌškÿÆ‘`ÿˆTÿ¼}Hÿ·t=ÿ¶t>ÿ¸wEÿ¹{Lÿ»Sÿ½ƒZÿ¾†aÿÁ‹hÿÂ�oÿÅ“uÿǘ|ÿÍ¡Šÿ×¶¤ÿÛ½®ÿͤ‘ÿÀŒtÿ²sWÿ£Z:ÿšH'ÿ˜F&ÿ—C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿŒ3ÿŠ1ÿ‰.ÿ‡,÷†*=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|N|üªlgÿÇ�—ÿÓ²¬ÿÑ®¦ÿÉŸ“ÿÊ ’ÿË¡‘ÿÌ£‘ÿͤ�ÿϦ�ÿѨŽÿÒª�ÿÔ¬�ÿÕ®Œÿ×°‹ÿس‹ÿÛµŠÿݸ‰ÿÞº‰ÿ༈ÿᾈÿâÀ‡ÿãÁ†ÿäÁ„ÿäÁƒÿäÀ�ÿä¿ÿã½}ÿâ¼zÿáºxÿ߸uÿܱjÿÕ¡OÿÔŸNÿÒžMÿÑœLÿКKÿΗJÿÍ•IÿÌ“HÿÊ‘HÿÉ�GÿÇ�FÿÆŒFÿË–ZÿÏžhÿ×®ƒÿóçÚÿçϹÿÙ´‘ÿܺ›ÿßÀ¥ÿâÆ¯ÿå͸ÿèÔÃÿëØÊÿêÖÇÿæÏ¾ÿáÇ´ÿÝ¿ªÿض ÿÔ®–ÿÏ¥ŒÿÊ�‚ÿÅ”xÿÀ‹oÿ¹`ÿ«fDÿ R,ÿžO*ÿ�M)ÿ›J(ÿšH'ÿ˜E&ÿ–C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿ�5ÿŒ3ÿŠ1ÿ‰.ÿ‡,ü…)Nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|`~ÿµ}yÿÌ¥¡ÿ׸³ÿÈž–ÿÉŸ”ÿÊ “ÿË¢’ÿÌ£‘ÿÎ¥�ÿϦ�ÿШŽÿÒªŽÿÓ«�ÿÕ®ŒÿÖ°‹ÿز‹ÿÙ´ŠÿÛ¶Šÿܸ‰ÿÞ¹ˆÿߺ‡ÿ༆ÿἄÿἃÿá¼�ÿá¼ÿàº}ÿà¹zÿÞ·xÿݵvÿܳsÿÖ¤ZÿÑ›LÿÏ™KÿΗJÿÍ•IÿÌ“HÿÊ‘HÿÉ�GÿÈ�FÿÆ‹EÿʼnDÿÇCÿÂ…BÿÌ™cÿïßÎÿÓ§|ÿ¼|>ÿ»z=ÿ¹x<ÿ¸u;ÿ¶s:ÿµq9ÿ³o8ÿ³m9ÿ°j7ÿ¯h5ÿ­e4ÿ¬c3ÿªa2ÿ©_1ÿ§\0ÿ¦Z/ÿ¤X.ÿ£U-ÿ¡S,ÿŸQ+ÿžO*ÿœL)ÿ›J(ÿ™H'ÿ˜E&ÿ–C%ÿ•A$ÿ“>#ÿ’<"ÿ�:!ÿ�7 ÿ�5ÿŒ3ÿŠ0ÿˆ.ÿ‡,ÿ…)`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|u‚%ÿ»‰…ÿغ·ÿÊ£œÿÈŸ–ÿÉ •ÿÊ¡”ÿË¢“ÿÌ£’ÿͤ�ÿΦ�ÿЧ�ÿÑ©ŽÿÓ«�ÿÔ­ŒÿÖ®Œÿ×°ŠÿرŠÿÙ³‰ÿÛµˆÿܶ‡ÿÝ·†ÿݸ„ÿݸƒÿÝ·�ÿÞ·ÿݶ}ÿݵ{ÿܳyÿÛ²wÿÚ°tÿجoÿΗLÿÌ”IÿË’HÿÊ�GÿÉ�FÿÇ�FÿÆ‹EÿʼnDÿÇCÿÂ…BÿÁƒAÿΟnÿïßÏÿÍœlÿ»{>ÿºx=ÿ¸v<ÿ·t;ÿ¶r:ÿ´p9ÿ³m8ÿ±k7ÿ°i6ÿ®g5ÿ­e4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸP+ÿžN*ÿœL)ÿ›I(ÿ™G'ÿ˜E&ÿ–B%ÿ”@$ÿ“>#ÿ‘<"ÿ�9!ÿŽ7 ÿ�5ÿ‹2ÿŠ0ÿˆ.ÿ‡+ÿ…)uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|u‚%ÿÀ‘�ÿÓ²®ÿÈž—ÿÈž–ÿÉŸ•ÿÊ ”ÿË¡’ÿÌ£’ÿͤ‘ÿÎ¥�ÿϧ�ÿѨŽÿÒª�ÿÓ«ŒÿÔ­‹ÿÕ®ŠÿׯŠÿ×°ˆÿر‡ÿÙ²†ÿÙ³„ÿÚ³ƒÿÚ³�ÿÚ³ÿÚ²~ÿÚ±|ÿÙ¯zÿØ®wÿ׬uÿÖªrÿÑ¡dÿÈŽFÿÇ�FÿÆ‹EÿÅŠDÿĈDÿÆCÿ„BÿÁƒAÿ¿�@ÿÒ§|ÿíÜËÿÆ‘^ÿºy=ÿ¹w<ÿ·u;ÿ¶s:ÿ´p9ÿ³n8ÿ²l7ÿ°j6ÿ¯h5ÿ­f4ÿ¬c3ÿªa3ÿ©_2ÿ§]1ÿ¦[0ÿ¥X/ÿ£V.ÿ¢T-ÿ R,ÿŸO+ÿ�M*ÿœK)ÿšI(ÿ™F'ÿ—D&ÿ–B%ÿ”?$ÿ’=#ÿ‘;"ÿ�9!ÿŽ6 ÿŒ4ÿ‹2ÿ‰/ÿˆ-ÿ†+ÿ…(uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|` ü”‘ÿË¥¡ÿÈž˜ÿÈŸ—ÿÉŸ•ÿÉ ”ÿÊ¡“ÿË¡’ÿÌ£�ÿͤ�ÿϦ�ÿϧŽÿШ�ÿÒ©ŒÿÓª‹ÿÓ¬ŠÿÔ¬ˆÿÕ­‡ÿÖ®†ÿÖ¯…ÿ×®ƒÿׯ‚ÿ×®€ÿ×®~ÿ×­|ÿÖ¬zÿÖ«xÿÕ©uÿÔ§sÿÓ¥qÿË–YÿÇCÿÆBÿ„BÿÁƒAÿÀ�Aÿ¿€@ÿ½~?ÿÖ°ŠÿêÕÃÿÁ†Rÿ¹w<ÿ·u;ÿ¶s:ÿµq9ÿ³o8ÿ²m7ÿ±k7ÿ¯h6ÿ®f5ÿ¬d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿŸQ+ÿžN*ÿœL)ÿ›J(ÿ™H'ÿ˜E&ÿ–C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿ�6ÿŒ3ÿŠ1ÿ‰/ÿ‡,ÿ†*ü„(`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|Nˆ0*ø¸‚~ÿÇžšÿÈž™ÿÈŸ—ÿÉŸ–ÿÉŸ”ÿÊ “ÿË¡’ÿÌ¢‘ÿÍ£�ÿͤŽÿΤ�ÿϦŒÿЧ‹ÿѨŠÿÒ©‰ÿÒªˆÿÓª†ÿÔª…ÿÔ«„ÿÔ«‚ÿÔª€ÿÔª~ÿÔ©}ÿÓ¨zÿÓ§xÿÒ¦vÿÒ¤tÿТqÿÏ oÿÄŠMÿ¿€@ÿ¾?ÿ½}?ÿ¼|>ÿ½~Dÿܺœÿå̶ÿ½Hÿ·t;ÿ¶r:ÿ´p9ÿ³n8ÿ²l7ÿ°j7ÿ¯h6ÿ®f5ÿ­d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¦Z/ÿ¤X.ÿ£V-ÿ¡T-ÿ Q,ÿžO+ÿ�M*ÿœK)ÿšI(ÿ™G'ÿ—D&ÿ–B%ÿ”@$ÿ“>#ÿ‘;"ÿ�9!ÿŽ7 ÿ�5ÿ‹2ÿŠ0ÿˆ.ÿ‡,ÿ…)÷„'Nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|=”E@ñ§faÿÆœ™ÿÇž™ÿÈž˜ÿÈŸ–ÿÉŸ•ÿÊ ”ÿÊ ’ÿÊ¡‘ÿË¢�ÿÌ¢ŽÿÍ£�ÿͤŒÿÎ¥ŠÿÏ¥‰ÿЦ‡ÿЦ†ÿЦ„ÿѧ„ÿѧ‚ÿѦ�ÿѦÿÑ¥}ÿѤ{ÿУyÿТwÿÏ tÿΟrÿÍ�pÿË™jÿ¼~Dÿºx=ÿ¹w<ÿÆ‘cÿèÓÀÿÛ¹�ÿ·v@ÿ´p9ÿ³o8ÿ²m8ÿ±k7ÿ°i6ÿ¯h5ÿ­f5ÿ¬d4ÿ«b3ÿª`2ÿ¨^1ÿ§\0ÿ¦Z/ÿ¤X/ÿ£V.ÿ¢T-ÿ R,ÿŸP+ÿ�N*ÿœL)ÿ›I(ÿ™G'ÿ˜E&ÿ–C%ÿ•A$ÿ“?#ÿ’<"ÿ�:!ÿ�8 ÿŽ6ÿŒ4ÿ‹1ÿ‰/ÿˆ-ÿ†+ÿ…(îƒ&=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�82#›PKÓ˜KFÿĘ•ÿÇ�šÿÈž˜ÿÈž–ÿÈž•ÿÈŸ“ÿÉŸ’ÿÊŸ‘ÿÊ �ÿË ŽÿÌ¡�ÿÌ¢‹ÿÍ¢ŠÿÍ¢ˆÿΣ‡ÿΣ…ÿΣ„ÿΣ‚ÿ΢�ÿ΢~ÿΡ}ÿΡ|ÿÍ yÿÍžwÿÌ�uÿÌœsÿÊ™pÿɘnÿÅ�cÿ¹zDÿײ”ÿèÒÁÿÄ�fÿ³n8ÿ²l7ÿ±k7ÿ°i6ÿ¯h5ÿ®f5ÿ­e4ÿ«c3ÿªa2ÿ©_2ÿ¨]1ÿ§\0ÿ¥Z/ÿ¤X.ÿ£V.ÿ¢T-ÿ R,ÿŸP+ÿžN*ÿœL)ÿ›J(ÿ™H'ÿ˜F&ÿ—D&ÿ•A%ÿ”?$ÿ’=#ÿ‘;"ÿ�9!ÿŽ7 ÿ�4ÿ‹2ÿŠ0ÿˆ.ÿ‡,ÿ…)ÿ„'ȃ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ¾¼ ZU �92ÿº†ƒÿÇ�šÿÇ�˜ÿÈ�–ÿÇ�•ÿÈ�“ÿÈž’ÿÉž‘ÿÉž�ÿÉŸ�ÿÊŸŒÿÊŸ‹ÿËŸ‰ÿËŸˆÿÌ †ÿÌ „ÿËŸƒÿÌŸ�ÿËžÿÌž}ÿË�{ÿËœzÿÊ›xÿÉšvÿɘsÿÈ—qÿÇ•oÿÒª‹ÿê×ÈÿÕ°”ÿ³o?ÿ¯i6ÿ¯h5ÿ®f5ÿ­e4ÿ¬d4ÿ«b3ÿªa2ÿ©_2ÿ¨^1ÿ§\0ÿ¦[0ÿ¥Y/ÿ¤W.ÿ¢U-ÿ¡S,ÿ Q,ÿŸP+ÿ�N*ÿœL)ÿ›J(ÿ™H'ÿ˜F&ÿ—D&ÿ•B%ÿ”@$ÿ“=#ÿ‘;"ÿ�9!ÿ�7 ÿ�5ÿŒ3ÿŠ1ÿ‰/ÿˆ-ÿ†*ÿ…(ÿƒ&Œ‚$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«lhg€#íŸXSÿĘ•ÿÆ�˜ÿÇœ—ÿÇœ•ÿÇœ”ÿÈœ’ÿÈœ�ÿÈ��ÿÈœ�ÿÉ�ŒÿÈ�ŠÿÉœˆÿÉ�‡ÿÉœ…ÿÉœƒÿÉ›�ÿÉ›€ÿÉ›~ÿÉ™|ÿȘzÿȘyÿÇ–vÿÆ•tÿȘyÿßųÿêÙÍÿÏ¥‰ÿ¸yPÿ«c3ÿ«b3ÿªa2ÿª`2ÿ©_2ÿ¨^1ÿ§]0ÿ§[0ÿ¦Z/ÿ¥X/ÿ¤W.ÿ¢U-ÿ¡T-ÿ R,ÿŸP+ÿžO*ÿ�M*ÿœK)ÿšI(ÿ™G'ÿ˜E&ÿ—C%ÿ•A%ÿ”?$ÿ“=#ÿ‘;"ÿ�9!ÿ�7 ÿ�5ÿŒ3ÿ‹1ÿ‰/ÿˆ-ÿ†+ÿ…)ÿ„'í‚%Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇž›6€#«†,&ÿ²yuÿÆœ™ÿÆ›—ÿÆ›•ÿÆ›”ÿÆ›’ÿÇ›�ÿÆ›�ÿÇ›�ÿÇš‹ÿÇšŠÿÇšˆÿÇ™†ÿÇ™„ÿÇ™‚ÿǘ€ÿÇ—ÿÆ–}ÿÆ–{ÿÅ”xÿÅ”wÿÒ«•ÿêÙÏÿÜ¿­ÿÑsÿÀ‹kÿ¿‰iÿµvPÿ§\1ÿ¦[0ÿ¥Z/ÿ¥Y/ÿ¤X.ÿ£W.ÿ£U-ÿ¢T-ÿ¡S,ÿ Q,ÿŸP+ÿžO*ÿ�M*ÿœK)ÿ›I(ÿšH'ÿ˜F'ÿ—D&ÿ–C%ÿ•A$ÿ”?#ÿ’=#ÿ‘;"ÿ�9!ÿ�7 ÿ�5ÿŒ3ÿ‹1ÿ‰/ÿˆ-ÿ†+ÿ…)ÿ„'ÿ‚%©�#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ‹5/K|Ú–HBÿ¿��ÿÅš—ÿÅš•ÿÅš“ÿÅš’ÿÅ™�ÿÅ™ŽÿŘŒÿŘ‹ÿ؉ÿÅ—‡ÿÅ—…ÿÅ–ƒÿÅ•�ÿÄ”ÿÄ“~ÿÅ•ÿÓ®žÿæÑÆÿåÐÆÿÌ¢�ÿÀŒqÿ¿Šoÿ¾ˆlÿ½†jÿ¼„gÿ²rRÿ¡U.ÿ¡S,ÿ¡R,ÿ Q,ÿŸP+ÿŸO+ÿžN*ÿ�M*ÿœL)ÿ›J(ÿšI(ÿ™H'ÿ˜F'ÿ—D&ÿ–C%ÿ•A$ÿ”?$ÿ“>#ÿ’<"ÿ�:!ÿ�8!ÿŽ7 ÿ�5ÿŒ3ÿŠ1ÿ‰/ÿˆ-ÿ†+ÿ…)ÿ„'ÿ‚%Ú�#Eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ+ÿÿÿ&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË¥¢}|�#ö©jeÿÅš—ÿÄ™•ÿĘ“ÿĘ‘ÿÄ—�ÿÄ–ŽÿÄ–ŒÿÄ–ŠÿÕ‰ÿÔ‡ÿÔ„ÿÓ‚ÿÆ™ˆÿ×·«ÿèÕÎÿßÄ»ÿË¢�ÿÀŒvÿ¿Štÿ¾‰rÿ½ˆpÿ¼†nÿ»ƒkÿº�iÿ¹fÿ¯oRÿ�M+ÿœL)ÿœK)ÿ›J(ÿšI(ÿšH'ÿ™G'ÿ˜F&ÿ—E&ÿ–C%ÿ–B%ÿ•@$ÿ”?$ÿ“=#ÿ’<"ÿ‘:!ÿ�9!ÿŽ7 ÿ�5ÿŒ4ÿ‹2ÿŠ0ÿ‰.ÿ‡,ÿ†*ÿ…(ÿƒ'ÿ‚%ö�#|€!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ:ÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†,%|�‰1+õ¨hcÿÁ”�ÿדÿÖ‘ÿÕ�ÿ•�ÿ”Œÿ“‰ÿÂ’ˆÿÉŸ•ÿÚ¾·ÿæÔÎÿغ°ÿŘŠÿ¿Œ|ÿ¾‹yÿ¾‰wÿ½ˆuÿ¼†sÿ»„pÿºƒnÿ¹�lÿ¸iÿ·}gÿµzdÿ­kRÿ™H)ÿ—D&ÿ—C%ÿ–C%ÿ–B%ÿ•A$ÿ”@$ÿ“?#ÿ“=#ÿ’<"ÿ‘;"ÿ�9!ÿ�8 ÿŽ7 ÿ�5ÿŒ3ÿ‹2ÿŠ0ÿ‰/ÿˆ-ÿ†+ÿ…)ÿ„(ÿƒ&ÿ‚$ô€"� ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ+ÿÿÿFÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||‚�$ð�TOÿº‡„ÿ•‘ÿÄ™•ÿÌ¥¡ÿÓ³®ÿÞÆÂÿâÍÉÿѯ¨ÿÁ‘‡ÿ¿��ÿ¾‹ÿ½Š}ÿ¼ˆ{ÿ¼‡xÿ»†vÿº„sÿ¹‚qÿ¸€oÿ·~lÿ¶|jÿ´zgÿ³xeÿ²vcÿ®mYÿ›N6ÿ’="ÿ’<"ÿ‘;"ÿ‘:!ÿ�9!ÿ�8!ÿ�7 ÿŽ6 ÿ�5ÿŒ4ÿ‹2ÿŠ1ÿ‰0ÿˆ.ÿˆ-ÿ†+ÿ…)ÿ„(ÿƒ&ÿ‚$ÿ�#ï€!‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÿÿÿGÿÿÿSÿÿÿ>ÿÿÿ*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ áÊÉ0µ{—´|xäÊ¢ ÿÚ¿½ÿÛÁ¾ÿÓ²°ÿÊ¢žÿ¾�Šÿ¾�‡ÿ½Œ„ÿ¼Š‚ÿ¼Š€ÿ»ˆ~ÿ»†|ÿº…yÿ¹ƒwÿ¸�tÿ·€rÿ¶~pÿµ|mÿ´zkÿ³wiÿ±ufÿ°scÿ¯paÿ­n^ÿ¢[Iÿ‘;&ÿ�4ÿŒ4ÿŒ3ÿ‹2ÿ‹1ÿŠ0ÿ‰/ÿˆ.ÿˆ-ÿ‡+ÿ†*ÿ…(ÿ„'ÿƒ&ÿ‚$ÿ�#ÿ€!Ôs~ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ'ÿÿÿ<ÿÿÿLÿÿÿ^ÿÿÿoÿÿÿvÿÿÿxÿÿÿzÿÿÿxÿÿÿdÿÿÿJÿÿÿ.�UP@|’‰1+í¢]Xÿ²zvÿ¾�Šÿ½Œˆÿ¼Š†ÿ»‰„ÿ»‡�ÿº†ÿ¹„}ÿ¸ƒzÿ·�xÿ¶€vÿ¶~tÿµ|qÿ³zoÿ²xlÿ±uiÿ°tgÿ®qdÿ­oaÿ¬l_ÿªi\ÿ§dWÿ–F7ÿˆ.ÿ‡,ÿ‡+ÿ†+ÿ†*ÿ…)ÿ„(ÿƒ'ÿƒ%ÿ‚$ÿ�#ÿ€!ÿ ë~’}3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||O|˜�#Ú�=7ÿŸYTÿ®snÿº†ƒÿ¹…�ÿ¸ƒÿ·�|ÿ¶zÿµ~wÿ´|uÿ³zsÿ²xpÿ±vmÿ¯skÿ®rhÿ­ofÿ¬lcÿªj`ÿ©g^ÿ§e[ÿ¥bXÿ¢\Rÿ—I>ÿ�9-ÿ…)ÿ�#ÿ�"ÿ€!ÿ ÿÿ~Ù}˜|O|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||Z|›€!׎;5ûœSNÿ¦c_ÿ©jeÿ­plÿ°uqÿ±ytÿ°wqÿ¯toÿ®rlÿ­piÿ¬mgÿªkeÿ©hbÿ§e_ÿ¦c\ÿ¤`Yÿ¡\UÿœRKÿ–G@ÿ�<5ÿ…+"ú|Ö|›|Z|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ||%|L|s|š|µ~ă' Ò‡.(àŠ4.íŽ:4ú�<6ú�82í‹4.áˆ1*Ô†,&ǃ'!¸~›|s|L|%|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿàüÿÿÿÀð?ÿÿÿ€`ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÀÿÿÿÀÿÿÿàÿÿð?ÿÿøÿÿüÿÿþÿÿÿÿÿÿ€ÿÿÿàÿÿÿðÿÿÿøÿÿÿüÿÿþ?ÿÿÿ?ÿÿþÿÿþÿÿüÿÿøÿÿøÿÿðÿÿðÿÿàÿÿàÿÿÀÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿþþþþü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?þ?þ?þ?þ?ÿ?ÿ?ÿÿÿ€ÿÿ€ÿÿÀÿÿÀÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿøÿÿøÿÿü?ÿÿþÿÿþÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿøÿÿÿÿü?ÿÿÿÿþÿÿÿÿ¿ÿÿÿÿÿ¿€ÿÿÿÿÿŸÀÿÿÿÿÿ�àÿÿÿÿÿÇðÿÿÿÿÿãø?ÿÿÿÿÿñüÿÿÿÿÿøþÿÿÿÿÿÿü?ÿÿÿÿÿÿþÀÿÿÿÿÿÿÿ�ä?ÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€ @  ÿÿÿ .0' ÿÿÿÿÿÿÿÿÿÿÿÿ !#$%%$"  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6b***Œ444™ tP*ÿÿÿÿÿÿ  (08?EKPTWZ[[YWSOJD=5-$ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2000�   ò¼¼¼ÿ¨¨¨ÿ£££ýwwwÒc2  *4?KVajt}„Œ‘–˜˜•‘Šƒ{rh^SG=2' ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ [µµµú¨¨¨ÿÅÅÅý½½½î¬¬¬ÿ���ÿ‚‚‚âj2 #0<HTbnz†‘�§±¹Àÿ¸¯¦›�„yl_SF9, ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+tttµ±±±ÿÁÁÁꌌŒT™™™}¶¶¶ó­­­ÿ‡‡‡ài1#0<IUco|ˆ4 ©Z*Êj3Ùw:å‚? ï�C"ö˜K%ü™L$üŽG#öƒ@ ïy=åm6Ùa0Ê=ª ‡znaTG:.! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0­­­ç¾¾¾þzzzo –––·ÁÁÁÿ½½½ÿˆˆˆÞf/!+8B SV(ˆ|9Á“E#ð�N'ÿ£T*ÿ§Y+ÿ«_,ÿ­b-ÿ®e/ÿ¯f/ÿ°g/ÿ¯f/ÿ®e/ÿ­c-ÿ«_,ÿ¨Z+ÿ£T*ÿ™N&ñƒB Âa2‹$ T C 7+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÄÄÄù¶¶¶îA&&&&q¹¹¹ÿÁÁÁÿÁÁÁÿ………Ûb-  T*6‰: ©—D$óžM'ÿ¤W*ÿ«_,ÿ¯e/ÿ²j0ÿµn1ÿ·p2ÿ¹r3ÿ¹u3ÿºu3ÿ»u3ÿºu3ÿ¹u3ÿ¹r3ÿ·p2ÿ¶n1ÿ·t>ÿ¼~Pÿ¸xKÿ¯kCÿ§`;õ—P/¯k<:-- " ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍêÁÁÁúpD<Ylllɺººÿ’’’ÿÁÁÁÿ¾¾¾ÿ}}}Ô_*zD"‘?"�—E$öžN'ÿ¦Y*ÿ­c-ÿ²j0ÿ¶o2ÿ¸r3ÿ¹t3ÿºu4ÿ»w4ÿ»v4ÿ¼w4ÿ¼x5ÿ¼x5ÿ¼w4ÿ¾~>ÿÎ�nÿÑ£uÿÏŸqÿÈ’_ÿ¿€Hÿ½}Eÿº{Gÿ¸vGÿµtMÿ±qQø®mK�©u?ÀÀ@€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¹¹¹ ÛÛÛÿ{{{͈Œ¦†††õ»»»ÿ,,,ÿJJJÿÃÃÃÿºººÿhhhÄ bj+Š�=!ïœK&ÿ¥W*ÿ­b-ÿ±j/ÿ¶n2ÿ·r3ÿ¹s3ÿºt4ÿºu4ÿºu4ÿºv4ÿ»v4ÿ»v4ÿºv4ÿ‡MÿÓ§|ÿРtÿ¿Bÿºu3ÿºu4ÿºt4ÿºt4ÿ¹s3ÿ¸s6ÿ·q6ÿ²j0ÿ­c-ÿ«a6ÿ¬hEñªcDƒÀ–@ ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿjjj+ÈÈÈÞÎÎÎþšššäpppç›››ü×××ÿnnnÿÿÿYYYÿÃÃÃÿ²²²þ`KEðf3ÿ�jNÿÄ—{ÿѧˆÿÖ®�ÿ×±�ÿÚµ•ÿز�ÿѤ|ÿÊ–eÿÁ…Mÿ¸s3ÿ¸q4ÿ·q3ÿ¼|DÿÓ§‚ÿÈ”gÿ·r6ÿ¶p2ÿ¶q3ÿ·q4ÿ¸r3ÿ·r3ÿ¸r3ÿ¸q2ÿ·q3ÿ¸u9ÿºw=ÿ´l0ÿ°f/ÿª]-ÿ¨]5ÿ¤Y9Ò­c-!ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfff&ÂÂÂ×ëëëÿÝÝÝÿÀÀÀÿefeÿ233ÿ%'&ÿÿ ÿkkkÿÃÃÃÿ¨§§ÿgTJÿzP3ÿš]/ÿ­h/ÿ³n1ÿ´n2ÿ´l2ÿ¶p8ÿ½€NÿÅ‘gÿÑ¥„ÿÛ»¢ÿѧˆÿÏ£„ÿɘwÿ®e4ÿ¬b/ÿ¬b0ÿ­c0ÿ­e0ÿ¯f0ÿ°g1ÿ°g1ÿ±h1ÿ±i1ÿ²j0ÿ³l1ÿ¶p8ÿ»{Dÿ³k1ÿ°g0ÿ«`-ÿ¦Y.ÿ¢V3è¢R+:ÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZZZºººÑçççÿŸŸŸÿ010ÿIMKÿ9;:ÿ&('ÿÿÿ}}}ÿÁÁÁÿŸž�ÿZ>)ÿxF ÿ›[*ÿªc.ÿ­e0ÿ«b/ÿª_.ÿ¨\.ÿ¨[.ÿ¦Z-ÿ°lDÿÓ­—ÿШ’ÿÖ³ ÿÈš�ÿ©_8ÿ¤V-ÿ¤X.ÿ¥X-ÿ¥X-ÿ¦Y-ÿ¥X-ÿ¦Z-ÿ§Z-ÿ©].ÿ«`.ÿ­c/ÿ³m:ÿ·sBÿ±g0ÿ°g/ÿ¬a-ÿ¦Z.ÿžM*÷�H&]ÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTTT²²²Éæææÿ¡¡¡ÿ777ÿIMKÿ9<;ÿ')(ÿÿÿ���ÿ¿¿¿ÿ—•“ÿS4ÿtA ÿ“P(ÿ V,ÿ£V,ÿ£U,ÿ¢T-ÿ¢S-ÿµxXÿÇ™€ÿ£X/ÿ¢U-ÿ¢U.ÿ´vVÿÔ°žÿǘ€ÿ¦[6ÿ¢S,ÿ¡T,ÿ¡S+ÿ¡R+ÿ Q,ÿ¡R,ÿ¡S*ÿ¢S+ÿ£V,ÿ¥Y,ÿ´rIÿ­d4ÿ¬b.ÿ­b.ÿ«_-ÿ¥W-ÿ›J&þ˜F%zÿªUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHHH¨¨¨Áäääÿ«««ÿ9::ÿHKIÿ:=<ÿ(*)ÿÿÿŸŸŸÿ½½½ÿ�‹‰ÿM*ÿp9ÿ�I'ÿ�P+ÿ¡T-ÿ¢U.ÿ¼„gÿÂ�tÿ£V.ÿ£W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ¤W.ÿ´wUÿÓ¯œÿÆ•|ÿ¤X1ÿ¢T-ÿ¡S,ÿ S,ÿŸR,ÿ P,ÿŸO+ÿŸO*ÿŸO+ÿ¡S-ÿ²rOÿ¥W+ÿ¨\-ÿ©^-ÿ¨\,ÿ¢T)ÿšH&þ˜G&[ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<<< ¡¡¡·âââÿ±±±ÿ>?>ÿFJHÿ;><ÿ)+*ÿÿ&&&ÿ«««ÿ¸¸¸ÿ…|ÿN,ÿyI0ÿ�cEÿ±sTÿЩ”ÿϦ�ÿ¹^ÿµvTÿ°mGÿ¬d<ÿ§[1ÿ¦Z/ÿ¦Z/ÿ¥Z/ÿ¥Y/ÿ·zYÿÕ²Ÿÿ²pMÿ£V.ÿ¢U-ÿ¡S,ÿ R,ÿŸQ+ÿžP+ÿ�N+ÿ�M*ÿ¬hJÿ¢T/ÿ R)ÿ¤W+ÿ¦Y,ÿ¦X+ÿ P)ÿ™E%÷�H$8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx9$#˜z÷ßßßÿ¹¹¹ÿCDDÿFIGÿÿ©a7ÿÌ¢ŠÿÆ–|ÿ¥X0ÿ£V.ÿ¢U-ÿ¡S,ÿ Q,ÿŸP+ÿžN*ÿ¡U3ÿ«gJÿœK(ÿ�M(ÿ Q*ÿ¢T*ÿ¢T)ÿ�M'ÿ–B%å¢M"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’$$‹4Ê’@(ÿ“vjÿÜÜÜÿÀÀÀÿKKKÿFIGÿ=?>ÿ*,+ÿÿ999ÿ»»»ÿªªªÿh\Tÿ`F7ÿ‰_Fÿ˜U,ÿ¦]1ÿ¨`2ÿª`2ÿªa2ÿªa2ÿªa2ÿªa2ÿª`2ÿ­f9ÿ¹}YÿÇ—yÿÍ¢‡ÿËž„ÿÇ—|ÿÓ®™ÿ¯lGÿ¤W.ÿ£V.ÿ¢T-ÿ¡R,ÿŸP+ÿžO*ÿ²rVÿ›K(ÿ›J(ÿ›K'ÿžM(ÿ O(ÿŸN(ÿ›H%ÿ”@#̪r8 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰1s�7 ÿ•@#ÿœM)ÿ˜�uÿÙÙÙÿÆÆÆÿSTSÿDGFÿ=@?ÿ+-,ÿÿGGGÿ¾¾¾ÿ¢¡¡ÿ_TNÿU0ÿ}G%ÿ›Y.ÿ©a2ÿ«d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬d4ÿ¬c3ÿ«c3ÿ«b3ÿ«a3ÿª`2ÿªb5ÿ»�^ÿΤŒÿã˽ÿÅ”xÿ¥Y1ÿ£W.ÿ¢U-ÿ¡S,ÿŸQ+ÿ±rUÿ Q/ÿ›K(ÿšI(ÿšI'ÿ›J'ÿ�L'ÿœK&ÿ—C$ÿ“? tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ3"Œ3í‘;!ÿ£Y<ÿµw]ÿŸR1ÿŒjZÿÔÔÔÿÊÊÊÿ\]]ÿDFEÿ>A@ÿ,.-ÿÿVVVÿ¾¾¾ÿ™™˜ÿN<0ÿW3ÿ€L'ÿž^0ÿ«e4ÿ­g5ÿ®g5ÿ®g5ÿ®g5ÿ®g5ÿ®f5ÿ­e4ÿ­d4ÿ¬c3ÿ«b3ÿªa2ÿ©`2ÿªb6ÿÕ±œÿÙ¹¦ÿÂŽrÿ¦[3ÿ¢U-ÿ¡S,ÿ­kKÿ§`>ÿœL)ÿ›J(ÿ™H(ÿ™G&ÿšG'ÿ›H'ÿ˜E$ÿ“?"í–K-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ2†�:#ÿ©fPÿ§_DÿšH'ÿšJ(ÿ›L*ÿ�gVÿÑÐÐÿÎÎÎÿghhÿCEDÿ?B@ÿ,/.ÿÿiiiÿ»»»ÿ’��ÿE1#ÿZ6ÿ„O(ÿ¡a1ÿ®i6ÿ°k7ÿ°j7ÿ°j6ÿ°j6ÿ°i6ÿ¯h6ÿ®g5ÿ®f5ÿ­e4ÿ¬d4ÿ«b3ÿªa2ÿ©_2ÿÃ�rÿÊ�„ÿÊ�„ÿÃ�tÿ¥[4ÿ«eBÿ®kKÿžN*ÿœL)ÿšI(ÿ™G(ÿ˜F'ÿ˜F&ÿ˜E%ÿ”@$ÿ‘;!‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰'Œ4 õ¦aMÿ™G+ÿ˜E&ÿ™H(ÿ›L)ÿžO*ÿ R,ÿ‘hSÿËËÊÿÒÒÒÿrsrÿCEDÿ@CAÿ-/.ÿ!"!ÿ}}}ÿ¸¸¸ÿЉ‡ÿ?*ÿ\8ÿ‡R*ÿ¤e3ÿ°l7ÿ²n8ÿ²m8ÿ²m7ÿ±l7ÿ±k7ÿ°j6ÿ°i6ÿ¯h5ÿ®f5ÿ­e4ÿ¬c3ÿ«a3ÿ©`2ÿ¼„aÿÈ™}ÿ­jCÿÈ™€ÿÅ•|ÿ·{]ÿŸP+ÿ�M*ÿ›K)ÿšH'ÿ˜F&ÿ—D&ÿ—D%ÿ•A#ÿ’="õ�Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰.—žUDÿ—C+ÿ–B%ÿ˜E'ÿšJ(ÿ�N*ÿ R,ÿ£V.ÿ¤X/ÿ•iOÿÇÆÅÿ×××ÿ~~~ÿBDDÿ@CBÿ.0/ÿ&&&ÿ���ÿ²²²ÿ‚}ÿ='ÿ^;ÿ‰V+ÿ§h5ÿ²o8ÿ³p9ÿ´p9ÿ´o9ÿ³n8ÿ²m8ÿ±l7ÿ±k7ÿ°i6ÿ®g5ÿ­f4ÿ¬d4ÿ«b3ÿª`2ÿ¸|XÿÅ“vÿ¥Y/ÿ®jEÿÙ¹©ÿ®kKÿžO+ÿ�L)ÿ›J(ÿ™G'ÿ—E&ÿ–C%ÿ•A$ÿ“="ÿ‘9!˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™33˜K;ò”B,ÿ“>#ÿ–B&ÿ™H'ÿœL)ÿŸP+ÿ¢U-ÿ¥Y/ÿ§]1ÿ©`2ÿškLÿÂÀ¾ÿÛÛÛÿŠŠŠÿBDCÿADCÿ/10ÿ+++ÿ¢¢¢ÿ«««ÿxtqÿ<&ÿa=ÿŒY-ÿ©k6ÿ³q9ÿµs:ÿ¶r:ÿµq9ÿ´p9ÿ³o8ÿ²m8ÿ±l7ÿ°j6ÿ¯h6ÿ®f5ÿ¬d4ÿ«b3ÿª`2ÿ¼ƒ`ÿ½…eÿ¥Y/ÿÀ‹qÿ½‡lÿÀ�tÿ Q-ÿœK)ÿšH(ÿ˜E&ÿ–C%ÿ•A%ÿ“=#ÿ‘:"ð™33ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒ8&HšL<ÿ�9 ÿ“?#ÿ—E&ÿ›I(ÿžO*ÿ¡S,ÿ¤X.ÿ§\0ÿª`2ÿ¬c3ÿ­g5ÿº �ÿ¼¹¶ÿßßßÿ—˜—ÿABBÿBEDÿ021ÿ/0/ÿ²²²ÿ¤¤¤ÿle`ÿ>(ÿc@ ÿŽ[.ÿ«n8ÿµt;ÿ¶u;ÿ·t;ÿ¶s:ÿµq:ÿ´p9ÿ³n8ÿ²l7ÿ±k7ÿ¯i6ÿ®g5ÿ¬d4ÿ«b3ÿ©`2ÿÀ‰iÿ·zVÿÀŒoÿ¢U-ÿªb@ÿÇ™ƒÿ§`@ÿ›J(ÿ™G'ÿ—D&ÿ•A$ÿ’>#ÿ�;!ÿŒ7!Eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�UH¡�9%ÿ�:!ÿ•@$ÿ˜F'ÿœL)ÿ Q+ÿ£V.ÿ¦[0ÿ©_2ÿ¬c3ÿ®g5ÿÄ‘jÿÄ‘jÿ¦sIÿ·²®ÿâââÿ¤¤¤ÿABBÿCFDÿ031ÿ555ÿ¼¼¼ÿœœœÿ`YRÿ?)ÿeB!ÿ�^/ÿ¬p8ÿµv;ÿ¸v<ÿ·u;ÿ·t;ÿ¶r:ÿµq9ÿ³o8ÿ²m8ÿ±k7ÿ¯i6ÿ®f5ÿ¬d4ÿ«a3ÿ©_1ÿÑtÿǘ}ÿ£W.ÿ¢T-ÿ¡S-ÿÁ�xÿªeHÿ™H'ÿ—E&ÿ•A%ÿ“>#ÿ‘;"ÿ�7!”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›O@ç�5ÿ’<"ÿ–B%ÿšH(ÿžN*ÿ¡T-ÿ¥Y/ÿ¨^1ÿ«b3ÿ®f5ÿ°k7ÿײ–ÿ´p9ÿ¶s:ÿ¬vGÿ´­§ÿãããÿ²²²ÿBCCÿBFDÿ021ÿ===ÿÁÁÁÿ•••ÿ\TLÿ@+ÿeC!ÿŒ\.ÿ£k6ÿ®r9ÿ³t;ÿµu;ÿµt:ÿµs:ÿµq9ÿ´o9ÿ²m8ÿ±k7ÿ¯h6ÿ­f5ÿ¬c3ÿªa2ÿ¯lBÿÑ«”ÿ©a:ÿ¢U-ÿ¡R,ÿžO+ÿ»ƒkÿ®mRÿ˜F&ÿ–B%ÿ”?$ÿ‘<"ÿ�8!ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžXL>“@0ÿŽ7 ÿ“>#ÿ—D&ÿ›K)ÿŸQ+ÿ£V.ÿ§\0ÿª`2ÿ­e4ÿ°i6ÿÈ–pÿÃŒ`ÿ·t;ÿ¸v<ÿºy=ÿ²{Gÿ¯¦žÿãããÿ½½½ÿDEEÿBFDÿ021ÿGHHÿÀÀÀÿ‘‘‘ÿYPHÿ?*ÿY<ÿsM&ÿ†Y,ÿ•b1ÿŸg4ÿ¨l6ÿ®p8ÿ°o8ÿ±o9ÿ±m8ÿ±l8ÿ¯j6ÿ¯h5ÿ­e4ÿ«b3ÿ³rIÿ¾‡eÿ¾ˆiÿ£W.ÿ¡T-ÿŸP+ÿ�M*ÿ´w^ÿ°pWÿ–C%ÿ”@$ÿ’<"ÿ�9!ÿŒ73ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™M@|‘<+ÿ�8 ÿ”?$ÿ˜F'ÿ�M)ÿ¡S,ÿ¥Y/ÿ¨^1ÿ¬c3ÿ¯h5ÿ²m8ÿ׳•ÿ·t;ÿ¹w<ÿ»z=ÿ¼|>ÿ¾~?ÿ¸€Fÿ« •ÿáááÿÉÉÉÿHIHÿBEDÿ121ÿUVVÿºººÿŽŽŽÿSKBÿ4#ÿ?*ÿK2ÿX:ÿiF#ÿzP(ÿˆX,ÿ’]/ÿ˜`0ÿŸc2ÿ¦g4ÿ­i5ÿ¯h6ÿ®g5ÿ¬d4ÿ½„`ÿ²pHÿ²qLÿ²rOÿ¢U-ÿ Q,ÿžN*ÿœK)ÿ´w`ÿ¥^Dÿ•@$ÿ’=#ÿ�9!ÿ�7 pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœPD–Ž8$ÿ�9!ÿ•A$ÿ™H'ÿžO*ÿ¢U-ÿ¦[0ÿªa2ÿ®f5ÿ±k7ÿÉ—oÿÄŽ`ÿ¹w<ÿ»z=ÿ½}?ÿ¿€@ÿÀ‚AÿÁƒAÿ¼„Fÿ¨›ŒÿßßßÿÒÒÒÿMNMÿBEDÿ032ÿeeeÿ°°°ÿŠŠŠÿZSLÿ0"ÿ,ÿ1!ÿ9&ÿB,ÿK1ÿT7ÿ`>ÿnE#ÿ‚Q)ÿ™^0ÿ¨f4ÿ­g5ÿ­e4ÿȘyÿ©`3ÿ§\0ÿ¸}\ÿ§^8ÿ¡R,ÿžO+ÿœL)ÿšH'ÿ¸�lÿ›L1ÿ“=#ÿ�:!ÿŽ6ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸUJ±Œ4 ÿ�:!ÿ–B%ÿ›I(ÿŸP+ÿ¤W.ÿ¨]1ÿ¬c3ÿ¯i6ÿ³m8ÿ׳”ÿ¸v<ÿ»z=ÿ½~?ÿ¿€@ÿÁƒAÿÂ…BÿÇCÿĈDÿ‰Gÿ¦–„ÿÛÛÛÿÛÛÛÿSTTÿBECÿ242ÿ½½½ÿ™™™ÿ‹‹‹ÿzzzÿsqpÿ\WQÿ:/%ÿ*ÿ+ÿ/ÿ4"ÿ<'ÿO2ÿnE#ÿ�X,ÿ¥c3ÿ¬f4ÿÊ�~ÿª`2ÿ¨]1ÿ¨^4ÿ¶yYÿ¡T-ÿŸP+ÿœL)ÿšI(ÿšI*ÿ¸€nÿ”@&ÿ�:!ÿ�6!¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—I<Å’?,ÿ‘;"ÿ–C%ÿ›K)ÿ R,ÿ¥Y/ÿ©_2ÿ­e4ÿ±k7ÿŠ]ÿɘlÿºy=ÿ½}?ÿ¿�@ÿÁ„BÿÆCÿĈDÿÆŠEÿÇŒEÿÇ�FÿÆ�Hÿ¥“}ÿ×××ÿáááÿiiiÿuuuÿ´´´ÿ˜˜˜ÿŽŽŽÿ��€ÿ•••ÿ†††ÿyyyÿqqpÿkjiÿ\XUÿD;4ÿ,ÿ/ÿC*ÿf? ÿŽV,ÿ¦c4ÿÊ�ÿ«a3ÿ¨^1ÿ¦[0ÿ­gBÿ«dAÿŸP+ÿ�M*ÿ›I(ÿ˜F&ÿžP5ÿ­lXÿ‘:!ÿŽ7 ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹4&ÚœQ@ÿ‘;"ÿ—D&ÿœL)ÿ¡S,ÿ¦[0ÿªa3ÿ¯h5ÿ³m8ÿÔ­Œÿº{@ÿ¼|>ÿ¿€@ÿÁ„BÿÇCÿÅŠDÿÇŒEÿÈŽFÿÉ�GÿÊ�GÿÊ‘GÿÈ‘Hÿ®˜|ÿÒÒÒÿêêêÿõõõÿïïïÿ›››ÿ\[[ÿ<=;ÿ^_]ÿ~|ÿ ¡¡ÿ�‘‘ÿ€€ÿtuuÿlllÿhhhÿPLIÿ.ÿB)ÿkA!ÿ�iCÿ½‹hÿªc3ÿ©_2ÿ§\0ÿ¤Y0ÿ°oMÿ Q+ÿ�M*ÿ›J(ÿ˜F&ÿ–B%ÿ¯p\ÿ”?'ÿŽ7 Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…)ò¤]Nÿ‘<"ÿ—D&ÿ�M)ÿ¢T-ÿ§\0ÿ¬c3ÿ°j6ÿµq;ÿÖ¯Œÿ»{>ÿ¾@ÿÁƒAÿćCÿÆŠEÿÈ�FÿÉ�GÿÊ‘HÿË“HÿÌ”IÿÌ”IÿÌ•IÿÊ”Hÿ¬”sÿËËËÿíííÿûûûÿëëëÿÿlqoÿÔØ×ÿµ¹¸ÿxxvÿƒƒ‚ÿª«ªÿ�‘�ÿ…‡†ÿ}~ÿ~ÿ`_^ÿ5%ÿL/ÿŽnVÿ£e:ÿªb2ÿ©`2ÿ§\0ÿ¥Y/ÿ¨`:ÿ¦]:ÿ�N*ÿ›J(ÿ˜F'ÿ–B%ÿ™I/ÿ©dQÿŽ6 òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…(ò¥aQÿ’=%ÿ—D&ÿ�M*ÿ£U-ÿ¨]1ÿ­e4ÿ±l7ÿÆ�dÿÇ”dÿ½}?ÿÀ‚AÿÇCÿÆŠEÿÈŽFÿÊ�GÿË“HÿÌ•IÿÍ–JÿΗJÿϘJÿϘJÿϘJÿÉ“Hÿ£–„ÿÏÐÏÿíííÿ¨§¥ÿ:<:ÿ–š˜ÿÕ×Öÿ«°­ÿÿ««ªÿ®°¯ÿ¤¦¥ÿšœ›ÿ‘’’ÿ¬­­ÿ—˜—ÿlkjÿ?,ÿv^Mÿ“W-ÿ§a3ÿª`2ÿ§]1ÿ¥Y/ÿ¢U-ÿ©a@ÿ�N*ÿ›J(ÿšJ+ÿ–B%ÿ“>#ÿ©gSÿ�:%òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„'Ø’@-ÿ¦`Lÿ—D&ÿ�M*ÿ£V.ÿ¨^1ÿ®f5ÿ²m8ÿÔ­‹ÿ¼{?ÿ¿€@ÿÂ…BÿÅŠDÿÈŽFÿÊ‘GÿÌ”IÿΖJÿϘKÿКKÿЛLÿÑ›LÿÑ›LÿÑ›LÿΚKÿ¶�Yÿ°±±ÿÛÜÜÿYXTÿ_caÿ¹¿½ÿÜßÞÿadcÿ677ÿÎÏÏÿÂÄÃÿº»»ÿ®°¯ÿšœœÿ¿¿¿ÿ­­­ÿ���ÿb^ZÿaI6ÿˆQ*ÿ¥_2ÿ©a2ÿ¨]1ÿ¥Y/ÿ£U-ÿ£W2ÿ T2ÿ©cFÿ±s[ÿ–B%ÿ“>#ÿ›N8ÿšN9Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„&¾Š0ÿ­n[ÿ˜F)ÿ�M*ÿ£V.ÿ©_2ÿ®g5ÿ³o8ÿÔ¬ˆÿ¼|>ÿÀ‚AÿĈCÿÇŒEÿÊ‘GÿÌ”IÿΗJÿКKÿÑœLÿÒ�MÿÓžMÿÓžMÿÓŸMÿÓžMÿÑ�MÿÊ—Jÿ�•‰ÿµ·¶ÿªª¨ÿpqnÿÄÆÄÿ°µ³ÿ]][ÿ””“ÿÌÎÍÿÉÊÊÿÆÇÆÿ³´³ÿ•—–ÿÄÅÅÿ¿¿¿ÿ¡¡¡ÿ��ÿjP;ÿŠR+ÿ¤`1ÿ©a2ÿ¨]1ÿ¥Y/ÿ¢U-ÿ¡S.ÿ·|bÿÓÿº‚mÿ•A%ÿ“=#ÿ’=%ÿ¦`PÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�$¤ˆ.ÿ—H2ÿ­lTÿ�M*ÿ£V.ÿ©_2ÿ¯h5ÿ¼€PÿÏ¡yÿÀ�DÿÂ…CÿÆŠEÿÉ�GÿÌ”IÿΗJÿЛLÿÒ�MÿÓŸNÿÔ NÿÕ¡OÿÕ¢OÿÕ¢OÿÕ¡OÿÔ NÿÏ›Lÿ£‹gÿª¬«ÿÌÌÌÿÞÞÞÿÑÒÑÿ‰‰†ÿSRMÿרØÿÒÓÓÿÏÑÐÿÌÎÍÿ§¨¨ÿ���ÿÄÆÅÿÒÒÒÿ³³³ÿ’““ÿ~obÿœ]0ÿ¨b2ÿ©a2ÿ¨]1ÿ¥Y/ÿ¢U-ÿº�eÿÊž‹ÿÊŸŽÿÂ�~ÿ•A$ÿ’="ÿ�8!ÿ©fW´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ї,ÿŽ7 ÿ®nYÿ¦^>ÿ£V.ÿ©`3ÿµsEÿÍŸyÿÈ“cÿÇJÿÅ‹IÿÇŽGÿË’HÿΗJÿЛLÿÓžMÿÔ NÿÖ¢OÿפPÿ×¥Pÿ×¥Pÿ×¥PÿפPÿÖ£PÿÒ Nÿ¶‘Rÿ¥¦¥ÿµ·¶ÿÎÎÎÿÜÜÜÿàâáÿæççÿÜÝÜÿÙÚÙÿÖ××ÿÉÊÉÿ—™˜ÿ‘Œ‚ÿ³›€ÿÊÉÆÿÆÆÆÿ§§§ÿˆ�xÿ¦h;ÿ¬d4ÿªa2ÿ§]1ÿ¥Y/ÿ¢U-ÿ«fEÿЫ™ÿѬ�ÿÊŸ�ÿ”@$ÿ’<"ÿ�8 ÿ©hXœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}p…)ÿ�4ÿ”?$ÿºƒkÿ¨`;ÿµvOÿ¼€VÿÕ°‘ÿÉTÿÅ�QÿÉ�PÿË“NÿÍ—LÿКKÿÒžMÿÕ¡OÿפPÿئQÿÙ§QÿÙ¨QÿÚ¨RÿÙ¨QÿÙ§QÿئQÿÖ¤PÿÉ™Jÿ–’‹ÿ¸»ºÿ¿¿¿ÿÐÐÐÿâãâÿâãâÿáââÿßààÿÝÞÝÿ±²²ÿ˜‹zÿ½€Bÿ¼|>ÿºx>ÿ­›ÿ©¥žÿ•”‘ÿ¤mDÿ­e4ÿª`2ÿ§\0ÿ¤X/ÿ¢T-ÿŸP+ÿÄ”ÿع¬ÿÓ°¤ÿ”?$ÿ‘;"ÿŽ6 ÿªj[„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}3ƒ%ÿ‹1ÿ’=#ÿ£X:ÿϦ’ÿº�]ÿ¾„[ÿײ•ÿÅ�XÿÇ’WÿË•VÿΙUÿМSÿÓžPÿÕ¡NÿפPÿÙ§QÿÚ©RÿÛ«SÿÜ«SÿÜ«SÿÛ«SÿÛªRÿÚ©RÿÙ§QÿПMÿ˜ˆnÿÀÂÁÿ···ÿÒÒÒÿçèçÿèéèÿèèèÿæçæÿâããÿ›ˆpÿ¹~?ÿ¼~?ÿ»{>ÿÊ—jÿÇ”hÿ´p9ÿ©wOÿªk=ÿ¬d4ÿª`2ÿ§\0ÿ¤X.ÿ¡S,ÿžO+ÿ¥[<ÿݸÿݹÿ“>#ÿ�9!ÿ�5ÿÀ�„Pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€!ãˆ-ÿ–C,ÿ´waÿ¿ŒsÿÒ­–ÿÁ‰cÿس–ÿÇ‘^ÿÊ•]ÿÍš\ÿО[ÿÔ¡YÿÕ¤XÿاUÿÙ©RÿÛ«SÿÜ­TÿÝ®TÿÞ¯TÿÞ¯TÿÝ®TÿÝ­TÿܬSÿÚªRÿÕ¥Oÿ¨�_ÿ·¸·ÿÇÇÇÿâââÿëììÿîîîÿîïîÿíííÿÊÈÃÿ‚Z,ÿšj5ÿ©q8ÿ°t:ÿÓ±‘ÿ¶s;ÿ´p9ÿ±l7ÿ¯h5ÿ¬c3ÿ©_2ÿ¦[0ÿ£W.ÿ R,ÿžN*ÿ›J(ÿ‘ÿçÔÍÿ“>$ÿ�8 ÿŒ4ãÿÿÿ#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~”‰1"ÿ°sdÿ·kÿºƒiÿÑtÿضžÿصšÿÉ•eÿÌ™cÿОbÿÓ¢aÿÖ¦`ÿÙª^ÿÚ­\ÿÜ®ZÿÞ¯Wÿß°Uÿà²Vÿà²Vÿà²Vÿß±UÿÞ°UÿÝ®TÿܬSÿרQÿ½—Tÿ¥¦¥ÿÖ××ÿéêêÿîïîÿòòòÿôôôÿôôôÿ‘Š‚ÿK4ÿ_A!ÿvO'ÿ–rNÿ¬€Zÿ­m7ÿ³n9ÿ±k7ÿ®g5ÿ«b3ÿ¨^1ÿ¥Z/ÿ¢U-ÿ Q+ÿ�M)ÿšH'ÿœM0ÿçÓÍÿ—E-ÿŽ6 ÿ–C0šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~EšMCÿ¶~qÿ¹�pÿ¼…nÿ¿‰mÿÇ–vÿæÐ¿ÿÍ�rÿÍ�iÿÒ¢hÿÕ¦gÿØ«fÿܯeÿݲbÿß´`ÿáµ^ÿâ¶[ÿâµWÿâµWÿâµWÿá´Wÿà²Vÿß°UÿÝ®TÿÚªSÿÑ¡Oÿ’�ŠÿÖÖÖÿéééÿîïïÿôôôÿùùùÿúúúÿš–‘ÿ. ÿ6$ÿC-ÿhXHÿ}P(ÿ¡e3ÿ°l7ÿ°j6ÿ­e4ÿªa2ÿ§]0ÿ¤X/ÿ¢T-ÿŸO+ÿœK)ÿ™G'ÿ–B%ÿ»…uÿ›L7ÿ�4ÿµ~s_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿf3ƒ(!ñ¶€vÿº„uÿ½‡sÿÀŒrÿÆ–yÿÕ°•ÿßÀ¥ÿÖ®…ÿÒ¤mÿשlÿÛ¯lÿÞ³kÿà¶iÿâ¹fÿä»dÿå»aÿä¹\ÿä¸Yÿä¸Xÿã·XÿâµWÿà²VÿÞ°UÿÜ­TÿרQÿž�vÿÓÔÔÿæççÿìììÿñòòÿ÷÷÷ÿüüüÿ¯¬©ÿ,ÿ1!ÿF9,ÿ\B)ÿ€R)ÿ£f3ÿ°l7ÿ¯h6ÿ¬d4ÿ©`2ÿ¦[0ÿ£W.ÿ R,ÿ�M*ÿšI(ÿ—D&ÿ”@$ÿ’=%ÿ“@*ÿŽ8%ðòåå$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{—§e]ÿ»†{ÿ¾ŠxÿÀ�wÿÉœƒÿÒ«�ÿË›tÿܹ—ÿâÆ¤ÿØ®vÿܱqÿà·pÿâºnÿå¾mÿçÀkÿèÀhÿçÀcÿæ¼Zÿæ»Zÿå¹Yÿã·Xÿá´Wÿß±UÿÝ®TÿÛªRÿºœgÿ»¼»ÿâããÿèèèÿíîíÿòòòÿõööÿÁ¿¾ÿzupÿgZMÿwcOÿ…V,ÿŸe3ÿ­l7ÿ°k7ÿ®g5ÿ«b3ÿ¨^1ÿ¥Y/ÿ¢U-ÿŸP+ÿœK)ÿ™G'ÿ–B%ÿ“>#ÿ�9!ÿ�4ÿ¥_Q§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ž93ö¼ˆÿ¾Œ~ÿÁ�|ÿÉœ…ÿÓ¬”ÿÌ�yÿТxÿ×®�ÿèÏ­ÿãÂ�ÿá¹uÿä¿tÿèÂsÿéÄqÿëÅnÿëÅkÿèÀ^ÿç½[ÿæ»Zÿä¸YÿâµWÿà²VÿÝ®TÿÛªSÿÓ¦Uÿ¢ŸšÿÙÛÚÿãããÿçèèÿìììÿïïïÿñòòÿòòòÿÕÔÓÿ¢›•ÿ|jZÿ“hCÿ±m8ÿ°i6ÿ­e4ÿª`2ÿ§[0ÿ¤W.ÿ R,ÿ�N*ÿšI(ÿ—D&ÿ”@$ÿ‘;"ÿŽ7 ÿ›O>ö²xk&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|†±wpÿ¿�ƒÿÁ��ÿÅ–�ÿÕ²žÿË�}ÿÏ£|ÿÔ©|ÿد{ÿåÈ›ÿî×±ÿéÊŒÿéÆyÿìÉwÿíÊuÿíÉqÿìÆiÿé¿\ÿç½[ÿåºYÿã¶Xÿà²VÿÝ®TÿÛªRÿئQÿÆ cÿ²²±ÿÜÝÜÿáââÿåæåÿèéèÿêëêÿêëëÿêëêÿïïïÿòòòÿËÅÀÿ±k8ÿ®g5ÿ«b3ÿ¨]1ÿ¥Y/ÿ¢T-ÿŸP+ÿœK)ÿ˜F'ÿ•B%ÿ’=#ÿ�8!ÿœP=ÿ™M=�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw"Œ71ï¿�ˆÿÁ’†ÿÄ•„ÿÕ³¢ÿÊ�‚ÿ΢�ÿÓ¨€ÿ×®ÿܵÿá½€ÿîÕ¤ÿóà´ÿñÕ’ÿïÏzÿðÎwÿîÌsÿëÃbÿè¾[ÿåºYÿã¶Xÿà²VÿÝ­TÿÚ©RÿפPÿÔ NÿÄ�fÿ³®¦ÿÑÒÑÿÞßßÿáââÿãääÿäååÿäåäÿâããÿÕÎÇÿ¹}Oÿ¯i6ÿ¬d4ÿ©_2ÿ¦[0ÿ£V.ÿ Q+ÿ�L)ÿ™H'ÿ–C%ÿ“?#ÿ“?&ÿ¤]Lÿ—G6ïˆ3"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{r¦c^ÿÁ’ŠÿÄ•‰ÿÔ²¤ÿÊ�…ÿÍ¡„ÿѧƒÿÕ¬ƒÿÚ³‚ÿຂÿå‚ÿêʃÿóݤÿøæ¸ÿõÝ›ÿðÏzÿìÉpÿç½\ÿå¹Yÿâ´Wÿß°UÿÜ«SÿÙ§QÿÕ¢OÿÒžMÿÏ™KÿÊ•Mÿ½žuÿ¼®�ÿÆÅÃÿÍÌÊÿÍÈÂÿ̽¯ÿÄ �ÿ³p9ÿ°j6ÿ­e4ÿªa2ÿ§\0ÿ¤W.ÿ¡S,ÿžN*ÿšI(ÿ—D&ÿ”@$ÿ U?ÿ©eTÿ�7%ÿˆ-rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm$$ƒ'!̽Œ†ÿÕŒÿÓ±¦ÿÈ›‰ÿËŸ‡ÿϤ†ÿÓª†ÿذ…ÿÜ·…ÿ⾆ÿçdžÿîφÿô׈ÿõÝ›ÿöã±ÿôà®ÿí͇ÿã·[ÿà²VÿÝ­TÿÚ¨RÿÖ¤PÿÓŸNÿКKÿÍ–IÿÊ‘GÿÇŒEÿÇ�MÿßÀŸÿ¾€Bÿºy=ÿ·t;ÿ´p9ÿ±k7ÿ®f5ÿ«b3ÿ§]1ÿ¤X/ÿ¡S,ÿžO*ÿ›J(ÿ™G)ÿ§aIÿ¯o\ÿžT@ÿ‹2ÿˆ-Ê’$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€”D>è•�ÿΨ ÿÊ “ÿÊž‹ÿÌ¢‰ÿЦˆÿÔ¬‡ÿÙ²‡ÿݹ‡ÿâÀ‡ÿèLJÿí͇ÿîЄÿíÍ€ÿëÈ|ÿìÍ�ÿìКÿëΙÿåÈÿݲjÿÔ¡QÿКLÿÍ–IÿÊ‘GÿÇŒEÿÅŠGÿßÀžÿÁ…Iÿºz=ÿ·u;ÿ´p9ÿ±k7ÿ®g5ÿ«b3ÿ¨]1ÿ¥Y/ÿ¢T-ÿŸQ-ÿ§`Bÿ´ybÿ³vaÿžQ9ÿ�8 ÿŒ3ÿˆ.ä‰'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}3�TOøÆ›–ÿϬ£ÿÈœŽÿÊŸ�ÿΣ‹ÿѧŠÿÔ¬ˆÿزˆÿݸ‡ÿᾇÿä†ÿçÅ„ÿçÅ€ÿæÂ|ÿä¾xÿÞ²cÿئQÿØ©]ÿݵyÿáÀ�ÿà¿’ÿÞ¼�ÿذÿÓ¦tÿäɬÿÌ›jÿ¿ƒKÿ¸w?ÿµs=ÿµsBÿ¶uHÿ¶vMÿ¶xSÿº`ÿ¿‹qÿ¼†nÿ¸€hÿ«gMÿ—E)ÿ’<"ÿ�8 ÿŒ3ÿ‰.ö‡(3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}V¨gcþЬ¨ÿÇ›’ÿÈ��ÿË ŽÿÍ£ŒÿЧ‹ÿÔ¬‰ÿ×°ˆÿÚ´‡ÿݸ†ÿß»ƒÿà»�ÿàº}ÿß·xÿܳsÿÓžPÿÏ™KÿÍ•IÿÊ‘HÿÈ�FÿʼnDÿÉ”YÿâÆ©ÿÏ¡tÿËšmÿÌ�uÿΡ}ÿË�{ÿÆ”qÿÀŠgÿº]ÿ´uRÿªdAÿžO*ÿ›J(ÿ˜E&ÿ•A$ÿ’<"ÿ�7 ÿŒ3ÿˆ.þ…*Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~v·�}þÊ¢�ÿÇœ“ÿÉž‘ÿÊ �ÿÍ¢�ÿϦ‹ÿÑ©‰ÿÔ¬‡ÿÖ®…ÿذƒÿÙ±€ÿÚ±}ÿÙ¯zÿØ­uÿÒ¡bÿÈŽFÿÆ‹EÿĈDÿ„BÿÄ‹OÿÝ»›ÿ¾�Iÿ·u;ÿ´p9ÿ²l7ÿ¯h5ÿ¬c3ÿ©_2ÿ¦[0ÿ£V.ÿ R,ÿ�M*ÿšI(ÿ—D&ÿ”?$ÿ‘;"ÿŽ6 ÿ‹2ÿˆ-þ…'uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿW´}xúÆœ˜ÿÇœ•ÿÈ�’ÿÊŸ�ÿË �ÿÍ¢ŠÿÏ¥ˆÿѦ†ÿÒ¨ƒÿÓ©�ÿÓ¨}ÿÓ§zÿÒ¥uÿÑ¢qÿÆŽTÿ¿€@ÿ½}?ÿÄ‹VÿÙµ•ÿ¹xAÿ´p9ÿ²l7ÿ¯h6ÿ­d4ÿª`2ÿ§\0ÿ¤X.ÿ¡T-ÿžO+ÿœK)ÿ™G'ÿ–B%ÿ“>#ÿ�9!ÿ�5ÿŠ0ÿ‡,ö…'Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�519©jeíÅš—ÿÆ›•ÿÇœ’ÿÈ��ÿÉž�ÿÊŸŠÿÌ ‡ÿÍ¡…ÿÍ¡‚ÿÍ¡~ÿÍŸzÿÌžvÿË›rÿÉ—lÿ»|GÿÍŸyÿΡ}ÿ³m9ÿ°i6ÿ®f5ÿ«c3ÿ©_2ÿ§\0ÿ¤X.ÿ¢T-ÿŸP+ÿœL)ÿ™H'ÿ—D&ÿ”?$ÿ‘;"ÿŽ7 ÿ‹2ÿˆ.ÿ…)ä‚#3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ¶}x*›PJÔ¼Š†ÿÅš•ÿÆš’ÿÆš�ÿÇšŒÿÇ›‰ÿÈš†ÿÈšƒÿÈ™ÿÈ™{ÿÇ–xÿÆ”sÿËž�ÿÛ¼§ÿ¹{Rÿ«b3ÿª`2ÿ¨^1ÿ§[0ÿ¥X/ÿ¢U-ÿ R,ÿžO*ÿœK)ÿ™G'ÿ—C%ÿ”?$ÿ‘;"ÿ�7 ÿŒ3ÿ‰/ÿ†+ÿ…'Ê€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿȬ¬�:4{¤a\òÖ“ÿÄ—’ÿÄ—�ÿÄ–‹ÿÄ–ˆÿÄ•…ÿÔ�ÿÃ’}ÿÇš„ÿ×·§ÿÔ°žÿ¿‰mÿ¹aÿ¦[6ÿ¡S,ÿ Q,ÿŸO+ÿ�M*ÿ›J(ÿ™H'ÿ—D&ÿ•A$ÿ“>#ÿ�:!ÿŽ7 ÿŒ3ÿ‰/ÿ†+ÿ„'í‚$rm$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿ£j^’A<‘¯tpù•‘ÿÁ“�ÿÁ’‹ÿÁ‘‡ÿÉž”ÿÖ¶­ÿÒ¯¤ÿÀ�}ÿ¼…rÿº‚mÿ¸hÿ³w_ÿ�N1ÿ—D&ÿ–C%ÿ•A$ÿ“?#ÿ’<"ÿ�9!ÿŽ7 ÿŒ3ÿŠ0ÿˆ-ÿ…)ÿƒ'õ€"†w"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿÿÿ(ÿÿÿÿÿÿÿÿÿ ˜HAšQK§¹…�öЮ«ÿÓ³°ÿˤ ÿ½Šƒÿ»‡}ÿ¹„yÿ¸�tÿ¶}pÿ³zkÿ±ufÿ®o_ÿ�Q>ÿŽ7!ÿŒ4ÿ‹2ÿŠ0ÿˆ.ÿ‡+ÿ…(ÿƒ&ÿ�#ð—€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿ(ÿÿÿ1ÿÿÿ;ÿÿÿ-àÕˇ*"IŸXS¦¦d_ë°uqÿ¸„€ÿ¶{ÿ´}wÿ²yrÿ°umÿ®qhÿ¬lcÿ©g^ÿ¡ZOÿ�=1ÿ†,ÿ�#ÿ€!ÿã~”~Ef3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}3…-&ušPIšœRN´œTOË�TOá�TNõ›QLõ—JDß’C=Ç�;6­‹6/’~!r}3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ ?ÿÿÿÿÿ?ÿÿÿ€ÿÀÿàÿðÿøÿüÿþþþ?ü?üøøðððàààààààààààààààððððøøü?ü?þþÿÿÿ€ÿÿÀÿÿàÿÿpÿÿ8ÿÿœ?ÿÿÎÿÿãÿÿÿðÿÿÿþÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿecbuild-3.16.0/doc/static/cmake-logo-16.png0000664000175000017500000000137115252726137020414 0ustar alastairalastair‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœ™IDAT8Ëu“KhQ†¿™ifî�$�&­¡¶¤¦5¢.t§q!ФZA©h|PAŠ « | ˆ¢®t¯HEtÓ…âB|-¬ŠÔLj¬b›f&™$3.Ò‚µæ,ÿsÏ÷ÿ—s¯F�jY¼ i˜Šêy nÅõPùÏ9õ_Á÷}z\oèÝ{¡{{kò(@±ŽQÿ‚¢(LåÃÂdÁù%• À- *…âŒÁ<|Xk <ЂFqg~*²´ÅhlÛi`Þð<@WWÍݲ 15°�ªhkŒ@ÿlZs&á<ÀÅ‹9úûï«RªÝ?~ÈÎ’ëQ‘Mt‘8 ¥ìzW8uj™Œ*'&ž™ž.ã=ì@ ièb](t|6EPÓæNž|@:}O5Mc·e‰¤ãTgQLà  %úãñÃ…ju.àÒ¥Õär%™Í†O e§BÕs‰u˜èº�BnŒF�€pCm�j_ßszzî(RÊËÒ’e×%˜bë¶qÖoiE×A)Y‰$ÎvtÈ×Ö‹zóæ:††î�Ï—åØXð´m;¨‘ ;v�’Jùd'mÌÆF ]GanŽÇû  ¼'[¾ÿÓg}¯Öù‘ʹ«Ø‘,^ìßVYã¨HàÙ4ͨ¿Ÿär/]ÏCós>ƒ÷¿ǧÃw�Ôë“×®ð­é+#‘� 7cU24ýòh)Kt]Ghz`‘4“·¾|¾ TµÁá×JleÛÁ±Öw{&.ß`’|íá�äôŸ<êÌ2Ø=4.4.0 setuptools>=51.0.0 sphinx-rtd-theme>=0.5.0 ecbuild-3.16.0/doc/contrib.rst0000664000175000017500000000015615252726137016347 0ustar alastairalastairecBuild third party scripts ########################### .. toctree:: :maxdepth: 1 :glob: contrib/* ecbuild-3.16.0/doc/cmake.py0000664000175000017500000003760115252726137015614 0ustar alastairalastair# ============================================================================= # CMake - Cross Platform Makefile Generator # Copyright 2000-2013 Kitware, Inc., Insight Software Consortium # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. # ============================================================================= import os import re # Monkey patch for pygments reporting an error when generator expressions are # used. # https://bitbucket.org/birkenfeld/pygments-main/issue/942/cmake-generator-expressions-not-handled from pygments.lexers import CMakeLexer from pygments.token import Name, Operator from pygments.lexer import bygroups CMakeLexer.tokens["args"].append(('(\\$<)(.+?)(>)', bygroups(Operator, Name.Variable, Operator))) # Monkey patch for sphinx generating invalid content for qcollectiongenerator # https://bitbucket.org/birkenfeld/sphinx/issue/1435/qthelp-builder-should-htmlescape-keywords import html from sphinxcontrib.qthelp import QtHelpBuilder old_build_keywords = QtHelpBuilder.build_keywords def new_build_keywords(self, title, refs, subitems): old_items = old_build_keywords(self, title, refs, subitems) new_items = [] for item in old_items: before, rest = item.split("ref=\"", 1) ref, after = rest.split("\"") if ("<" in ref and ">" in ref): new_items.append(before + 'ref="' + html.escape(ref) + '"' + after) else: new_items.append(item) return new_items QtHelpBuilder.build_keywords = new_build_keywords from docutils.parsers.rst import Directive, directives from docutils.transforms import Transform class EncodedString(str): """ Safely convert an object to a string, handling encoding issues. This replaces previously used `ErrorString` and `SafeString` classes (recently removed/deprecated from `docutils`), which were used to handle encoding errors when converting objects to strings for error messages. """ def __new__(cls, obj): try: if isinstance(obj, bytes): return super().__new__(cls, obj.decode('utf-8', errors='replace')) return super().__new__(cls, str(obj)) except Exception: try: return super().__new__(cls, repr(obj)) except Exception: return super().__new__(cls, object.__repr__(obj)) from docutils import io, nodes from sphinx.directives import ObjectDescription from sphinx.domains import Domain, ObjType from sphinx.roles import XRefRole from sphinx.util.nodes import make_refnode from sphinx import addnodes class CMakeModule(Directive): required_arguments = 1 optional_arguments = 0 final_argument_whitespace = True option_spec = {'encoding': directives.encoding} def __init__(self, *args, **keys): self.re_start = re.compile(r'^#\[(?P=*)\[\.rst:$') Directive.__init__(self, *args, **keys) def run(self): settings = self.state.document.settings if not settings.file_insertion_enabled: raise self.warning('"%s" directive disabled.' % self.name) env = self.state.document.settings.env rel_path, path = env.relfn2path(self.arguments[0]) path = os.path.normpath(path) encoding = self.options.get('encoding', settings.input_encoding) e_handler = settings.input_encoding_error_handler try: settings.record_dependencies.add(path) f = io.FileInput(source_path=path, encoding=encoding, error_handler=e_handler) except UnicodeEncodeError as error: raise self.severe('Problems with "%s" directive path:\n' 'Cannot encode input file path "%s" ' '(wrong locale?).' % (self.name, EncodedString(path))) except IOError as error: raise self.severe('Problems with "%s" directive path:\n%s.' % (self.name, EncodedString(error))) raw_lines = f.read().splitlines() f.close() rst = None lines = [] for line in raw_lines: if rst is not None and rst != '#': # Bracket mode: check for end bracket pos = line.find(rst) if pos >= 0: if line[0] == '#': line = '' else: line = line[0:pos] rst = None else: # Line mode: check for .rst start (bracket or line) m = self.re_start.match(line) if m: rst = ']%s]' % m.group('eq') line = '' elif line == '#.rst:': rst = '#' line = '' elif rst == '#': if line == '#' or line[:2] == '# ': line = line[2:] else: rst = None line = '' elif rst is None: line = '' lines.append(line) if rst is not None and rst != '#': raise self.warning('"%s" found unclosed bracket "#[%s[.rst:" in %s' % (self.name, rst[1:-1], path)) self.state_machine.insert_input(lines, path) return [] class _cmake_index_entry: def __init__(self, desc): self.desc = desc def __call__(self, title, targetid, main='main'): return ('pair', u'%s ; %s' % (self.desc, title), targetid, main) _cmake_index_objs = { 'command': _cmake_index_entry('command'), 'generator': _cmake_index_entry('generator'), 'manual': _cmake_index_entry('manual'), 'module': _cmake_index_entry('module'), 'policy': _cmake_index_entry('policy'), 'prop_cache': _cmake_index_entry('cache property'), 'prop_dir': _cmake_index_entry('directory property'), 'prop_gbl': _cmake_index_entry('global property'), 'prop_inst': _cmake_index_entry('installed file property'), 'prop_sf': _cmake_index_entry('source file property'), 'prop_test': _cmake_index_entry('test property'), 'prop_tgt': _cmake_index_entry('target property'), 'variable': _cmake_index_entry('variable'), } def _cmake_object_inventory(env, document, line, objtype, targetid): inv = env.domaindata['cmake']['objects'] if targetid in inv: document.reporter.warning( 'CMake object "%s" also described in "%s".' % (targetid, env.doc2path(inv[targetid][0])), line=line) inv[targetid] = (env.docname, objtype) class CMakeTransform(Transform): # Run this transform early since we insert nodes we want # treated as if they were written in the documents. default_priority = 210 def __init__(self, document, startnode): Transform.__init__(self, document, startnode) self.titles = {} def parse_title(self, docname): """Parse a document title as the first line starting in [A-Za-z0-9<] or fall back to the document basename if no such line exists. The cmake --help-*-list commands also depend on this convention. Return the title or False if the document file does not exist. """ env = self.document.settings.env title = self.titles.get(docname) if title is None: fname = os.path.join(env.srcdir, docname+'.rst') try: f = open(fname, 'r') except IOError: title = False else: for line in f: if len(line) > 0 and (line[0].isalnum() or line[0] == '<'): title = line.rstrip() break f.close() if title is None: title = os.path.basename(docname) self.titles[docname] = title return title def apply(self): env = self.document.settings.env # Treat some documents as cmake domain objects. objtype, sep, tail = env.docname.rpartition('/') make_index_entry = _cmake_index_objs.get(objtype) if make_index_entry: title = self.parse_title(env.docname) # Insert the object link target. if objtype == 'command': targetname = title.lower() else: targetname = title targetid = '%s:%s' % (objtype, targetname) targetnode = nodes.target('', '', ids=[targetid]) self.document.note_explicit_target(targetnode) self.document.insert(0, targetnode) # Insert the object index entry. indexnode = addnodes.index() indexnode['entries'] = [make_index_entry(title, targetid)] self.document.insert(0, indexnode) # Add to cmake domain object inventory _cmake_object_inventory(env, self.document, 1, objtype, targetid) class CMakeObject(ObjectDescription): def handle_signature(self, sig, signode): # called from sphinx.directives.ObjectDescription.run() signode += addnodes.desc_name(sig, sig) return sig def add_target_and_index(self, name, sig, signode): if self.objtype == 'command': targetname = name.lower() else: targetname = name targetid = '%s:%s' % (self.objtype, targetname) if targetid not in self.state.document.ids: signode['names'].append(targetid) signode['ids'].append(targetid) signode['first'] = (not self.names) self.state.document.note_explicit_target(signode) _cmake_object_inventory(self.env, self.state.document, self.lineno, self.objtype, targetid) make_index_entry = _cmake_index_objs.get(self.objtype) if make_index_entry: self.indexnode['entries'].append(make_index_entry(name, targetid)) class CMakeXRefRole(XRefRole): # See sphinx.util.nodes.explicit_title_re; \x00 escapes '<'. _re = re.compile(r'^(.+?)(\s*)(?$', re.DOTALL) _re_sub = re.compile(r'^([^()\s]+)\s*\(([^()]*)\)$', re.DOTALL) def __call__(self, typ, rawtext, text, *args, **keys): # Translate CMake command cross-references of the form: # `command_name(SUB_COMMAND)` # to have an explicit target: # `command_name(SUB_COMMAND) ` if typ == 'cmake:command': m = CMakeXRefRole._re_sub.match(text) if m: text = '%s <%s>' % (text, m.group(1)) # CMake cross-reference targets frequently contain '<' so escape # any explicit `` with '<' not preceded by whitespace. while True: m = CMakeXRefRole._re.match(text) if m and len(m.group(2)) == 0: text = '%s\x00<%s>' % (m.group(1), m.group(3)) else: break return XRefRole.__call__(self, typ, rawtext, text, *args, **keys) # We cannot insert index nodes using the result_nodes method # because CMakeXRefRole is processed before substitution_reference # nodes are evaluated so target nodes (with 'ids' fields) would be # duplicated in each evaluted substitution replacement. The # docutils substitution transform does not allow this. Instead we # use our own CMakeXRefTransform below to add index entries after # substitutions are completed. # # def result_nodes(self, document, env, node, is_ref): # pass class CMakeXRefTransform(Transform): # Run this transform early since we insert nodes we want # treated as if they were written in the documents, but # after the sphinx (210) and docutils (220) substitutions. default_priority = 221 def apply(self): env = self.document.settings.env # Find CMake cross-reference nodes and add index and target # nodes for them. for ref in self.document.traverse(addnodes.pending_xref): if not ref['refdomain'] == 'cmake': continue objtype = ref['reftype'] make_index_entry = _cmake_index_objs.get(objtype) if not make_index_entry: continue objname = ref['reftarget'] targetnum = env.new_serialno('index-%s:%s' % (objtype, objname)) targetid = 'index-%s-%s:%s' % (targetnum, objtype, objname) targetnode = nodes.target('', '', ids=[targetid]) self.document.note_explicit_target(targetnode) indexnode = addnodes.index() indexnode['entries'] = [make_index_entry(objname, targetid, '')] ref.replace_self([indexnode, targetnode, ref]) class CMakeDomain(Domain): """CMake domain.""" name = 'cmake' label = 'CMake' object_types = { 'command': ObjType('command', 'command'), 'generator': ObjType('generator', 'generator'), 'variable': ObjType('variable', 'variable'), 'module': ObjType('module', 'module'), 'policy': ObjType('policy', 'policy'), 'prop_cache': ObjType('prop_cache', 'prop_cache'), 'prop_dir': ObjType('prop_dir', 'prop_dir'), 'prop_gbl': ObjType('prop_gbl', 'prop_gbl'), 'prop_inst': ObjType('prop_inst', 'prop_inst'), 'prop_sf': ObjType('prop_sf', 'prop_sf'), 'prop_test': ObjType('prop_test', 'prop_test'), 'prop_tgt': ObjType('prop_tgt', 'prop_tgt'), 'manual': ObjType('manual', 'manual'), } directives = { 'command': CMakeObject, 'variable': CMakeObject, # Other object types cannot be created except by the CMakeTransform # 'generator': CMakeObject, # 'module': CMakeObject, # 'policy': CMakeObject, # 'prop_cache': CMakeObject, # 'prop_dir': CMakeObject, # 'prop_gbl': CMakeObject, # 'prop_inst': CMakeObject, # 'prop_sf': CMakeObject, # 'prop_test': CMakeObject, # 'prop_tgt': CMakeObject, # 'manual': CMakeObject, } roles = { 'command': CMakeXRefRole(fix_parens=True, lowercase=True), 'generator': CMakeXRefRole(), 'variable': CMakeXRefRole(), 'module': CMakeXRefRole(), 'policy': CMakeXRefRole(), 'prop_cache': CMakeXRefRole(), 'prop_dir': CMakeXRefRole(), 'prop_gbl': CMakeXRefRole(), 'prop_inst': CMakeXRefRole(), 'prop_sf': CMakeXRefRole(), 'prop_test': CMakeXRefRole(), 'prop_tgt': CMakeXRefRole(), 'manual': CMakeXRefRole(), } initial_data = { 'objects': {}, # fullname -> docname, objtype } def clear_doc(self, docname): to_clear = set() for fullname, (fn, _) in self.data['objects'].items(): if fn == docname: to_clear.add(fullname) for fullname in to_clear: del self.data['objects'][fullname] def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): targetid = '%s:%s' % (typ, target) obj = self.data['objects'].get(targetid) if obj is None: # TODO: warn somehow? return None return make_refnode(builder, fromdocname, obj[0], targetid, contnode, target) def get_objects(self): for refname, (docname, type) in self.data['objects'].items(): yield (refname, refname, type, docname, refname, 1) def setup(app): app.add_directive('cmake-module', CMakeModule) app.add_transform(CMakeTransform) app.add_transform(CMakeXRefTransform) app.add_domain(CMakeDomain) ecbuild-3.16.0/doc/templates/0000775000175000017500000000000015252726137016151 5ustar alastairalastairecbuild-3.16.0/doc/templates/layout.html0000664000175000017500000000132615252726137020356 0ustar alastairalastair{% extends "!layout.html" %} {% block rootrellink %}
  • ecBuild
  • ecBuild{{ reldelim1 }}
  • {{ shorttitle|e }}{{ reldelim1 }}
  • {% endblock %} {# Put some context in the html title element. Workaround for #} {# https://bitbucket.org/birkenfeld/sphinx/issue/1492/qthelp-generate-html-title-element-should #} {% block htmltitle %} {{ title|striptags|e }} {{ "—"|safe }} {{ docstitle|e }} {% endblock %} ecbuild-3.16.0/VERSION0000777000175000017500000000000015252726137016601 2cmake/VERSIONustar alastairalastairecbuild-3.16.0/tools/0000775000175000017500000000000015252726137014546 5ustar alastairalastairecbuild-3.16.0/tools/git-mproj0000775000175000017500000000230315252726137016402 0ustar alastairalastair#!/bin/bash # # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. # # git-proj: status, branch, checkout # txtbld=$(tput bold) # bold bldblu=${txtbld}$(tput setaf 6) # bold cyan txtrst=$(tput sgr0) # reset dashless=$(basename "$0" | sed -e 's/-/ /') USAGE="$dashless [options...]" SUBDIRECTORY_OK="yes" PATH=$(git --exec-path):$PATH . git-sh-setup require_work_tree_exists # go to top cd_to_toplevel cd .. # check option for number of levels nlevels=$(git config --global --int --get mproj.levels) if [ "$nlevels" != "" ] then nlevels="-maxdepth $nlevels" fi # do it for d in $( find $PWD $nlevels -type d -iname ".git" ) do gdir=$(dirname $d) proj=$(basename $gdir) pushd $gdir > /dev/null branch=$(git symbolic-ref --short HEAD) echo -e "${bldblu}---> $proj ($branch)${txtrst}" git "$@" popd > /dev/null done ecbuild-3.16.0/tools/CMakeLists.txt0000664000175000017500000000125215252726137017306 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. list( APPEND ecbuild_bin_files ecbuild git-meld git-mproj check_install.sh apply_license.sh license.pl ) add_custom_target( ecbuild_bin SOURCES ${ecbuild_bin_files} ) install( PROGRAMS ecbuild DESTINATION ${INSTALL_BIN_DIR} ) # install( PROGRAMS ${ecbuild_bin_files} DESTINATION ${INSTALL_BIN_DIR} ) ecbuild-3.16.0/tools/git-meld0000775000175000017500000000003015252726137016167 0ustar alastairalastair#!/bin/bash meld $2 $5 ecbuild-3.16.0/tools/license.pl0000775000175000017500000001107315252726137016532 0ustar alastairalastair#!/usr/bin/perl # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. use strict; my $LICENSE = <<"EOF"; (C) Copyright 1996- ECMWF. This software is licensed under the terms of the Apache Licence Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. In applying this licence, ECMWF does not waive the privileges and immunities granted to it by virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. EOF my %COMMENTS = ( java => { start => "/*\n" , end => " */\n\n" , comment => " * " }, xml => { start => "\n\n" , after => "\<\?xml[^<]*\>" }, # xsd => { start => "\n\n" }, # jsp => { start => "\n\n" }, sh => { comment => "# ", end => "\n", after => "^#!/.*\n" }, pl => { comment => "# ", end => "\n", after => "^#!/.*\n" }, pm => { comment => "# ", end => "\n", after => "^#!/.*\n" }, py => { comment => "# ", end => "\n", after => "^#!/.*\n" }, js => { start => "/*\n" , end => " */\n\n" , comment => " * " }, c => { start => "/*\n" , end => " */\n\n" , comment => " * " }, cc => { start => "/*\n" , end => " */\n\n" , comment => " * " }, cpp => { start => "/*\n" , end => " */\n\n" , comment => " * " }, cxx => { start => "/*\n" , end => " */\n\n" , comment => " * " }, h => { start => "/*\n" , end => " */\n\n" , comment => " * " }, hh => { start => "/*\n" , end => " */\n\n" , comment => " * " }, hpp => { start => "/*\n" , end => " */\n\n" , comment => " * " }, l => { start => "/*\n" , end => " */\n\n" , comment => " * " }, 'y' => { start => "/*\n" , end => " */\n\n" , comment => " * " }, 'f' => { comment => "C ", end => "C\n\n" }, # assume f77 'F' => { comment => "C ", end => "C\n\n" }, # assume f77 'for' => { comment => "C ", end => "C\n\n" }, # assume f77 'f77' => { comment => "C ", end => "C\n\n" }, 'f90' => { comment => "! ", end => "!\n\n" }, cmake => { end => "\n", comment => "# " }, css => { start => "/*\n" , end => " */\n\n" , comment => " * " }, sql => { comment => "-- ", end => "\n" }, properties => { comment => "# ", end => "\n" }, def => { comment => "# ", end => "\n" }, ); my %cmdargs = map { $_ => 1 } @ARGV; foreach my $file ( @ARGV ) { next if( $file eq "-u" or $file eq "--update" ); # my $doit=0; my $doit=1; $file =~ /\.(\w+)$/; my $ext = $1; my $c = $COMMENTS{$ext}; unless($c) { print "$file: unsupported extension. File ignored\n"; next; } open(IN,"<$file") or die "$file: $!"; my @text = ; close(IN); if(join("",@text) =~ /icensed under the/gs) { if( exists( $cmdargs{"-u"} ) or exists( $cmdargs{"--update"} ) ) { # lets update the year if needed my $currentyear = (localtime)[5] + 1900; if($doit) { print("$file: updating license year to $currentyear\n"); system("perl -pi -e 's/Copyright ([0-9]{4})-[0-9]{4} ECMWF/Copyright \$1-$currentyear ECMWF/' $file"); } } else { print "$file: License already stated. File ignored\n"; } next; } open(OUT,">$file.tmp") or die "$file.tmp: $!"; if($c->{after}) { my @x; my $re = $c->{after}; loop: while(@text) { if($text[0] =~ m/$re/) { print OUT @x, shift @text; @x = (); last loop; } push @x,shift @text; } @text = (@x,@text); } print OUT $c->{start}; foreach my $line ( split("\n",$LICENSE) ) { print OUT $c->{comment}, $line,"\n"; } print OUT $c->{end}; print OUT @text; close(OUT) or die "$file: $!"; if($doit) { use File::Copy qw(cp); use File::Compare qw(compare_text compare); if(compare_text("$file.tmp",$file)) { print "UPDATING file $file\n"; system("p4 edit $file") unless(-w $file); #s cp($file,"$file.old") or die "cp($file,$file.old): $!"; cp("$file.tmp",$file) or die "cp($file.tmp,$file): $!"; } } else { print "IGNORING file $file\n"; } unlink("$file.tmp"); } ecbuild-3.16.0/tools/check_install.sh0000775000175000017500000000340415252726137017711 0ustar alastairalastair#!/bin/bash # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. chksm="md5sum" manifest_file="manifest.txt" install_proc="echo_install" #------------------------------------------------------------------------------ function abspath { if [[ -d "$1" ]] then pushd "$1" >/dev/null pwd popd >/dev/null elif [[ -e $1 ]] then pushd $(dirname $1) >/dev/null echo $(pwd)/$(basename $1) popd >/dev/null else echo "error: path $1 does not exist!" >&2 return 127 fi } function echo_install { echo "$1 -> $2" } #------------------------------------------------------------------------------ if [ -z $2 ] then echo "usage: $0 " exit 1 fi [[ ! -z $3 ]] && install_proc="$3" SRC=$(abspath $1) TGT=$(abspath $2) manifest="$SRC/$manifest_file" #------------------------------------------------------------------------------ [[ ! -f $manifest ]] && echo "error: cannot find manifest.txt in dir $SRC" && exit 1 cd $SRC for f in $(cat $manifest ) do [[ ! -f "$SRC/$f" ]] && echo "error: $SRC/$f does not exist" && exit 1 install="no" if [[ ! -f "$TGT/$f" ]] then install="yes" else srcsum=$( $chksm "$SRC/$f" | cut -d" " -f1 ) tgtsum=$( $chksm "$TGT/$f" | cut -d" " -f1 ) if [ $srcsum != "$tgtsum" ] then install="yes" fi fi if [ $install == "yes" ] then $install_proc $SRC/$f $TGT/$f fi done ecbuild-3.16.0/tools/apply_license.sh0000775000175000017500000000270515252726137017740 0ustar alastairalastair#!/bin/bash # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. if [ -z $1 ] then echo "apply_license.sh" echo "usage: $0 [dir] [dir] ... " echo "dir - directory where to search" exit 1 fi for f in $( find $DIRS $* \( \ -iname "*.java" \ -or -iname "*.xml" \ -or -iname "*.sh" \ -or -iname "*.pl" \ -or -iname "*.pm" \ -or -iname "*.py" \ -or -iname "*.js" \ -or -iname "*.c" \ -or -iname "*.cpp" \ -or -iname "*.cxx" \ -or -iname "*.cc" \ -or -iname "*.h" \ -or -iname "*.hh" \ -or -iname "*.hpp" \ -or -iname "*.l" \ -or -iname "*.y" \ -or -iname "*.f" \ -or -iname "*.F" \ -or -iname "*.for" \ -or -iname "*.f77" \ -or -iname "*.f90" \ -or -iname "*.cmake" \ -or -iname "*.css" \ -or -iname "*.sql" \ -or -iname "*.properties" \ -or -iname "*.def" \ \) -print -follow | grep -v "\.git/" | grep -v "\.svn/" ) do # echo $f license.pl -u $f done #| sed "s/ /\\\ /g" | \ #xargs echo exit ecbuild-3.16.0/ecbuild-post-import.cmake.in0000664000175000017500000000046315252726137020722 0ustar alastairalastairif(@PROJECT_NAME@_IS_BUILD_DIR_EXPORT) set(ecbuild_MACROS_DIR @ECBUILD_MACROS_DIR@) else() set(ecbuild_MACROS_DIR ${ecbuild_BASE_DIR}/share/ecbuild/cmake) endif() if(NOT ${ecbuild_MACROS_DIR} IN_LIST CMAKE_MODULE_PATH) list(INSERT CMAKE_MODULE_PATH 0 ${ecbuild_MACROS_DIR}) endif() include(ecbuild) ecbuild-3.16.0/.gitignore0000664000175000017500000000016115252726137015374 0ustar alastairalastair*sublime-workspace CMakeLists.txt.user* *.log *.py[cdo] *.swp *~ doc/contrib doc/find doc/macros build .DS_Store ecbuild-3.16.0/.cd/0000775000175000017500000000000015252726137014052 5ustar alastairalastairecbuild-3.16.0/.cd/conda/0000775000175000017500000000000015252726137015136 5ustar alastairalastairecbuild-3.16.0/.cd/conda/meta.yaml0000664000175000017500000000213215252726137016746 0ustar alastairalastair{% set name = "ecbuild" %} {% set git_tag = environ.get('GIT_DESCRIBE_TAG', '0.0.0').lstrip('v') %} {% set version = git_tag.replace('-', '') | lower %} package: name: {{ name|lower }} version: {{ version }} source: path: ../.. build: number: 0 skip: true # [win] requirements: build: - cmake - {{ compiler('cxx') }} run: - cmake - {{ compiler('cxx') }} test: commands: - test -f $PREFIX/bin/ecbuild - test -d $PREFIX/share/ecbuild/cmake - $PREFIX/bin/ecbuild --version about: home: https://github.com/ecmwf/ecbuild license: Apache-2.0 license_family: APACHE license_file: LICENSE summary: | A CMake-based build system, consisting of a collection of CMake macros and functions that ease the managing of software build systems. description: | ecBuild is built on top of CMake and consists of a set of macros as well as a wrapper around CMake. doc_url: https://github.com/ecmwf/ecbuild#readme dev_url: https://github.com/ecmwf/ecbuild extra: recipe-maintainers: - simondsmart - marcosbento - wdeconinck - iainrussell ecbuild-3.16.0/.cd/conda/build.sh0000664000175000017500000000045315252726137016573 0ustar alastairalastair#!/usr/bin/env bash set -eux SOURCE_DIR=$(pwd) BUILD_DIR=build ECBUILD_BIN=$SOURCE_DIR/bin/ecbuild test -x $(which $ECBUILD_BIN) rm -rf $BUILD_DIR mkdir $BUILD_DIR cd $BUILD_DIR $ECBUILD_BIN --prefix=$PREFIX --log=DEBUG -- -DINSTALL_LIB_DIR=lib $SOURCE_DIR make test -j $CPU_COUNT make install ecbuild-3.16.0/cmake/0000775000175000017500000000000015252726137014466 5ustar alastairalastairecbuild-3.16.0/cmake/ecbuild_print_summary.cmake0000664000175000017500000001156015252726137022073 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_print_summary # ===================== # # Print a summary of the project, build environment and enabled features. :: # # ecbuild_print_summary() # # If ``project_summary.cmake`` exist in the source root directory, a project # summary is printed by including this file. # # For a top level project, a summary of the build environment and a feature # summary are also printed. # ############################################################################## macro( ecbuild_print_summary ) set( project_summary_file ) if( EXISTS ${PROJECT_SOURCE_DIR}/project_summary.cmake ) set( project_summary_file ${PROJECT_SOURCE_DIR}/project_summary.cmake ) elseif( EXISTS ${PROJECT_SOURCE_DIR}/cmake/project_summary.cmake ) set( project_summary_file ${PROJECT_SOURCE_DIR}/cmake/project_summary.cmake ) endif() if( project_summary_file ) ecbuild_info( "---------------------------------------------------------" ) ecbuild_info( "Project ${PROJECT_NAME} summary" ) ecbuild_info( "---------------------------------------------------------" ) include( ${project_summary_file} ) endif() if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME ) get_property( langs GLOBAL PROPERTY ENABLED_LANGUAGES ) list( FILTER langs EXCLUDE REGEX NONE ) ecbuild_info( "---------------------------------------------------------" ) ecbuild_info( "Build summary" ) ecbuild_info( "---------------------------------------------------------" ) ecbuild_info( "system : [${BUILD_SITE}] [${CMAKE_SYSTEM}] [${EC_OS_NAME}.${EC_OS_BITS}]" ) ecbuild_info( "processor : [${CMAKE_SYSTEM_PROCESSOR}]" ) if( EC_BIG_ENDIAN ) ecbuild_info( "endiness : Big Endian -- IEEE [${IEEE_BE}]" ) endif() if( EC_LITTLE_ENDIAN ) ecbuild_info( "endiness : Little Endian -- IEEE [${IEEE_LE}]" ) endif() ecbuild_info( "build type : [${CMAKE_BUILD_TYPE}]" ) ecbuild_info( "timestamp : [${EC_BUILD_TIMESTAMP}]" ) ecbuild_info( "install prefix : [${CMAKE_INSTALL_PREFIX}]" ) ecbuild_info( " bin dir : [${${PROJECT_NAME}_FULL_INSTALL_BIN_DIR}]" ) ecbuild_info( " lib dir : [${${PROJECT_NAME}_FULL_INSTALL_LIB_DIR}]" ) ecbuild_info( " include dir : [${${PROJECT_NAME}_FULL_INSTALL_INCLUDE_DIR}]" ) ecbuild_info( " data dir : [${${PROJECT_NAME}_FULL_INSTALL_DATA_DIR}]" ) ecbuild_info( " cmake dir : [${${PROJECT_NAME}_FULL_INSTALL_CMAKE_DIR}]" ) if( EC_LINK_DIR ) ecbuild_info( "links prefix : [${EC_LINK_DIR}]" ) endif() if( langs ) ecbuild_info( "---------------------------------------------------------" ) foreach( lang ${langs} ) ecbuild_info( "${lang} -- ${CMAKE_${lang}_COMPILER_ID} ${CMAKE_${lang}_COMPILER_VERSION}" ) ecbuild_info( " compiler : ${CMAKE_${lang}_COMPILER}" ) ecbuild_info( " flags : ${CMAKE_${lang}_FLAGS} ${CMAKE_${lang}_FLAGS_${CMAKE_BUILD_TYPE_CAPS}} ${${PNAME}_${lang}_FLAGS} ${${PNAME}_${lang}_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}" ) ecbuild_info( " link flags : ${CMAKE_${lang}_LINK_FLAGS}" ) endforeach() ecbuild_info( "linker : ${CMAKE_LINKER}") ecbuild_info( "ar : ${CMAKE_AR}") ecbuild_info( "ranlib : ${CMAKE_RANLIB}") ecbuild_info( "link flags" ) ecbuild_info( " executable [${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" ) ecbuild_info( " shared lib [${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" ) ecbuild_info( " static lib [${CMAKE_MODULE_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_CAPS}}]" ) ecbuild_info( "install rpath : ${CMAKE_INSTALL_RPATH}" ) get_directory_property( defs COMPILE_DEFINITIONS ) ecbuild_info( "common definitions: ${defs}" ) endif() ### FEATURE SUMMARY ecbuild_info( "---------------------------------------------------------" ) ecbuild_info( "Feature summary" ) ecbuild_info( "---------------------------------------------------------" ) set( __what ALL INCLUDE_QUIET_PACKAGES ) # Print feature summary feature_summary( WHAT ${__what} ) # Write feature summary to ecbuild.log feature_summary( WHAT ${__what} FILENAME ${ECBUILD_LOG_FILE} APPEND ) ### WARNINGS # issue warnings / errors in case there are unused project files ecbuild_warn_unused_files() endif() endmacro( ecbuild_print_summary ) ecbuild-3.16.0/cmake/ecbuild_find_package_search_hints.cmake0000664000175000017500000001442715252726137024314 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_find_package_search_hints # ================================= # # Detect more search hints and possibly add to _ROOT :: # # ecbuild_find_package_search_hints( NAME ) # # This is called within ecbuild_find_package(). # Alternatively it can be called anywhere before a standard find_package() # # Motivation # ---------- # # Since CMake 3.12 the recommended approach to find_package is via _ROOT # which can be set both as variable or in the environment. # Many environments still need to be adapted to this, as they are set up with the # ecbuild 2 convention _PATH or _PATH. Furthermore this allows compatibility # with _ROOT for CMake versions < 3.12 # # Procedure # --------- # # 1) If neither _ROOT nor _DIR are set in scope: # Try setting _ROOT variable to first valid in list [ _PATH ; _PATH ] # # 2) If 1) was not succesfull and neither _ROOT nor _DIR are set in environment: # Try setting _ROOT variable to first valid in list [ ENV{_PATH} ; ENV{_PATH} ] # # 3) Overcome CMake versions < 3.12 that do not yet recognize _ROOT in scope or environment # If CMake version < 3.12: # If _DIR not defined in scope or environment, but _ROOT IS defined in scope or environment # Try setting _DIR to a valid cmake-dir deduced from _ROOT. # # Warning: Deduction is not feature-complete (it could be improved, but should now cover 99% of cases) # It is advised to use CMake 3.12 instead. # ############################################################################## function( ecbuild_find_package_search_hints ) set( options ) set( single_value_args NAME ) set( multi_value_args ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if( NOT DEFINED _PAR_NAME ) ecbuild_critical( "ecbuild_find_package_search_hints(): NAME argument is missing" ) endif() string( TOUPPER ${_PAR_NAME} pkgUPPER ) unset( _outvar ) unset( _names ) # Diagnose what is there for debugging list( APPEND _names ${_PAR_NAME} ) if( NOT ${pkgUPPER} STREQUAL ${_PAR_NAME} ) list( APPEND _names ${pkgUPPER} ) endif() foreach( _suffix DIR ROOT HOME PATH ROOT_DIR ) foreach( _name ${_names}) if( DEFINED ${_name}_${_suffix} ) list( APPEND _outvar "${_name}_${_suffix}: ${${_name}_${_suffix}}") endif() if( DEFINED ENV{${_name}_${_suffix}} ) list( APPEND _outvar "ENV{${_name}_${_suffix}}: $ENV{${_name}_${_suffix}}") endif() endforeach() endforeach() if( DEFINED CMAKE_PREFIX_PATH ) list( APPEND _outvar "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") endif() if( DEFINED ENV{CMAKE_PREFIX_PATH} ) list( APPEND _outvar "ENV{CMAKE_PREFIX_PATH}: $ENV{CMAKE_PREFIX_PATH}") endif() if( _outvar ) string( REPLACE ";" "\n - " print_this "${_outvar}" ) ecbuild_debug( "ecbuild_find_package_search_hints(${_PAR_NAME}): Detected variables that could influence find_package() :\n - ${print_this}" ) endif() # Only look at older variables _PATH and _PATH if _ROOT and _DIR are not defined in scope if( NOT DEFINED ${_PAR_NAME}_ROOT AND NOT DEFINED ${_PAR_NAME}_DIR ) if( NOT DEFINED ${_PAR_NAME}_ROOT AND DEFINED ${_PAR_NAME}_PATH ) ecbuild_debug("ecbuild_find_package_search_hints(${_PAR_NAME}): Setting ${_PAR_NAME}_ROOT to ${_PAR_NAME}_PATH: ${${_PAR_NAME}_PATH}") set( ${_PAR_NAME}_ROOT ${${_PAR_NAME}_PATH} ) endif() if( NOT DEFINED ${_PAR_NAME}_ROOT AND DEFINED ${pkgUPPER}_PATH ) ecbuild_debug("ecbuild_find_package_search_hints(${_PAR_NAME}): Setting ${_PAR_NAME}_ROOT to ${pkgUPPER}_PATH: ${${pkgUPPER}_PATH}") set( ${_PAR_NAME}_ROOT ${${pkgUPPER}_PATH} ) endif() if( DEFINED ${_PAR_NAME}_ROOT ) set( ${_PAR_NAME}_ROOT ${${_PAR_NAME}_ROOT} PARENT_SCOPE ) endif() endif() # Only look at older variables ENV{_PATH} and ENV{_PATH} if _ROOT and _DIR are not defined in scope or in environment if( NOT DEFINED ${_PAR_NAME}_ROOT AND NOT DEFINED ENV{${_PAR_NAME}_ROOT} AND NOT DEFINED ${_PAR_NAME}_DIR AND NOT DEFINED ENV{${_PAR_NAME}_DIR} ) if( NOT DEFINED ${_PAR_NAME}_ROOT AND DEFINED ENV{${_PAR_NAME}_PATH} ) ecbuild_debug("ecbuild_find_package_search_hints(${_PAR_NAME}): Setting ${_PAR_NAME}_ROOT to ENV{${_PAR_NAME}_PATH}: $ENV{${_PAR_NAME}_PATH}") set( ${_PAR_NAME}_ROOT $ENV{${_PAR_NAME}_PATH} ) endif() if( NOT DEFINED ${_PAR_NAME}_ROOT AND DEFINED ENV{${pkgUPPER}_PATH} ) ecbuild_debug("ecbuild_find_package_search_hints(${_PAR_NAME}): Setting ${_PAR_NAME}_ROOT to ENV{${pkgUPPER}_PATH}: $ENV{${pkgUPPER}_PATH}") set( ${_PAR_NAME}_ROOT $ENV{${pkgUPPER}_PATH} ) endif() if( DEFINED ${_PAR_NAME}_ROOT ) set( ${_PAR_NAME}_ROOT ${${_PAR_NAME}_ROOT} PARENT_SCOPE ) endif() endif() #### Overcome CMake 3.11 to 3.12 transition with _ROOT # warning! this is not fully foolproof! if( CMAKE_VERSION VERSION_LESS 3.12 ) if( ( NOT DEFINED ${_PAR_NAME}_DIR AND NOT DEFINED ENV{${_PAR_NAME}_DIR} ) AND ( DEFINED ${_PAR_NAME}_ROOT OR DEFINED ENV{${_PAR_NAME}_ROOT}} ) ) if( DEFINED ${_PAR_NAME}_ROOT ) set( _root ${_PAR_NAME}_ROOT ) else() set( _root $ENV{${_PAR_NAME}_ROOT} ) endif() foreach( _path_suffix lib/cmake/${_PAR_NAME} share/${_PAR_NAME}/cmake ) if( EXISTS ${_root}/${_path_suffix} ) ecbuild_debug("ecbuild_find_package_search_hints(${_PAR_NAME}): Setting ${_PAR_NAME}_DIR to ${_root}/${_path_suffix}") set( ${_PAR_NAME}_DIR ${_root}/${_path_suffix} PARENT_SCOPE ) break() endif() endforeach() endif() endif() endfunction() ecbuild-3.16.0/cmake/ecbuild_add_persistent.cmake0000664000175000017500000000627715252726137022203 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_add_persistent # ====================== # # Add persistent layer object classes. :: # # ecbuild_add_persistent( SRC_LIST # FILES [ ...] ] # [ NAMESPACE ] ) # # Options # ------- # # SRC_LIST : required # CMake variable to append the generated persistent layer objects to # # FILES : required # list of base names of files to build persistent class information for # # The source file is expected to have a .h extension, the generated file # gets a .b extension. # # NAMESPACE : optional # C++ namespace to place the persistent class information in # ############################################################################## # define the script to build the persistent class information set( sg_perl "${CMAKE_CURRENT_LIST_DIR}/sg.pl" CACHE INTERNAL "perl script to generate persistent objects" ) function( ecbuild_add_persistent ) set( options ) set( single_value_args SRC_LIST NAMESPACE ) set( multi_value_args FILES ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_add_persistent(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT _PAR_SRC_LIST ) ecbuild_critical("The call to ecbuild_add_persistent() doesn't specify the SRC_LIST.") endif() # Perl is only needed to run sg.pl over FILES argument. if( _PAR_FILES ) ecbuild_find_perl( REQUIRED ) endif() ecbuild_debug( "ecbuild_add_persistent: adding persistent layer for [${_PAR_FILES}]" ) set(_SOURCES ${${_PAR_SRC_LIST}}) foreach( file ${_PAR_FILES} ) get_filename_component( _file_dir ${file} PATH ) get_filename_component( _file_we ${file} NAME_WE ) set( file ${_file_we} ) if( _file_dir ) file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir} ) set( file ${_file_dir}/${_file_we} ) endif() ecbuild_debug( "ecbuild_add_persistent: adding persistent layer for ${file}.b with namespace '${_PAR_NAMESPACE}' from ${file}.h in ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir}" ) add_custom_command( OUTPUT ${file}.b COMMAND ${PERL_EXECUTABLE} ${sg_perl} ${CMAKE_CURRENT_SOURCE_DIR}/${file}.h ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir} ${_PAR_NAMESPACE} DEPENDS ${sg_perl} ${file}.h ) set_source_files_properties( ${file}.h PROPERTIES OBJECT_DEPENDS "${file}.b" ) list( APPEND _SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${file}.b ) endforeach() if( _SOURCES ) list(REMOVE_DUPLICATES _SOURCES) endif() set(${_PAR_SRC_LIST} ${_SOURCES} PARENT_SCOPE) endfunction( ecbuild_add_persistent ) ecbuild-3.16.0/cmake/ecbuild_check_c_source_return.cmake0000664000175000017500000001411715252726137023521 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_check_c_source_return # ============================= # # Compile and run a given C source code and return its output. :: # # ecbuild_check_c_source_return( # VAR # OUTPUT # [ INCLUDES [ ... ] ] # [ LIBS [ ... ] ] # [ DEFINITIONS [ ... ] ] ) # # Options # ------- # # VAR : required # name of the check and name of the CMake variable to write result to # # OUTPUT : required # name of CMake variable to write the output to # # INCLUDES : optional # list of paths to add to include directories # # LIBS : optional # list of libraries to link against (CMake targets or external libraries) # # DEFINITIONS : optional # list of definitions to add to preprocessor defines # # Usage # ----- # # This will write the given source to a .c file and compile and run it with # ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is # set to the output of the successful run in the CMake cache. # # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache). # ############################################################################## macro( ecbuild_check_c_source_return SOURCE ) set( options ) set( single_value_args VAR OUTPUT ) set( multi_value_args INCLUDES LIBS DEFINITIONS ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_check_c_source_return(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT _PAR_VAR OR NOT _PAR_OUTPUT ) ecbuild_critical("The call to ecbuild_check_c_source_return() doesn't specify either SOURCE, VAR or OUTPUT") endif() if( NOT DEFINED ${_PAR_VAR} ) set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_PAR_VAR} ${CMAKE_REQUIRED_FLAGS}") set(__add_libs "") set(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES) if( CMAKE_REQUIRED_LIBRARIES ) list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} ) endif() if( _PAR_LIBS ) list( APPEND __add_libs ${_PAR_LIBS} ) endif() if( __add_libs ) set(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}") endif() set(__add_incs "") set(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES) if( CMAKE_REQUIRED_INCLUDES ) list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} ) endif() if( _PAR_INCLUDES ) list( APPEND __add_incs ${_PAR_INCLUDES} ) endif() if( __add_incs ) set(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}") endif() # write the source file file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCSource/test_${_PAR_VAR}.c" "${SOURCE}\n" ) ecbuild_debug( "Performing Test ${_PAR_VAR}" ) ecbuild_try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCSource/test_${_PAR_VAR}.c COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH} "${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}" "${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}" COMPILE_OUTPUT_VARIABLE compile_OUTPUT RUN_OUTPUT_VARIABLE run_OUTPUT ) # if it did not compile make the return value fail code of 1 if( NOT ${_PAR_VAR}_COMPILED ) set( ${_PAR_VAR}_EXITCODE 1 ) endif() ecbuild_debug_var( ${_PAR_VAR}_EXITCODE ) ecbuild_debug_var( ${_PAR_VAR}_COMPILED ) ecbuild_debug_var( compile_OUTPUT ) ecbuild_debug_var( run_OUTPUT ) # if the return value was 0 then it worked if("${${_PAR_VAR}_EXITCODE}" EQUAL 0) ecbuild_debug("Performing Test ${_PAR_VAR} - Success") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Performing C SOURCE FILE Test ${_PAR_VAR} succeded with the following compile output:\n" "${compile_OUTPUT}\n" "Performing C SOURCE FILE Run ${_PAR_VAR} succeded with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_PAR_VAR}}\n" "Source file was:\n${SOURCE}\n") set( ${_PAR_VAR} 1 CACHE INTERNAL "Test ${_PAR_VAR}") set( ${_PAR_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_PAR_VAR} output") else() if(CMAKE_CROSSCOMPILING AND "${${_PAR_VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN") set(${_PAR_VAR} "${${_PAR_VAR}_EXITCODE}") set(${OUTPUT} "") else() set(${_PAR_VAR} "" CACHE INTERNAL "Test ${_PAR_VAR}") set(${_PAR_OUTPUT} "" CACHE INTERNAL "Test ${_PAR_VAR} output") endif() ecbuild_debug("Performing Test ${_PAR_VAR} - Failed") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Performing C SOURCE FILE Test ${_PAR_VAR} failed with the following compile output:\n" "${compile_OUTPUT}\n" "Performing C SOURCE FILE Run ${_PAR_VAR} failed with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_PAR_VAR}_EXITCODE}\n" "Source file was:\n${SOURCE}\n") endif() endif() endmacro() ecbuild-3.16.0/cmake/ecbuild_enable_fortran.cmake0000664000175000017500000000573515252726137022152 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_enable_fortran # ====================== # # Enable the Fortran language. :: # # ecbuild_enable_fortran( [ MODULE_DIRECTORY ] [ REQUIRED ] ) # # Options # ------- # # MODULE_DIRECTORY : optional, defaults to ``${PROJECT_BINARY_DIR}/module`` # set the CMAKE_Fortran_MODULE_DIRECTORY # # NO_MODULE_DIRECTORY : optional # unset CMAKE_Fortran_MODULE_DIRECTORY # # REQUIRED : optional # fail if no working Fortran compiler was detected # ############################################################################## macro( ecbuild_enable_fortran ) set( options REQUIRED NO_MODULE_DIRECTORY ) set( single_value_args MODULE_DIRECTORY ) set( multi_value_args ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_enable_fortran(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT CMAKE_Fortran_COMPILER_LOADED ) enable_language( Fortran ) ecbuild_compiler_flags( Fortran ) endif() if( _PAR_REQUIRED ) if( CMAKE_Fortran_COMPILER_FORCED ) set( CMAKE_Fortran_COMPILER_WORKS 1 ) endif() if( NOT CMAKE_Fortran_COMPILER OR NOT CMAKE_Fortran_COMPILER_WORKS ) ecbuild_critical( "Fortran compiler required by project ${PROJECT_NAME} but does not seem to work" ) endif() endif() if( CMAKE_Fortran_COMPILER_LOADED ) include(CheckFortranFunctionExists) if( CMAKE_C_COMPILER_LOADED AND ENABLE_FORTRAN_C_INTERFACE ) include(FortranCInterface) endif() set( EC_HAVE_FORTRAN 1 ) # see issue ECBUILD-298 if( CMAKE_Fortran_COMPILER_ID MATCHES PGI ) unset( CMAKE_Fortran_COMPILE_OPTIONS_PIE ) unset( CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS ) endif() endif() if( _PAR_NO_MODULE_DIRECTORY ) unset( CMAKE_Fortran_MODULE_DIRECTORY ) else() if( _PAR_MODULE_DIRECTORY ) set( CMAKE_Fortran_MODULE_DIRECTORY ${_PAR_MODULE_DIRECTORY} ) else() set( CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/module ) endif() file( MAKE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} ) if( ECBUILD_2_COMPAT ) include_directories( ${CMAKE_Fortran_MODULE_DIRECTORY} ) endif() # We should also not auto-install. Every project is already doing this anyway # install( CODE "EXECUTE_PROCESS (COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"${CMAKE_Fortran_MODULE_DIRECTORY}/\${BUILD_TYPE}\" \"${INSTALL_INCLUDE_DIR}\")" ) endif() endmacro( ecbuild_enable_fortran ) ecbuild-3.16.0/cmake/ecbuild-config.cmake0000664000175000017500000000123715252726137020345 0ustar alastairalastair# (C) Copyright 2019- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. get_filename_component(ecbuild_MACROS_DIR ${CMAKE_CURRENT_LIST_DIR} ABSOLUTE) cmake_policy( PUSH ) cmake_policy( SET CMP0057 NEW ) if(NOT ${ecbuild_MACROS_DIR} IN_LIST CMAKE_MODULE_PATH) list(INSERT CMAKE_MODULE_PATH 0 ${ecbuild_MACROS_DIR}) endif() cmake_policy( POP ) include(ecbuild) ecbuild-3.16.0/cmake/ecbuild_check_urls.cmake0000664000175000017500000000747415252726137021315 0ustar alastairalastair# (C) Copyright 2020- JCSDA. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ############################################################################## #.rst: # # ecbuild_check_urls # ====================== # # Check multiple URL validity. :: # # ecbuild_check_urls( NAMES [ ... ] # RESULT ) # # curl or wget is required (curl is preferred if available). # # Options # ------- # # NAMES : required # list of names of the files to check, including the directory structure # on the server hosting test files (if available) # # RESULT : required # check result (0 if all URLs exist, more if not) # # Usage # ----- # # Check whether files exist on ``/`` # for each name given in the list of ``NAMES``. # ``RESULT`` is set to the number of missing files. # # If the ``ECBUILD_DOWNLOAD_BASE_URL`` variable is not set, the default URL # ``https://sites.ecmwf.int/repository`` is used. # # Examples # -------- # # Check file ... existence: :: # # ecbuild_check_urls( NAMES test/data/dir/msl1.grib test/data/dir/msl2.grib # RESULT FILES_EXIST ) # ############################################################################## function(ecbuild_check_urls) set( single_value_args RESULT ) set( multi_value_args NAMES ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_p_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_check_url(): \"${_p_UNPARSED_ARGUMENTS}\"") endif() ### check parameters if( NOT _p_NAMES ) ecbuild_critical("ecbuild_get_test_data() expects a NAMES") endif() # Allow the user to override the download URL (ECBUILD-447) if( NOT DEFINED ECBUILD_DOWNLOAD_BASE_URL ) set( ECBUILD_DOWNLOAD_BASE_URL https://sites.ecmwf.int/repository ) endif() # Do not retry downloads by default (ECBUILD-307) if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES ) set( ECBUILD_DOWNLOAD_RETRIES 0 ) endif() # Use default timeout of 30s if not specified (ECBUILD-307) if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT ) set( ECBUILD_DOWNLOAD_TIMEOUT 30 ) endif() # Initialise CODE_SUM set( CODE_SUM 0 ) find_program( CURL_PROGRAM curl ) if ( NOT CURL_PROGRAM ) find_program( WGET_PROGRAM wget ) if ( NOT WGET_PROGRAM ) set( CODE 1 ) if( NOT WARNING_CANNOT_DOWNLOAD_TEST_DATA ) ecbuild_warn( "Couldn't find curl neither wget -- cannot check URL, set result to 0." ) set( WARNING_CANNOT_DOWNLOAD_TEST_DATA 1 CACHE INTERNAL "Couldn't find curl neither wget -- cannot check URL, set result to 0" ) mark_as_advanced( WARNING_CANNOT_DOWNLOAD_TEST_DATA ) endif() endif() endif() foreach( NAME ${_p_NAMES} ) if ( CURL_PROGRAM ) execute_process( COMMAND ${CURL_PROGRAM} --silent --head --fail --output /dev/null --retry ${ECBUILD_DOWNLOAD_RETRIES} --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT} ${ECBUILD_DOWNLOAD_BASE_URL}/${NAME} RESULT_VARIABLE CODE ) else() math( EXPR ECBUILD_DOWNLOAD_RETRIES "${ECBUILD_DOWNLOAD_RETRIES} + 1" ) execute_process( COMMAND ${WGET_PROGRAM} -O/dev/null -q -t ${ECBUILD_DOWNLOAD_RETRIES} -T ${ECBUILD_DOWNLOAD_TIMEOUT} ${ECBUILD_DOWNLOAD_BASE_URL}/${NAME} RESULT_VARIABLE CODE ) endif() # Add to CODE_SUM if( CODE GREATER 0) math( EXPR CODE_SUM "${CODE_SUM} + 1" ) endif() endforeach() # Set result set( ${_p_RESULT} ${CODE_SUM} PARENT_SCOPE ) endfunction(ecbuild_check_urls) ecbuild-3.16.0/cmake/ecbuild_define_paths.cmake0000664000175000017500000000264615252726137021620 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. # define project paths file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib ) ####################################################################################################### # setup library building rpaths (both in build dir and then when installed) # add the automatic parts to RPATH which point to dirs outside build tree set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE ) # use RPATHs for the build tree set( CMAKE_SKIP_BUILD_RPATH FALSE ) # build with *relative* rpaths by default if( ENABLE_RELATIVE_RPATHS ) set( CMAKE_BUILD_WITH_INSTALL_RPATH TRUE ) else() # in case the RPATH is absolute, the install RPATH cannot be set # at build-time since it breaks the build tree dynamic links set( CMAKE_BUILD_WITH_INSTALL_RPATH FALSE ) endif() # put the include dirs which are in the source or build tree # before all other include dirs, so the headers in the sources # are prefered over the already installed ones (since cmake 2.4.1) set( CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON ) ecbuild-3.16.0/cmake/FindYACC.cmake0000664000175000017500000001553515252726137017021 0ustar alastairalastair# - Find yacc executable and provides macros to generate custom build rules # The module defines the following variables: # # YACC_EXECUTABLE - path to the yacc program # YACC_FOUND - true if the program was found # # The minimum required version of yacc can be specified using the # standard CMake syntax, e.g. find_package(YACC 2.1.3) # # If yacc is found, the module defines the macros: # YACC_TARGET( [VERBOSE ] # [COMPILE_FLAGS ]) # which will create a custom rule to generate a parser. is # the path to a yacc file. is the name of the source file # generated by yacc. A header file is also be generated, and contains # the token list. If COMPILE_FLAGS option is specified, the next # parameter is added in the yacc command line. if VERBOSE option is # specified, is created and contains verbose descriptions of the # grammar and parser. The macro defines a set of variables: # YACC_${Name}_DEFINED - true is the macro ran successfully # YACC_${Name}_INPUT - The input source file, an alias for # YACC_${Name}_OUTPUT_SOURCE - The source file generated by yacc # YACC_${Name}_OUTPUT_HEADER - The header file generated by yacc # YACC_${Name}_OUTPUTS - The sources files generated by yacc # YACC_${Name}_COMPILE_FLAGS - Options used in the yacc command line # # ==================================================================== #============================================================================= # Copyright 2009 Kitware, Inc. # Copyright 2006 Tristan Carel # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # This file is based on the FindFLEX CMake macro, and adapted by ECMWF #============================================================================= # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. FIND_PROGRAM(YACC_EXECUTABLE yacc DOC "path to the yacc/yacc executable") MARK_AS_ADVANCED(YACC_EXECUTABLE) IF(YACC_EXECUTABLE) # the yacc commands should be executed with the C locale, otherwise # the message (which are parsed) may be translated SET(_Yacc_SAVED_LC_ALL "$ENV{LC_ALL}") SET(ENV{LC_ALL} C) SET(ENV{LC_ALL} ${_Yacc_SAVED_LC_ALL}) # internal macro MACRO(YACC_TARGET_option_verbose Name YaccOutput filename) LIST(APPEND YACC_TARGET_cmdopt "--verbose") GET_FILENAME_COMPONENT(YACC_TARGET_output_path "${YaccOutput}" PATH) GET_FILENAME_COMPONENT(YACC_TARGET_output_name "${YaccOutput}" NAME_WE) ADD_CUSTOM_COMMAND(OUTPUT ${filename} COMMAND ${CMAKE_COMMAND} ARGS -E copy "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output" "${filename}" DEPENDS "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output" COMMENT "[YACC][${Name}] Copying yacc verbose table to ${filename}" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) SET(YACC_${Name}_VERBOSE_FILE ${filename}) LIST(APPEND YACC_TARGET_extraoutputs "${YACC_TARGET_output_path}/${YACC_TARGET_output_name}.output") ENDMACRO(YACC_TARGET_option_verbose) # internal macro MACRO(YACC_TARGET_option_extraopts Options) SET(YACC_TARGET_extraopts "${Options}") SEPARATE_ARGUMENTS(YACC_TARGET_extraopts) LIST(APPEND YACC_TARGET_cmdopt ${YACC_TARGET_extraopts}) ENDMACRO(YACC_TARGET_option_extraopts) #============================================================ # YACC_TARGET (public macro) #============================================================ # MACRO(YACC_TARGET Name YaccInput YaccOutput) SET(YACC_TARGET_output_header "") SET(YACC_TARGET_cmdopt "") SET(YACC_TARGET_outputs "${YaccOutput}") IF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7) MESSAGE(SEND_ERROR "Usage") ELSE() # Parsing parameters IF(${ARGC} GREATER 5 OR ${ARGC} EQUAL 5) IF("${ARGV3}" STREQUAL "VERBOSE") YACC_TARGET_option_verbose(${Name} ${YaccOutput} "${ARGV4}") ENDIF() IF("${ARGV3}" STREQUAL "COMPILE_FLAGS") YACC_TARGET_option_extraopts("${ARGV4}") ENDIF() ENDIF() IF(${ARGC} EQUAL 7) IF("${ARGV5}" STREQUAL "VERBOSE") YACC_TARGET_option_verbose(${Name} ${YaccOutput} "${ARGV6}") ENDIF() IF("${ARGV5}" STREQUAL "COMPILE_FLAGS") YACC_TARGET_option_extraopts("${ARGV6}") ENDIF() ENDIF() # Header's name generated by yacc (see option -d) LIST(APPEND YACC_TARGET_cmdopt "-d") STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\2" _fileext "${ARGV2}") STRING(REPLACE "c" "h" _fileext ${_fileext}) STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\1${_fileext}" YACC_${Name}_OUTPUT_HEADER "${ARGV2}") LIST(APPEND YACC_TARGET_outputs "${YACC_${Name}_OUTPUT_HEADER}") # message ( STATUS "${YACC_EXECUTABLE} ${YACC_TARGET_cmdopt} ${CMAKE_CURRENT_BINARY_DIR}/${ARGV1}" ) # message ( STATUS "${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.h ${YACC_${Name}_OUTPUT_HEADER}" ) # message ( STATUS "${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c ${ARGV2}" ) ADD_CUSTOM_COMMAND(OUTPUT ${YACC_TARGET_outputs} ${YACC_TARGET_extraoutputs} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${ARGV1} ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${YACC_EXECUTABLE} ${YACC_TARGET_cmdopt} ${CMAKE_CURRENT_BINARY_DIR}/${ARGV1} COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.h ${YACC_${Name}_OUTPUT_HEADER} COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c ${ARGV2} DEPENDS ${ARGV1} COMMENT "[YACC][${Name}] Building parser with yacc" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) # define target variables SET(YACC_${Name}_DEFINED TRUE) SET(YACC_${Name}_INPUT ${ARGV1}) SET(YACC_${Name}_OUTPUTS ${YACC_TARGET_outputs}) SET(YACC_${Name}_COMPILE_FLAGS ${YACC_TARGET_cmdopt}) SET(YACC_${Name}_OUTPUT_SOURCE "${YaccOutput}") ENDIF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7) ENDMACRO(YACC_TARGET) # #============================================================ ENDIF(YACC_EXECUTABLE) FIND_PACKAGE_HANDLE_STANDARD_ARGS(YACC REQUIRED_VARS YACC_EXECUTABLE ) # FindYACC.cmake ends here ecbuild-3.16.0/cmake/sg.pl0000775000175000017500000006570615252726137015455 0ustar alastairalastair#!/usr/bin/env perl # (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. # ========================================================================== # sg.pl -- Serialisation Generator # ========================================================================== # # PURPOSE # # Generates .b ("bless") files that are #included into C++ class bodies # to provide eckit's persistence / serialisation infrastructure: # # - Bless constructor ClassName(eckit::Bless& b) # - Evolve constructor ClassName(eckit::Evolve b) # - specName() static type identifier string # - isa() RTTI-style type chain registration # - schema() member layout introspection # - describe() human-readable dump (unless hand-written) # - _export() binary export via eckit::Exporter # # A header opts in by containing #include "path/ClassName.b" inside # the class body. The build system (CMake) detects this and invokes # sg.pl on the header at configure/build time. # # USAGE # # perl sg.pl [output_dir] [namespace] # # header.h -- C++ header to parse (required) # output_dir -- directory for generated .b files (default: dirname of header) # namespace -- C++ namespace qualifying helper functions (default: "eckit") # # HOW IT WORKS # # 1. Preprocessing (parse sub, lines 177-183 in original) # - Strip all preprocessor lines (^#...) -- includes, guards, macros # - Strip all C++ line comments (//...) # - Tokenize: split on word boundaries (\b), then split each # non-word token into individual characters so that operators, # braces, and punctuation each become a single token. # - Drop empty/whitespace-only tokens. # # 2. Parsing # A hand-written recursive-descent parser walks the token stream # looking for class/struct definitions (possibly preceded by # template<...>). For each class found it records: # - name, base classes (super), template parameters # - member variables (name + type) # - member functions (name, type, args, const/static/virtual/...) # - nested classes # # 3. Code generation # For each parsed class, a .b file is written to output_dir # containing the C++ method bodies listed above. # # KNOWN LIMITATIONS # # The parser is intentionally minimal -- just enough to handle the # class declarations found in eckit headers that use the .b mechanism. # # - Template parameters: only "class", "bool", and "int" are accepted # as parameter keywords. "typename" and non-type template parameters # other than bool/int will cause a parse error. # - Multi-declaration members (int a, b, *c;) are not supported. # - Block comments (/* ... */) are only handled inside class bodies, # not at file scope. # - C-style casts, complex SFINAE expressions, and many modern C++ # constructs are not understood and will cause parse failures if # they appear in headers processed by this script. # - Pure virtual = 0 is supported; = default / = delete are not. # - Explicit template specializations (template <>) are skipped # entirely, since they are never persistence classes. # # ========================================================================== use strict; use File::Basename; # -------------------------------------------------------------------------- # Command-line arguments # -------------------------------------------------------------------------- # (1) C++ header file to process (required) my $file = $ARGV[0]; # (2) Output directory for generated .b files (optional, defaults to # the directory containing the input file) my $base = $ARGV[1]; # (3) C++ namespace used to qualify helper functions in the generated # code -- eckit::_describe, eckit::_export, etc. (optional, # defaults to "eckit") my $namespace = $ARGV[2]; if( $base eq "" ) { $base = dirname($file); } if( $namespace eq "" ) { $namespace = "eckit" } # -------------------------------------------------------------------------- # Parse the header and generate .b files # -------------------------------------------------------------------------- # Parse returns a list of "class" objects -- one per class definition # found in the header (forward declarations are skipped). my @c = parser::parse($file); foreach my $c ( @c ) { my $n = $c->name; # Each class gets its own .b file, written to stdout redirected # to $base/$n.b. open(STDOUT,">$base/$n.b") || die "$base/$n.b: $!"; # ------------------------------------------------------------------ # Build the Bless constructor initialiser list. # Bless is the "deserialise from raw memory" path. Base classes # are initialised with (b) and members with (b(&member)). # ------------------------------------------------------------------ my @init1; push @init1, map { "$_(b)" } $c->super; push @init1, map { "$_(b(\&$_))" } $c->members; my $col1 = ""; $col1=":\n" if(@init1); my $init1 = join(",\n",map {"\t$_"} @init1); # ------------------------------------------------------------------ # Build the Evolve constructor initialiser list. # Evolve is the "deserialise from named-field archive" path. # Base classes get (b("ClassName")) and members get # (b("ClassName","memberName")). # ------------------------------------------------------------------ my @init2; push @init2, map { "$_(b(\"$n\"))" } $c->super; push @init2, map { "$_(b(\"$n\",\"$_\"))" } $c->members; my $col2 = ""; $col2=":\n" if(@init2); my $init2 = join(",\n",map {"\t$_"} @init2); # ------------------------------------------------------------------ # describe() -- human-readable recursive dump of the object tree. # Calls _startClass / base::describe / _describe(member) / _endClass. # ------------------------------------------------------------------ my @s = map { "${_}::describe(s,depth+1)" } $c->super; my @m = map { "${namespace}::_describe(s,depth+1,\"$_\",$_)" } $c->members; my $d = join(";\n\t","${namespace}::_startClass(s,depth,specName())",@s,@m,"${namespace}::_endClass(s,depth,specName())"); # ------------------------------------------------------------------ # _export() -- binary export via eckit::Exporter. # Same pattern: _startClass / base::_export / _export(member) / _endClass. # ------------------------------------------------------------------ my @s = map { "${_}::_export(h)" } $c->super; my @m = map { "${namespace}::_export(h,\"$_\",$_)" } $c->members; my $D = join(";\n\t","${namespace}::_startClass(h,\"$n\")",@s,@m,"${namespace}::_endClass(h,\"$n\")"); # ------------------------------------------------------------------ # specName() -- static method returning the type's string identifier. # For plain classes this is a const char* literal "ClassName". # For template instantiations it builds a std::string at runtime: # "ClassName<" + Traits::name() + "," + Traits::name() + ">" # ------------------------------------------------------------------ my $spec = "\"$n\""; my @tmpl = $c->template; my $spec_type = "const char*"; if(@tmpl) { $spec_type = "std::string"; my $x = join("+ ',' + ", map { "Traits<$_>::name()"; } @tmpl); $spec = <<"EOS"; std::string("$n<\") + $x + ">" EOS $spec =~ s/\n/ /g; } # ------------------------------------------------------------------ # isa() -- registers this type (and all bases) in eckit's RTTI chain. # Generates: Base1::isa(t); Base2::isa(t); eckit::Isa::add(t, specName()); # ------------------------------------------------------------------ my $isa = "${namespace}::Isa::add(t,specName());"; foreach my $s ( $c->super ) { $isa = "${s}::isa(t);$isa"; } # ------------------------------------------------------------------ # schema() -- introspection of member layout (name, size, offset, type). # ------------------------------------------------------------------ my $schema; @s = map { "${_}::schema(s)" } $c->super; @m = map { $a=$_->[0]; $b=$_->[1]; "s.member(\"$a\",member_size($n,$a),member_offset($n,$a),\"$b\")" } $c->members_types; $schema = join(";\n\t","s.start(specName(),sizeof($n))",@s,@m,"s.end(specName())"); # ------------------------------------------------------------------ # Emit the .b file # ------------------------------------------------------------------ # Bless constructor and Evolve constructor print <<"EOF"; ${n}(${namespace}::Bless& b)$col1$init1 { } ${n}(${namespace}::Evolve b)$col2$init2 { } static ${spec_type} specName() { return ${spec}; } static void isa(TypeInfo* t) { ${isa} } static ${namespace}::Isa* isa() { return ${namespace}::Isa::get(specName()); } static void schema(${namespace}::Schema& s) { $schema; } EOF # describe() is only generated if the class doesn't already define # its own -- allows hand-written overrides. if(!$c->has_method("describe")) { print <<"EOF"; void describe(std::ostream& s,int depth = 0) const { $d; } EOF } print <<"EOF"; void _export(${namespace}::Exporter& h) const { $D; } EOF } # Dead code -- older schema-only generator kept for reference. # Guarded by if(0) so it never executes. if(0) { foreach my $c ( @c ) { my $n = $c->name; open(OUT,">${n}.b"); select OUT; print "static void schema(${namespace}::Schema& s) {\n"; foreach my $x ( $c->super ) { print "${x}::schema(s);\n"; } foreach my $x ( $c->members ) { print "s(\"${n}::$x\",offsetof($n,$x),sizeof(&(($n*)0)->$x));\n"; } print "}\n"; } } # ========================================================================== # package parser -- recursive-descent C++ header parser # ========================================================================== # # Parses a minimal subset of C++ sufficient to extract class definitions # with their base classes, member variables, and method signatures. # # The token stream is stored in the package-level @TOKENS array. # Each "sub" below either consumes tokens or peeks at the head. # # ========================================================================== package parser; use Carp; my @TOKENS; # -------------------------------------------------------------------------- # parse($file) -> @classes # # Entry point. Reads the file, preprocesses it into a token stream, # and runs the top-level grammar loop. # # Preprocessing: # 1. Strip lines starting with # (preprocessor directives, include # guards, macros). This means #define'd code is invisible to us. # 2. Strip // line comments. # 3. Tokenize: split on word boundaries, then split non-word chunks # into individual characters (so "{", "(", "*", etc. are each one # token). Drop whitespace-only and empty tokens. # # Top-level grammar: # Repeatedly scan for "typedef", "template", "class", or "struct". # - typedef: skip to ";" (not interesting for .b generation) # - template: parse template parameter list, then the class that follows # - class/struct: parse class definition # # Returns a list of "class" objects (blessed hashrefs). Forward # declarations and explicit specializations return undef and are # filtered out. # -------------------------------------------------------------------------- sub parse { my ($file) = @_; local $/ = undef; open(IN,"<$file") || croak "$file: $!"; my $x = ; close(IN); # Preprocessing $x =~ s/^#.*$//mg; # strip preprocessor lines $x =~ s/\/\/.*$//mg; # strip line comments # Tokenize @TOKENS = grep { length($_); } # drop empty tokens map { /\W/ ? split('',$_) : $_; } # split non-word tokens into chars map { s/\s//g; $_; } # strip whitespace within tokens split(/\b/, $x ); # split on word boundaries # Top-level grammar loop my @c; my $x; while($x = consume_until("(typedef|template|class|struct)")) { if($x eq 'typedef') { consume_until(";"); next; } if($x eq 'template') { push @c, parse_template(); } else { push @c, parse_class(); } } # Filter out undefs (forward declarations, skipped specializations) return grep { defined $_; } @c; } # -------------------------------------------------------------------------- # parse_template() -> class | undef # # Called after consuming the "template" keyword. Parses the template # parameter list <...>, then the class/struct definition that follows. # # Special case: explicit specializations (template <>) have an empty # parameter list. These are never persistence classes so we skip the # entire declaration and return undef. # -------------------------------------------------------------------------- sub parse_template { my @tmp = template_args(); if(!@tmp) { # Explicit specialization (template <>): not a new class, # skip the entire declaration. my $x = consume_until('(;|\{)'); if($x eq '{') { unshift @TOKENS, $x; consume_block('{','}'); next_is(";"); } return; } return parse_class(@tmp) if(next_is("(class|struct)")); } # -------------------------------------------------------------------------- # template_args() -> @parameter_names # # Parses the angle-bracketed template parameter list. # # Handles: # template <> -> empty list (explicit specialization) # template -> ("T") # template -> ("T", "U") # template -> ("T") (default is discarded) # template -> ("B") # template -> ("N") # # Does NOT handle "typename" -- only "class", "bool", and "int" are # accepted as parameter keywords. # -------------------------------------------------------------------------- sub template_args { my @tmp; expect_next("<"); # Empty parameter list: template <> if(next_is(">")) { return @tmp; } for(;;) { expect_next("(class|bool|int)"); push @tmp, next_ident(); # Skip default argument: = SomeType<...> if(next_is("=")) { my $x = consume_until('(,|\>|\<)'); unshift @TOKENS,$x; while($x eq '<') { consume_block('<','>'); $x = consume_until('(,|\>|\<)'); unshift @TOKENS,$x; } } last unless(next_is(",")); } expect_next(">"); return @tmp; } # -------------------------------------------------------------------------- # parse_class(@template_params) -> class | undef # # Parses a class or struct definition. @template_params is empty for # non-template classes. # # Grammar (simplified): # ClassName ; -> forward declaration, return undef # ClassName : [virtual] [public] Base -> inheritance # ClassName { ... } ; -> full definition # # Inside the class body, recognises: # - Access specifiers (public/private/protected:) # - Friend declarations (skipped) # - Nested typedefs, using, typename, enum (skipped to ;) # - Nested class/struct (recursive parse_class) # - Template member functions # - Member variables (type + name, terminated by ; , or =) # - Member functions (type + name + (...) + optional body) # - C-style block comments (/* ... */) # - Operator overloads (operator+, operator(), operator new[], etc.) # - Pure virtual (= 0) # - Constructor initialiser lists (: member(init), ...) # # Returns a blessed "class" hashref with fields: # name -> string # super -> [base class names] # template -> [template parameter names] # members -> [{name, type, static?}] # methods -> [{name, type, args, const?, static?, virtual?, ...}] # classes -> [nested class objects] # -------------------------------------------------------------------------- sub parse_class { my (@tmp) = @_; my $self = {}; my $name = next_ident(); $self->{name} = $name; $self->{template} = \@tmp if(@tmp); # Forward declaration: "class Foo;" return if(next_is(";")); # Inheritance list: "class Foo : public Base1, virtual Base2" if(next_is(":")) { for(;;) { ignore_while("(public|private|protected|virtual)"); push @{$self->{super}}, next_ident(); last unless(next_is(",")); } } # Class body expect_next('{'); while(!peek_next('}')) { # --- Block comments inside class body (/* ... */) --- if(next_is('\/')) { if(next_is('\*')) { while(!next_is('\/')) { consume_until('\*'); } next; } else { unshift @TOKENS, "/"; } } # --- Access specifiers --- if(next_is("(public|private|protected)")) { expect_next(":"); next; } # --- Friend declarations (skip entirely) --- if(next_is("friend")) { my $x = consume_until("(;|{)"); if($x eq "{") { unshift @TOKENS, $x; consume_block('{','}'); } next; } # --- typedef, using, typename, enum (skip to ;) --- if(next_is("(typedef|using|typename|enum)")) { consume_until(";"); next; } # --- Nested class/struct --- if(next_is("(class|struct)")) { push @{$self->{classes}}, parse_class(); next; } # --- Begin parsing a member variable or method declaration --- my %m; # Template member functions: template void foo(...) while(next_is("template")) { push @{ $m{template} } , template_args(); } my @x; $m{explicit} = 1 if(next_is("explicit")); $m{static} = 1 if(next_is("static")); $m{virtual} = 1 if(next_is("virtual")); # Accumulate type + name tokens. The last identifier before # a delimiter ( ; , = ( ) is the member/method name; everything # before it is the type. my $x; while($x = next_is_ident()) { push @x, $x; push @x,'*' while(next_is('\*')); push @x,'&' while(next_is('\&')); $m{name} = $x; # --- Member variable: terminated by , ; or = --- my $s; if($s = next_is('(,|;|=)')) { pop @x; $m{type} = make_type(@x); if(exists $m{static}) { push @{$self->{class_members}}, \%m; } else { push @{$self->{members}}, \%m; } consume_until(";") if($s eq '='); last; } # --- Method: name followed by (...) --- if(peek_next('\(')) { pop @x; $m{type} = make_type(@x); # Parse argument list my @args = consume_block('(',')'); shift @args; # remove opening '(' pop @args; # remove closing ')' # Split arguments on top-level commas # (commas inside <> or () are nested, not separators) my @a; my $n = 0; my @z; foreach my $a ( @args ) { if($a eq ',' && $n == 0) { push @a, make_type(@z); @z = (); next; } $n++ if($a eq '<'); $n++ if($a eq '('); $n-- if($a eq ')'); $n-- if($a eq '>'); push @z,$a; } push @a, make_type(@z) if(@z); $m{const} = 1 if(next_is("const")); $m{override} = 1 if(next_is("override")); $m{args} = \@a; if(exists $m{static}) { push @{$self->{class_methods}}, \%m; } else { push @{$self->{methods}}, \%m; } # Method body or declaration if(next_is(':')) { # Constructor initialiser list: skip to { and consume body consume_until('\{'); unshift @TOKENS, '{'; consume_block('{','}'); } else { if(peek_next('\{')) { # Inline method body consume_block('{','}'); } else { # Pure virtual (= 0) or plain declaration (;) if(next_is("=")) { expect_next("0"); $m{abstract} = 1; } expect_next(";"); } } last; } } } expect_next("}"); expect_next(";"); return bless($self,"class"); } # ========================================================================== # Token stream primitives # ========================================================================== # -------------------------------------------------------------------------- # consume_until($regex) -> $token | undef # # Discards tokens until one matches $regex, then returns that token. # Returns undef if the token stream is exhausted. # -------------------------------------------------------------------------- sub consume_until { my ($r) = @_; while(@TOKENS) { my $x = shift @TOKENS; return $x if($x =~ /^$r$/); } return undef; } # -------------------------------------------------------------------------- # consume_block($open, $close) -> @tokens # # Consumes a balanced block of tokens delimited by $open/$close # (e.g. '{'/'}', '('/')', '<'/'>'). Returns all consumed tokens # including the delimiters. Handles nesting. # # Precondition: $TOKENS[0] must equal $open. # -------------------------------------------------------------------------- sub consume_block { my ($bra,$ket) = @_; my $n = 0; my @x; croak "@TOKENS" unless($bra eq $TOKENS[0]); while(@TOKENS) { my $x = shift @TOKENS; $n++ if($x eq $bra); $n-- if($x eq $ket); push @x,$x; return @x if($n == 0); } } # -------------------------------------------------------------------------- # ignore_while($regex) # # Consumes and discards consecutive tokens matching $regex. # Stops at the first non-matching token (which is left in the stream). # -------------------------------------------------------------------------- sub ignore_while { my ($r) = @_; while(@TOKENS) { return unless($TOKENS[0] =~ /^$r$/); shift @TOKENS; } } # -------------------------------------------------------------------------- # expect_next($regex) -> $token # # Consumes the next token and asserts it matches $regex. # Croaks (dies with stack trace) on mismatch. # -------------------------------------------------------------------------- sub expect_next { my ($r) = @_; my $ident = shift @TOKENS; croak "$ident is not $r" unless($ident =~ /^$r$/); return $ident; } # -------------------------------------------------------------------------- # next_ident() -> $identifier # # Consumes and returns the next identifier (via next_is_ident). # Croaks if the next token is not an identifier. # -------------------------------------------------------------------------- sub next_ident { my $x = next_is_ident(); croak "not an ident " unless($x); return $x; } # -------------------------------------------------------------------------- # next_is($regex) -> $token | undef # # If the next token matches $regex, consumes and returns it. # Otherwise returns undef and leaves the stream unchanged. # -------------------------------------------------------------------------- sub next_is { my ($r) = @_; if($TOKENS[0] =~ /^$r$/) { return shift @TOKENS; } return undef; } # -------------------------------------------------------------------------- # next_is_ident() -> $identifier | undef # # Tries to consume a C++ identifier from the token stream. # Handles several complex cases: # # - Operator overloads: "operator+", "operator()", "operator new", # "operator delete[]", "operator<<", etc. # - Destructors: "~ClassName" # - Template identifiers: "Foo" (angle brackets consumed # as a block and appended to the name) # - Qualified names: "Namespace::Name" (one level of :: only) # # Returns the full identifier string, or undef if the next token is # not the start of an identifier. # -------------------------------------------------------------------------- sub next_is_ident { # Check for "operator" keyword first my $op = next_is("operator"); if($op) { my $x; # operator new / operator delete / operator new[] / operator delete[] if($x = next_is("(new|delete)")) { $op .= " $x"; if(next_is('\[')) { expect_next('\]'); $op .= "[]"; } return $op; } # operator() if(next_is('\(')) { expect_next('\)'); $op .= "()"; } # operator+, operator<<, operator==, operator!=, etc. my $z; while($z = next_is('[\-+/\*\[\]<>=!]')) { $op .= $z; } return $op; } # Optional ~ for destructors my $y = next_is('\~'); # The identifier itself (any \w+ token) my $x = next_is('\w+'); if($x) { $x = (defined $y ? "$y$x" : $x); # Template arguments: Foo if(peek_next("<")) { my @x = consume_block("<",">"); $x .= join("",@x); } # Scope resolution: Namespace::Name (one level) if(next_is(":")) { if(next_is(":")) { my $z = next_is_ident(); return "${x}::${z}"; } else { # Single colon was not ::, put it back unshift @TOKENS, ":"; } } } return $x; } # -------------------------------------------------------------------------- # peek_next($regex) -> bool # # Returns true if the next token matches $regex, without consuming it. # -------------------------------------------------------------------------- sub peek_next { my ($r) = @_; if($TOKENS[0] =~ /^$r$/) { return 1; } return 0; } # -------------------------------------------------------------------------- # make_type(@tokens) -> $type_string # # Joins a list of type tokens into a human-readable type string. # Inserts spaces between consecutive word tokens and between # pointer/reference sigils and following words. Normalises ">>" # to "> >" for C++03 compatibility. # -------------------------------------------------------------------------- sub make_type { my (@a) = @_; my $p; my @x; foreach my $a ( @a ) { push @x, " " if(defined $p && $p =~ /^(\w+|\&|\*)$/ && $a =~ /^\w+$/); push @x, $a; $p = $a; } my $s = join('',@x); $s =~ s/>>/> >/g; return $s; } # ========================================================================== # package class -- data object representing a parsed C++ class # ========================================================================== # # Fields (hashref keys): # name -> string: class name # super -> [string]: base class names # template -> [string]: template parameter names # members -> [{name, type}]: non-static member variables # class_members -> [{name, type}]: static member variables # methods -> [{name, type, args, const?, override?}]: non-static methods # class_methods -> [{name, type, args}]: static methods # classes -> [class]: nested class definitions # # ========================================================================== package class; # name() -> $string sub name { my ($self) = @_; return $self->{name}; } # super() -> @strings (base class names) sub super { my ($self) = @_; return $self->{super} ? @{$self->{super}} : (); } # members() -> @strings (member variable names) sub members { my ($self) = @_; my @x = $self->{members} ? @{$self->{members}} : (); return map { $_->{name} } @x; } # methods() -> @strings (method names) sub methods { my ($self) = @_; my @x = $self->{methods} ? @{$self->{methods}} : (); return map { $_->{name} } @x; } # has_method($name) -> bool # Returns true if the class has a method with the given name. # Used to check whether describe() is hand-written. sub has_method { my ($self,$name) = @_; return grep { $_ eq $name } $self->methods; } # members_types() -> @[ [$name, $type] ] # Returns member variables with both name and type. sub members_types { my ($self) = @_; my @x = $self->{members} ? @{$self->{members}} : (); return map { [ $_->{name}, $_->{type} ] } @x; } # template() -> @strings (template parameter names) sub template { my ($self) = @_; return $self->{template} ? @{$self->{template}} : (); } 1; ecbuild-3.16.0/cmake/ecbuild_setup_test_framework.cmake0000664000175000017500000000323615252726137023437 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ecbuild_add_option( FEATURE TESTS DEFAULT ON DESCRIPTION "Enable the unit tests" ) if( HAVE_TESTS ) # CTest has built-in support for running with memcheck # (https://cmake.org/cmake/help/latest/manual/ctest.1.html#ctest-memcheck-step) # via `ctest -T memcheck`, however by default memcheck does not exit with a # non-zero error code if any issues are found. # # CTest will run ${MEMORYCHECK_COMMAND} with ${MEMORYCHECK_COMMAND_OPTIONS}. # Suppressions are read from ${MEMORYCHECK_SUPPRESSIONS_FILE} if given. find_program( MEMORYCHECK_COMMAND valgrind ) ecbuild_debug_var( MEMORYCHECK_COMMAND ) if( NOT MEMORYCHECK_COMMAND_OPTIONS ) set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --error-exitcode=1" CACHE STRING "Options passed to memcheck command" ) endif() ecbuild_debug_var( MEMORYCHECK_COMMAND_OPTIONS ) if( NOT MEMORYCHECK_SUPPRESSIONS_FILE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/valgrind_suppress.txt" ) set( MEMORYCHECK_SUPPRESSIONS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.supp" CACHE FILEPATH "Suppressions file to be used with memcheck command" ) endif() ecbuild_debug_var( MEMORYCHECK_SUPPRESSIONS_FILE ) else() ecbuild_info("Tests have been disabled") endif() ecbuild-3.16.0/cmake/ecbuild_purge_compiler_flags.cmake0000664000175000017500000000442315252726137023352 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_get_build_type_list # =========================== # # Return the list of recognised CMake build types :: # # ecbuild_get_build_type_list( ) # # The list contains the standard ecBuild build types # (``NONE``, ``DEBUG``, ``BIT``, ``PRODUCTION``, ``RELEASE``, # ``RELWITHDEBINFO``) plus the value of ``CMAKE_BUILD_TYPE`` if it is set # to a custom value not already in the list. # ############################################################################## macro( ecbuild_get_build_type_list _outvar ) set( _btypelist NONE DEBUG BIT PRODUCTION RELEASE RELWITHDEBINFO ) if (NOT "${CMAKE_BUILD_TYPE}" IN_LIST _btypelist) list (APPEND _btypelist "${CMAKE_BUILD_TYPE}") endif () set( ${_outvar} ${_btypelist} ) endmacro() ############################################################################## #.rst: # # ecbuild_purge_compiler_flags # ============================ # # Purge compiler flags for a given language :: # # ecbuild_purge_compiler_flags( ) # ############################################################################## macro( ecbuild_purge_compiler_flags _lang ) set( options WARN ) set( oneValueArgs "" ) set( multiValueArgs "" ) ecbuild_get_build_type_list( _btypelist ) list( REMOVE_ITEM _btypelist NONE ) list( INSERT _btypelist 0 ALL ) cmake_parse_arguments( _PAR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) if( CMAKE_${_lang}_COMPILER_LOADED ) # Clear default compilation flags potentially inherited from parent scope # when using custom compilation flags set(CMAKE_${_lang}_FLAGS "") foreach( _btype IN LISTS _btypelist) set(CMAKE_${_lang}_FLAGS_${_btype} "") endforeach() endif() if( _PAR_WARN ) ecbuild_warn( "Purging compiler flags set for ${_lang}" ) endif() endmacro() ecbuild-3.16.0/cmake/ecbuild_echo_targets.cmake0000664000175000017500000001267215252726137021636 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_echo_target_property # ============================ # # Output a given property of a given target. :: # # ecbuild_echo_target_property( ) # ############################################################################## function(ecbuild_echo_target_property tgt prop) cmake_policy(PUSH) if( POLICY CMP0026 ) cmake_policy( SET CMP0026 OLD) endif() # v for value, d for defined, s for set get_property(v TARGET ${tgt} PROPERTY ${prop}) get_property(d TARGET ${tgt} PROPERTY ${prop} DEFINED) get_property(s TARGET ${tgt} PROPERTY ${prop} SET) # only produce output for values that are set if(s) ecbuild_debug("tgt='${tgt}' prop='${prop}'") ecbuild_debug(" value='${v}'") ecbuild_debug(" defined='${d}'") ecbuild_debug(" set='${s}'") ecbuild_debug("") endif() cmake_policy(POP) endfunction() ############################################################################## #.rst: # # ecbuild_echo_target # =================== # # Output all possible target properties of a given target. :: # # ecbuild_echo_target( ) # ############################################################################## function(ecbuild_echo_target tgt) if(NOT TARGET ${tgt}) ecbuild_debug("There is no target named '${tgt}'") return() endif() set(props DEBUG_OUTPUT_NAME DEBUG_POSTFIX RELEASE_OUTPUT_NAME RELEASE_POSTFIX ARCHIVE_OUTPUT_DIRECTORY ARCHIVE_OUTPUT_DIRECTORY_DEBUG ARCHIVE_OUTPUT_DIRECTORY_RELEASE ARCHIVE_OUTPUT_NAME ARCHIVE_OUTPUT_NAME_DEBUG ARCHIVE_OUTPUT_NAME_RELEASE AUTOMOC AUTOMOC_MOC_OPTIONS BUILD_WITH_INSTALL_RPATH BUNDLE BUNDLE_EXTENSION COMPILE_DEFINITIONS COMPILE_DEFINITIONS_DEBUG COMPILE_DEFINITIONS_RELEASE COMPILE_FLAGS DEBUG_POSTFIX RELEASE_POSTFIX DEFINE_SYMBOL ENABLE_EXPORTS EXCLUDE_FROM_ALL EchoString FOLDER FRAMEWORK Fortran_FORMAT Fortran_MODULE_DIRECTORY GENERATOR_FILE_NAME GNUtoMS HAS_CXX IMPLICIT_DEPENDS_INCLUDE_TRANSFORM IMPORTED IMPORTED_CONFIGURATIONS IMPORTED_IMPLIB IMPORTED_IMPLIB_DEBUG IMPORTED_IMPLIB_RELEASE IMPORTED_LINK_DEPENDENT_LIBRARIES IMPORTED_LINK_DEPENDENT_LIBRARIES_DEBUG IMPORTED_LINK_DEPENDENT_LIBRARIES_RELEASE IMPORTED_LINK_INTERFACE_LANGUAGES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE IMPORTED_LINK_INTERFACE_LIBRARIES IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE IMPORTED_LINK_INTERFACE_MULTIPLICITY IMPORTED_LINK_INTERFACE_MULTIPLICITY_DEBUG IMPORTED_LINK_INTERFACE_MULTIPLICITY_RELEASE IMPORTED_LOCATION IMPORTED_LOCATION_DEBUG IMPORTED_LOCATION_RELEASE IMPORTED_NO_SONAME IMPORTED_NO_SONAME_DEBUG IMPORTED_NO_SONAME_RELEASE IMPORTED_SONAME IMPORTED_SONAME_DEBUG IMPORTED_SONAME_RELEASE IMPORT_PREFIX IMPORT_SUFFIX INCLUDE_DIRECTORIES INSTALL_NAME_DIR INSTALL_RPATH INSTALL_RPATH_USE_LINK_PATH INTERPROCEDURAL_OPTIMIZATION INTERPROCEDURAL_OPTIMIZATION_DEBUG INTERPROCEDURAL_OPTIMIZATION_RELEASE LABELS LIBRARY_OUTPUT_DIRECTORY LIBRARY_OUTPUT_DIRECTORY_DEBUG LIBRARY_OUTPUT_DIRECTORY_RELEASE LIBRARY_OUTPUT_NAME LIBRARY_OUTPUT_NAME_DEBUG LIBRARY_OUTPUT_NAME_RELEASE LINKER_LANGUAGE LINK_DEPENDS LINK_FLAGS LINK_FLAGS_DEBUG LINK_FLAGS_RELEASE LINK_INTERFACE_LIBRARIES LINK_INTERFACE_LIBRARIES_DEBUG LINK_INTERFACE_LIBRARIES_RELEASE LINK_INTERFACE_MULTIPLICITY LINK_INTERFACE_MULTIPLICITY_DEBUG LINK_INTERFACE_MULTIPLICITY_RELEASE LINK_SEARCH_END_STATIC LINK_SEARCH_START_STATIC LOCATION LOCATION_DEBUG LOCATION_RELEASE MACOSX_BUNDLE MACOSX_BUNDLE_INFO_PLIST MACOSX_FRAMEWORK_INFO_PLIST MAP_IMPORTED_CONFIG_DEBUG MAP_IMPORTED_CONFIG_RELEASE OSX_ARCHITECTURES OSX_ARCHITECTURES_DEBUG OSX_ARCHITECTURES_RELEASE OUTPUT_NAME OUTPUT_NAME_DEBUG OUTPUT_NAME_RELEASE POST_INSTALL_SCRIPT PREFIX PRE_INSTALL_SCRIPT PRIVATE_HEADER PROJECT_LABEL PUBLIC_HEADER RESOURCE RULE_LAUNCH_COMPILE RULE_LAUNCH_CUSTOM RULE_LAUNCH_LINK RUNTIME_OUTPUT_DIRECTORY RUNTIME_OUTPUT_DIRECTORY_DEBUG RUNTIME_OUTPUT_DIRECTORY_RELEASE RUNTIME_OUTPUT_NAME RUNTIME_OUTPUT_NAME_DEBUG RUNTIME_OUTPUT_NAME_RELEASE SKIP_BUILD_RPATH SOURCES SOVERSION STATIC_LIBRARY_FLAGS STATIC_LIBRARY_FLAGS_DEBUG STATIC_LIBRARY_FLAGS_RELEASE SUFFIX TYPE VERSION VS_DOTNET_REFERENCES VS_GLOBAL_WHATEVER VS_GLOBAL_KEYWORD VS_GLOBAL_PROJECT_TYPES VS_KEYWORD VS_SCC_AUXPATH VS_SCC_LOCALPATH VS_SCC_PROJECTNAME VS_SCC_PROVIDER VS_WINRT_EXTENSIONS VS_WINRT_REFERENCES WIN32_EXECUTABLE XCODE_ATTRIBUTE_WHATEVER ) ecbuild_debug("======================== ${tgt} ========================") foreach(p ${props}) ecbuild_echo_target_property("${tgt}" "${p}") endforeach() ecbuild_debug("") endfunction() ############################################################################## #.rst: # # ecbuild_echo_targets # ==================== # # Output all possible target properties of the specified list-of-targets. # This is very useful for debugging. :: # # ecbuild_echo_targets( ) # ############################################################################## function(ecbuild_echo_targets) set(tgts ${ARGV}) foreach(t ${tgts}) ecbuild_echo_target("${t}") endforeach() endfunction() ecbuild-3.16.0/cmake/ecbuild_download_resource.cmake0000664000175000017500000000510715252726137022700 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_download_resource # ========================= # # Download a file from a given URL and save to FILE at configure time. :: # # ecbuild_download_resource( FILE URL ) # # curl or wget is required (curl is preferred if available). # # The default timeout is 30 seconds, which can be overridden with # ``ECBUILD_DOWNLOAD_TIMEOUT``. Downloads are by default only tried once, use # ``ECBUILD_DOWNLOAD_RETRIES`` to set the number of retries. # ############################################################################## function( ecbuild_download_resource _p_OUT _p_URL ) # Do not retry downloads by default (ECBUILD-307) if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES ) set( ECBUILD_DOWNLOAD_RETRIES 0 ) endif() # Use default timeout of 30s if not specified (ECBUILD-307) if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT ) set( ECBUILD_DOWNLOAD_TIMEOUT 30 ) endif() if( NOT EXISTS ${_p_OUT} ) find_program( CURL_PROGRAM curl ) mark_as_advanced(CURL_PROGRAM) if( CURL_PROGRAM ) execute_process( COMMAND ${CURL_PROGRAM} --silent --show-error --fail --retry ${ECBUILD_DOWNLOAD_RETRIES} --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT} --output ${_p_OUT} ${_p_URL} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT ) else() find_program( WGET_PROGRAM wget ) if( WGET_PROGRAM ) # wget takes the total number of tries, curl the number or retries math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 ) execute_process( COMMAND ${WGET_PROGRAM} -nv -O ${_p_OUT} -t ${ECBUILD_DOWNLOAD_RETRIES} -T ${ECBUILD_DOWNLOAD_TIMEOUT} ${_p_URL} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT ) else() ecbuild_critical("Could not find curl or wget. Error downloading ${_p_URL}") endif() endif() if(CMD_RESULT) ecbuild_critical("Error downloading ${_p_URL}") endif() endif() endfunction() ecbuild-3.16.0/cmake/ecbuild_cache.cmake0000664000175000017500000000667415252726137020237 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecBuild Cache # ============= # # During initialisation, ecBuild introspects the compiler and operating system # and performs a number of checks. The result of these is written to a # dedicated ``ecbuild-cache.cmake`` file in the build tree. This cache may be # used to speed up subsequent *clean* builds i.e. those where no CMakeCache.txt # exists yet. # # To use the ecBuild cache, configure with ``-DECBUILD_CACHE=``, # where ```` is the path to an existing ``ecbuild-cache.cmake``. # # .. note :: # # The ecBuild cache is specific to compiler *and* operating system. Do *not* # attempt to use a cache file created on a different machine or with a # different compiler! # ############################################################################## # Prepare the cache and clobber any existing ecbuild-cache.cmake macro( ecbuild_prepare_cache ) include( CheckSymbolExists ) include( CheckIncludeFiles ) include( CheckCSourceCompiles ) include( CheckCXXSourceCompiles ) include( CheckTypeSize ) set( ecbuild_cache_file ${CMAKE_BINARY_DIR}/ecbuild-cache.cmake ) file(WRITE ${ecbuild_cache_file} "# ecbuild cache file\n\n") endmacro() # Buffer the CMake variable var to be written to the ecBuild cache function( ecbuild_cache_var var ) if( NOT ${var} ) set( ${var} 0 ) endif() set( ECBUILD_CACHE_BUFFER "${ECBUILD_CACHE_BUFFER}set( ${var} ${${var}} )\n" CACHE INTERNAL "Cache buffer" ) endfunction() # Call check_symbol_exists only if the output is not defined yet function( ecbuild_cache_check_symbol_exists symbol includes output ) if( NOT DEFINED ${output} ) check_symbol_exists( ${symbol} ${includes} ${output} ) endif() ecbuild_cache_var( ${output} ) endfunction() # Call check_include_files only if the output is not defined yet function( ecbuild_cache_check_include_files includes output ) if( NOT DEFINED ${output} ) check_include_files( ${includes} ${output} ) endif() ecbuild_cache_var( ${output} ) endfunction() # Call check_c_source_compiles only if the output is not defined yet function( ecbuild_cache_check_c_source_compiles source output ) if( NOT DEFINED ${output} ) check_c_source_compiles( "${source}" ${output} ) endif() ecbuild_cache_var( ${output} ) endfunction() # Call check_cxx_source_compiles only if the output is not defined yet function( ecbuild_cache_check_cxx_source_compiles source output ) if( NOT DEFINED ${output} ) check_cxx_source_compiles( "${source}" ${output} ) endif() ecbuild_cache_var( ${output} ) endfunction() # Call check_type_size only if the output is not defined yet function( ecbuild_cache_check_type_size type output ) if( NOT DEFINED ${output} ) check_type_size( "${type}" ${output} ) endif() ecbuild_cache_var( ${output} ) endfunction() # Flush the ecBuild cache to disk and reset the buffer function( ecbuild_flush_cache ) file( APPEND ${ecbuild_cache_file} "${ECBUILD_CACHE_BUFFER}" ) set( ECBUILD_CACHE_BUFFER "" CACHE INTERNAL "Cache buffer" ) endfunction() ecbuild-3.16.0/cmake/pkg-config.pc.in0000664000175000017500000000164615252726137017452 0ustar alastairalastair# This pkg-config file is generated by ecbuild_pkgconfig() # with template ecbuild/cmake/pkg-config.pc.in git_tag=@PKGCONFIG_GIT_TAG@ prefix=${pcfiledir}/../.. exec_prefix=${prefix} libdir=${prefix}/@INSTALL_LIB_DIR@ includedir=${prefix}/@INSTALL_INCLUDE_DIR@ bindir=${prefix}/@INSTALL_BIN_DIR@ fmoddir=${prefix}/@INSTALL_INCLUDE_DIR@ CC=@CMAKE_C_COMPILER@ CXX=@CMAKE_CXX_COMPILER@ FC=@CMAKE_Fortran_COMPILER@ libs=@PKGCONFIG_LIBS@ libs_private=@PKGCONFIG_LIBS_PRIVATE@ cflags=@PKGCONFIG_INCLUDE@ @PKGCONFIG_CFLAGS@ @PKGCONFIG_VARIABLES@ #==================================================================== Name: @PKGCONFIG_NAME@ Description: @PKGCONFIG_DESCRIPTION@ URL: @PKGCONFIG_URL@ Version: @PKGCONFIG_VERSION@ Libs: ${libs} Libs.private: ${libs_private} Requires: @PKGCONFIG_REQUIRES@ Requires.private: @PKGCONFIG_REQUIRES_PRIVATE@ Cflags: ${cflags} #==================================================================== ecbuild-3.16.0/cmake/contrib/0000775000175000017500000000000015252726137016126 5ustar alastairalastairecbuild-3.16.0/cmake/contrib/GetGitRevisionDescription.cmake.in0000664000175000017500000000246115252726137024646 0ustar alastairalastair# # Internal file for GetGitRevisionDescription.cmake # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") if(EXISTS "@GIT_DIR@/${HEAD_REF}") configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) set(HEAD_HASH "${HEAD_REF}") endif() else() # detached HEAD configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) endif() if(NOT HEAD_HASH) if(EXISTS "@GIT_DATA@/head-ref") file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) string(STRIP "${HEAD_HASH}" HEAD_HASH) else() set(HEAD_HASH "unknown") endif() endif() ecbuild-3.16.0/cmake/contrib/FindEigen3.cmake0000664000175000017500000000731215252726137021046 0ustar alastairalastair# - Try to find Eigen3 lib # # This module supports requiring a minimum version, e.g. you can do # find_package(Eigen3 3.1.2) # to require version 3.1.2 or newer of Eigen3. # # Once done this will define # # EIGEN3_FOUND - system has eigen lib with correct version # EIGEN3_INCLUDE_DIRS - the eigen include directory # EIGEN3_VERSION - eigen version # # First a find_package( Eigen3 NO_MODULE ) is invoked which will also define target Eigen3::Eigen # If this is not found, a fallback mechanism is used which searches for include dirs and defines # above variables without the target. # To force definition of the target, set the variable `Eigen3_NO_MODULE` ON. # To skip the find_package( Eigen3 NO_MODULE ), set the variable `Eigen3_NO_MODULE` OFF # # Copyright (c) 2006, 2007 Montel Laurent, # Copyright (c) 2008, 2009 Gael Guennebaud, # Copyright (c) 2009 Benoit Jacob # Copyright (c) 2013- ECMWF # Redistribution and use is allowed according to the terms of the 2-clause BSD license. macro(_eigen3_check_version) file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) if( Eigen3_FIND_VERSION ) if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) set(EIGEN3_VERSION_OK FALSE) else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) set(EIGEN3_VERSION_OK TRUE) endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) else() set( EIGEN3_VERSION_OK TRUE ) endif() if(NOT EIGEN3_VERSION_OK) message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " "but at least version ${Eigen3_FIND_VERSION} is required") else() set( EIGEN3_VERSION ${EIGEN3_VERSION} CACHE INTERNAL "Eigen3 version" ) endif() endmacro(_eigen3_check_version) if( NOT DEFINED Eigen3_NO_MODULE OR Eigen3_NO_MODULE ) find_package( Eigen3 NO_MODULE ) set( EIGEN3_VERSION ${Eigen3_VERSION} ) set( EIGEN3_FOUND ${Eigen3_FOUND} ) if( Eigen3_FOUND OR Eigen3_NO_MODULE ) include( FindPackageHandleStandardArgs ) find_package_handle_standard_args( Eigen3 CONFIG_MODE ) return() endif() endif() if(EIGEN3_INCLUDE_DIR) # in cache already _eigen3_check_version() set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) else(EIGEN3_INCLUDE_DIR) find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library PATHS ${CMAKE_INSTALL_PREFIX}/include ${KDE4_INCLUDE_DIR} ${EIGEN3_PATH}/include ${EIGEN3_DIR}/include ${EIGEN3_ROOT}/include ${EIGEN_PATH}/include ${EIGEN_DIR}/include ${EIGEN_ROOT}/include ENV EIGEN3_PATH ENV EIGEN3_DIR ENV EIGEN3_ROOT ENV EIGEN_PATH ENV EIGEN_DIR ENV EIGEN_ROOT PATH_SUFFIXES eigen3 eigen include/eigen3 include/eigen ) if(EIGEN3_INCLUDE_DIR) _eigen3_check_version() endif(EIGEN3_INCLUDE_DIR) mark_as_advanced(EIGEN3_INCLUDE_DIR) endif(EIGEN3_INCLUDE_DIR) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) set( EIGEN3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR} ) ecbuild-3.16.0/cmake/contrib/FindNetCDF4.cmake0000664000175000017500000003562015252726137021066 0ustar alastairalastair# Project uclales # http://gitorious.org/uclales # License: Academic Free License v3.0 # # - Find NETCDF, a library for reading and writing self describing array data. # # This module invokes the NETCDF wrapper compiler that should be installed # alongside NETCDF. Depending upon the NETCDF Configuration, the wrapper compiler # is called either h5cc or h5pcc. If this succeeds, the module will then call # the compiler with the -show argument to see what flags are used when compiling # an NETCDF client application. # # The module will optionally accept the COMPONENTS argument. If no COMPONENTS # are specified, then the find module will default to finding only the NETCDF C # library. If one or more COMPONENTS are specified, the module will attempt to # find the language bindings for the specified components. Currently, the only # valid components are C, CXX, FORTRAN and F90. # # On UNIX systems, this module will read the variable NETCDF_USE_STATIC_LIBRARIES # to determine whether or not to prefer a static link to a dynamic link for NETCDF # and all of it's dependencies. To use this feature, make sure that the # NETCDF_USE_STATIC_LIBRARIES variable is set before the call to find_package. # # To provide the module with a hint about where to find your NETCDF installation, # set the CMake or environment variable NETCDF_ROOT, NETCDF_DIR, NETCDF_PATH or # NETCDF4_DIR. The Find module will then look in this path when searching for # NETCDF executables, paths, and libraries. # # In addition to finding the includes and libraries required to compile an NETCDF # client application, this module also makes an effort to find tools that come # with the NETCDF distribution that may be useful for regression testing. # # This module will define the following variables: # NETCDF_INCLUDE_DIRS - Location of the NETCDF includes # NETCDF_INCLUDE_DIR - Location of the NETCDF includes (deprecated) # NETCDF_DEFINITIONS - Required compiler definitions for NETCDF # NETCDF_C_LIBRARIES - Required libraries for the NETCDF C bindings. # NETCDF_CXX_LIBRARIES - Required libraries for the NETCDF C++ bindings # NETCDF_FORTRAN_LIBRARIES - Required libraries for the NETCDF FORTRAN bindings # NETCDF_F90_LIBRARIES - Required libraries for the NETCDF FORTRAN 90 bindings # NETCDF_LIBRARIES - Required libraries for all requested bindings # NETCDF_FOUND - true if NETCDF was found on the system # NETCDF_LIBRARY_DIRS - the full set of library directories # NETCDF_IS_PARALLEL - Whether or not NETCDF was found with parallel IO support # NETCDF_CONFIG_EXECUTABLE - the path to the NC-CONFIG tool #============================================================================= # Copyright 2009 Kitware, Inc. # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) # This module is maintained by Thijs Heus . include(SelectLibraryConfigurations) include(FindPackageHandleStandardArgs) # List of the valid NETCDF components set( NETCDF_VALID_COMPONENTS FORTRAN F90 CXX C ) # Invoke the NETCDF wrapper compiler. The compiler return value is stored to the # return_value argument, the text output is stored to the output variable. macro( _NETCDF_CONFIG flag output return_value ) if( NETCDF_CONFIG_EXECUTABLE ) exec_program( ${NETCDF_CONFIG_EXECUTABLE} ARGS ${flag} OUTPUT_VARIABLE ${output} RETURN_VALUE ${return_value} ) if( ${${return_value}} EQUAL 0 ) # do nothing else() message( STATUS "Unable to determine ${flag} from NC-CONFIG." ) endif() endif() endmacro() # # try to find the NETCDF wrapper compilers find_program( NETCDF_CONFIG_EXECUTABLE NAMES nc-config HINTS ${NETCDF_ROOT} ${NETCDF_DIR} ${NETCDF_PATH} ${NETCDF4_DIR} ENV NETCDF_ROOT ENV NETCDF_DIR ENV NETCDF_PATH ENV NETCDF4_DIR PATH_SUFFIXES bin Bin DOC "NETCDF CONFIG PROGRAM. Used only to detect NETCDF compile flags." ) mark_as_advanced( NETCDF_CONFIG_EXECUTABLE ) ecbuild_debug("FindNetCDF4: nc-config executable = ${NETCDF_CONFIG_EXECUTABLE}") set(output "no") _NETCDF_CONFIG (--has-hdf5 output return) set(HAS_HDF5 FALSE) if(${output} STREQUAL yes) set(HAS_HDF5 TRUE) set(HDF5_FIND_QUIETLY ${NETCDF_FIND_QUIETLY}) set(HDF5_FIND_REQUIRED ${NETCDF_FIND_REQUIRED}) find_package(HDF5) # list( APPEND NETCDF_LIBRARIES_DEBUG # ${HDF5_LIBRARIES_DEBUG} ) # list( APPEND NETCDF_LIBRARIES_RELEASE # ${HDF5_LIBRARIES_RELEASE} ) set (NETCDF_IS_PARALLEL ${HDF5_IS_PARALLEL}) endif() _NETCDF_CONFIG (--has-pnetcdf output return) if(${output} STREQUAL yes) set (NETCDF_IS_PARALLEL TRUE) else() # set(NETCDF_IS_PARALLEL FALSE) endif() set( NETCDF_IS_PARALLEL TRUE CACHE BOOL "NETCDF library compiled with parallel IO support" ) if( NETCDF_INCLUDE_DIRS AND NETCDF_LIBRARIES ) # Do nothing: we already have NETCDF_INCLUDE_PATH and NETCDF_LIBRARIES in the # cache, it would be a shame to override them else() if( NOT NETCDF_FIND_COMPONENTS ) set( NETCDF_LANGUAGE_BINDINGS "C" ) else() # add the extra specified components, ensuring that they are valid. foreach( component ${NETCDF_FIND_COMPONENTS} ) list( FIND NETCDF_VALID_COMPONENTS ${component} component_location ) if( ${component_location} EQUAL -1 ) message( FATAL_ERROR "\"${component}\" is not a valid NETCDF component." ) else() list( APPEND NETCDF_LANGUAGE_BINDINGS ${component} ) endif() endforeach() endif() # seed the initial lists of libraries to find with items we know we need set( NETCDF_C_INCLUDE_NAMES netcdf.h ) set( NETCDF_CXX_INCLUDE_NAMES netcdfcpp.h ${NETCDF_C_INCLUDE_NAMES} ) set( NETCDF_FORTRAN_INCLUDE_NAMES ${NETCDF_C_INCLUDE_NAMES} ) set( NETCDF_F90_INCLUDE_NAMES netcdf.mod typesizes.mod ${NETCDF_C_INCLUDE_NAMES} ) set( NETCDF_C_LIBRARY_NAMES netcdf) set( NETCDF_CXX_LIBRARY_NAMES netcdf_c++ netcdf_c++4 ${NETCDF_C_LIBRARY_NAMES} ) set( NETCDF_FORTRAN_LIBRARY_NAMES netcdff ${NETCDF_C_LIBRARY_NAMES}) set( NETCDF_F90_LIBRARY_NAMES ${NETCDF_FORTRAN_LIBRARY_NAMES} ) set( NETCDF_REQUIRED netcdf.h netcdfcpp.h netcdf.mod typesizes.mod netcdf netcdff netcdf_c++ netcdf_c++4) foreach( LANGUAGE ${NETCDF_LANGUAGE_BINDINGS} ) ecbuild_debug("FindNetCDF4: looking for ${LANGUAGE} language bindings") set( NETCDF_${LANGUAGE}_FOUND 1 ) # disable this in following if necessary # find the NETCDF includes foreach( INC ${NETCDF_${LANGUAGE}_INCLUDE_NAMES} ) #ecbuild_debug( "FindNetCDF4: looking for include file ${INC}") find_path( NETCDF_${INC}_INCLUDE_DIR ${INC} HINTS ${NETCDF_${LANGUAGE}_INCLUDE_FLAGS} ${NETCDF_ROOT} ${NETCDF_DIR} ${NETCDF_PATH} ${NETCDF4_DIR} ENV NETCDF_ROOT ENV NETCDF_DIR ENV NETCDF_PATH ENV NETCDF4_DIR PATH_SUFFIXES include Include ) if( NOT NETCDF_${INC}_INCLUDE_DIR ) #ecbuild_debug( "FindNetCDF4: ${INC} not found" ) GET_FILENAME_COMPONENT( _basename ${INC} NAME_WE ) GET_FILENAME_COMPONENT( _ext ${INC} EXT ) string( TOUPPER ${_basename} _BASENAME ) set( INC_MOD "${_BASENAME}${_ext}") #ecbuild_debug( "FindNetCDF4: try ${INC_MOD}" ) find_path( NETCDF_${INC}_INCLUDE_DIR ${INC_MOD} HINTS ${NETCDF_${LANGUAGE}_INCLUDE_FLAGS} ${NETCDF_ROOT} ${NETCDF_DIR} ${NETCDF_PATH} ${NETCDF4_DIR} ENV NETCDF_ROOT ENV NETCDF_DIR ENV NETCDF_PATH ENV NETCDF4_DIR PATH_SUFFIXES include Include ) endif() mark_as_advanced( NETCDF_${INC}_INCLUDE_DIR ) #ecbuild_debug_var( NETCDF_${INC}_INCLUDE_DIR) if (NETCDF_${INC}_INCLUDE_DIR) list( APPEND NETCDF_INCLUDE_DIRS ${NETCDF_${INC}_INCLUDE_DIR} ) else() list( FIND NETCDF_REQUIRED ${INC} location ) if( ${location} GREATER -1 ) if(NETCDF_FIND_REQUIRED) ecbuild_error( "\"${INC}\" is not found for NetCDF component ${LANGUAGE}" ) elseif( NOT NETCDF_FIND_QUIETLY ) message( STATUS "\"${INC}\" is not found for NetCDF component ${LANGUAGE}" ) endif() set( NETCDF_${LANGUAGE}_FOUND 0 ) endif() endif() endforeach() # find the NETCDF libraries foreach( LIB ${NETCDF_${LANGUAGE}_LIBRARY_NAMES} ) if( UNIX AND NETCDF_USE_STATIC_LIBRARIES ) # According to bug 1643 on the CMake bug tracker, this is the # preferred method for searching for a static library. # See http://www.cmake.org/Bug/view.php?id=1643. We search # first for the full static library name, but fall back to a # generic search on the name if the static search fails. set( THIS_LIBRARY_SEARCH_DEBUG lib${LIB}d.a ${LIB}d ) set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} ) else() set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ) set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ) endif() find_library( NETCDF_${LIB}_LIBRARY_DEBUG NAMES ${THIS_LIBRARY_SEARCH_DEBUG} HINTS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS} ${NETCDF_ROOT} ${NETCDF_DIR} ${NETCDF_PATH} ${NETCDF4_DIR} ENV NETCDF_ROOT ENV NETCDF_DIR ENV NETCDF_PATH ENV NETCDF4_DIR PATH_SUFFIXES lib64 Lib64 lib Lib) find_library( NETCDF_${LIB}_LIBRARY_RELEASE NAMES ${THIS_LIBRARY_SEARCH_RELEASE} HINTS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS} ${NETCDF_ROOT} ${NETCDF_DIR} ${NETCDF_PATH} ${NETCDF4_DIR} ENV NETCDF_ROOT ENV NETCDF_DIR ENV NETCDF_PATH ENV NETCDF4_DIR PATH_SUFFIXES lib64 Lib64 lib Lib ) select_library_configurations( NETCDF_${LIB} ) # even though we adjusted the individual library names in # select_library_configurations, we still need to distinguish # between debug and release variants because NETCDF_LIBRARIES will # need to specify different lists for debug and optimized builds. # We can't just use the NETCDF_${LIB}_LIBRARY variable (which was set # up by the selection macro above) because it may specify debug and # optimized variants for a particular library, but a list of # libraries is allowed to specify debug and optimized only once. if (NETCDF_${LIB}_LIBRARY_RELEASE) list( APPEND NETCDF_LIBRARIES_RELEASE ${NETCDF_${LIB}_LIBRARY_RELEASE} ) list( APPEND NETCDF_${LANGUAGE}_LIBRARIES_RELEASE ${NETCDF_${LIB}_LIBRARY_RELEASE} ) endif() if (NETCDF_${LIB}_LIBRARY_DEBUG) list( APPEND NETCDF_LIBRARIES_DEBUG ${NETCDF_${LIB}_LIBRARY_DEBUG} ) list( APPEND NETCDF_${LANGUAGE}_LIBRARIES_DEBUG ${NETCDF_${LIB}_LIBRARY_DEBUG} ) endif() if (NETCDF_${LIB}_LIBRARY_RELEASE OR NETCDF_${LIB}_LIBRARY_DEBUG ) else() list( FIND NETCDF_REQUIRED ${LIB} location ) if( ${location} EQUAL -1 ) else() if(NETCDF_FIND_REQUIRED) message( SEND_ERROR "\"${LIB}\" is not found for NetCDF component ${LANGUAGE}." ) elseif( NOT NETCDF_FIND_QUIETLY ) message( STATUS "\"${LIB}\" is not found for NetCDF component ${LANGUAGE}." ) else() set( NETCDF_${LANGUAGE}_FOUND 0 ) endif() endif() endif() endforeach() list( APPEND NETCDF_LIBRARY_DIRS ${NETCDF_${LANGUAGE}_LIBRARY_DIRS} ) # Append the libraries for this language binding to the list of all # required libraries. if( NETCDF_${LANGUAGE}_FOUND ) ecbuild_debug( "FindNetCDF4: ${LANGUAGE} language bindings found" ) if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) list( APPEND NETCDF_${LANGUAGE}_LIBRARIES debug ${NETCDF_${LANGUAGE}_LIBRARIES_DEBUG} optimized ${NETCDF_${LANGUAGE}_LIBRARIES_RELEASE} ) else() list( APPEND NETCDF_${LANGUAGE}_LIBRARIES ${NETCDF_${LANGUAGE}_LIBRARIES_RELEASE} ) endif() endif() # ecbuild_debug_var( NETCDF_${LANGUAGE}_LIBRARIES ) list( APPEND NETCDF_FOUND_REQUIRED_VARS NETCDF_${LANGUAGE}_FOUND ) endforeach() # We may have picked up some duplicates in various lists during the above # process for the language bindings (both the C and C++ bindings depend on # libz for example). Remove the duplicates. if( NETCDF_INCLUDE_DIRS ) list( REMOVE_DUPLICATES NETCDF_INCLUDE_DIRS ) endif() if( NETCDF_LIBRARIES_DEBUG ) list( REMOVE_DUPLICATES NETCDF_LIBRARIES_DEBUG ) endif() if( NETCDF_LIBRARIES_RELEASE ) list( REMOVE_DUPLICATES NETCDF_LIBRARIES_RELEASE ) endif() if( NETCDF_LIBRARY_DIRS ) list( REMOVE_DUPLICATES NETCDF_LIBRARY_DIRS ) endif() # Construct the complete list of NETCDF libraries with debug and optimized # variants when the generator supports them. if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) if( NOT NETCDF_LIBRARIES_DEBUG ) set( NETCDF_LIBRARIES_DEBUG ${NETCDF_LIBRARIES_RELEASE} ) endif() set( NETCDF_LIBRARIES debug ${NETCDF_LIBRARIES_DEBUG} optimized ${NETCDF_LIBRARIES_RELEASE} ) else() set( NETCDF_LIBRARIES ${NETCDF_LIBRARIES_RELEASE} ) endif() endif() set( NETCDF4_FIND_QUIETLY ${NETCDF_FIND_QUIETLY} ) set( NETCDF4_FIND_REQUIRED ${NETCDF_FIND_REQUIRED} ) # handle the QUIET and REQUIRED arguments and set NETCDF4_FOUND to TRUE # if all listed variables are valid # Note: capitalisation of the package name must be the same as in the file name find_package_handle_standard_args( NetCDF4 DEFAULT_MSG ${NETCDF_FOUND_REQUIRED_VARS} NETCDF_LIBRARIES NETCDF_INCLUDE_DIRS ) mark_as_advanced( NETCDF_INCLUDE_DIRS NETCDF_LIBRARIES NETCDF_LIBRARY_DIRS ) set( NETCDF_FOUND ${NETCDF4_FOUND} ) set( NetCDF_FOUND ${NETCDF4_FOUND} ) set( NetCDF4_FOUND ${NETCDF4_FOUND} ) # For backwards compatibility we set NETCDF_INCLUDE_DIR to the value of # NETCDF_INCLUDE_DIRS set( NETCDF_INCLUDE_DIR "${NETCDF_INCLUDE_DIRS}" ) ecbuild-3.16.0/cmake/contrib/GetGitRevisionDescription.cmake0000664000175000017500000001001415252726137024232 0ustar alastairalastair# - Returns a version string from Git # # These functions force a re-configure on each git commit so that you can # trust the values of the variables in your build system. # # get_git_head_revision( [ ...]) # # Returns the refspec and sha hash of the current head revision # # git_describe( [ ...]) # # Returns the results of git describe on the source tree, and adjusting # the output so that it tests false if an error occurs. # # git_get_exact_tag( [ ...]) # # Returns the results of git describe --exact-match on the source tree, # and adjusting the output so that it tests false if there was no exact # matching tag. # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) if(__get_git_revision_description) return() endif() set(__get_git_revision_description YES) # We must run the following at "include" time, not at function call time, # to find the path to this module rather than the path to a calling list file get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) function(get_git_head_revision _refspecvar _hashvar) set(GIT_PARENT_DIR "${PROJECT_SOURCE_DIR}") set(GIT_DIR "${GIT_PARENT_DIR}/.git") while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) # We have reached the root directory, we are not in git set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) return() endif() set(GIT_DIR "${GIT_PARENT_DIR}/.git") endwhile() set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") if(NOT EXISTS "${GIT_DATA}") file(MAKE_DIRECTORY "${GIT_DATA}") endif() if(NOT EXISTS "${GIT_DIR}/HEAD") return() endif() set(HEAD_FILE "${GIT_DATA}/HEAD") configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY) include("${GIT_DATA}/grabRef.cmake") set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) endfunction() function(git_describe _var) if(NOT GIT_FOUND) find_package(Git QUIET) endif() get_git_head_revision(refspec hash) if(NOT GIT_FOUND) set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) return() endif() if(NOT hash) set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) return() endif() # TODO sanitize #if((${ARGN}" MATCHES "&&") OR # (ARGN MATCHES "||") OR # (ARGN MATCHES "\\;")) # message("Please report the following error to the project!") # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") #endif() #message(STATUS "Arguments to execute_process: ${ARGN}") execute_process(COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT res EQUAL 0) set(out "${out}-${res}-NOTFOUND") endif() set(${_var} "${out}" PARENT_SCOPE) endfunction() function(git_get_exact_tag _var) git_describe(out --exact-match ${ARGN}) set(${_var} "${out}" PARENT_SCOPE) endfunction() ecbuild-3.16.0/cmake/ecbuild_find_package.cmake0000664000175000017500000003307415252726137021561 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_find_package # ==================== # # Find a package and import its configuration. :: # # ecbuild_find_package( [ NAME ] # [ [ VERSION ] [ EXACT ] ] # [ COMPONENTS [ ... ] ] # [ URL ] # [ DESCRIPTION ] # [ TYPE ] # [ PURPOSE ] # [ FAILURE_MSG ] # [ REQUIRED ] # [ QUIET ] ) # # Options # ------- # # NAME : required # package name (used as ``Find.cmake`` and ``-config.cmake``) # # VERSION : optional # minimum required package version # # COMPONENTS : optional # list of package components to find (behaviour depends on the package) # # EXACT : optional, requires VERSION # require the exact version rather than a minimum version # # URL : optional # homepage of the package (shown in summary and stored in the cache) # # DESCRIPTION : optional # literal string or name of CMake variable describing the package # # TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED # type of dependency of the project on this package (defaults to OPTIONAL) # # PURPOSE : optional # literal string or name of CMake variable describing which functionality # this package enables in the project # # FAILURE_MSG : optional # literal string or name of CMake variable containing a message to be # appended to the failure message if the package is not found # # REQUIRED : optional (equivalent to TYPE REQUIRED, and overrides TYPE argument) # fail if package cannot be found # # QUIET : optional # do not output package information if found # # Input variables # --------------- # # The following CMake variables influence the behaviour if set (```` is # the package name as given, ```` is the capitalised version): # # :_ROOT: install prefix path of the package # :_PATH: install prefix path of the package, prefer _ROOT # :_PATH: install prefix path of the package, prefer _ROOT # :_DIR: directory containing the ``-config.cmake`` file # (usually ``/lib/cmake/``), prefer _ROOT # :CMAKE_PREFIX_PATH: Specify this when most packages are installed in same prefix # # The environment variables ``_ROOT``, ``_PATH``, ``_PATH``, ``_DIR`` # are taken into account only if the corresponding CMake variables are unset. # # Note, some packages are found via ``Find.cmake`` and may have their own mechanism of # finding paths with other variables, e.g. ``_HOME``. See the corresponing # ``Find.cmake`` file for datails, or use `cmake --help-module Find` if it is a # standard CMake-recognized module. # # Usage # ----- # # The search proceeds as follows: # # 1. If is a subproject of the top-level project, search for # ``-config.cmake`` in ``_BINARY_DIR``. # # 2. If ``Find.cmake`` exists in ``CMAKE_MODULE_PATH``, search using it. # # 3. If any paths have been specified by the user via CMake or environment # variables as given above: # # * search for ``-config.cmake`` in those paths only # * fail if the package was not found in any of those paths # * Search paths are in order from high to low priority: # - ``_DIR`` # - ``_ROOT`` # - ``_PATH`` # - ``_PATH`` # - ``ENV{_ROOT}`` # - ``ENV{_PATH}`` # - ``ENV{_PATH}`` # - ``CMAKE_PREFIX_PATH`` # - ``ENV{_DIR}`` # - ``ENV{CMAKE_PREFIX_PATH}`` # - ``system paths`` # # See CMake documentation of ``find_package()`` for details. # # 4. Fail if the package was not found and is REQUIRED. # ############################################################################## macro( ecbuild_find_package ) set( options REQUIRED RECOMMENDED QUIET EXACT ) set( single_value_args NAME VERSION URL DESCRIPTION TYPE PURPOSE FAILURE_MSG ) set( multi_value_args COMPONENTS ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) if( NOT _PAR_NAME ) set( _PAR_NAME ${ARGV0} ) list( REMOVE_ITEM _PAR_UNPARSED_ARGUMENTS ${ARGV0} ) if( NOT _PAR_VERSION AND "${ARGV1}" MATCHES "^[0-9]+(\\.[0-9]+)*$" ) set( _PAR_VERSION ${ARGV1} ) list( REMOVE_ITEM _PAR_UNPARSED_ARGUMENTS ${ARGV1} ) endif() endif() endif() if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_find_package(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT _PAR_NAME ) ecbuild_critical("The call to ecbuild_find_package() doesn't specify the NAME.") endif() if( _PAR_EXACT AND NOT _PAR_VERSION ) ecbuild_critical("Call to ecbuild_find_package() requests EXACT but doesn't specify VERSION.") endif() if( _PAR_QUIET ) set( _${_PAR_NAME}_find_quiet QUIET ) endif() # If the package is required, set TYPE to REQUIRED # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect if( _PAR_REQUIRED ) set( _PAR_TYPE REQUIRED ) endif() # As mentioned in documentation above, the default TYPE is OPTIONAL if( NOT _PAR_TYPE ) set( _PAR_TYPE OPTIONAL ) endif() set( _${_PAR_NAME}_version "" ) if( _PAR_VERSION ) set( _${_PAR_NAME}_version ${_PAR_VERSION} ) if( _PAR_EXACT ) set( _${_PAR_NAME}_version ${_PAR_VERSION} EXACT ) endif() endif() set( _${_PAR_NAME}_components "" ) if( DEFINED _PAR_COMPONENTS ) set( _${_PAR_NAME}_components COMPONENTS ${_PAR_COMPONENTS} ) endif() if( ECBUILD_2_COMPAT ) # Disable deprecation warnings until ecbuild_mark_compat, because "_FOUND" may already have been # marked with "ecbuild_mark_compat()" in a bundle. set( DISABLE_ECBUILD_DEPRECATION_WARNINGS_orig ${DISABLE_ECBUILD_DEPRECATION_WARNINGS} ) set( DISABLE_ECBUILD_DEPRECATION_WARNINGS ON ) endif() # cancel the effect of ecbuild_install_project setting _FOUND in # compat mode (otherwise this means the -config.cmake file may not # always be loaded, see ECBUILD-401) if( ECBUILD_2_COMPAT ) unset( ${_PAR_NAME}_FOUND ) endif() # if a project with the same name has been defined, try to use it if( ${_PAR_NAME}_BINARY_DIR ) # 1) search using CONFIG mode -- try to locate a configuration file provided by the package (package-config.cmake) # _BINARY_DIR is defined by CMake when using project() if( NOT ${_PAR_NAME}_FOUND ) ecbuild_debug("ecbuild_find_package(${_PAR_NAME}): find_package( ${_PAR_NAME} ${_${_PAR_NAME}_version} ${_${_PAR_NAME}_components} ${_${_PAR_NAME}_find_quiet} )\n" " using hints ${_PAR_NAME}_BINARY_DIR=${${_PAR_NAME}_BINARY_DIR}" ) find_package( ${_PAR_NAME} ${_${_PAR_NAME}_version} ${_${_PAR_NAME}_components} ${_${_PAR_NAME}_find_quiet} NO_MODULE HINTS ${${_PAR_NAME}_BINARY_DIR} NO_DEFAULT_PATH ) endif() if( NOT ${_PAR_NAME}_FOUND ) if( ${_PAR_NAME}_CONSIDERED_VERSIONS ) ecbuild_critical( "${_PAR_NAME} was found in the source tree but no suitable version (or component set) was found at '${${_PAR_NAME}_BINARY_DIR}'" ) else() ecbuild_critical( "${_PAR_NAME} was found in the source tree but could not be loaded from '${${_PAR_NAME}_BINARY_DIR}'" ) endif() endif() else() # If a Find.cmake module is found, use MODULE keyword, otherwise, use CONFIG. # This makes the find_package error message much more consise. find_file( ${_PAR_NAME}_FindModule Find${_PAR_NAME}.cmake PATHS ${CMAKE_MODULE_PATH} ${CMAKE_ROOT}/Modules NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) find_file( ${_PAR_NAME}_FindModule Find${_PAR_NAME}.cmake PATHS ${CMAKE_MODULE_PATH} ${CMAKE_ROOT}/Modules ) if( ${_PAR_NAME}_FindModule ) set( _${_PAR_NAME}_mode MODULE ) else() set( _${_PAR_NAME}_mode CONFIG ) endif() # Read variables like _PATH and _PATH, # and make older versions (CMake < 3.12) forward compatible with _ROOT ecbuild_find_package_search_hints( NAME ${_PAR_NAME} ) # Disable search in package registry, and save to be restored after find_package() set( CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY_orig ${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY} ) set( CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ON ) # The actual find_package() ecbuild_debug ( "ecbuild_find_package(${_PAR_NAME}): find_package( ${_PAR_NAME} ${_${_PAR_NAME}_version} ${_${_PAR_NAME}_find_quiet} ${_${_PAR_NAME}_components} ${_${_PAR_NAME}_mode} )") find_package( ${_PAR_NAME} ${_${_PAR_NAME}_version} ${_${_PAR_NAME}_find_quiet} ${_${_PAR_NAME}_components} ${_${_PAR_NAME}_mode} ) # Restore setting set( CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY_orig} ) endif() string( TOUPPER ${_PAR_NAME} pkgUPPER ) if(ECBUILD_2_COMPAT) ecbuild_declare_compat(${pkgUPPER}_FOUND ${_PAR_NAME}_FOUND) endif() if( ECBUILD_2_COMPAT ) set( DISABLE_ECBUILD_DEPRECATION_WARNINGS ${DISABLE_ECBUILD_DEPRECATION_WARNINGS_orig} ) endif() ### final messages if( ${_PAR_NAME}_FOUND ) if( NOT _PAR_QUIET ) if( ${_PAR_NAME}_DIR ) # Defined by find_package if found via CONFIG option ecbuild_info( "${PROJECT_NAME} FOUND ${_PAR_NAME}: ${${_PAR_NAME}_DIR} (found version \"${${_PAR_NAME}_VERSION}\")" ) else() if( ${_PAR_NAME}_VERSION ) ecbuild_info( "${PROJECT_NAME} FOUND ${_PAR_NAME} (found version \"${${_PAR_NAME}_VERSION}\")" ) else() ecbuild_info( "${PROJECT_NAME} FOUND ${_PAR_NAME}" ) endif() endif() foreach( var IN ITEMS INCLUDE_DIRS INCLUDE_DIR ) if( ${_PAR_NAME}_${var} ) ecbuild_info( " ${_PAR_NAME}_${var} : [${${_PAR_NAME}_${var}}]" ) break() endif() if( ${pkgUPPER}_${var} ) ecbuild_info( " ${pkgUPPER}_${var} : [${${pkgUPPER}_${var}}]" ) break() endif() endforeach() foreach( var IN ITEMS LIBRARIES LIBRARY ) if( ${pkgUPPER}_${var} ) ecbuild_info( " ${pkgUPPER}_${var} : [${${pkgUPPER}_${var}}]" ) break() endif() if( ${_PAR_NAME}_${var} ) ecbuild_info( " ${_PAR_NAME}_${var} : [${${_PAR_NAME}_${var}}]" ) break() endif() endforeach() foreach( var IN ITEMS DEFINITIONS ) if( ${pkgUPPER}_${var} ) ecbuild_info( " ${pkgUPPER}_${var} : [${${pkgUPPER}_${var}}]" ) break() endif() if( ${_PAR_NAME}_${var} ) ecbuild_info( " ${_PAR_NAME}_${var} : [${${_PAR_NAME}_${var}}]" ) break() endif() endforeach() endif() if( DEFINED ${_PAR_DESCRIPTION} ) set( _PAR_DESCRIPTION ${${_PAR_DESCRIPTION}} ) endif() if( DEFINED ${_PAR_PURPOSE} ) set( _PAR_PURPOSE ${${_PAR_PURPOSE}} ) endif() set_package_properties( ${_PAR_NAME} PROPERTIES URL "${_PAR_URL}" DESCRIPTION "${_PAR_DESCRIPTION}" TYPE "${_PAR_TYPE}" PURPOSE "${_PAR_PURPOSE}" ) else() set( _failed_message ${_PAR_FAILURE_MSG} ) if( DEFINED ${_PAR_FAILURE_MSG} ) set( _failed_message "${${_PAR_FAILURE_MSG}}" ) endif() # Quite verbose message, only to be printed when package is REQUIRED, or ECBUILD_LOG_LEVEL <= DEBUG # When TYPE is RECOMMENDED, we will issue with ecbuild_warn, otherwise ecbuild_info set( _default_failed_message "${PROJECT_NAME} FAILED to find ${_PAR_TYPE} package ${_PAR_NAME}" ) if( ${_PAR_NAME}_FindModule ) set( _failed_help "find_package(${_PAR_NAME}) used a Find${_PAR_NAME} module to find ${_PAR_NAME}\n" " Please check file `${${_PAR_NAME}_FindModule}` for help on setting variables to find this package." ) else() set( _failed_help "find_package(${_PAR_NAME}) assumed ${_PAR_NAME} is a CMake project.\n" " Recommended variables that can help detection:\n" " - ${_PAR_NAME}_ROOT : the install prefix (as in /bin /lib /include)\n" " - CMAKE_PREFIX_PATH : the install prefix (as ${_PAR_NAME}_ROOT, or its parent directory as in /${_PAR_NAME})" ) endif() if( NOT _failed_message ) if(_PAR_TYPE MATCHES "(RECOMMENDED|REQUIRED)" ) set( _failed_message "${_default_failed_message}\n${_failed_help}" ) else() set( _failed_message ${_default_failed_message} ) endif() endif() if( _PAR_REQUIRED ) ecbuild_critical( "${_failed_message}" ) endif() if( NOT _PAR_QUIET ) if( _PAR_TYPE MATCHES "RECOMMENDED" ) ecbuild_warn( "${_failed_message}" ) else() ecbuild_info( "${_failed_message}" ) endif() if( ECBUILD_LOG_LEVEL LESS_EQUAL ${ECBUILD_DEBUG} ) ecbuild_debug( "${_failed_help}" ) endif() else() ecbuild_debug( "${_failed_message}" ) endif() endif() endmacro() ecbuild-3.16.0/cmake/ecbuild_check_cxx_source_return.cmake0000664000175000017500000001417515252726137024105 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_check_cxx_source_return # =============================== # # Compile and run a given C++ code and return its output. :: # # ecbuild_check_cxx_source_return( # VAR # OUTPUT # [ INCLUDES [ ... ] ] # [ LIBS [ ... ] ] # [ DEFINITIONS [ ... ] ] ) # # Options # ------- # # VAR : required # name of the check and name of the CMake variable to write result to # # OUTPUT : required # name of CMake variable to write the output to # # INCLUDES : optional # list of paths to add to include directories # # LIBS : optional # list of libraries to link against (CMake targets or external libraries) # # DEFINITIONS : optional # list of definitions to add to preprocessor defines # # Usage # ----- # # This will write the given source to a .cxx file and compile and run it with # ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is # set to the output of the successful run in the CMake cache. # # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache). # ############################################################################## macro( ecbuild_check_cxx_source_return SOURCE ) set( options ) set( single_value_args VAR OUTPUT ) set( multi_value_args INCLUDES LIBS DEFINITIONS ) cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_p_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_check_cxx_source_return(): \"${_p_UNPARSED_ARGUMENTS}\"") endif() if( NOT _p_VAR OR NOT _p_OUTPUT ) ecbuild_critical("The call to ecbuild_check_cxx_source_return() doesn't specify either SOURCE, VAR or OUTPUT") endif() set( _msg "Testing ${_p_VAR}:" ) if( NOT DEFINED ${_p_VAR} ) set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_p_VAR} ${CMAKE_REQUIRED_FLAGS}") set(__add_libs "") set(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES) if(CMAKE_REQUIRED_LIBRARIES) list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} ) endif() if( _p_LIBS ) list( APPEND __add_libs ${_p_LIBS} ) endif() if( __add_libs ) set(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}") endif() set(__add_incs "") set(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES) if(CMAKE_REQUIRED_INCLUDES) list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} ) endif() if( _p_INCLUDES ) list( APPEND __add_incs ${_p_INCLUDES} ) endif() if( __add_incs ) set(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}") endif() # write the source file file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCXXSource/test_${_p_VAR}.cxx" "${SOURCE}\n" ) ecbuild_debug( "${_msg}" ) ecbuild_try_run( ${_p_VAR}_EXITCODE ${_p_VAR}_COMPILED ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCXXSource/test_${_p_VAR}.cxx COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH} "${CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES}" "${CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES}" COMPILE_OUTPUT_VARIABLE compile_OUTPUT RUN_OUTPUT_VARIABLE run_OUTPUT ) # ecbuild_debug_var( ${_p_VAR}_COMPILED ) # ecbuild_debug_var( ${_p_VAR}_EXITCODE ) # if it did not compile make the return value fail code of 1 if( NOT ${_p_VAR}_COMPILED ) ecbuild_debug( "${_msg} failed to compile" ) endif() if( "${${_p_VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN" ) ecbuild_debug( "${_msg} failed to run" ) endif() # if the return value was 0 then it worked if( ${_p_VAR}_COMPILED AND "${${_p_VAR}_EXITCODE}" EQUAL 0 ) ecbuild_debug("${_msg} Success") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Performing C++ SOURCE FILE Test ${_p_VAR} succeded with the following compile output:\n" "${compile_OUTPUT}\n" "Performing C++ SOURCE FILE Run ${_p_VAR} succeded with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_p_VAR}}\n" "Source file was:\n${SOURCE}\n") set( ${_p_VAR} 1 CACHE INTERNAL "Test ${_p_VAR}") set( ${_p_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_p_VAR} output") else() if(CMAKE_CROSSCOMPILING AND "${${_p_VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN") set(${_p_VAR} "${${_p_VAR}_EXITCODE}") set(${OUTPUT} "") else() set(${_p_VAR} "" CACHE INTERNAL "Test ${_p_VAR}") set(${_p_OUTPUT} "" CACHE INTERNAL "Test ${_p_VAR} output") endif() ecbuild_debug("Test ${_p_VAR} - Failed") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Performing C++ SOURCE FILE Test ${_p_VAR} failed with the following compile output:\n" "${compile_OUTPUT}\n" "Performing C++ SOURCE FILE Run ${_p_VAR} failed with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_p_VAR}_EXITCODE}\n" "Source file was:\n${SOURCE}\n") endif() endif() endmacro() ecbuild-3.16.0/cmake/ecbuild_find_fortranlibs.cmake0000664000175000017500000001107215252726137022505 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_find_fortranlibs # ======================== # # Find the Fortran (static) link libraries. :: # # ecbuild_find_fortranlibs( [ COMPILER gfortran|pgi|xlf|intel ] # [ REQUIRED ] ) # # Options # ------- # # COMPILER : optional, defaults to gfortran # request a given Fortran compiler (``gfortran``, ``pgi``, ``xlf``, ``intel``) # # REQUIRED : optional # fail if Fortran libraries were not found # ############################################################################## macro( ecbuild_find_fortranlibs ) ecbuild_deprecate( "ecbuild_find_fortranlibs is deprecated and will be removed in an upcoming ecBuild release" ) # parse parameters set( options REQUIRED ) set( single_value_args COMPILER ) set( multi_value_args ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_find_fortranlibs(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT FORTRANLIBS_FOUND ) # don't repeat search if( _PAR_COMPILER ) set( __known_fcomp 0 ) endif() if( _PAR_COMPILER MATCHES "gfortran" ) set( WITH_LIBGFORTRAN 1 ) set( __known_fcomp 1 ) endif() if( _PAR_COMPILER MATCHES "pgi" ) set( WITH_PGI_FORTRAN 1 ) set( __known_fcomp 1 ) endif() if( _PAR_COMPILER MATCHES "xlf" ) set( WITH_XL_FORTRAN 1 ) set( __known_fcomp 1 ) endif() if( _PAR_COMPILER MATCHES "intel" ) set( WITH_INTEL_FORTRAN 1 ) set( __known_fcomp 1 ) endif() if( _PAR_COMPILER AND NOT __known_fcomp ) ecbuild_critical( "unknown fortran compiler ${_PAR_COMPILER}" ) endif() ### set path from environment variables foreach( _fortran_lib PGI XLF LIBGFORTRAN INTEL ) if( NOT ${_fortran_lib}_PATH AND NOT "$ENV{${_fortran_lib}_PATH}" STREQUAL "" ) set( ${_fortran_lib}_PATH "$ENV{${_fortran_lib}_PATH}" ) endif() endforeach() set( _flibs_found 0 ) ### default is to search for gfortran if( NOT (WITH_PGI_FORTRAN OR WITH_LIBGFORTRAN OR WITH_XL_FORTRAN OR WITH_INTEL_FORTRAN) AND NOT (DEFINED PGI_PATH OR DEFINED LIBGFORTRAN_PATH OR DEFINED XLF_PATH OR DEFINED INTEL_PATH) ) ecbuild_warn( "Finding fortran libs for unspecified Fortran compiler: default search [ gfortran ]" ) set( WITH_LIBGFORTRAN 1 ) endif() ### actual search ... if( WITH_PGI_FORTRAN OR DEFINED PGI_PATH ) find_package(PGIFortran) if( LIBPGIFORTRAN_FOUND ) set( FORTRAN_LIBRARIES ${PGIFORTRAN_LIBRARIES} ) set( _flibs_found 1 ) set( _flibs_txt "PGI" ) endif() endif() if( WITH_LIBGFORTRAN OR DEFINED LIBGFORTRAN_PATH ) find_package(LibGFortran) if( LIBGFORTRAN_FOUND ) set( FORTRAN_LIBRARIES ${GFORTRAN_LIBRARIES} ) set( _flibs_found 1 ) set( _flibs_txt "gfortran" ) endif() endif() if( WITH_XL_FORTRAN OR DEFINED XLF_PATH ) find_package(XLFortranLibs) if( LIBXLFORTRAN_FOUND ) set( FORTRAN_LIBRARIES ${XLFORTRAN_LIBRARIES} ) set( _flibs_found 1 ) set( _flibs_txt "XLF" ) endif() endif() if( WITH_INTEL_FORTRAN OR DEFINED INTEL_PATH ) find_package(LibIFort) if( LIBIFORT_FOUND ) set( FORTRAN_LIBRARIES ${IFORT_LIBRARIES} ) set( _flibs_found 1 ) set( _flibs_txt "Intel" ) endif() endif() ### set found if( _flibs_found ) set( FORTRANLIBS_FOUND 1 CACHE INTERNAL "Fortran libraries found" ) set( FORTRANLIBS_NAME ${_flibs_txt} CACHE INTERNAL "Fortran library name" ) set( FORTRAN_LIBRARIES ${FORTRAN_LIBRARIES} CACHE INTERNAL "Fortran libraries" ) ecbuild_info( "Found Fortran libraries: ${_flibs_txt}" ) else() set( FORTRANLIBS_FOUND 0 ) if( _PAR_REQUIRED ) ecbuild_critical( "Failed to find Fortran libraries" ) else() ecbuild_warn( "Failed to find Fortran libraries" ) endif() endif() endif( NOT FORTRANLIBS_FOUND ) endmacro( ecbuild_find_fortranlibs ) ecbuild-3.16.0/cmake/ecbuild-config-version.cmake0000664000175000017500000000060315252726137022024 0ustar alastairalastairinclude(${CMAKE_CURRENT_LIST_DIR}/ecbuild_parse_version.cmake) ecbuild_parse_version_file(${CMAKE_CURRENT_LIST_DIR}/VERSION PREFIX PACKAGE) if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() ecbuild-3.16.0/cmake/ecbuild_check_os.cmake0000664000175000017500000004400315252726137020736 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################################ # check size of pointer # Re-check size of void pointer since for some compiler combinations this is not properly set check_type_size( "void*" CMAKE_SIZEOF_VOID_P ) if( NOT CMAKE_C_COMPILER_LOADED ) enable_language( C ) ecbuild_compiler_flags( C ) endif() math( EXPR EC_OS_BITS "${CMAKE_SIZEOF_VOID_P} * 8" ) # we only support 32 and 64 bit operating systems if( NOT EC_OS_BITS EQUAL "32" AND NOT EC_OS_BITS EQUAL "64" ) ecbuild_critical( "operating system ${CMAKE_SYSTEM} ${EC_OS_BITS} bits -- ecbuild only supports 32 or 64 bit OS's" ) endif() ############################################################################################ ### this will be deprecated in ecbuild 3.x include(ecbuild_test_endiness) ecbuild_test_endiness() ############################################################################################ # For 64 bit architectures enable PIC (position-independent code) # Allow overriding the position independent code setting (ECBUILD-220) if( DEFINED ECBUILD_POSITION_INDEPENDENT_CODE ) set( CMAKE_POSITION_INDEPENDENT_CODE ${ECBUILD_POSITION_INDEPENDENT_CODE} ) elseif( ${EC_OS_BITS} EQUAL 64 ) set( CMAKE_POSITION_INDEPENDENT_CODE ON ) endif() ############################################################################################ # check for large file support ### this will be deprecated in ecbuild 3.x include(ecbuild_add_large_file_support) if( ENABLE_LARGE_FILE_SUPPORT ) ecbuild_add_large_file_support() endif() ############################################################################################ # enable profiling via gprof if( ENABLE_PROFILING ) ecbuild_deprecate( "ENABLE_PROFILING is deprecated and ignored, use ENABLE_GPROF instead" ) endif() if( ENABLE_GPROF ) # User defined profiling flag takes precedence if( ECBUILD_GPROF_FLAG ) ecbuild_debug( "Enabling profiling with user defined flag '${ECBUILD_GPROF_FLAG}'" ) # -p Generate extra code to write profile information suitable for the analysis program # prof. You must use this option when compiling the source files you want data about, # and you must also use it when linking. # # -pg Generate extra code to write profile information suitable for the analysis program # gprof. You must use this option when compiling the source files you want data about, # and you must also use it when linking. # # --coverage # This option is used to compile and link code instrumented for coverage analysis. The # option is a synonym for -fprofile-arcs -ftest-coverage (when compiling) and -lgcov # (when linking). See the documentation for those options for more details. # # * Compile the source files with -fprofile-arcs plus optimization and code generation # options. For test coverage analysis, use the additional -ftest-coverage option. # You do not need to profile every source file in a program. # # * Link your object files with -lgcov or -fprofile-arcs (the latter implies the # former). # # * Run the program on a representative workload to generate the arc profile # information. This may be repeated any number of times. You can run concurrent # instances of your program, and provided that the file system supports locking, the # data files will be correctly updated. Also "fork" calls are detected and correctly # handled (double counting will not happen). # # * For profile-directed optimizations, compile the source files again with the same # optimization and code generation options plus -fbranch-probabilities. # # * For test coverage analysis, use gcov to produce human readable information from the # .gcno and .gcda files. Refer to the gcov documentation for further information. # # With -fprofile-arcs, for each function of your program GCC creates a program flow # graph, then finds a spanning tree for the graph. Only arcs that are not on the # spanning tree have to be instrumented: the compiler adds code to count the number of # times that these arcs are executed. When an arc is the only exit or only entrance to a # block, the instrumentation code can be added to the block; otherwise, a new basic block # must be created to hold the instrumentation code. elseif( CMAKE_C_COMPILER_ID MATCHES "GNU" ) set( ECBUILD_GPROF_FLAG "-pg --coverage" ) ecbuild_debug( "Enabling profiling with GNU flag '${ECBUILD_GPROF_FLAG}'" ) # -p # # Compiles and links for function profiling # with gprof(1). # # Architecture Restrictions: Not available on Intel(R) 64 architecture # targeting the # Intel(R) Xeon Phi(TM) coprocessor x100 product family (formerly code # name Knights Corner), on IA-32 architecture targeting Intel(R) # Graphics Technology, or on Intel(R) 64 architecture targeting Intel(R) # Graphics Technology # # Arguments: # # None # # Default: # # OFF Files are compiled and linked without profiling. # # Description: # # This option compiles and links for function profiling with gprof(1). # # When you specify this option, inlining is disabled. However, you can override # this by specifying pragma forceinline, declspec forceinline (Windows* OS), # attribute always_inline (Linux* OS and OS X*), or a compiler option such as # [Q]inline-forceinline. elseif( CMAKE_C_COMPILER_ID MATCHES "Intel" ) set( ECBUILD_GPROF_FLAG "-p" ) ecbuild_debug( "Enabling profiling with Intel flag '${ECBUILD_GPROF_FLAG}'" ) # -Mprof[=option[,option,...]] # Set performance profiling options. Use of these options will cause the resulting # executable to create a performance profile that can be viewed and analyzed with the # PGPROF performance profiler. In the descriptions below, PGI-style profiling implies # compiler-generated source instrumentation. MPICH-style profiling implies the use of # instrumented wrappers for MPI library routines. The -Mprof options are: # # ccff # # dwarf Generate limited DWARF symbol information sufficient for most performance # profilers. # # func Perform PGI-style function level profiling. # # hwcts Generate a profile using event-based sampling of hardware counters via the # PAPI interface (linux86-64 only, PAPI must be installed). # # lines Perform PGI-style line level profiling. # # hpmpi (PGI CDK only) Perform MPICH-style profiling for the HP Implies # -Mmpi=hpmpi. # # mpich1 (PGI CDK only) Perform MPICH-style profiling for MPICH-1. Implies # -Mmpi=mpich1. Use MPIDIR to point to the MPICH-1 libraries. This flag is # no longer fully supported. # # mpich2 (PGI CDK only) Perform MPICH-style profiling for MPICH-2. Implies # -Mmpi=mpich2. Use MPIDIR to point to the MPICH-1 libraries. This flag is # no longer fully supported. # # mvapich1 (PGI CDK only) Perform MPICH-style profiling for MVAPICH. Implies # -Mmpi=mvapich1. Use MPIDIR to point to the MPICH-1 libraries. This flag # is no longer fully supported. # # time Generate a profile using time-based instruction-level statistical # sampling. This is equivalent to -pg, except that the profile is saved in a # file named pgprof.out instead of gmon.out. # # On Linux systems that have OProfile installed, PGPROF supports collection of # performance data without recompilation. Use of -Mprof=dwarf is useful for this mode # of profiling. elseif( CMAKE_C_COMPILER_ID MATCHES "PGI" ) set( ECBUILD_GPROF_FLAG "-Mprof=dwarf,time" ) ecbuild_debug( "Enabling profiling with PGI flag '${ECBUILD_GPROF_FLAG}'" ) # There is no equivalent to -pg for clang: # http://lists.llvm.org/pipermail/cfe-dev/2010-September/011255.html else() ecbuild_warn( "Profiling enabled but ecbuild doesn't know how to enable for this particular compiler ${CMAKE_C_COMPILER_ID}") endif() set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" ) set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" ) set( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" ) set( _trust_flags ${ECBUILD_TRUST_FLAGS} ) set( ECBUILD_TRUST_FLAGS ON ) ecbuild_add_c_flags( "${ECBUILD_GPROF_FLAG}" ) ecbuild_add_cxx_flags( "${ECBUILD_GPROF_FLAG}" ) ecbuild_add_fortran_flags( "${ECBUILD_GPROF_FLAG}" ) set( ECBUILD_TRUST_FLAGS ${_trust_flags} ) unset( _trust_flags ) endif() ############################################################################################ # check operating system set( EC_OS_NAME "UNKNOWN" ) ### Unix's -- Proper operating systems if( UNIX ) ### APPLE ### if( APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" ) set( EC_OS_NAME "macosx" ) endif() ### Linux ### if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" ) set( EC_OS_NAME "linux" ) # The following option allows enabling the new dtags linker option # (when set to OFF). ONLY SET TO OFF IF YOU KNOW WHAT YOU ARE DOING AND # NEVER WHEN BUILDING PRODUCTION SOFTWARE. YOU HAVE BEEN WARNED! option( ECBUILD_DISABLE_NEW_DTAGS "Set the linker flag --disable-new-dtags" ON ) mark_as_advanced( ECBUILD_DISABLE_NEW_DTAGS ) if( ECBUILD_DISABLE_NEW_DTAGS ) # recent linkers default to --enable-new-dtags # which then adds both RPATH and RUNPATH to executables # thus invalidating RPATH setting, and making LD_LIBRARY_PATH take precedence # to be sure, use tool 'readelf -a | grep PATH' to see what paths are built-in # see: # * http://blog.qt.digia.com/blog/2011/10/28/rpath-and-runpath # * http://www.cmake.org/Wiki/CMake_RPATH_handling # * man ld # * http://blog.tremily.us/posts/rpath # * http://fwarmerdam.blogspot.co.uk/2010/12/rpath-runpath-and-ldlibrarypath.html set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--disable-new-dtags") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--disable-new-dtags") endif() # The following option enables a linker check to set ECBUILD_DISABLE_DYNCHECK if needed. option( ECBUILD_DISABLE_RPATH_FIX "Disable the linker fix for relative RPATH" OFF ) mark_as_advanced( ECBUILD_DISABLE_RPATH_FIX ) get_property(HAVE_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS) if( HAVE_SHARED_LIBS AND NOT ECBUILD_DISABLE_RPATH_FIX ) # GNU ld versions before 2.28 do not expand $ORIGIN at link time. # If this is the case for the current linker, disable checking for dynamic symbols # See https://sourceware.org/bugzilla/show_bug.cgi?id=20535 set( _linker_check_srcdir "${ECBUILD_MACROS_DIR}/../check_linker" ) if( NOT EXISTS ${_linker_check_srcdir} ) # ecbuild source dir set( _linker_check_srcdir "${ECBUILD_MACROS_DIR}/../share/ecbuild/check_linker" ) endif() set( _linker_check_bindir "${CMAKE_BINARY_DIR}/ecbuild_tmp/check_linker" ) # Make sure the build directory does not point to another version if( EXISTS ${_linker_check_bindir}/CMakeCache.txt ) file( STRINGS ${_linker_check_bindir}/CMakeCache.txt _linker_check_prev_src REGEX "^CMAKE_HOME_DIRECTORY" LIMIT_COUNT 1 ) string( REGEX REPLACE "^.*=(.+)$" "\\1" _linker_check_prev_src "${_linker_check_prev_src}" ) string( STRIP _linker_check_prev_src "${_linker_check_prev_src}" ) get_filename_component( _linker_check_prev_src "${_linker_check_prev_src}" REALPATH ) get_filename_component( _linker_check_curr_src "${_linker_check_srcdir}" REALPATH ) if( NOT _linker_check_prev_src STREQUAL _linker_check_curr_src ) file( REMOVE ${_linker_check_bindir}/CMakeCache.txt ) endif() endif() try_compile( _linker_understands_origin ${_linker_check_bindir} ${_linker_check_srcdir} test_ld_origin ) cmake_policy( PUSH ) cmake_policy( SET CMP0012 NEW ) if( NOT ${_linker_understands_origin} ) ecbuild_warn( "The linker does not support $ORIGIN at link-time, \ disabling dynamic symbol check when linking against shared libraries" ) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-shlib-undefined") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-shlib-undefined") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--allow-shlib-undefined") endif() cmake_policy( POP ) endif() endif() ### FreeBSD ### if( ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" ) set( EC_OS_NAME "freebsd" ) endif() ### OpenBSD ### if( ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" ) set( EC_OS_NAME "openbsd" ) endif() ### Solaris ### if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" ) set( EC_OS_NAME "solaris" ) endif() ### AIX ### if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" ) set( EC_OS_NAME "aix" ) set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" ) if( CMAKE_C_COMPILER_ID MATCHES "GNU" ) set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" ) endif() if( CMAKE_COMPILER_IS_GNUCC ) if( EC_OS_BITS EQUAL "64" ) ecbuild_add_c_flags("-maix64") endif() if( EC_OS_BITS EQUAL "32" ) ecbuild_add_c_flags("-maix32") endif() endif() if( CMAKE_COMPILER_IS_GNUCXX ) if( EC_OS_BITS EQUAL "64" ) ecbuild_add_cxx_flags("-maix64") endif() if( EC_OS_BITS EQUAL "32" ) ecbuild_add_cxx_flags("-maix32") endif() endif() if( CMAKE_C_COMPILER_ID MATCHES "XL" ) ecbuild_add_c_flags("-qpic=large") # ecbuild_add_c_flags("-qweaksymbol") if(EC_OS_BITS EQUAL "32" ) ecbuild_add_c_flags("-q32") endif() if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" ) ecbuild_add_c_flags("-qstrict") ecbuild_add_c_flags("-qinline") endif() if(${CMAKE_BUILD_TYPE} MATCHES "Debug") ecbuild_add_c_flags("-qfullpath") ecbuild_add_c_flags("-qkeepparm") endif() endif() if( CMAKE_CXX_COMPILER_ID MATCHES "XL" ) ecbuild_add_cxx_flags("-qpic=large") ecbuild_add_cxx_flags("-bmaxdata:0x40000000") ecbuild_add_cxx_flags("-qrtti") ecbuild_add_cxx_flags("-qfuncsect") # ecbuild_add_cxx_flags("-qweaksymbol") if(EC_OS_BITS EQUAL "32" ) ecbuild_add_cxx_flags("-q32") endif() if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" ) ecbuild_add_cxx_flags("-qstrict") ecbuild_add_cxx_flags("-qinline") endif() if(${CMAKE_BUILD_TYPE} MATCHES "Debug") ecbuild_add_cxx_flags("-qfullpath") ecbuild_add_cxx_flags("-qkeepparm") endif() endif() if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" ) ecbuild_add_fortran_flags("-qxflag=dealloc_cfptr") ecbuild_add_fortran_flags("-qextname") ecbuild_add_fortran_flags("-qdpc=e") ecbuild_add_fortran_flags("-bmaxdata:0x40000000") ecbuild_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap") if(EC_OS_BITS EQUAL "32" ) ecbuild_add_fortran_flags("-q32") endif() endif() endif() ### GNU/Hurd ### if( ${CMAKE_SYSTEM_NAME} STREQUAL "GNU" ) set( EC_OS_NAME "hurd" ) endif() endif() ### Cygwin if( ${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN" ) set( EC_OS_NAME "cygwin" ) ecbuild_warn( "Building on Cygwin should work but is untested" ) endif() ### Windows if( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" OR WIN32 ) # its weird, but WIN32 also includes Win64 set( EC_OS_NAME "windows" ) find_program( BASH_EXE NAMES bash DOC "Used under Windows for fixing symlinks and running unit tests" ) if( NOT BASH_EXE ) ecbuild_critical("Could not find program 'bash'. Specify the location with -DBASH_EXE=C:/...") endif() ecbuild_warn( "CMake doesn't support symlinks on Windows. " "Replacing all symlinks with copies." ) execute_process( COMMAND ${BASH_EXE} -c "${ECBUILD_MACROS_DIR}/ecbuild_windows_replace_symlinks.sh" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE CMD_RESULT OUTPUT_VARIABLE CMD_OUTPUT ERROR_VARIABLE CMD_ERROR ) ecbuild_debug( "Windows Replace Symlinks res=[${CMD_RESULT}] " "output=[${CMD_OUTPUT}] error=[${CMD_ERROR}]" ) if( CMD_RESULT ) ecbuild_critical( "Failed to replace windows symlinks. " "output=[${CMD_OUTPUT}] error=[${CMD_ERROR}]" ) endif() endif() ### final warning / error if( ${EC_OS_NAME} MATCHES "UNKNOWN" ) if( DISABLE_OS_CHECK ) ecbuild_warn( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]" " -- DISABLE_OS_CHECK is ON so proceeding at your own risk ..." ) else() ecbuild_critical( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]" " -- refusing to continue. Disable this check with -DDISABLE_OS_CHECK=ON" ) endif() endif() ecbuild-3.16.0/cmake/fcm-make-interfaces.cfg.in0000664000175000017500000000217515252726137021362 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. # FCM configuration file used to auto-generate interface files # for F77 and F90 files. # Interface files will have the extention "@P_SUFFIX@" # Results will be in a directory "interfaces/include" relative to cwd # Usage: fcm make --config-file= \ # interfaces.ns-incl="" $SRC{?} = $HERE step.class[interfaces] = build steps = interfaces interfaces.target{task} = ext-iface interfaces.source = $SRC # Exclude all interfaces.ns-excl = / # Include some # interfaces.ns-incl = # Extention of interface files interfaces.prop{file-ext.f90-interface} = @P_SUFFIX@ # Do not follow includes interfaces.prop{no-dep.f.module} = * interfaces.prop{no-dep.include} = * ecbuild-3.16.0/cmake/ecbuild_add_cxx_flags.cmake0000664000175000017500000000325015252726137021745 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_add_cxx_flags # ===================== # # Add C++ compiler flags to CMAKE_CXX_FLAGS only if supported by compiler. :: # # ecbuild_add_cxx_flags( [ ... ] # [ BUILD ] # [ NAME ] # [ NO_FAIL ] # [ PROJECT ] ) # # Options # ------- # # BUILD : optional # add flags to ``CMAKE_CXX_FLAGS_`` instead of ``CMAKE_CXX_FLAGS`` # # NAME : optional # name of the check (if omitted, checks are enumerated) # # NO_FAIL : optional # do not fail if the flag cannot be added # # PROJECT : optional # add flags to project specific ``${PNAME}_CXX_FLAGS`` and # ``${PNAME}_CXX_FLAGS_`` instead of the corresponding # ``CMAKE_CXX_FLAGS`` variables. # ############################################################################## include(ecbuild_add_lang_flags) macro( ecbuild_add_cxx_flags ) ecbuild_debug("call ecbuild_add_cxx_flags( ${ARGV} )") ecbuild_add_lang_flags( FLAGS ${ARGV} LANG CXX ) endmacro() macro( cmake_add_cxx_flags ) ecbuild_deprecate( " cmake_add_cxx_flags is deprecated, use ecbuild_add_cxx_flags instead." ) ecbuild_add_cxx_flags( ${ARGV} ) endmacro() ecbuild-3.16.0/cmake/ecbuild_check_fortran_source_return.cmake0000664000175000017500000001400215252726137024743 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_check_fortran_source_return # =================================== # # Compile and run a given Fortran code and return its output. :: # # ecbuild_check_fortran_source_return( # VAR # OUTPUT # [ INCLUDES [ ... ] ] # [ LIBS [ ... ] ] # [ DEFINITIONS [ ... ] ] ) # # Options # ------- # # VAR : required # name of the check and name of the CMake variable to write result to # # OUTPUT : required # name of CMake variable to write the output to # # INCLUDES : optional # list of paths to add to include directories # # LIBS : optional # list of libraries to link against (CMake targets or external libraries) # # DEFINITIONS : optional # list of definitions to add to preprocessor defines # # Usage # ----- # # This will write the given source to a .f file and compile and run it with # ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is # set to the output of the successful run in the CMake cache. # # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache). # ############################################################################## macro( ecbuild_check_fortran_source_return SOURCE ) set( options ) set( single_value_args VAR OUTPUT ) set( multi_value_args INCLUDES LIBS DEFINITIONS ) cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} ) if(_PAR_UNPARSED_ARGUMENTS) ecbuild_critical("Unknown keywords given to ecbuild_check_fortran_source_return(): \"${_PAR_UNPARSED_ARGUMENTS}\"") endif() if( NOT _PAR_VAR OR NOT _PAR_OUTPUT ) ecbuild_critical("The call to ecbuild_check_fortran_source_return() doesn't specify either SOURCE, VAR or OUTPUT") endif() if( NOT DEFINED ${_PAR_VAR} ) set(MACRO_CHECK_FUNCTION_DEFINITIONS "-D${_PAR_VAR} ${CMAKE_REQUIRED_FLAGS}") set(__add_libs "") set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES) if( CMAKE_REQUIRED_LIBRARIES ) list( APPEND __add_libs ${CMAKE_REQUIRED_LIBRARIES} ) endif() if( _PAR_LIBS ) list( APPEND __add_libs ${_PAR_LIBS} ) endif() if( __add_libs ) set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${__add_libs}") endif() set(__add_incs "") set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES) if( CMAKE_REQUIRED_INCLUDES ) list( APPEND __add_incs ${CMAKE_REQUIRED_INCLUDES} ) endif() if( _PAR_INCLUDES ) list( APPEND __add_incs ${_PAR_INCLUDES} ) endif() if( __add_incs ) set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${__add_incs}") endif() # write the source file file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.F90" "${SOURCE}\n" ) ecbuild_debug( "Performing Test ${_PAR_VAR}" ) ecbuild_try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.F90 COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH} "${CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES}" "${CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES}" COMPILE_OUTPUT_VARIABLE compile_OUTPUT RUN_OUTPUT_VARIABLE run_OUTPUT ) # if it did not compile make the return value fail code of 1 if( NOT ${_PAR_VAR}_COMPILED ) set( ${_PAR_VAR}_EXITCODE 1 ) endif() # if the return value was 0 then it worked if("${${_PAR_VAR}_EXITCODE}" EQUAL 0) ecbuild_debug("Performing Test ${_PAR_VAR} - Success") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Performing Fortran SOURCE FILE Test ${_PAR_VAR} succeded with the following compile output:\n" "${compile_OUTPUT}\n" "Performing Fortran SOURCE FILE Run ${_PAR_VAR} succeded with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_PAR_VAR}}\n" "Source file was:\n${SOURCE}\n") set( ${_PAR_VAR} 1 CACHE INTERNAL "Test ${_PAR_VAR}") set( ${_PAR_OUTPUT} "${run_OUTPUT}" CACHE INTERNAL "Test ${_PAR_VAR} output") else() if(CMAKE_CROSSCOMPILING AND "${${_PAR_VAR}_EXITCODE}" MATCHES "FAILED_TO_RUN") set(${_PAR_VAR} "${${_PAR_VAR}_EXITCODE}") set(${OUTPUT} "") else() set(${_PAR_VAR} "" CACHE INTERNAL "Test ${_PAR_VAR}") set(${_PAR_OUTPUT} "" CACHE INTERNAL "Test ${_PAR_VAR} output") endif() ecbuild_debug("Performing Test ${_PAR_VAR} - Failed") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Performing Fortran SOURCE FILE Test ${_PAR_VAR} failed with the following compile output:\n" "${compile_OUTPUT}\n" "Performing Fortran SOURCE FILE Run ${_PAR_VAR} failed with the following run output:\n" "${run_OUTPUT}\n" "Return value: ${${_PAR_VAR}_EXITCODE}\n" "Source file was:\n${SOURCE}\n") endif() endif() endmacro() ecbuild-3.16.0/cmake/compiler_flags/0000775000175000017500000000000015252726137017454 5ustar alastairalastairecbuild-3.16.0/cmake/compiler_flags/Clang_C.cmake0000664000175000017500000000172315252726137021747 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C compiler flags for Release builds" FORCE ) set( CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "C compiler flags for Debug builds" FORCE ) set( CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "C compiler flags for Production builds." FORCE ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C compiler flags for RelWithDebInfo builds." FORCE ) ecbuild-3.16.0/cmake/compiler_flags/PGI_CXX.cmake0000664000175000017500000000101715252726137021616 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-fast -O3 -DNDEBUG" CACHE STRING "Release C++ compiler flags" FORCE ) set( CMAKE_CXX_LINK_FLAGS "" CACHE STRING "" ) ecbuild-3.16.0/cmake/compiler_flags/CrayClang_CXX.cmake0000664000175000017500000000174715252726137023054 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C++ compiler flags for Release builds" FORCE ) set( CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C++ compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "C++ compiler flags for Debug builds" FORCE ) set( CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "C++ compiler flags for Production builds." FORCE ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C++ compiler flags for RelWithDebInfo builds." FORCE ) ecbuild-3.16.0/cmake/compiler_flags/Cray_Fortran.cmake0000664000175000017500000000375215252726137023056 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. # -emf activates .mods and uses lower case # -rmoid produces a listing file if( CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 18.0.0 AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 20.0.0 ) # Unfortunately, CCE 18 and 19 incurred a bug in the lower-casing of # submodule .smod files, leading to incomplete lower-casing of the output # file name, e.g., `parent_mod.sUB_MOD.smod`. # This is supposedly fixed in CCE20, but we have to switch off the use of # lowr-casing, thus only using the `-em` option for versions in-between. set( _crayftn_mod_options "-em" ) else() set( _crayftn_mod_options "-emf" ) endif() set( CMAKE_Fortran_FLAGS_RELEASE "${_crayftn_mod_options} -rmoid -N 1023 -O3 -hfp3 -hscalar3 -hvector3 -DNDEBUG" CACHE STRING "Release Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${_crayftn_mod_options} -rmoid -N 1023 -O2 -hfp1 -g -DNDEBUG" CACHE STRING "Release-with-debug-info Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_PRODUCTION "${_crayftn_mod_options} -rmoid -N 1023 -O2 -hfp1 -g" CACHE STRING "Production Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_BIT "${_crayftn_mod_options} -rmoid -N 1023 -O2 -hfp1 -g -hflex_mp=conservative -hadd_paren -DNDEBUG" CACHE STRING "Bit-reproducible Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_DEBUG "${_crayftn_mod_options} -rmoid -N 1023 -O0 -g" CACHE STRING "Debug Fortran flags" FORCE ) ecbuild-3.16.0/cmake/compiler_flags/Intel_CXX.cmake0000664000175000017500000000173515252726137022261 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C++ compiler flags" FORCE ) set( CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C++ compiler flags" FORCE ) set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C++ compiler flags" FORCE ) set( CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C++ compiler flags" FORCE ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C++ compiler flags" FORCE ) ecbuild-3.16.0/cmake/compiler_flags/CrayClang_C.cmake0000664000175000017500000000172315252726137022566 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C compiler flags for Release builds" FORCE ) set( CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "C compiler flags for Debug builds" FORCE ) set( CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "C compiler flags for Production builds." FORCE ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C compiler flags for RelWithDebInfo builds." FORCE ) ecbuild-3.16.0/cmake/compiler_flags/GNU_CXX.cmake0000664000175000017500000000245015252726137021632 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C++ compiler flags for Release builds" FORCE ) set( CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C++ compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "C++ compiler flags for Debug builds" FORCE ) set( CMAKE_CXX_FLAGS_PRODUCTION "-O2 -g" CACHE STRING "C++ compiler flags for Production builds." FORCE ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C++ compiler flags for RelWithDebInfo builds." FORCE ) # NOTE: gcc does not guarrante that -O3 performs better than -O2 # -- it can perform worse due to assembly code bloating. # Moreover for gcc 4.1.2 we found that -O3 remove the parser code generated from Lex/Yacc # and therefore in production mode we downgrade to -O2 if the compiler is GCC (for all versions). ecbuild-3.16.0/cmake/compiler_flags/GNU_C.cmake0000664000175000017500000000242415252726137021353 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C compiler flags for Release builds" FORCE ) set( CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "C compiler flags for Debug builds" FORCE ) set( CMAKE_C_FLAGS_PRODUCTION "-O2 -g" CACHE STRING "C compiler flags for Production builds." FORCE ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C compiler flags for RelWithDebInfo builds." FORCE ) # NOTE: gcc does not guarrante that -O3 performs better than -O2 # -- it can perform worse due to assembly code bloating. # Moreover for gcc 4.1.2 we found that -O3 remove the parser code generated from Lex/Yacc # and therefore in production mode we downgrade to -O2 if the compiler is GCC (for all versions). ecbuild-3.16.0/cmake/compiler_flags/PGI_Fortran.cmake0000664000175000017500000000102215252726137022563 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. set( CMAKE_Fortran_FLAGS_RELEASE "-fast -O3" CACHE STRING "Release Fortran compiler flags" FORCE ) set( CMAKE_Fortran_LINK_FLAGS "" CACHE STRING "" ) ecbuild-3.16.0/cmake/compiler_flags/Intel_Fortran.cmake0000664000175000017500000000277515252726137023237 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( Fortran_AUTOMATIC_ARRAYS_LIMIT 32768 ) # (32 kb) math( EXPR Fortran_AUTOMATIC_ARRAYS_LIMIT_KB "${Fortran_AUTOMATIC_ARRAYS_LIMIT}/1024" ) set( Fortran_FLAG_STACK_ARRAYS "-no-heap-arrays" ) set( Fortran_FLAG_AUTOMATIC_ARRAYS "-heap-arrays ${Fortran_AUTOMATIC_ARRAYS_LIMIT_KB}" ) set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Release Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Release-with-debug-info Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_BIT "-O2 -DNDEBUG -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Bit-reproducible Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -traceback ${Fortran_FLAG_AUTOMATIC_ARRAYS} -check all" CACHE STRING "Debug Fortran flags" FORCE ) set( CMAKE_Fortran_FLAGS_PRODUCTION "-O3 -g ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Production Fortran compiler flags" FORCE ) # "-check all" implies "-check bounds" ecbuild-3.16.0/cmake/compiler_flags/Intel_C.cmake0000664000175000017500000000171615252726137022000 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C compiler flags" FORCE ) set( CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C compiler flags" FORCE ) set( CMAKE_C_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C compiler flags" FORCE ) set( CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C compiler flags" FORCE ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C compiler flags" FORCE ) ecbuild-3.16.0/cmake/compiler_flags/Cray_C.cmake0000664000175000017500000000205515252726137021620 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-O3 -hfp3 -hscalar3 -hvector3 -DNDEBUG" CACHE STRING "Release C flags" FORCE ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -hfp1 -G2 -DNDEBUG" CACHE STRING "Release-with-debug-info C flags" FORCE ) set( CMAKE_C_FLAGS_PRODUCTION "-O2 -hfp1 -G2" CACHE STRING "Production C flags" FORCE ) set( CMAKE_C_FLAGS_BIT "-O2 -hfp1 -G2 -hflex_mp=conservative -DNDEBUG" CACHE STRING "Bit-reproducible C flags" FORCE ) set( CMAKE_C_FLAGS_DEBUG "-O0 -G0" CACHE STRING "Debug Cflags" FORCE ) ecbuild-3.16.0/cmake/compiler_flags/Clang_CXX.cmake0000664000175000017500000000174715252726137022235 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "C++ compiler flags for Release builds" FORCE ) set( CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "C++ compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "C++ compiler flags for Debug builds" FORCE ) set( CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "C++ compiler flags for Production builds." FORCE ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "C++ compiler flags for RelWithDebInfo builds." FORCE ) ecbuild-3.16.0/cmake/compiler_flags/GNU_Fortran.cmake0000664000175000017500000000300615252726137022601 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -funroll-all-loops -finline-functions" CACHE STRING "Fortran compiler flags for Release builds" FORCE ) set( CMAKE_Fortran_FLAGS_BIT "-O2 -DNDEBUG -fno-range-check" CACHE STRING "Fortran compiler flags for Bit-reproducible builds" FORCE ) set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -fcheck=bounds -fbacktrace -finit-real=snan" CACHE STRING "Fortran compiler flags for Debug builds" FORCE ) set( CMAKE_Fortran_FLAGS_PRODUCTION "-O2 -g" CACHE STRING "Fortran compiler flags for Production builds." FORCE ) set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Fortran compiler flags for RelWithDebInfo builds." FORCE ) set( Fortran_FLAG_STACK_ARRAYS "-fstack-arrays" ) #################################################################### # Meaning of flags # ---------------- # -fstack-arrays : Allocate automatic arrays on the stack (needs large stacksize!!!) # -funroll-all-loops : Unroll all loops # -fcheck=bounds : Bounds checking ecbuild-3.16.0/cmake/compiler_flags/PGI_C.cmake0000664000175000017500000000101115252726137021330 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. set( CMAKE_C_FLAGS_RELEASE "-fast -O3 -DNDEBUG" CACHE STRING "Release C compiler flags" FORCE ) set( CMAKE_C_LINK_FLAGS "" CACHE STRING "" ) ecbuild-3.16.0/cmake/compiler_flags/Cray_CXX.cmake0000664000175000017500000000205015252726137022073 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. set( CMAKE_CXX_FLAGS_RELEASE "-O3 -hfp3 -hscalar3 -hvector3 -DNDEBUG" CACHE STRING "Release C++ flags" FORCE ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -hfp1 -G2 -DNDEBUG" CACHE STRING "Release-with-debug-info C++ flags" FORCE ) set( CMAKE_CXX_FLAGS_PRODUCTION "-O2 -hfp1" CACHE STRING "Production C++ flags" FORCE ) set( CMAKE_CXX_FLAGS_BIT "-O2 -hfp1 -hflex_mp=conservative -DNDEBUG" CACHE STRING "Bit-reproducible C++ flags" FORCE ) set( CMAKE_CXX_FLAGS_DEBUG "-G0 -O0" CACHE STRING "Debug CXX flags" FORCE ) ecbuild-3.16.0/cmake/CMakeLists.txt0000664000175000017500000000116215252726137017226 0ustar alastairalastair# (C) Copyright 2011- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. file( GLOB_RECURSE ecbuild_support_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) ecbuild_add_resources( TARGET ${PROJECT_NAME}_ecbuild_support_files SOURCES_PACK ${ecbuild_support_files} ) ecbuild-3.16.0/cmake/ecbuild_generate_project_config.cmake0000664000175000017500000000556215252726137024034 0ustar alastairalastair# (C) Copyright 2019- ECMWF. # # This software is licensed under the terms of the Apache Licence Version 2.0 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. # In applying this licence, ECMWF does not waive the privileges and immunities # granted to it by virtue of its status as an intergovernmental organisation nor # does it submit to any jurisdiction. ############################################################################## #.rst: # # ecbuild_generate_project_config # =============================== # # Generate the -config.cmake file :: # # ecbuild_generate_project_config(