You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2018/04/24 06:40:31 UTC
[incubator-netbeans] branch master updated: Adding LICENSE/NOTICE/DISCLAIMER to NBMs, packing OSGi jars into NBMs… (#494)
This is an automated email from the ASF dual-hosted git repository.
geertjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 08c8028 Adding LICENSE/NOTICE/DISCLAIMER to NBMs, packing OSGi jars into NBMs… (#494)
08c8028 is described below
commit 08c8028557462c3d14095806ab5b98e13b162317
Author: Jan Lahoda <la...@gmail.com>
AuthorDate: Tue Apr 24 08:40:28 2018 +0200
Adding LICENSE/NOTICE/DISCLAIMER to NBMs, packing OSGi jars into NBMs… (#494)
* Adding LICENSE/NOTICE/DISCLAIMER to NBMs, packing OSGi jars into NBMs when producing update center from the main checkout, so that it holds the appropriate licenses.
* Removing debug outputs; adding license to info.xml in OSGi NBMs.
* Need to also include license hash in the fake OSGi info.xml
---
apisupport.harness/build.xml | 4 +-
nbbuild/antsrc/org/netbeans/nbbuild/MakeNBM.java | 121 +++++++++++++++------
.../org/netbeans/nbbuild/MakeUpdateDesc.java | 25 ++++-
.../nbbuild/extlibs/CreateLicenseSummary.java | 18 +++
nbbuild/build.xml | 4 +-
nbbuild/catalog-license-header.txt | 20 ++++
nbbuild/templates/common.xml | 8 +-
nbbuild/templates/projectized.xml | 39 ++++++-
8 files changed, 194 insertions(+), 45 deletions(-)
diff --git a/apisupport.harness/build.xml b/apisupport.harness/build.xml
index 45ccec3..b305b9a 100644
--- a/apisupport.harness/build.xml
+++ b/apisupport.harness/build.xml
@@ -24,14 +24,14 @@
<import file="../nbbuild/templates/projectized.xml"/>
<target name="nbantext" depends="build-init">
- <jar jarfile="${cluster}/tasks.jar" compress="${build.package.compress}" index="${build.package.index}">
+ <nb-ext-jar jarfile="${cluster}/tasks.jar" compress="${build.package.compress}" index="${build.package.index}">
<manifest>
<attribute name="NetBeans-Own-Library" value="true"/>
</manifest>
<!-- XXX would be more maintainable to use depfind.sf.net / genjar.sf.net / sadun-util.sf.net/pack.html -->
<zipfileset src="${nbantext.jar}" includes="${bundled.tasks}"/>
<zipfileset file="taskdefs.properties" fullpath="org/netbeans/nbbuild/taskdefs.properties"/>
- </jar>
+ </nb-ext-jar>
</target>
<target name="compile-jnlp-launcher" depends="init,compile">
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/MakeNBM.java b/nbbuild/antsrc/org/netbeans/nbbuild/MakeNBM.java
index ad0ae3b..f8524e3 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/MakeNBM.java
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/MakeNBM.java
@@ -39,6 +39,7 @@ import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
@@ -46,6 +47,7 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
+import java.util.function.Supplier;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
import java.util.jar.JarEntry;
@@ -301,12 +303,13 @@ public class MakeNBM extends Task {
private boolean isStandardInclude = true;
private ArrayList<ExternalPackage> externalPackages = null;
private ArrayList<String> locales = null;
- private ArrayList<Attributes> moduleAttributes = null;
private Attributes englishAttr = null;
private Path updaterJar;
private FileSet executablesSet;
+ private ZipFileSet extraNBMFiles;
private boolean usePack200;
private String pack200excludes;
+ private boolean alwaysCreateNBM;
/** Try to find and create localized info.xml files */
public void setLocales(String s) {
@@ -340,11 +343,19 @@ public class MakeNBM extends Task {
this.pack200excludes = pack200excludes;
}
+ public void setAlwaysCreateNBM(boolean alwaysCreateNBM) {
+ this.alwaysCreateNBM = alwaysCreateNBM;
+ }
+
/** List of executable files in NBM concatinated by ${line.separator}. */
public FileSet createExecutables() {
return (executablesSet = new FileSet());
}
+ public ZipFileSet createExtraNBMFiles() {
+ return (extraNBMFiles = new ZipFileSet());
+ }
+
/** Module manifest needed for versioning.
* @deprecated Use {@link #setModule} instead.
*/
@@ -496,6 +507,8 @@ public class MakeNBM extends Task {
try {
try (JarFile mjar = new JarFile(mfile)) {
if (mjar.getManifest().getMainAttributes().getValue("Bundle-SymbolicName") != null) {
+ englishAttr = new Attributes();
+ englishAttr.putValue("OpenIDE-Module", JarWithModuleAttributes.extractCodeName(mjar.getManifest().getMainAttributes()));
// #181025: treat bundles specially.
return null;
}
@@ -581,25 +594,30 @@ public class MakeNBM extends Task {
overrideLicenseIfNeeded() ;
- moduleAttributes = new ArrayList<> ();
+ Map<String, Supplier<Document>> moduleAttributes = new LinkedHashMap<>();
File module = new File( productDir, moduleName );
Attributes attr = getModuleAttributesForLocale("");
if (attr == null) {
- // #181025: OSGi bundle, copy unmodified.
- Copy copy = new Copy();
- copy.setProject(getProject());
- copy.setOwningTarget(getOwningTarget());
- copy.setFile(module);
- copy.setTofile(new File(nbm.getAbsolutePath().replaceFirst("[.]nbm$", ".jar")));
- copy.execute();
- // XXX possibly sign it
- // XXX could try to run pack200, though not if it was signed
- return;
+ if (!alwaysCreateNBM) {
+ // #181025: OSGi bundle, copy unmodified.
+ Copy copy = new Copy();
+ copy.setProject(getProject());
+ copy.setOwningTarget(getOwningTarget());
+ copy.setFile(module);
+ copy.setTofile(new File(nbm.getAbsolutePath().replaceFirst("[.]nbm$", ".jar")));
+ copy.execute();
+ // XXX possibly sign it
+ // XXX could try to run pack200, though not if it was signed
+ return;
+ } else {
+ moduleAttributes.put("", () -> createFakeOSGiInfo(module));
+ }
+ } else {
+ moduleAttributes.put("", () -> createInfoXml(attr));
}
- moduleAttributes.add(attr);
for (String locale : locales) {
Attributes a = getModuleAttributesForLocale(locale);
- if (a != null) moduleAttributes.add(a);
+ if (a != null) moduleAttributes.put(locale, () -> createInfoXml(a));
}
// Will create a file Info/info.xml to be stored in tmp
@@ -615,10 +633,10 @@ public class MakeNBM extends Task {
}
ArrayList<ZipFileSet> infoXMLFileSets = new ArrayList<>();
- for (Attributes modAttr : moduleAttributes) {
- Document infoXmlContents = createInfoXml(modAttr);
+ for (Map.Entry<String, Supplier<Document>> modAttr : moduleAttributes.entrySet()) {
+ Document infoXmlContents = modAttr.getValue().get();
File infofile;
- String loc = modAttr.getValue("locale");
+ String loc = modAttr.getKey();
if (loc == null)
throw new BuildException("Found attributes without assigned locale code", getLocation());
try {
@@ -643,7 +661,6 @@ public class MakeNBM extends Task {
String codename = englishAttr.getValue("OpenIDE-Module");
if (codename == null)
new BuildException( "Can't get codenamebase" );
-
UpdateTracking tracking = new UpdateTracking(productDir.getAbsolutePath());
Set<String> _files = new LinkedHashSet<>(Arrays.asList(tracking.getListOfNBM(codename)));
List<String> __files = new ArrayList<>(_files);
@@ -731,6 +748,10 @@ public class MakeNBM extends Task {
jar.addFileset(zfs);
}
+ if (extraNBMFiles != null) {
+ jar.addZipfileset(extraNBMFiles);
+ }
+
if (main != null) { // Add the main dir
main.setPrefix("main"); // use main prefix
jar.addZipfileset(main);
@@ -941,14 +962,7 @@ public class MakeNBM extends Task {
} else {
throw new BuildException("NBM distribution URL is not set", getLocation());
}
- // Here we only write a name for the license.
- if (license != null) {
- String name = license.getName();
- if (name == null) {
- throw new BuildException("Every license must have a name or file attribute", getLocation());
- }
- module.setAttribute("license", name);
- }
+ maybeAddLicenseName(module);
module.setAttribute("downloadsize", "0");
if (needsrestart != null) {
module.setAttribute("needsrestart", needsrestart);
@@ -1008,13 +1022,7 @@ public class MakeNBM extends Task {
}
}
module.appendChild(el);
- // Maybe write out license text.
- if (license != null) {
- el = doc.createElement("license");
- el.setAttribute("name", license.getName());
- el.appendChild(license.getTextNode(doc));
- module.appendChild(el);
- }
+ maybeAddLicense(module);
if (updaterJar != null && updaterJar.size() > 0) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -1029,6 +1037,53 @@ public class MakeNBM extends Task {
return doc;
}
+ private Document createFakeOSGiInfo(File osgiJar) {
+ DOMImplementation domimpl;
+ try {
+ domimpl = DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation();
+ } catch (ParserConfigurationException x) {
+ throw new BuildException(x, getLocation());
+ }
+
+ log("Creating fake info.xml for OSGi bundle", Project.MSG_VERBOSE);
+
+ String pub = "-//NetBeans//DTD Autoupdate Module Info 2.5//EN";
+ String sys = "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd";
+ Document doc = domimpl.createDocument(null, "module", domimpl.createDocumentType("module", pub, sys));
+
+ try (JarFile jf = new JarFile(osgiJar)) {
+ MakeUpdateDesc.fakeOSGiInfoXml(jf, osgiJar, doc);
+ maybeAddLicenseName(doc.getDocumentElement());
+ maybeAddLicense(doc.getDocumentElement());
+ } catch (IOException x) {
+ throw new BuildException(x, getLocation());
+ }
+
+ return doc;
+ }
+
+ private void maybeAddLicenseName(Element module) {
+ // Here we only write a name for the license.
+ if (license != null) {
+ String name = license.getName();
+ if (name == null) {
+ throw new BuildException("Every license must have a name or file attribute", getLocation());
+ }
+ module.setAttribute("license", name);
+ }
+ }
+
+ private void maybeAddLicense(Element module) {
+ // Maybe write out license text.
+ if (license != null) {
+ Document doc = module.getOwnerDocument();
+ Element el = doc.createElement("license");
+ el.setAttribute("name", license.getName());
+ el.appendChild(license.getTextNode(doc));
+ module.appendChild(el);
+ }
+ }
+
static void validateAgainstAUDTDs(InputSource input, final Path updaterJar, final Task task) throws IOException, SAXException {
XMLUtil.parse(input, true, false, XMLUtil.rethrowHandler(), new EntityResolver() {
ClassLoader loader = new AntClassLoader(task.getProject(), updaterJar);
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java b/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java
index 8ae5d48..825ffba 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/MakeUpdateDesc.java
@@ -35,6 +35,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
+import java.nio.file.Files;
import java.text.Collator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -111,6 +112,13 @@ public class MakeUpdateDesc extends MatchingTask {
desc = d;
}
+ private File descLicense;
+
+ /** Description file license to use. */
+ public void setDescLicense(File d) {
+ descLicense = d;
+ }
+
/** Module group to create **/
public Group createGroup () {
Group g = new Group ();
@@ -275,6 +283,9 @@ public class MakeUpdateDesc extends MatchingTask {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); //NOI18N
pw.println ("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); //NOI18N
pw.println ();
+ if (descLicense != null) {
+ pw.println(new String(Files.readAllBytes(descLicense.toPath()), "UTF-8"));
+ }
DateFormat format = new SimpleDateFormat("ss/mm/HH/dd/MM/yyyy"); //NOI18N
format.setTimeZone(TimeZone.getTimeZone("GMT")); //NOI18N
String date = format.format(new Date());
@@ -664,7 +675,11 @@ public class MakeUpdateDesc extends MatchingTask {
* @return a {@code <module ...><manifest .../></module>} valid according to
* <a href="http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">DTD</a>
*/
- private Element fakeOSGiInfoXml(JarFile jar, File whereFrom) throws IOException {
+ private static Element fakeOSGiInfoXml(JarFile jar, File whereFrom) throws IOException {
+ return fakeOSGiInfoXml(jar, whereFrom, XMLUtil.createDocument("module"));
+ }
+ //TODO: javadoc
+ public static Element fakeOSGiInfoXml(JarFile jar, File whereFrom, Document doc) throws IOException {
Attributes attr = jar.getManifest().getMainAttributes();
Properties localized = new Properties();
String bundleLocalization = attr.getValue("Bundle-Localization");
@@ -673,10 +688,12 @@ public class MakeUpdateDesc extends MatchingTask {
localized.load(is);
}
}
- return fakeOSGiInfoXml(attr, localized, whereFrom);
+ return fakeOSGiInfoXml(attr, localized, whereFrom, doc);
+ }
+ static Element fakeOSGiInfoXml(Attributes attr, Properties localized, File whereFrom) { //tests
+ return fakeOSGiInfoXml(attr, localized, whereFrom, XMLUtil.createDocument("module"));
}
- static Element fakeOSGiInfoXml(Attributes attr, Properties localized, File whereFrom) {
- Document doc = XMLUtil.createDocument("module");
+ private static Element fakeOSGiInfoXml(Attributes attr, Properties localized, File whereFrom, Document doc) {
Element module = doc.getDocumentElement();
String cnb = JarWithModuleAttributes.extractCodeName(attr);
module.setAttribute("codenamebase", cnb);
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/CreateLicenseSummary.java b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/CreateLicenseSummary.java
index 945a32f..69089c9 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/CreateLicenseSummary.java
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/CreateLicenseSummary.java
@@ -50,6 +50,8 @@ import java.util.zip.ZipFile;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.selectors.SelectorUtils;
import org.netbeans.nbbuild.JUnitReportWriter;
import org.netbeans.nbbuild.extlibs.licenseinfo.Fileset;
@@ -122,6 +124,11 @@ public class CreateLicenseSummary extends Task {
this.binary = binary;
}
+ private FileSet moduleFiles;
+ public FileSet createModuleFiles() {
+ return (moduleFiles = new FileSet());
+ }
+
private Map<String, String> pseudoTests;
public @Override
@@ -289,6 +296,17 @@ public class CreateLicenseSummary extends Task {
List<String> ignoredPatterns = VerifyLibsAndLicenses.loadPatterns("ignored-binary-overlaps");
if (build != null)
findBinaries(build, binaries2LicenseHeaders, crc2License, new HashMap<>(), "", testBinariesAreUnique, ignoredPatterns);
+ if (moduleFiles != null) {
+ for (Resource r : moduleFiles) {
+ try (InputStream is = r.getInputStream()) {
+ long crc = computeCRC32(is);
+ Map<String, String> headers = crc2License.get(crc);
+ if (headers != null) {
+ binaries2LicenseHeaders.put(r.getName(), headers);
+ }
+ }
+ }
+ }
if (binaries2LicenseHeaders.isEmpty())
return ;
pseudoTests.put("testBinariesAreUnique", testBinariesAreUnique.length() > 0 ? "Some binaries are duplicated (edit nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-binary-overlaps as needed)" + testBinariesAreUnique : null);
diff --git a/nbbuild/build.xml b/nbbuild/build.xml
index a1c5a36..07fa60f 100644
--- a/nbbuild/build.xml
+++ b/nbbuild/build.xml
@@ -211,6 +211,7 @@
<subant-junit target="nbm" failonerror="${nbms.fail.on.error}" report="${nb.build.dir}/build-nbms.xml" inheritall="false">
<buildpath path="${modules.sorted}"/>
<property name="base.nbm.target.dir" value="${base.nbm.target.dir}"/>
+ <property name="nbm.always.create" value="true" />
</subant-junit>
</target>
@@ -1894,9 +1895,10 @@ It is possible to use -Ddebug.port=3234 -Ddebug.pause=y to start the system in d
<property name="catalog.notification.url" value=""/>
<property name="catalog.content.description" value=""/>
<property name="catalog.content.description.url" value=""/>
+ <property name="catalog.license.header" value="${nb_all}/nbbuild/catalog-license-header.txt"/>
<!-- <genau config="ausrc/modules.setup" nbmLocation="${nbms.location}" catalog="${catalog.file}" catalogDeploymentLocation="${catalog.base.url}"/>-->
- <makeupdatedesc desc="${catalog.file}" distbase="${catalog.base.url}" automaticgrouping="true" uselicenseurl="${use.license.url.in.catalog}" notificationmessage="${catalog.notification.message}" notificationurl="${catalog.notification.url}" contentdescription="${catalog.content.description}" contentdescriptionurl="${catalog.content.description.url}">
+ <makeupdatedesc desc="${catalog.file}" distbase="${catalog.base.url}" automaticgrouping="true" uselicenseurl="${use.license.url.in.catalog}" notificationmessage="${catalog.notification.message}" notificationurl="${catalog.notification.url}" contentdescription="${catalog.content.description}" contentdescriptionurl="${catalog.content.description.url}" desclicense="${catalog.license.header}">
<fileset dir="${nbms.location}">
<include name="**/*.nbm"/>
<include name="**/*.jar"/>
diff --git a/nbbuild/catalog-license-header.txt b/nbbuild/catalog-license-header.txt
new file mode 100644
index 0000000..a0eb9fb
--- /dev/null
+++ b/nbbuild/catalog-license-header.txt
@@ -0,0 +1,20 @@
+<!--
+
+ 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.
+
+-->
diff --git a/nbbuild/templates/common.xml b/nbbuild/templates/common.xml
index 252dc7f..afe5635 100644
--- a/nbbuild/templates/common.xml
+++ b/nbbuild/templates/common.xml
@@ -427,7 +427,11 @@
<fileset dir="${cluster}" id="module.executable.files" includes="${nbm.executable.files}"/>
</target>
- <target name="nbm" depends="init,netbeans,-nbm-prompt-for-storepass,-init-executables" description="Build NBM archive.">
+ <target name="-init-extra.nbm.files" unless="extra.nbm.files.provided"> <!-- fallback -->
+ <zipfileset dir="${cluster}" id="extra.nbm.files" includes="[NOTHING]"/>
+ </target>
+
+ <target name="nbm" depends="init,netbeans,-nbm-prompt-for-storepass,-init-executables,-init-extra.nbm.files" description="Build NBM archive.">
<mkdir dir="${build.dir}"/>
<property name="nbm.target.cluster" value=""/> <!-- fallback -->
<property name="license.file.override" value="${license.file}"/>
@@ -444,6 +448,7 @@
preferredupdate="${nbm.is.preferredupdate}"
usepack200="${use.pack200}"
pack200excludes="${pack200.excludes}"
+ alwayscreatenbm="${nbm.always.create}"
targetcluster="${nbm.target.cluster}"
releasedate="${nbm.release.date}"
moduleauthor="${nbm.module.author}"
@@ -458,6 +463,7 @@
</pathfileset>
</updaterjar>
<executables refid="module.executable.files"/>
+ <extranbmfiles refid="extra.nbm.files"/>
</makenbm>
</target>
diff --git a/nbbuild/templates/projectized.xml b/nbbuild/templates/projectized.xml
index b112e65..6a17279 100644
--- a/nbbuild/templates/projectized.xml
+++ b/nbbuild/templates/projectized.xml
@@ -409,11 +409,42 @@ If you are sure you want to build with JDK 9+ anyway, use: -Dpermit.jdk9.builds=
</target>
<target name="-create-license.file" depends="init">
- <mkdir dir="${build.dir}"/>
- <property name="license.file.override" location="${build.dir}/license"/>
+ <mkdir dir="${build.dir}/nbm-extras/META-INF"/>
+ <taskdef name="createlicensesummary" classname="org.netbeans.nbbuild.extlibs.CreateLicenseSummary" classpath="${nbantext.jar}"/>
+ <property name="module.name.temp" location="." />
+ <basename property="module.name" file="${module.name.temp}" />
+ <createlicensesummary licenseStub="${nb_all}/LICENSE"
+ noticeStub="${nb_all}/nbbuild/notice-stub.txt"
+ nball="${nb_all}"
+ license="${build.dir}/nbm-extras/META-INF/LICENSE"
+ notice="${build.dir}/notice-temp"
+ binary="true"
+ modules="${module.name}"
+ >
+ <moduleFiles dir="${cluster}">
+ <patternset refid="module.files"/>
+ </moduleFiles>
+ </createlicensesummary>
+
+ <concat destfile="${build.dir}/nbm-extras/META-INF/NOTICE">
+ <fileset file="${build.dir}/notice-temp" />
+ <fileset dir="."
+ includes="notice.txt" />
+ <filterchain>
+ <tokenfilter>
+ <filetokenizer />
+ <replaceregex pattern="(\r?\n)(\r?\n)+"
+ replace="\1\1"
+ flags="g" />
+ </tokenfilter>
+ </filterchain>
+ </concat>
+
+ <copy file="${nb_all}/DISCLAIMER" todir="${build.dir}/nbm-extras/META-INF/" />
+ <property name="license.file.override" location="${build.dir}/nbm-extras/META-INF/LICENSE"/>
<property name="extra.license.files" value=""/>
- <taskdef name="releasefileslicense" classname="org.netbeans.nbbuild.extlibs.ReleaseFilesLicense" classpath="${nbantext.jar}"/>
- <releasefileslicense license="${license.file.override}" standardlicense="${nb_all}/nbbuild/standard-nbm-license.txt" extralicensefiles="${extra.license.files}"/>
+ <zipfileset id="extra.nbm.files" dir="${build.dir}/nbm-extras/" />
+ <property name="extra.nbm.files.provided" value=""/>
</target>
<target name="nbm" depends="-create-dest-dir-nbm,-create-license.file,projectized-common.nbm"/>
--
To stop receiving notification emails like this one, please contact
geertjan@apache.org.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists