# 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.

netbeans.dest=netbeans
test.dist.dir=build/testdist

test.user.dir=testuserdir
nb.run.validation=true
build.compiler.debug=on
# Options to pass to NetBeans when starting it with "ant tryme":
tryme.arg.hack=-J-Dnetbeans.full.hack=true

# Information about branch of previous release
# needed to help us generate list of changes since then
#previous.release.year=2019
#previous.release.month=04
#previous.release.day=04

# Useful for "always successful" build, when you don't care of some
# particular (and currently broken) modules
stop.when.broken.modules=true

# resolve compile time dependencies and merge all dependent modules
# set to true and command `ant -Dmodules=javacvs` will build IDE
# with working module javacvs
merge.dependent.modules=true

# usefull for NBM build. <nbmerge> can set it to the list
# of successfuly built modules => can create NBM for them
# the most powerful combination is to set value to "modules"
# and set stop.when.broken.modules to false
built.modules.property=

# resolve compile-time dependencies during cleaning working repository
# set it to true if you want to clean also modules, your module(s) depends on
resolve.clean.dependencies=false

# stop, if the module have got wrong "clean" target
# if set to false, clean build never fail on calls of the clean targets.
stop.when.clean.error=true

test.unit.cp=\
    ../platform/libs.junit4/external/junit-4.12.jar:\
    netbeans/harness/modules/org-netbeans-modules-nbjunit.jar:\
    netbeans/harness/modules/org-netbeans-insane.jar:\
    ${ant.home}/lib/ant-junit.jar:\
    ${ant.home}/lib/ant-junit4.jar:\
    ${ant.home}/lib/ant-launcher.jar:\
    ${ant.home}/lib/ant.jar:\
    ${nbantext.jar}

# make javadoc for these packages
# - the list will be shared for signature API tests!
# - for javadoc you may specify org.foo.*, the trailing ".*"
#     will be stripped for signature API tests
javadoc.packages=\
    org.netbeans.api.*,\
    org.netbeans.spi.*

# List of modules that provide stable javadoc
config.javadoc.stable=\
    api.annotations.common,\
    api.htmlui,\
    api.intent,\
    api.io,\
    api.knockout,\
    api.maven,\
    api.scripting,\
    libs.graalsdk,\
    api.templates,\
    autoupdate.services,\
    autoupdate.ui,\
    core.ide,\
    core.multiview,\
    openide.util,\
    openide.util.lookup,\
    openide.util.ui,\
    openide.actions,\
    openide.awt,\
    openide.dialogs,\
    openide.nodes,\
    openide.explorer,\
    openide.filesystems,\
    openide.filesystems.nb,\
    openide.modules,\
    openide.text,\
    openide.windows,\
    openide.loaders,\
    openide.io,\
    parsing.api,\
    parsing.indexing,\
    api.progress,\
    api.progress.nb,\
    sendopts,\
    settings,\
    javahelp,\
    keyring,\
    spi.palette,\
    options.api,\
    spi.tasklist,\
    openide.execution,\
    queries,\
    editor.codetemplates,\
    editor.errorstripe.api,\
    editor.guards,\
    editor.lib2,\
    editor.mimelookup,\
    editor.settings,\
    spi.navigator,\
    diff,\
    projectapi,\
    projectuiapi,\
    projectuiapi.base,\
    project.libraries,\
    project.libraries.ui,\
    api.debugger,\
    spi.viewmodel,\
    spi.debugger.ui,\
    api.debugger.jpda,\
    project.ant,\
    project.ant.ui,\
    api.visual,\
    api.java,\
    api.java.classpath,\
    api.search,\
    java.platform,\
    java.platform.ui,\
    java.project,\
    java.project.ui,\
    java.source,\
    java.source.base,\
    java.sourceui,\
    editor.fold,\
    editor.completion,\
    lexer,\
    api.xml,\
    o.apache.tools.ant.module,\
    db,\
    spi.quicksearch,\
    print,\
    extexecution,\
    lib.uihandler,\
    uihandler

#FIXME: changes for retouche merge:
#   editor/codetemplates,\

# List of javadocs under development
config.javadoc.devel=\
    nbjunit,\
    jellytools.platform,\
    jellytools.ide,\
    core.multitabs,\
    core.netigso,\
    gradle,\
    gradle.java,\
    o.n.swing.outline,\
    o.n.swing.tabcontrol,\
    editor.indent,\
    editor.indent.support,\
    editor.bracesmatching,\
    j2ee.metadata,\
    jumpto,\
    libs.git,\
    refactoring.api,\
    refactoring.java,\
    server,\
    textmate.lexer,\
    versioning,\
    bugtracking,\
    sampler,\
    spi.editor.hints,\
    spi.java.hints,\
    java.hints.test,\
    api.web.webmodule,\
    xml.xam,\
    xml.xdm

# List of javadocs dedicated just for friend usage
config.javadoc.friend=\
    o.n.bootstrap,\
    o.n.core,\
    core.network,\
    code.analysis,\
    core.startup,\
    classfile,\
    o.n.swing.plaf,\
    editor.util,\
    editor.settings.storage,\
    editor.lib,\
    editor,\
    j2ee.dd,\
    j2eeserver,\
    java.api.common,\
    java.j2seproject,\
    junit,\
    lib.v8debug,\
    versioning.core,\
    masterfs,\
    masterfs.ui,\
    projectui

# List of old and deprecated APIs for building complete javadoc

config.javadoc.deprecated=\
    openide.compat,\
    openide.options,\
    o.openidex.util,\
    openide.util.enumerations

# List of all javadocs for development version
# is composed from the javadocs split by stability
# categories, for release it shall contain just stable ones
#config.javadoc.all=\
#    ${config.javadoc.stable},\
#    ${config.javadoc.devel},\
#    ${config.javadoc.friend},\
#    ${config.javadoc.deprecated}

# list of modules for jnlp:
config.jnlp.stable=\
    ${nb.cluster.platform},\
    ${nb.cluster.ide},\
    ${nb.cluster.extide},\
    ${nb.cluster.java}
