From c497ac7e5951c2f01c1dc21c4db9829a2bd1b44b Mon Sep 17 00:00:00 2001 From: klugier Date: Sun, 1 Jan 2017 18:59:11 +0000 Subject: [PATCH] Fix android builder windows issues, android builder now can be used with never versions of JDK. git-svn-id: svn://ultimatepp.org/upp/trunk@10617 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ide/Android/Adb.cpp | 9 +- uppsrc/ide/Android/AndroidNDK.cpp | 4 +- uppsrc/ide/Android/Executables.h | 6 +- uppsrc/ide/Builders/Android.h | 10 +- uppsrc/ide/Builders/AndroidBuilder.cpp | 135 +++++++++--------- uppsrc/ide/Builders/AndroidBuilder.h | 29 +++- .../ide/Builders/AndroidBuilderCommands.cpp | 43 ++++++ uppsrc/ide/Builders/AndroidProject.cpp | 23 +-- uppsrc/ide/Builders/Build.cpp | 2 +- uppsrc/ide/Builders/Builders.upp | 1 + uppsrc/ide/Java/Java.h | 67 ++++++--- uppsrc/ide/Java/Java.upp | 1 + uppsrc/ide/Java/Jdk.cpp | 59 ++++++-- 13 files changed, 248 insertions(+), 141 deletions(-) create mode 100644 uppsrc/ide/Builders/AndroidBuilderCommands.cpp diff --git a/uppsrc/ide/Android/Adb.cpp b/uppsrc/ide/Android/Adb.cpp index bc7dc91cf..ab81c737a 100644 --- a/uppsrc/ide/Android/Adb.cpp +++ b/uppsrc/ide/Android/Adb.cpp @@ -2,14 +2,9 @@ namespace Upp { -Adb::Adb(const String& path) : path(path) +Adb::Adb(const String& path) + : path(path) { - -} - -Adb::~Adb() -{ - } int Adb::GetPid(const String& packageName) const diff --git a/uppsrc/ide/Android/AndroidNDK.cpp b/uppsrc/ide/Android/AndroidNDK.cpp index 5ce453776..068829fbd 100644 --- a/uppsrc/ide/Android/AndroidNDK.cpp +++ b/uppsrc/ide/Android/AndroidNDK.cpp @@ -140,7 +140,7 @@ String AndroidNDK::GetCppIncludeDir(const String& cppRuntime) const // TODO: implement selection of library version String versionsDir = nest + "gnu-libstdc++"; - FindFile ff(nest + "gnu-libstdc++/*.*"); + FindFile ff(nest + "gnu-libstdc++" + DIR_SEPS + "*.*"); String inc; double ver = 0; while(ff) { @@ -153,7 +153,7 @@ String AndroidNDK::GetCppIncludeDir(const String& cppRuntime) const } ff.Next(); } - return inc + '/' + "include"; + return inc + DIR_SEPS + "include"; } else if(cppRuntime.StartsWith("c++")) { diff --git a/uppsrc/ide/Android/Executables.h b/uppsrc/ide/Android/Executables.h index 119587b87..b1ca7e489 100644 --- a/uppsrc/ide/Android/Executables.h +++ b/uppsrc/ide/Android/Executables.h @@ -12,11 +12,11 @@ class LogCat; class Adb : public Moveable { public: Adb(const String& path); - virtual ~Adb(); + virtual ~Adb() {} public: - String GetPath() const { return this->path; } - String GetSerial() const { return this->serial; } + String GetPath() const { return this->path; } + String GetSerial() const { return this->serial; } void SetPath(const String& path) { this->path = path; } void SetSerial(const String& serial) { this->serial = serial; } diff --git a/uppsrc/ide/Builders/Android.h b/uppsrc/ide/Builders/Android.h index 3e3ae9d9a..fda258454 100644 --- a/uppsrc/ide/Builders/Android.h +++ b/uppsrc/ide/Builders/Android.h @@ -8,8 +8,8 @@ namespace Upp { class AndroidProject { public: AndroidProject(); - AndroidProject(const String& dir); - virtual ~AndroidProject(); + AndroidProject(const String& dir, bool debug); + virtual ~AndroidProject() {} String GetDir() const; String GetJavaDir() const; @@ -28,12 +28,12 @@ public: String GetJniMakeFilePath() const; String GetJniApplicationMakeFilePath() const; - void SetDir(const String& dir); - - bool HasDir() const; + bool IsDebug() const; + bool IsRelease() const; private: String dir; + bool debug; }; class AndroidApplicationMakeFile { diff --git a/uppsrc/ide/Builders/AndroidBuilder.cpp b/uppsrc/ide/Builders/AndroidBuilder.cpp index e9babfde6..a2704f2e0 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidBuilder.cpp @@ -12,11 +12,16 @@ Index AndroidBuilder::GetBuildersNames() return builders; } -AndroidBuilder::AndroidBuilder() : - wspc(GetIdeWorkspace()) +AndroidBuilder::AndroidBuilder() + : wspc(GetIdeWorkspace()) { } +void AndroidBuilder::SetJdk(One jdk) +{ + this->jdk = pick(jdk); +} + String AndroidBuilder::GetTargetExt() const { return ".apk"; @@ -59,8 +64,8 @@ bool AndroidBuilder::BuildPackage( bool isBlitz = HasFlag("BLITZ") && ndk_blitz; - String javaSourcesDir = project.GetJavaDir(); - String jniSourcesDir = project.GetJniDir(); + String javaSourcesDir = project->GetJavaDir(); + String jniSourcesDir = project->GetJniDir(); String pkgJavaSourcesDir = javaSourcesDir + DIR_SEPS + package; String pkgJniSourcesDir = jniSourcesDir + DIR_SEPS + package; for(int i = 0; i < pkg.GetCount(); i++) { @@ -80,7 +85,7 @@ bool AndroidBuilder::BuildPackage( if(isResourcesPackage) { if(packageFileDir.Find(package + DIR_SEPS) != -1) packageFileDir.Remove(0, String(package + DIR_SEPS).GetCount()); - String filePathInAndroidProject = GetFilePathInAndroidProject(project.GetResDir(), + String filePathInAndroidProject = GetFilePathInAndroidProject(project->GetResDir(), packageFileDir, fileName); @@ -130,7 +135,7 @@ bool AndroidBuilder::BuildPackage( return false; } - if(!FileCopy(filePath, project.GetManifestPath())) + if(!FileCopy(filePath, project->GetManifestPath())) return false; androidManifestPath = filePath; @@ -159,25 +164,10 @@ bool AndroidBuilder::BuildPackage( "@blitz.cpp"); if(!isResourcesPackage && !error && !javaSourceFiles.IsEmpty()) { - if(!RealizeDirectory(project.GetClassesDir())) + if(!RealizeDirectory(project->GetClassesDir())) return false; - - String compileCmd; - compileCmd << NormalizeExePath(jdk.GetJavacPath()); - compileCmd << (HasFlag("DEBUG") ? " -g" : " -g:none"); - compileCmd << " -d "<< project.GetClassesDir(); - compileCmd << " -classpath "; - compileCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter(); - compileCmd << project.GetBuildDir(); - compileCmd << " -sourcepath "; - compileCmd << javaSourcesDir << " "; - for(int i = 0; i < javaSourceFiles.GetCount(); i++) { - compileCmd << javaSourceFiles[i]; - if(i < javaSourceFiles.GetCount() - 1) - compileCmd << " "; - } - - linkfile.Add(compileCmd); + + linkfile.Add(commands->PreperCompileJavaSourcesCommand(javaSourceFiles)); } if(!isResourcesPackage && !error && !nativeSourceFiles.IsEmpty()) { @@ -199,7 +189,7 @@ bool AndroidBuilder::BuildPackage( if(FileExists(blitz.path)) { String blitzDestinationFile; - blitzDestinationFile << project.GetJniDir() << DIR_SEPS; + blitzDestinationFile << project->GetJniDir() << DIR_SEPS; blitzDestinationFile << blitzDestinationFileInPackage; CopyFile(blitzDestinationFile, blitz.path); @@ -264,7 +254,7 @@ bool AndroidBuilder::Link( } // Now, we are going to start compiling c/c++ sources - if(DirectoryExists(project.GetJniDir())) { + if(DirectoryExists(project->GetJniDir())) { if(!ndk.Validate()) { PutErrorOnConsole("Android NDK was not detected"); return false; @@ -278,7 +268,7 @@ bool AndroidBuilder::Link( GenerateMakeFile(); NDKBuild ndkBuild(ndk.GetNdkBuildPath()); - ndkBuild.SetWorkingDir(project.GetDir()); + ndkBuild.SetWorkingDir(project->GetDir()); ndkBuild.SetJobs(GetHydraThreads()); if(Execute(ndkBuild.MakeCmd(), ss) != 0 ) { PutConsole(ss.GetResult()); @@ -287,14 +277,14 @@ bool AndroidBuilder::Link( PutConsole("Native sources compiled in " + GetPrintTime(time) + "."); } - if(DirectoryExists(project.GetClassesDir())) { + if(DirectoryExists(project->GetClassesDir())) { PutConsole("-----"); PutConsole("Creating dex file..."); String dxCmd; dxCmd << NormalizeExePath(sdk.DxPath()); dxCmd << " --dex "; - dxCmd << "--output=" << project.GetBinDir() << DIR_SEPS << "classes.dex "; - dxCmd << project.GetClassesDir(); + dxCmd << "--output=" << project->GetBinDir() << DIR_SEPS << "classes.dex "; + dxCmd << project->GetClassesDir(); // PutConsole(dxCmd); if(Execute(dxCmd, ss) != 0) { PutConsole(ss.GetResult()); @@ -308,19 +298,19 @@ bool AndroidBuilder::Link( String apkCmd; apkCmd << NormalizeExePath(sdk.AaptPath()); apkCmd << " package -v -f"; - if(DirectoryExists(project.GetResDir())) - apkCmd << " -S " << project.GetResDir(); - apkCmd << " -M " << project.GetManifestPath(); + if(DirectoryExists(project->GetResDir())) + apkCmd << " -S " << project->GetResDir(); + apkCmd << " -M " << project->GetManifestPath(); apkCmd << " -I " << NormalizeExePath(sdk.AndroidJarPath()); apkCmd << " -F " << unsignedApkPath; - apkCmd << " " << project.GetBinDir(); + apkCmd << " " << project->GetBinDir(); // PutConsole(apkCmd); if(Execute(apkCmd, ss) != 0) { PutConsole(ss.GetResult()); return false; } - if(DirectoryExists(project.GetLibsDir())) { + if(DirectoryExists(project->GetLibsDir())) { PutConsole("Adding native libraries to apk..."); if(!AddSharedLibsToApk(unsignedApkPath)) return false; @@ -354,19 +344,19 @@ void AndroidBuilder::CleanPackage(const String& package, const String& outdir) Vector pkgDirs; Vector pkgFiles; if(HasFlag(RES_PKG_FLAG)) - pkgDirs.Add(project.GetResDir()); + pkgDirs.Add(project->GetResDir()); else { // TODO: handle deletetion of (.class)es - pkgDirs.Add(project.GetJavaDir(package)); - PutConsole(project.GetJavaDir(package)); - pkgDirs.Add(project.GetJniDir(package)); - for(FindFile ff(AppendFileName(project.GetObjLocalDir(), "*")); ff; ff.Next()) { + pkgDirs.Add(project->GetJavaDir(package)); + PutConsole(project->GetJavaDir(package)); + pkgDirs.Add(project->GetJniDir(package)); + for(FindFile ff(AppendFileName(project->GetObjLocalDir(), "*")); ff; ff.Next()) { if(!ff.IsHidden() && !ff.IsSymLink() && ff.IsFolder()) { pkgFiles.Add(ff.GetPath() + DIR_SEPS + "lib" + package + ".so"); pkgDirs.Add(ff.GetPath() + DIR_SEPS + "objs" + DIR_SEPS + package); } } - for(FindFile ff(AppendFileName(project.GetLibsDir(), "*")); ff; ff.Next()) + for(FindFile ff(AppendFileName(project->GetLibsDir(), "*")); ff; ff.Next()) if(!ff.IsHidden() && !ff.IsSymLink() && ff.IsFolder()) pkgFiles.Add(ff.GetPath() + DIR_SEPS + "lib" + package + ".so"); } @@ -398,8 +388,8 @@ void AndroidBuilder::ManageProjectCohesion() for(int i = 0; i < wspc.GetCount(); i++) packages.Add(wspc[i]); - DetectAndManageUnusedPackages(project.GetJavaDir(), packages); - DetectAndManageUnusedPackages(project.GetJniDir(), packages); + DetectAndManageUnusedPackages(project->GetJavaDir(), packages); + DetectAndManageUnusedPackages(project->GetJniDir(), packages); } void AndroidBuilder::DetectAndManageUnusedPackages( @@ -474,14 +464,14 @@ bool AndroidBuilder::MovePackageFileToAndroidProject(const String& src, const St bool AndroidBuilder::RealizePackageJavaSourcesDirectory(const String& packageName) { - String dir = project.GetJavaDir() + DIR_SEPS + packageName; + String dir = project->GetJavaDir() + DIR_SEPS + packageName; return DirectoryExists(dir) || RealizeDirectory(dir); } bool AndroidBuilder::RealizeLinkDirectories() const { - if(!RealizeDirectory(project.GetBinDir())) + if(!RealizeDirectory(project->GetBinDir())) return false; return true; @@ -500,7 +490,7 @@ bool AndroidBuilder::SignApk(const String& target, const String& unsignedApkPath PutConsole("Signing apk file..."); DeleteFile(signedApkPath); String jarsignerCmd; - jarsignerCmd << NormalizeExePath(jdk.GetJarsignerPath()); + jarsignerCmd << NormalizeExePath(jdk->GetJarsignerPath()); // Up to Java 6.0 below alogirms was by default // (In Java 7.0 and above we need to manually specific this algorithms) @@ -547,7 +537,7 @@ bool AndroidBuilder::GenerateDebugKey(const String& keystorePath) PutConsole("Generating debug key..."); String keytoolCmd; - keytoolCmd << NormalizeExePath(jdk.GetKeytoolPath()); + keytoolCmd << NormalizeExePath(jdk->GetKeytoolPath()); keytoolCmd << " -genkeypair -alias androiddebugkey -keypass android"; keytoolCmd << " -keystore " << keystorePath; keytoolCmd << " -storepass android -dname \"CN=Android Debug,O=Android,C=US\""; @@ -566,10 +556,10 @@ bool AndroidBuilder::AddSharedLibsToApk(const String& apkPath) { // TODO: A little bit workearound (I know one thing that shared libs should be in "lib" directory not in "libs") // So, we need to create temporary lib directory with .so files :( - const String libDir = project.GetDir() + DIR_SEPS + "lib"; + const String libDir = project->GetDir() + DIR_SEPS + "lib"; Vector sharedLibsToAdd; - for(FindFile ff(AppendFileName(project.GetLibsDir(), "*")); ff; ff.Next()) { + for(FindFile ff(AppendFileName(project->GetLibsDir(), "*")); ff; ff.Next()) { if (!ff.IsHidden () && !ff.IsSymLink () && ff.IsDirectory()) { for(FindFile ffa(AppendFileName (ff.GetPath(), "*")); ffa; ffa.Next ()) { if(!ffa.IsHidden() && !ffa.IsSymLink() && !ffa.IsDirectory()) { @@ -577,7 +567,7 @@ bool AndroidBuilder::AddSharedLibsToApk(const String& apkPath) String fileExt = ToLower(GetFileExt(ffa.GetPath())); if(fileExt == ".so") { const String libPath = String("lib") + DIR_SEPS + ff.GetName() + DIR_SEPS + ffa.GetName(); - const String destPath = project.GetDir() + DIR_SEPS + libPath; + const String destPath = project->GetDir() + DIR_SEPS + libPath; if(!RealizePath(destPath) || !FileCopy(ffa.GetPath(), destPath)) return false; sharedLibsToAdd.Add(libPath); @@ -587,7 +577,7 @@ bool AndroidBuilder::AddSharedLibsToApk(const String& apkPath) } } - ChDir(project.GetDir()); + ChDir(project->GetDir()); String aaptAddCmd; aaptAddCmd << NormalizeExePath(sdk.AaptPath()); aaptAddCmd << " add " << apkPath; @@ -619,7 +609,7 @@ bool AndroidBuilder::ValidateBuilderEnviorement() PutErrorOnConsole("Android SDK platform was not detected"); return false; } - if(!jdk.Validate()) { + if(!jdk->Validate()) { PutErrorOnConsole("JDK was not detected"); return false; } @@ -662,13 +652,13 @@ void AndroidBuilder::GenerateApplicationMakeFile() PutVerbose("CFlags: " + ndkCFlags); PutVerbose("Toolchain: " + ndkToolchain); - UpdateFile(project.GetJniApplicationMakeFilePath(), makeFile.ToString()); + UpdateFile(project->GetJniApplicationMakeFilePath(), makeFile.ToString()); } void AndroidBuilder::GenerateMakeFile() { const String makeFileName = "Android.mk"; - const String baseDir = project.GetJniDir(); + const String baseDir = project->GetJniDir(); Vector modules; BiVector dirs; @@ -700,23 +690,23 @@ void AndroidBuilder::GenerateMakeFile() AndroidMakeFile makeFile; makeFile.AddHeader(); - for(int i = 0; i < modules.GetCount(); i++) - makeFile.AddInclusion(modules[i] + DIR_SEPS + makeFileName); + for(const String& module : modules) + makeFile.AddInclusion(module + DIR_SEPS + makeFileName); - UpdateFile(project.GetJniMakeFilePath(), makeFile.ToString()); + UpdateFile(project->GetJniMakeFilePath(), makeFile.ToString()); } bool AndroidBuilder::GenerateRFile() { // TODO: gen in gen folder - if(DirectoryExists(project.GetResDir())) { + if(DirectoryExists(project->GetResDir())) { StringStream ss; String aaptCmd; aaptCmd << NormalizeExePath(sdk.AaptPath()); aaptCmd << " package -v -f -m"; - aaptCmd << " -S " << project.GetResDir(); - aaptCmd << " -J " << project.GetJavaDir(); - aaptCmd << " -M " << project.GetManifestPath(); + aaptCmd << " -S " << project->GetResDir(); + aaptCmd << " -J " << project->GetJavaDir(); + aaptCmd << " -M " << project->GetManifestPath(); aaptCmd << " -I " << NormalizeExePath(sdk.AndroidJarPath()); if(Execute(aaptCmd, ss) != 0) { @@ -745,12 +735,12 @@ bool AndroidBuilder::PreprocessJava(const String& package, const String& file, c RealizeDirectory(classesDir); String compileCmd; - compileCmd << NormalizeExePath(jdk.GetJavacPath()); + compileCmd << NormalizeExePath(jdk->GetJavacPath()); compileCmd << " -d "<< classesDir; compileCmd << " -classpath "; compileCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter(); - compileCmd << project.GetBuildDir(); - compileCmd << " -sourcepath " << project.GetJavaDir(); + compileCmd << project->GetBuildDir(); + compileCmd << " -sourcepath " << project->GetJavaDir(); compileCmd << " " << file; if(Execute(compileCmd) != 0) return false; @@ -784,11 +774,11 @@ bool AndroidBuilder::PreprocessJava(const String& package, const String& file, c className.Replace(DIR_SEPS, "."); String javahCmd; - javahCmd << NormalizeExePath(jdk.GetJavahPath()); + javahCmd << NormalizeExePath(jdk->GetJavahPath()); javahCmd << " -classpath "; javahCmd << classesDir << Java::GetDelimiter(); javahCmd << NormalizeExePath(sdk.AndroidJarPath()) << Java::GetDelimiter(); - javahCmd << project.GetBuildDir(); + javahCmd << project->GetBuildDir(); javahCmd << " -o " << target; javahCmd << " " << className; // PutConsole(javahCmd); @@ -804,8 +794,10 @@ bool AndroidBuilder::PreprocessJava(const String& package, const String& file, c void AndroidBuilder::InitProject() { - if(!project.HasDir()) - project.SetDir(GetSandboxDir() + DIR_SEPS + "AndroidProject"); + if(!project) { + project.Create(GetAndroidProjectDir(), HasFlag("DEBUG")); + commands.Create(~project, &sdk, ~jdk); + } } String AndroidBuilder::GetSandboxDir() const @@ -819,6 +811,11 @@ String AndroidBuilder::GetSandboxDir() const return GetFileFolder(target) + DIR_SEPS + "Sandbox" + DIR_SEPS + mainPackageName; } +String AndroidBuilder::GetAndroidProjectDir() const +{ + return GetSandboxDir() + DIR_SEPS + "AndroidProject"; +} + // ------------------------------------------------------------------- String AndroidBuilder::GetFilePathInAndroidProject( @@ -845,7 +842,7 @@ String AndroidBuilder::NormalizeModuleName(String moduleName) const String AndroidBuilder::GetModuleMakeFilePath(const String& package) { - return project.GetJniDir() + DIR_SEPS + package + DIR_SEPS + "Android.mk"; + return project->GetJniDir() + DIR_SEPS + package + DIR_SEPS + "Android.mk"; } // ------------------------------------------------------------------- diff --git a/uppsrc/ide/Builders/AndroidBuilder.h b/uppsrc/ide/Builders/AndroidBuilder.h index 5e3e625c5..f362b41d8 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.h +++ b/uppsrc/ide/Builders/AndroidBuilder.h @@ -9,11 +9,12 @@ namespace Upp { +class AndroidBuilderCommands; + class AndroidBuilder : public Builder { public: AndroidSDK sdk; AndroidNDK ndk; - Jdk jdk; bool ndk_blitz; Vector ndkArchitectures; @@ -28,6 +29,8 @@ public: public: AndroidBuilder(); + void SetJdk(One jdk); + virtual String GetTargetExt() const override; virtual bool BuildPackage( const String& packageName, @@ -86,19 +89,37 @@ protected: String NormalizeModuleName(String moduleName) const; String GetModuleMakeFilePath(const String& packageName); - + private: void InitProject(); String GetSandboxDir() const; + String GetAndroidProjectDir() const; private: - AndroidProject project; - const Workspace& wspc; + One jdk; + One project; + One commands; + + const Workspace& wspc; private: static const String RES_PKG_FLAG; }; +class AndroidBuilderCommands { +public: + AndroidBuilderCommands( + AndroidProject* projectPtr, AndroidSDK* sdkPtr, Jdk* jdkPtr); + + String PreperCompileJavaSourcesCommand( + const Vector& sources); + +private: + const AndroidProject* projectPtr; + const AndroidSDK* sdkPtr; + const Jdk* jdkPtr; +}; + class AndroidBuilderUtils final { public: AndroidBuilderUtils() = delete; diff --git a/uppsrc/ide/Builders/AndroidBuilderCommands.cpp b/uppsrc/ide/Builders/AndroidBuilderCommands.cpp new file mode 100644 index 000000000..4449d1ad4 --- /dev/null +++ b/uppsrc/ide/Builders/AndroidBuilderCommands.cpp @@ -0,0 +1,43 @@ +#include "AndroidBuilder.h" + +namespace Upp { + +AndroidBuilderCommands::AndroidBuilderCommands( + AndroidProject* projectPtr, AndroidSDK* sdkPtr, Jdk* jdkPtr) + : projectPtr(projectPtr) + , sdkPtr(sdkPtr) + , jdkPtr(jdkPtr) +{ + ASSERT_(projectPtr, "Project is not initialized."); + ASSERT_(sdkPtr, "Android sdk is not initialized."); + ASSERT_(jdkPtr, "JDK is not initialized."); +} + +String AndroidBuilderCommands::PreperCompileJavaSourcesCommand( + const Vector& sources) +{ + String cmd; + + cmd << NormalizeExePath(jdkPtr->GetJavacPath()); + + if (jdkPtr->GetVersion().IsGreaterOrEqual(1, 8)) { + cmd << " -source 1.7 -target 1.7"; + } + + cmd << (projectPtr->IsDebug() ? " -g" : " -g:none"); + cmd << " -d "<< projectPtr->GetClassesDir(); + cmd << " -classpath "; + cmd << NormalizeExePath(sdkPtr->AndroidJarPath()) << Java::GetDelimiter(); + cmd << projectPtr->GetBuildDir(); + cmd << " -sourcepath "; + cmd << projectPtr->GetJavaDir() << " "; + for(int i = 0; i < sources.GetCount(); ++i) { + cmd << sources[i]; + if(i < sources.GetCount() - 1) + cmd << " "; + } + + return cmd; +} + +} diff --git a/uppsrc/ide/Builders/AndroidProject.cpp b/uppsrc/ide/Builders/AndroidProject.cpp index 562201bba..916763abd 100644 --- a/uppsrc/ide/Builders/AndroidProject.cpp +++ b/uppsrc/ide/Builders/AndroidProject.cpp @@ -2,19 +2,10 @@ namespace Upp { -AndroidProject::AndroidProject() +AndroidProject::AndroidProject(const String& dir, bool debug) + : dir(dir) + , debug(debug) { - -} - -AndroidProject::AndroidProject(const String& dir) -{ - this->dir = dir; -} - -AndroidProject::~AndroidProject() -{ - } String AndroidProject::GetDir() const @@ -96,14 +87,14 @@ String AndroidProject::GetJniApplicationMakeFilePath() const // ------------------------------------------------------------------- -void AndroidProject::SetDir(const String& dir) +bool AndroidProject::IsDebug() const { - this->dir = dir; + return debug; } -bool AndroidProject::HasDir() const +bool AndroidProject::IsRelease() const { - return !dir.IsEmpty(); + return !debug; } } diff --git a/uppsrc/ide/Builders/Build.cpp b/uppsrc/ide/Builders/Build.cpp index 3c190e68b..bbcb419e4 100644 --- a/uppsrc/ide/Builders/Build.cpp +++ b/uppsrc/ide/Builders/Build.cpp @@ -138,7 +138,7 @@ One MakeBuild::CreateBuilder(Host *host) AndroidBuilder* ab = dynamic_cast(b); ab->sdk.SetPath((bm.Get("SDK_PATH", ""))); ab->ndk.SetPath((bm.Get("NDK_PATH", ""))); - ab->jdk.SetPath((bm.Get("JDK_PATH", ""))); + ab->SetJdk(One(new Jdk(bm.Get("JDK_PATH", ""), host))); String platformVersion = bm.Get("SDK_PLATFORM_VERSION", ""); if(!platformVersion.IsEmpty()) diff --git a/uppsrc/ide/Builders/Builders.upp b/uppsrc/ide/Builders/Builders.upp index 6d4535c08..273c4e666 100644 --- a/uppsrc/ide/Builders/Builders.upp +++ b/uppsrc/ide/Builders/Builders.upp @@ -27,6 +27,7 @@ file "Android Builder" readonly separator, AndroidBuilder.h, AndroidBuilder.cpp, + AndroidBuilderCommands.cpp, AndroidBuilderUtils.cpp, AndroidModuleMakeFileBuilder.cpp, Components readonly separator, diff --git a/uppsrc/ide/Java/Java.h b/uppsrc/ide/Java/Java.h index ba15cfd1b..327392e0f 100644 --- a/uppsrc/ide/Java/Java.h +++ b/uppsrc/ide/Java/Java.h @@ -2,20 +2,35 @@ #define _Java_Java_h_ #include - #include namespace Upp { +class JavaVersion { +public: + JavaVersion(); + JavaVersion(int major, int minor); + + bool IsGreate(int major) const; + + bool IsGreaterOrEqual(int major) const; + bool IsGreaterOrEqual(int major, int minor) const; + + String ToString() { return IntStr(mMajor) + "." + IntStr(mMinor); } + +private: + int mMajor; + int mMinor; +}; + class Java { public: + Java() = delete; + Java(const Java&) = delete; + Java& operator=(const Java&) = delete; + virtual ~Java() = delete; + static String GetDelimiter(); - -private: - Java(); - Java(const Java&); - Java& operator=(const Java&); - virtual ~Java(); }; class Jdk { @@ -23,33 +38,39 @@ public: static String GetDownloadUrl(); public: - Jdk(); - Jdk(const String& path); - virtual ~Jdk(); + Jdk(const String& path, Host* host); + virtual ~Jdk() {} bool Validate() const; public: - String GetBinDir() const { return path + DIR_SEPS + "bin"; } - String GetIncludeDir() const { return path + DIR_SEPS + "include"; } + const JavaVersion& GetVersion() const { return version; } - String GetJarPath() const { return GetBinDir() + DIR_SEPS + "jar" + GetExeExt(); } - String GetJavacPath() const { return GetBinDir() + DIR_SEPS + "javac" + GetExeExt(); } - String GetJavadocPath() const { return GetBinDir() + DIR_SEPS + "javadoc" + GetExeExt(); } - String GetJavahPath() const { return GetBinDir() + DIR_SEPS + "javah" + GetExeExt(); } - String GetJavapPath() const { return GetBinDir() + DIR_SEPS + "javap" + GetExeExt(); } - String GetJdbPath() const { return GetBinDir() + DIR_SEPS + "jdb" + GetExeExt(); } + String GetBinDir() const { return path + DIR_SEPS + "bin"; } + String GetIncludeDir() const { return path + DIR_SEPS + "include"; } - String GetJarsignerPath() const { return GetBinDir() + DIR_SEPS + "jarsigner" + GetExeExt(); } - String GetKeytoolPath() const { return GetBinDir() + DIR_SEPS + "keytool" + GetExeExt(); } + String GetJarPath() const { return GetBinDir() + DIR_SEPS + "jar" + GetExeExt(); } + String GetJavacPath() const { return GetBinDir() + DIR_SEPS + "javac" + GetExeExt(); } + String GetJavadocPath() const { return GetBinDir() + DIR_SEPS + "javadoc" + GetExeExt(); } + String GetJavahPath() const { return GetBinDir() + DIR_SEPS + "javah" + GetExeExt(); } + String GetJavapPath() const { return GetBinDir() + DIR_SEPS + "javap" + GetExeExt(); } + String GetJdbPath() const { return GetBinDir() + DIR_SEPS + "jdb" + GetExeExt(); } + String GetJarsignerPath() const { return GetBinDir() + DIR_SEPS + "jarsigner" + GetExeExt(); } + String GetKeytoolPath() const { return GetBinDir() + DIR_SEPS + "keytool" + GetExeExt(); } + + String GetPath() const { return this->path; } + public: - String GetPath() { return this->path; } - void SetPath(const String& path) { this->path = path; } + void SetVersion(const String& version); private: - String path; + void FindVersion(Host* host); + +private: + String path; + JavaVersion version; }; } diff --git a/uppsrc/ide/Java/Java.upp b/uppsrc/ide/Java/Java.upp index 5804527f6..4a89761db 100644 --- a/uppsrc/ide/Java/Java.upp +++ b/uppsrc/ide/Java/Java.upp @@ -5,6 +5,7 @@ uses file Java.h, + JavaVersion.cpp, Java.cpp, Jdk.cpp, Info readonly separator, diff --git a/uppsrc/ide/Java/Jdk.cpp b/uppsrc/ide/Java/Jdk.cpp index 8ab8dd23d..a8e15fd68 100644 --- a/uppsrc/ide/Java/Jdk.cpp +++ b/uppsrc/ide/Java/Jdk.cpp @@ -2,24 +2,19 @@ namespace Upp { +#define METHOD_NAME "Jdk::" + String(__FUNCTION__) + "(): " + String Jdk::GetDownloadUrl() { return "http://www.oracle.com/technetwork/java/javase/downloads/index.html"; } -Jdk::Jdk() -{ - -} - -Jdk::Jdk(const String& path) -{ - this->path = path; -} - -Jdk::~Jdk() +Jdk::Jdk(const String& path, Host* host) + : path(path) { + ASSERT_(host, "Host is null."); + FindVersion(host); } bool Jdk::Validate() const @@ -29,4 +24,46 @@ bool Jdk::Validate() const return true; } +void Jdk::FindVersion(Host* host) +{ + if (!Validate()) { + LOG(METHOD_NAME + "Path to JDK is wrong or files are corrupted."); + return; + } + + StringStream ss; + if (host->Execute(GetJavacPath() + " -version", ss) != 0) { + LOG(METHOD_NAME + "Cannot obtain version due to command execution failure."); + return; + } + + String output = static_cast(ss); + output.Replace("\n", ""); + Vector splitedOutput = Split(output, " "); + if (splitedOutput.GetCount() != 2) { + LOG(METHOD_NAME + "Splited output is too short (" + output + ")."); + return; + } + + Vector splitedVersion = Split(splitedOutput[1], "."); + if (splitedVersion.GetCount() != 3) { + LOG(METHOD_NAME + "Splited version is too short (" + output + ")."); + return; + } + + int major = StrInt(splitedVersion[0]); + if (major == INT_NULL) { + LOG(METHOD_NAME + "Major version conversion to int failed (" + splitedVersion[0] + ")."); + return; + } + + int minor = StrInt(splitedVersion[1]); + if (minor == INT_NULL) { + LOG(METHOD_NAME + "Minor version conversion to int failed (" + splitedVersion[1] + ")."); + return; + } + + version = JavaVersion(major, minor); +} + }