This is an automated email from the ASF dual-hosted git repository. damjan pushed a commit to branch scons-build in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 2fff3eb090a1ba53200bce9af32cd04f61bb8702 Author: Damjan Jovanovic <dam...@apache.org> AuthorDate: Sat Jul 4 11:04:57 2020 +0200 Add initial half-working SCons conversion for Ant targets. Patch by: me --- .../openoffice/gotoSCons/SConsConverter.java | 9 ++ .../openoffice/gotoSCons/targets/AntTarget.java | 95 ++++++++++++++++++++++ .../openoffice/gotoSCons/targets/Module.java | 10 +++ main/site_scons/Ant.py | 79 ++++++++++++++++++ main/site_scons/site_init.py | 1 + 5 files changed, 194 insertions(+) diff --git a/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/SConsConverter.java b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/SConsConverter.java index e181fd7..ddc0e3a 100644 --- a/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/SConsConverter.java +++ b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/SConsConverter.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.apache.openoffice.gotoSCons.targets.AllLangResTarget; +import org.apache.openoffice.gotoSCons.targets.AntTarget; import org.apache.openoffice.gotoSCons.targets.BaseBinary; import org.apache.openoffice.gotoSCons.targets.Executable; import org.apache.openoffice.gotoSCons.targets.GoogleTest; @@ -61,6 +62,10 @@ public class SConsConverter { convertExecutable(exe); } + for (AntTarget antTarget : module.getAntTargets().values()) { + convertAntTarget(antTarget); + } + for (AllLangResTarget allLangResTarget : module.getAllLangResTargets().values()) { convertAllLangResTarget(allLangResTarget); } @@ -177,6 +182,10 @@ public class SConsConverter { out.println(); } + private void convertAntTarget(AntTarget antTarget) throws Exception { + + } + private void convertGoogleTest(GoogleTest gtest) throws Exception { String objectsVariable = convertObjects(gtest); diff --git a/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/AntTarget.java b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/AntTarget.java new file mode 100644 index 0000000..29d0e44 --- /dev/null +++ b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/AntTarget.java @@ -0,0 +1,95 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.apache.openoffice.gotoSCons.targets; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import org.apache.openoffice.gotoSCons.GBuildParser; +import org.apache.openoffice.gotoSCons.raw.ListNode; +import org.apache.openoffice.gotoSCons.raw.Node; +import org.apache.openoffice.gotoSCons.raw.ValueNode; + +/** + * + * @author dj + */ +public class AntTarget extends BaseTarget { + private File filename; + private String name; + private String pathToBuildXml; + private String componentPath; + private String layer; + + public AntTarget(File filename) throws Exception { + this.filename = filename; + try ( + BufferedReader reader = new BufferedReader(new InputStreamReader( + new FileInputStream(filename))) + ) { + ListNode rootNode = new GBuildParser().parse(reader); + parse(rootNode); + } + } + + @Override + protected void parseCall(Node argsNode) throws Exception { + if (argsNode instanceof ValueNode) { + String value = ((ValueNode)argsNode).value; + String[] tokens = value.split(","); + + String function = tokens[0].trim(); + String[] args = Arrays.copyOfRange(tokens, 1, tokens.length); + + if (function.equals("gb_Ant_Ant")) { + parseAntAnt(args); + } else if (function.equals("gb_Ant_set_componentfile")) { + parseAntSetComponentfile(args); + } else { + throw new Exception("UNHANDLED FUNCTION " + function); + } + } else { + throw new Exception("Call args not a value"); + } + } + + private void parseAntAnt(String[] args) throws Exception { + if (args.length != 2) { + throw new Exception("Expected 2 args, got " + Arrays.toString(args)); + } + this.name = args[0]; + this.pathToBuildXml = args[1]; + } + + private void parseAntSetComponentfile(String[] args) throws Exception { + if (args.length != 3) { + throw new Exception("Expected 3 args, got " + Arrays.toString(args)); + } + if (!args[0].equals(name)) { + throw new Exception("Target name isn't " + name); + } + this.componentPath = args[1]; + this.layer = args[2]; + } + + public String getName() { + return name; + } + + public String getPathToBuildXml() { + return pathToBuildXml; + } + + public String getComponentPath() { + return componentPath; + } + + public String getLayer() { + return layer; + } +} diff --git a/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/Module.java b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/Module.java index 85ed77f..47a0f31 100644 --- a/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/Module.java +++ b/gotoSCons/src/main/java/org/apache/openoffice/gotoSCons/targets/Module.java @@ -42,6 +42,7 @@ public class Module extends BaseTarget { private Map<String, Library> libraries = new TreeMap<>(); private Map<String, Executable> executables = new TreeMap<>(); private Map<String, StaticLibrary> staticLibraries = new TreeMap<>(); + private Map<String, AntTarget> antTargets = new TreeMap<>(); private TreeSet<String> targets = new TreeSet<>(); private Map<String, Pkg> packages = new TreeMap<>(); private Map<String, JunitTest> junitTests = new TreeMap<>(); @@ -122,6 +123,11 @@ public class Module extends BaseTarget { if (staticLibraries.put(arg, staticLibrary) != null) { throw new Exception("Duplicate add of target " + arg); } + } else if (arg.startsWith("Ant_")) { + AntTarget antTarget = new AntTarget(makefile); + if (antTargets.put(arg, antTarget) != null) { + throw new Exception("Duplicate add of target " + arg); + } } else if (arg.startsWith("Package_")) { Pkg pkg = new Pkg(makefile); if (packages.put(arg, pkg) != null) { @@ -202,6 +208,10 @@ public class Module extends BaseTarget { public Map<String, Executable> getExecutables() { return executables; } + + public Map<String, AntTarget> getAntTargets() { + return antTargets; + } public Map<String, Pkg> getPackages() { return packages; diff --git a/main/site_scons/Ant.py b/main/site_scons/Ant.py new file mode 100644 index 0000000..5c2234c --- /dev/null +++ b/main/site_scons/Ant.py @@ -0,0 +1,79 @@ +#************************************************************** +# +# 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. +# +#************************************************************** + +from SCons.Script import * +from config import soenv +from globals import * +import os +import subprocess + +class AOOAnt: + def __init__(self, name, pathToBuildXml): + self.env = DefaultEnvironment().Clone() + self.env.Append(ENV=os.environ) + self.env['AOO_ANT'] = soenv['ANT'] + + self.buildXml = File(pathToBuildXml) + + outputDir = Dir('Ant/' + name) + depFile = File('deps', outputDir) + targetName = Dir(name + '.jar', outputDir) + + if self.env.GetOption('clean'): + # We cannot register a custom clean target with scons, + # so do Ant's cleaning in the preparation phase of the build. + cleanProcess = subprocess.run( + args = ' '.join([ + soenv['ANT'], + '-f', + self.buildXml.srcnode().abspath, + 'clean']), + shell = True, + env = self.env['ENV'] + ) + if cleanProcess.returncode != 0: + raise Exception('ant clean failed with exit code ' + cleanProcess.returncode) + else: + # Ant might require dependencies from other modules, + # which we need to know to establish build order. + depsProcess = subprocess.run( + args = ' '.join([ + soenv['ANT'], + '-Ddependencies.outfile=' + depFile.abspath, + '-f', + self.buildXml.srcnode().abspath, + 'dependencies' + ]), + shell = True, + env = self.env['ENV'] + ) + if depsProcess.returncode == 0: + with open(depFile.abspath, 'rt') as f: + for dep in f.readline().split(): + Depends(targetName, depFile) + else: + raise Exception('ant failed with exit code ' + depsProcess.returncode) + + self.target = self.env.Command(targetName, self.buildXml.srcnode(), + '${AOO_ANT} -f ${SOURCE}') + # Ant will depend on its internally known .java etc. + # so we must always run it + AlwaysBuild(self.target) diff --git a/main/site_scons/site_init.py b/main/site_scons/site_init.py index b9bfd73..e238aca 100644 --- a/main/site_scons/site_init.py +++ b/main/site_scons/site_init.py @@ -63,6 +63,7 @@ else: from sharedLibrary import AOOSharedLibrary from sharedObjects import AOOSharedObjects +from Ant import * from AllLangRes import * from JunitTest import * from GoogleTest import *