#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

########################
## BND BUILD SETTINGS ##
########################


## Global defaults are loaded from the bnd library (as shown below), place your
## specific settings here. Additional settings are inherited from ext/*.bnd and
## they will be overridden by anything you specify in this file.

## General Options
#project.dependson:     ${p-dependson;:}
#project.bootclasspath: ${p-bootclasspath;:}
#project.buildpath:     ${p-buildpath;:}
#project.sourcepath:    ${p-sourcepath;:}
#project.allsourcepath: ${p-allsourcepath;:}
#project.output:        ${p-output}
#project.testpath:      ${p-testpath;:}

#-verbose:              false
#project:               ${basedir}
#src:                   src
#bin:                   bin
#testsrc:               test
#testbin:               bin_test
#test-reports:          test-reports
#target-dir:            generated
#target:                ${project}/${target-dir}
#build:                 ${workspace}/cnf
#p:                     ${basename;${project}}
#project.name:          ${p}
#plugin-dir:            ${build}/plugins

## Java Compiler Options
#java:                  java
#javac:                 javac
javac.source:          1.8
javac.target:          1.8
#javac.profile:
#javac.debug:           on

## Bnd Options
-sources:               false
#-sourcepath:           ${project}/src


## Properties from ext/*.bnd can be referenced in order to extend them. For
## example, to add one additional plugin to the list defined in
## ext/repositories.bnd:
# -plugin: ${ext.repositories.-plugin}, org.example.MyPlugin


## To enable baselining, uncomment the following lines:
-baseline: *

## If you use git, you might want to uncomment the following lines:
# Git-Descriptor:       ${system-allow-fail;git describe --dirty --always}
# Git-SHA:              ${system-allow-fail;git rev-list -1 HEAD}
# -diffignore:          Git-Descriptor,Git-SHA

##
# Removes some headers in order to reduce binary diff between same bundles that are not changed between subsequent releases.
# see FELIX-4915
#
-removeheaders: Bnd-LastModified,Tool,Created-By,Include-Resource
