Clang and clang standard library is now default for all Android builds, c++14 enable by default for Android and minor improvments in code.

git-svn-id: svn://ultimatepp.org/upp/trunk@10568 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
klugier 2016-12-24 19:04:32 +00:00
parent 12b26fc6aa
commit b8a3ea0c8d
8 changed files with 146 additions and 136 deletions

View file

@ -2,6 +2,8 @@
namespace Upp {
static const String TOOLCHAIN_CLANG = "clang";
String AndroidNDK::GetDownloadUrl()
{
return "https://developer.android.com/ndk/downloads/index.html";
@ -43,15 +45,20 @@ String AndroidNDK::FindDefaultPlatform() const
String AndroidNDK::FindDefaultToolchain() const
{
Vector<String> toolchains = FindToolchains();
Sort(toolchains, StdGreater<String>());
Index<String> toolchains(FindToolchains());
return toolchains[toolchains.GetCount() - 1];
int clangIdx = toolchains.Find(TOOLCHAIN_CLANG);
if (clangIdx >= 0) {
return toolchains[clangIdx];
}
SortIndex(toolchains, StdGreater<String>());
return !toolchains.IsEmpty() ? toolchains[toolchains.GetCount()] : "";
}
String AndroidNDK::FindDefaultCppRuntime() const
{
return "gnustl_shared";
return "c++_shared";
}
Vector<String> AndroidNDK::FindPlatforms() const
@ -74,7 +81,7 @@ Vector<String> AndroidNDK::FindToolchains() const
if(!ff.IsHidden() && ff.IsFolder()) {
String name = ff.GetName();
if(name.StartsWith("llvm")) {
toolchains.Add("clang");
toolchains.Add(TOOLCHAIN_CLANG);
continue;
}
@ -152,7 +159,7 @@ String AndroidNDK::GetCppIncludeDir(const String& cppRuntime) const
}
else
if(cppRuntime.StartsWith("c++")) {
return nest + "llvm-libc++" + DIR_SEPS + "libcxx" + DIR_SEPS + "include";
return nest + "llvm-libc++" + DIR_SEPS + "include";
}
return "";

View file

@ -167,7 +167,7 @@ bool AndroidBuilder::BuildPackage(
compileCmd << (HasFlag("DEBUG") ? " -g" : " -g:none");
compileCmd << " -d "<< project.GetClassesDir();
compileCmd << " -classpath ";
compileCmd << NormalizeExePath(androidSDK.AndroidJarPath()) << Java::GetDelimiter();
compileCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter();
compileCmd << project.GetBuildDir();
compileCmd << " -sourcepath ";
compileCmd << javaSourcesDir << " ";
@ -265,7 +265,7 @@ bool AndroidBuilder::Link(
// Now, we are going to start compiling c/c++ sources
if(DirectoryExists(project.GetJniDir())) {
if(!androidNDK.Validate()) {
if(!ndk.Validate()) {
PutErrorOnConsole("Android NDK was not detected");
return false;
}
@ -277,7 +277,7 @@ bool AndroidBuilder::Link(
GenerateApplicationMakeFile();
GenerateMakeFile();
NDKBuild ndkBuild(androidNDK.GetNdkBuildPath());
NDKBuild ndkBuild(ndk.GetNdkBuildPath());
ndkBuild.SetWorkingDir(project.GetDir());
ndkBuild.SetJobs(GetHydraThreads());
if(Execute(ndkBuild.MakeCmd(), ss) != 0 ) {
@ -291,7 +291,7 @@ bool AndroidBuilder::Link(
PutConsole("-----");
PutConsole("Creating dex file...");
String dxCmd;
dxCmd << NormalizeExePath(androidSDK.DxPath());
dxCmd << NormalizeExePath(sdk.DxPath());
dxCmd << " --dex ";
dxCmd << "--output=" << project.GetBinDir() << DIR_SEPS << "classes.dex ";
dxCmd << project.GetClassesDir();
@ -306,12 +306,12 @@ bool AndroidBuilder::Link(
String unsignedApkPath = GetSandboxDir() + DIR_SEPS + GetFileTitle(target) + ".unsigned.apk";
DeleteFile(unsignedApkPath);
String apkCmd;
apkCmd << NormalizeExePath(androidSDK.AaptPath());
apkCmd << NormalizeExePath(sdk.AaptPath());
apkCmd << " package -v -f";
if(DirectoryExists(project.GetResDir()))
apkCmd << " -S " << project.GetResDir();
apkCmd << " -M " << project.GetManifestPath();
apkCmd << " -I " << NormalizeExePath(androidSDK.AndroidJarPath());
apkCmd << " -I " << NormalizeExePath(sdk.AndroidJarPath());
apkCmd << " -F " << unsignedApkPath;
apkCmd << " " << project.GetBinDir();
// PutConsole(apkCmd);
@ -426,8 +426,7 @@ void AndroidBuilder::DeleteUnusedSourceFiles(
Index<String> extsIdx = Index<String>(Split(exts, ","));
Index<String> excludedFilesIdx = Index<String>(Split(excludedFiles, ","));
Vector<String> dirs;
dirs.Add(nest);
Vector<String> dirs { nest };
for(int i = 0; i < dirs.GetCount(); i++) {
for(FindFile ff(AppendFileName(dirs[i], "*")); ff; ff.Next()) {
if(ff.IsHidden()) {
@ -526,7 +525,7 @@ bool AndroidBuilder::SignApk(const String& target, const String& unsignedApkPath
PutConsole("Aliging apk file...");
DeleteFile(target);
String zipalignCmd;
zipalignCmd << NormalizeExePath(androidSDK.ZipalignPath());
zipalignCmd << NormalizeExePath(sdk.ZipalignPath());
zipalignCmd << " -f 4 ";
zipalignCmd << (HasFlag("DEBUG") ? signedApkPath : unsignedApkPath) << " ";
zipalignCmd << target;
@ -590,7 +589,7 @@ bool AndroidBuilder::AddSharedLibsToApk(const String& apkPath)
ChDir(project.GetDir());
String aaptAddCmd;
aaptAddCmd << NormalizeExePath(androidSDK.AaptPath());
aaptAddCmd << NormalizeExePath(sdk.AaptPath());
aaptAddCmd << " add " << apkPath;
for(int i = 0; i < sharedLibsToAdd.GetCount(); i++)
aaptAddCmd << " " << sharedLibsToAdd[i];
@ -608,15 +607,15 @@ bool AndroidBuilder::AddSharedLibsToApk(const String& apkPath)
bool AndroidBuilder::ValidateBuilderEnviorement()
{
if(!androidSDK.Validate()) {
if(!sdk.Validate()) {
PutErrorOnConsole("Android SDK was not detected");
return false;
}
if(!androidSDK.ValidateBuildTools()) {
if(!sdk.ValidateBuildTools()) {
PutErrorOnConsole("Android SDK build tools was not detected");
return false;
}
if(!androidSDK.ValidatePlatform()) {
if(!sdk.ValidatePlatform()) {
PutErrorOnConsole("Android SDK platform was not detected");
return false;
}
@ -649,7 +648,7 @@ void AndroidBuilder::UpdateFile(const String& path, const String& data)
void AndroidBuilder::GenerateApplicationMakeFile()
{
AndroidApplicationMakeFile makeFile;
makeFile.SetPlatform(androidSDK.GetPlatform());
makeFile.SetPlatform(sdk.GetPlatform());
makeFile.SetArchitectures(ndkArchitectures);
makeFile.SetCppRuntime(ndkCppRuntime);
makeFile.SetCppFlags(ndkCppFlags);
@ -713,12 +712,12 @@ bool AndroidBuilder::GenerateRFile()
if(DirectoryExists(project.GetResDir())) {
StringStream ss;
String aaptCmd;
aaptCmd << NormalizeExePath(androidSDK.AaptPath());
aaptCmd << NormalizeExePath(sdk.AaptPath());
aaptCmd << " package -v -f -m";
aaptCmd << " -S " << project.GetResDir();
aaptCmd << " -J " << project.GetJavaDir();
aaptCmd << " -M " << project.GetManifestPath();
aaptCmd << " -I " << NormalizeExePath(androidSDK.AndroidJarPath());
aaptCmd << " -I " << NormalizeExePath(sdk.AndroidJarPath());
if(Execute(aaptCmd, ss) != 0) {
PutConsole(ss.GetResult());
@ -749,7 +748,7 @@ bool AndroidBuilder::PreprocessJava(const String& package, const String& file, c
compileCmd << NormalizeExePath(jdk.GetJavacPath());
compileCmd << " -d "<< classesDir;
compileCmd << " -classpath ";
compileCmd << NormalizeExePath(androidSDK.AndroidJarPath()) << Java::GetDelimiter();
compileCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter();
compileCmd << project.GetBuildDir();
compileCmd << " -sourcepath " << project.GetJavaDir();
compileCmd << " " << file;
@ -788,7 +787,7 @@ bool AndroidBuilder::PreprocessJava(const String& package, const String& file, c
javahCmd << NormalizeExePath(jdk.GetJavahPath());
javahCmd << " -classpath ";
javahCmd << classesDir << Java::GetDelimiter();
javahCmd << NormalizeExePath(androidSDK.AndroidJarPath()) << Java::GetDelimiter();
javahCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter();
javahCmd << project.GetBuildDir();
javahCmd << " -o " << target;
javahCmd << " " << className;

View file

@ -4,9 +4,101 @@
#include "Android.h"
#include <ide/Core/Core.h>
#include <ide/Android/Android.h>
#include <ide/Java/Java.h>
namespace Upp {
class AndroidBuilder : public Builder {
public:
AndroidSDK sdk;
AndroidNDK ndk;
Jdk jdk;
bool ndk_blitz;
Vector<String> ndkArchitectures;
String ndkToolchain;
String ndkCppRuntime;
String ndkCppFlags;
String ndkCFlags;
public:
static Index<String> GetBuildersNames();
public:
AndroidBuilder();
virtual String GetTargetExt() const override;
virtual bool BuildPackage(
const String& packageName,
Vector<String>& linkfile,
Vector<String>& immfile,
String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int optimize) override;
virtual bool Link(
const Vector<String>& linkfile, const String& linkoptions, bool createmap) override;
virtual bool Preprocess(
const String& package,
const String& file,
const String& target,
bool asmout) override;
virtual void CleanPackage(const String& package, const String& outdir) override;
virtual void AfterClean() override;
protected:
void ManageProjectCohesion();
void DetectAndManageUnusedPackages(const String& nest, const Index<String>& packages);
void DeleteUnusedSourceFiles(
const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles = "");
bool MovePackageFileToAndroidProject(const String& src, const String& dest);
bool RealizePackageJavaSourcesDirectory(const String& packageName);
bool RealizeLinkDirectories() const;
protected:
bool FileNeedsUpdate(const String& path, const String& data);
void UpdateFile(const String& path, const String& data);
void GenerateApplicationMakeFile();
void GenerateMakeFile();
bool GenerateRFile();
protected:
bool ValidateBuilderEnviorement();
void PutErrorOnConsole(const String& msg);
bool SignApk(const String& target, const String& unsignedApkPath);
bool GenerateDebugKey(const String& keystorePath);
bool AddSharedLibsToApk(const String& apkPath);
bool PreprocessJava(const String& package, const String& file, const String& target);
protected:
String GetFilePathInAndroidProject(
const String& nestDir,
const String& packageName,
const String& fileName) const;
String RemoveDirNameFromFileName(String fileName) const;
String NormalizeModuleName(String moduleName) const;
String GetModuleMakeFilePath(const String& packageName);
private:
void InitProject();
String GetSandboxDir() const;
private:
AndroidProject project;
const Workspace& wspc;
private:
static const String RES_PKG_FLAG;
};
class AndroidBuilderUtils final {
public:
AndroidBuilderUtils() = delete;

View file

@ -9,8 +9,8 @@ AndroidModuleMakeFileCreator::AndroidModuleMakeFileCreator(const Index<String>&
void AndroidModuleMakeFileCreator::AddSources(Vector<String>& sources)
{
for(int i = 0; i < sources.GetCount(); ++i) {
makeFile.AddSourceFile(sources[i]);
for(const String& source : sources) {
makeFile.AddSourceFile(source);
}
}
@ -43,38 +43,38 @@ void AndroidModuleMakeFileCreator::AddIncludeWithSubdirs(const String& path)
void AndroidModuleMakeFileCreator::AddIncludes(const Array<OptItem>& uses)
{
for(int i = 0; i < uses.GetCount(); ++i) {
makeFile.AddInclude(AndroidBuilderUtils::GetAssemblyDir(uses[i].text));
for(const OptItem& use : uses) {
makeFile.AddInclude(AndroidBuilderUtils::GetAssemblyDir(use.text));
}
}
void AndroidModuleMakeFileCreator::AddFlags(const Array<OptItem>& flags)
{
for(int i = 0; i < flags.GetCount(); ++i) {
makeFile.AddCppFlag(flags[i].text);
for(const OptItem& flag : flags) {
makeFile.AddCppFlag(flag.text);
}
}
void AndroidModuleMakeFileCreator::AddLdLibraries(const Array<OptItem>& libraries)
{
Vector<String> libs = Split(Gather(libraries, config.GetKeys()), ' ');
for(int i = 0; i < libs.GetCount(); ++i) {
makeFile.AddLdLibrary(libs[i]);
for(const String& lib : libs) {
makeFile.AddLdLibrary(lib);
}
}
void AndroidModuleMakeFileCreator::AddStaticModuleLibrary(Array<OptItem>& staticLibraries)
{
Vector<String> slibs = Split(Gather(staticLibraries, config.GetKeys()), ' ');
for(int i = 0; i < slibs.GetCount(); ++i) {
makeFile.AddStaticModuleLibrary(slibs[i]);
for(const String& slib : slibs) {
makeFile.AddStaticModuleLibrary(slib);
}
}
void AndroidModuleMakeFileCreator::AddSharedLibraries(const Array<OptItem>& uses)
{
for(int i = 0; i < uses.GetCount(); i++) {
makeFile.AddSharedLibrary(uses[i].text);
for(const OptItem& use : uses) {
makeFile.AddSharedLibrary(use.text);
}
}

View file

@ -1,4 +1,5 @@
#include "Builders.h"
#include "AndroidBuilder.h"
#include <plugin/bz2/bz2.h>
@ -135,20 +136,20 @@ One<Builder> MakeBuild::CreateBuilder(Host *host)
b->script = bm.Get("SCRIPT", "");
if(AndroidBuilder::GetBuildersNames().Find(builder) > -1) {
AndroidBuilder* ab = dynamic_cast<AndroidBuilder*>(b);
ab->androidSDK.SetPath((bm.Get("SDK_PATH", "")));
ab->androidNDK.SetPath((bm.Get("NDK_PATH", "")));
ab->sdk.SetPath((bm.Get("SDK_PATH", "")));
ab->ndk.SetPath((bm.Get("NDK_PATH", "")));
ab->jdk.SetPath((bm.Get("JDK_PATH", "")));
String platformVersion = bm.Get("SDK_PLATFORM_VERSION", "");
if(!platformVersion.IsEmpty())
ab->androidSDK.SetPlatform(platformVersion);
ab->sdk.SetPlatform(platformVersion);
else
ab->androidSDK.DeducePlatform();
ab->sdk.DeducePlatform();
String buildToolsRelease = bm.Get("SDK_BUILD_TOOLS_RELEASE", "");
if(!buildToolsRelease.IsEmpty())
ab->androidSDK.SetBuildToolsRelease(buildToolsRelease);
ab->sdk.SetBuildToolsRelease(buildToolsRelease);
else
ab->androidSDK.DeduceBuildToolsRelease();
ab->sdk.DeduceBuildToolsRelease();
ab->ndk_blitz = bm.Get("NDK_BLITZ", "") == "1";
if(bm.Get("NDK_ARCH_ARMEABI", "") == "1")

View file

@ -2,8 +2,6 @@
#define BUILDERS_H
#include <ide/Core/Core.h>
#include <ide/Android/Android.h>
#include <ide/Java/Java.h>
#include <plugin/bz2/bz2.h>
#include "Android.h"
@ -159,96 +157,6 @@ private:
bool script_error;
};
class AndroidBuilder : public Builder {
public:
AndroidSDK androidSDK;
AndroidNDK androidNDK;
Jdk jdk;
bool ndk_blitz;
Vector<String> ndkArchitectures;
String ndkToolchain;
String ndkCppRuntime;
String ndkCppFlags;
String ndkCFlags;
public:
static Index<String> GetBuildersNames();
public:
AndroidBuilder();
virtual String GetTargetExt() const override;
virtual bool BuildPackage(
const String& packageName,
Vector<String>& linkfile,
Vector<String>& immfile,
String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int optimize) override;
virtual bool Link(
const Vector<String>& linkfile, const String& linkoptions, bool createmap) override;
virtual bool Preprocess(
const String& package,
const String& file,
const String& target,
bool asmout) override;
virtual void CleanPackage(const String& package, const String& outdir) override;
virtual void AfterClean() override;
protected:
void ManageProjectCohesion();
void DetectAndManageUnusedPackages(const String& nest, const Index<String>& packages);
void DeleteUnusedSourceFiles(
const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles = "");
bool MovePackageFileToAndroidProject(const String& src, const String& dest);
bool RealizePackageJavaSourcesDirectory(const String& packageName);
bool RealizeLinkDirectories() const;
protected:
bool FileNeedsUpdate(const String& path, const String& data);
void UpdateFile(const String& path, const String& data);
void GenerateApplicationMakeFile();
void GenerateMakeFile();
bool GenerateRFile();
protected:
bool ValidateBuilderEnviorement();
void PutErrorOnConsole(const String& msg);
bool SignApk(const String& target, const String& unsignedApkPath);
bool GenerateDebugKey(const String& keystorePath);
bool AddSharedLibsToApk(const String& apkPath);
bool PreprocessJava(const String& package, const String& file, const String& target);
protected:
String GetFilePathInAndroidProject(
const String& nestDir,
const String& packageName,
const String& fileName) const;
String RemoveDirNameFromFileName(String fileName) const;
String NormalizeModuleName(String moduleName) const;
String GetModuleMakeFilePath(const String& packageName);
private:
void InitProject();
String GetSandboxDir() const;
private:
AndroidProject project;
const Workspace& wspc;
private:
static const String RES_PKG_FLAG;
};
void DeletePCHFile(const String& pch_file);
INITIALIZE(GccBuilder)

View file

@ -17,7 +17,6 @@ file
GccBuilder.cpp,
MscBuilder.cpp,
JavaBuilder.cpp,
AndroidBuilder.cpp,
ScriptBuilder.cpp,
Android readonly separator,
Android.h,
@ -27,6 +26,7 @@ file
AndroidModuleMakeFile.cpp,
"Android Builder" readonly separator,
AndroidBuilder.h,
AndroidBuilder.cpp,
AndroidBuilderUtils.cpp,
AndroidModuleMakeFileBuilder.cpp,
Components readonly separator,

View file

@ -1,3 +1,5 @@
#include <ide/Builders/AndroidBuilder.h>
#include "Methods.h"
void DirTable::SetData(const Value& data)
@ -256,7 +258,7 @@ void AndroidBuilderSetup::OnNdkPathChange0(const String& ndkPath)
ndk_arch_armeabi.Set(1);
ndk_arch_armeabi_v7a.Set(1);
ndk_arch_arm64_v8a.Set(1);
ndk_common_cpp_options.SetData("-std=c++14 -fexceptions -frtti");
ndk_common_cpp_options.SetData("-std=c++14 -fexceptions -frtti -Wno-logical-op-parentheses");
}
else
ClearNdkCtrls();
@ -889,6 +891,7 @@ String Ide::GetIncludePath()
MergeWith(include, ";", ndk.GetIncludeDir());
String cppIncludeDir = ndk.GetCppIncludeDir(bm.Get("NDK_CPP_RUNTIME", ""));
Cout() << cppIncludeDir << "\n";
if(!cppIncludeDir.IsEmpty())
MergeWith(include, ";", cppIncludeDir);
}