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

= DevFaqCustomizeBuild
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqCustomizeBuild
:description: Apache NetBeans wiki DevFaqCustomizeBuild
:toc: left
:toc-title:
:syntax: true

==== How can I customize the build process?

Problem: Customization of the build process is not documented properly

Solution: 

* Add the custom tasks in the suite's build.xml file
* Add a task overriding the -init task like this:
[source,xml]
----

<target name="-init" depends="suite.-init,custom-task1,...">
        <!--Perform your actions here-->
</target>
----

 

The key part is calling the suite.-init task as it initializes a lot of stuff used by the rest of the process. Depending on which things you need to initialize, this target may not work and you may need to pick another one; look at what `common.xml` in the harness is initializing when.

--
Applies to: NetBeans IDE 6.8 and 6.9
Platforms: All
See also link:DevFaqSignNbm.asciidoc[DevFaqSignNbm] for an example using this.

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqCustomizeBuild[http://wiki.netbeans.org/DevFaqCustomizeBuild] , 
that was last modified by NetBeans user Jglick 
on 2010-06-14T20:25:17Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
