diff --git a/uppsrc/ide/Android/AndroidNDK.cpp b/uppsrc/ide/Android/AndroidNDK.cpp index de4618eaa..b05f81e6d 100644 --- a/uppsrc/ide/Android/AndroidNDK.cpp +++ b/uppsrc/ide/Android/AndroidNDK.cpp @@ -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 toolchains = FindToolchains(); - Sort(toolchains, StdGreater()); + Index toolchains(FindToolchains()); - return toolchains[toolchains.GetCount() - 1]; + int clangIdx = toolchains.Find(TOOLCHAIN_CLANG); + if (clangIdx >= 0) { + return toolchains[clangIdx]; + } + + SortIndex(toolchains, StdGreater()); + return !toolchains.IsEmpty() ? toolchains[toolchains.GetCount()] : ""; } String AndroidNDK::FindDefaultCppRuntime() const { - return "gnustl_shared"; + return "c++_shared"; } Vector AndroidNDK::FindPlatforms() const @@ -74,7 +81,7 @@ Vector 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 ""; diff --git a/uppsrc/ide/Builders/AndroidBuilder.cpp b/uppsrc/ide/Builders/AndroidBuilder.cpp index 5795b85f6..e9babfde6 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidBuilder.cpp @@ -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 extsIdx = Index(Split(exts, ",")); Index excludedFilesIdx = Index(Split(excludedFiles, ",")); - Vector dirs; - dirs.Add(nest); + Vector 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; diff --git a/uppsrc/ide/Builders/AndroidBuilder.h b/uppsrc/ide/Builders/AndroidBuilder.h index f4fa32f3e..5e3e625c5 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.h +++ b/uppsrc/ide/Builders/AndroidBuilder.h @@ -4,9 +4,101 @@ #include "Android.h" #include +#include +#include namespace Upp { +class AndroidBuilder : public Builder { +public: + AndroidSDK sdk; + AndroidNDK ndk; + Jdk jdk; + + bool ndk_blitz; + Vector ndkArchitectures; + String ndkToolchain; + String ndkCppRuntime; + String ndkCppFlags; + String ndkCFlags; + +public: + static Index GetBuildersNames(); + +public: + AndroidBuilder(); + + virtual String GetTargetExt() const override; + virtual bool BuildPackage( + const String& packageName, + Vector& linkfile, + Vector& immfile, + String& linkoptions, + const Vector& all_uses, + const Vector& all_libraries, + int optimize) override; + virtual bool Link( + const Vector& 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& packages); + void DeleteUnusedSourceFiles( + const String& nest, + const Vector& 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; diff --git a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp index de77f996c..4efa9300f 100644 --- a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp @@ -9,8 +9,8 @@ AndroidModuleMakeFileCreator::AndroidModuleMakeFileCreator(const Index& void AndroidModuleMakeFileCreator::AddSources(Vector& 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& 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& 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& libraries) { Vector 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& staticLibraries) { Vector 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& uses) { - for(int i = 0; i < uses.GetCount(); i++) { - makeFile.AddSharedLibrary(uses[i].text); + for(const OptItem& use : uses) { + makeFile.AddSharedLibrary(use.text); } } diff --git a/uppsrc/ide/Builders/Build.cpp b/uppsrc/ide/Builders/Build.cpp index 6f8ff57ed..3c190e68b 100644 --- a/uppsrc/ide/Builders/Build.cpp +++ b/uppsrc/ide/Builders/Build.cpp @@ -1,4 +1,5 @@ #include "Builders.h" +#include "AndroidBuilder.h" #include @@ -135,20 +136,20 @@ One MakeBuild::CreateBuilder(Host *host) b->script = bm.Get("SCRIPT", ""); if(AndroidBuilder::GetBuildersNames().Find(builder) > -1) { AndroidBuilder* ab = dynamic_cast(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") diff --git a/uppsrc/ide/Builders/Builders.h b/uppsrc/ide/Builders/Builders.h index 37d9f67f1..033fec517 100644 --- a/uppsrc/ide/Builders/Builders.h +++ b/uppsrc/ide/Builders/Builders.h @@ -2,8 +2,6 @@ #define BUILDERS_H #include -#include -#include #include #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 ndkArchitectures; - String ndkToolchain; - String ndkCppRuntime; - String ndkCppFlags; - String ndkCFlags; - -public: - static Index GetBuildersNames(); - -public: - AndroidBuilder(); - - virtual String GetTargetExt() const override; - virtual bool BuildPackage( - const String& packageName, - Vector& linkfile, - Vector& immfile, - String& linkoptions, - const Vector& all_uses, - const Vector& all_libraries, - int optimize) override; - virtual bool Link( - const Vector& 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& packages); - void DeleteUnusedSourceFiles( - const String& nest, - const Vector& 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) diff --git a/uppsrc/ide/Builders/Builders.upp b/uppsrc/ide/Builders/Builders.upp index baf16b3a7..6d4535c08 100644 --- a/uppsrc/ide/Builders/Builders.upp +++ b/uppsrc/ide/Builders/Builders.upp @@ -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, diff --git a/uppsrc/ide/Methods.cpp b/uppsrc/ide/Methods.cpp index 39086fac9..89beeab32 100644 --- a/uppsrc/ide/Methods.cpp +++ b/uppsrc/ide/Methods.cpp @@ -1,3 +1,5 @@ +#include + #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); }