blob: 92d8c997fb1d15d969380ab229b0e0e78fe46bbd [file] [log] [blame]
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed 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.
******************************************************************************/
package com.badlogic.gdx.jnigen;
import java.util.ArrayList;
import com.badlogic.gdx.jnigen.BuildTarget.TargetOs;
import com.badlogic.gdx.jnigen.FileDescriptor.FileType;
public class AndroidNdkScriptGenerator {
public void generate (BuildConfig config, BuildTarget target) {
if (target.os != TargetOs.Android) throw new IllegalArgumentException("target os must be Android");
// create all the directories for outputing object files, shared libs and natives jar as well as build scripts.
if (!config.libsDir.exists()) {
if (!config.libsDir.mkdirs())
throw new RuntimeException("Couldn't create directory for shared library files in '" + config.libsDir + "'");
}
if (!config.jniDir.exists()) {
if (!config.jniDir.mkdirs())
throw new RuntimeException("Couldn't create native code directory '" + config.jniDir + "'");
}
ArrayList<FileDescriptor> files = new ArrayList<FileDescriptor>();
int idx = 0;
String[] includes = new String[target.cIncludes.length + target.cppIncludes.length];
for (String include : target.cIncludes)
includes[idx++] = config.jniDir + "/" + include;
for (String include : target.cppIncludes)
includes[idx++] = config.jniDir + "/" + include;
idx = 0;
String[] excludes = new String[target.cExcludes.length + target.cppExcludes.length + 1];
for (String exclude : target.cExcludes)
excludes[idx++] = config.jniDir + "/" + exclude;
for (String exclude : target.cppExcludes)
excludes[idx++] = config.jniDir + "/" + exclude;
excludes[idx] = "**/target/*";
gatherSourceFiles(config.jniDir, includes, excludes, files);
// create Application.mk file
FileDescriptor application = config.jniDir.child("Application.mk");
application.writeString(new FileDescriptor("com/badlogic/gdx/jnigen/resources/scripts/Application.mk.template",
FileType.Classpath).readString(), false);
// create Android.mk file
String template = new FileDescriptor("com/badlogic/gdx/jnigen/resources/scripts/Android.mk.template", FileType.Classpath)
.readString();
StringBuffer srcFiles = new StringBuffer();
for (int i = 0; i < files.size(); i++) {
if (i > 0) srcFiles.append("\t");
srcFiles.append(files.get(i).path().replace('\\', '/').replace(config.jniDir.toString() + "/", ""));
if (i < files.size() - 1)
srcFiles.append("\\\n");
else
srcFiles.append("\n");
}
StringBuffer headerDirs = new StringBuffer();
for (String headerDir : target.headerDirs) {
headerDirs.append(headerDir);
headerDirs.append(" ");
}
template = template.replace("%sharedLibName%", config.sharedLibName);
template = template.replace("%headerDirs%", headerDirs);
template = template.replace("%cFlags%", target.cFlags);
template = template.replace("%cppFlags%", target.cppFlags);
template = template.replace("%linkerFlags%", target.linkerFlags);
template = template.replace("%srcFiles%", srcFiles);
config.jniDir.child("Android.mk").writeString(template, false);
}
private void gatherSourceFiles (FileDescriptor file, String[] includes, String[] excludes, ArrayList<FileDescriptor> files) {
String fileName = file.path().replace('\\', '/');
if (file.isDirectory()) {
if (match(fileName, excludes)) return;
for (FileDescriptor child : file.list()) {
gatherSourceFiles(child, includes, excludes, files);
}
} else {
if (match(fileName, includes) && !match(fileName, excludes)) files.add(file);
}
}
private boolean match (String file, String[] patterns) {
return new AntPathMatcher().match(file, patterns);
}
}