# 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.13.2.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.lsp,\
    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.j2seplatform,\
    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,\
    db.core,\
    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,\
    nativeimage.api,\
    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

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