diff --git a/uppsrc/ide/Builders/Android.h b/uppsrc/ide/Builders/Android.h index 2b84155af..8730b47c6 100644 --- a/uppsrc/ide/Builders/Android.h +++ b/uppsrc/ide/Builders/Android.h @@ -55,6 +55,7 @@ public: void AddCppFlag(const String& name, const String& value = ""); void AddLdLibrary(const String& ldLibrary); void AddStaticLibrary(const String& staticLibrary); + void AddStaticModuleLibrary(const String& staticModuleLibrary); void AddSharedLibrary(const String& sharedLibrary); String GetName() const { return this->name; } @@ -67,6 +68,7 @@ protected: void AppendLdLibraries(String& makeFile) const; void AppendStaticLibraries(String& makeFile) const; void AppendSharedLibraries(String& makeFile) const; + void AppendModules(String& makeFile) const; private: String name; @@ -74,6 +76,7 @@ private: VectorMap cppFlags; Vector ldLibraries; Vector staticLibraries; + Vector staticModuleLibraries; Vector sharedLibraries; }; diff --git a/uppsrc/ide/Builders/AndroidApplicationMakeFile.cpp b/uppsrc/ide/Builders/AndroidApplicationMakeFile.cpp index 41b94d71c..b25a4efad 100644 --- a/uppsrc/ide/Builders/AndroidApplicationMakeFile.cpp +++ b/uppsrc/ide/Builders/AndroidApplicationMakeFile.cpp @@ -34,7 +34,7 @@ void AndroidApplicationMakeFile::SetPlatform(const String& platform) void AndroidApplicationMakeFile::SetArchitectures(const Vector& architectures) { - this->architectures = clone(architectures); + this->architectures = architectures; } void AndroidApplicationMakeFile::AddArchitecture(const String& architecture) diff --git a/uppsrc/ide/Builders/AndroidBuilder.icpp b/uppsrc/ide/Builders/AndroidBuilder.icpp index ec2e3cac0..9083a61f9 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.icpp +++ b/uppsrc/ide/Builders/AndroidBuilder.icpp @@ -201,10 +201,17 @@ bool AndroidBuilder::BuildPackage(const String& package, Vector& linkfil // TODO: improve sieve mechanisme for(int i = 0; i < nativeSourceFilesInPackage.GetCount(); i++) pkgMakeFile.AddSourceFile(nativeSourceFilesInPackage[i]); + for(int i = 0; i < pkg.flag.GetCount(); i++) pkgMakeFile.AddCppFlag(pkg.flag[i].text); + for(int i = 0; i < pkg.library.GetCount(); i++) pkgMakeFile.AddLdLibrary(pkg.library[i].text); + + Vector staticLibs = Split(Gather(pkg.static_library, config.GetKeys()), ' '); + for(int i = 0; i < staticLibs.GetCount(); i++) + pkgMakeFile.AddStaticModuleLibrary(staticLibs[i]); + for(int i = 0; i < pkg.uses.GetCount(); i++) pkgMakeFile.AddSharedLibrary(pkg.uses[i].text); @@ -228,17 +235,20 @@ bool AndroidBuilder::Link(const Vector& linkfile, const String& linkopti // We need to compile java packages in this place, because we need to generate "R.java" file before... // We don't know which packages contain resources. - PutConsole("-----"); - PutConsole("Compiling java sources..."); - bool error = false; - int time = GetTickCount(); - for(int i = 0; i < linkfile.GetCount(); i++) { - if(Execute(linkfile[i], ss) != 0) { - PutConsole(ss.GetResult()); - return false; + int time; + if(linkfile.GetCount()) { + PutConsole("-----"); + PutConsole("Compiling java sources..."); + bool error = false; + time = GetTickCount(); + for(int i = 0; i < linkfile.GetCount(); i++) { + if(Execute(linkfile[i], ss) != 0) { + PutConsole(ss.GetResult()); + return false; + } } + PutConsole("Java sources compiled in " + GetPrintTime(time) + "."); } - PutConsole("Java sources compiled in " + GetPrintTime(time) + "."); // Now, we are going to start compiling c/c++ sources if(DirectoryExists(GetAndroidProjectJniSourcesDir())) { @@ -264,18 +274,21 @@ bool AndroidBuilder::Link(const Vector& linkfile, const String& linkopti PutConsole("Native sources compiled in " + GetPrintTime(time) + "."); } - PutConsole("-----"); - PutConsole("Creating dex file..."); - RealizeDirectory(GetAndroidProjectBinDir()); - String dxCmd; - dxCmd << NormalizeExePath(androidSDK.DxPath()); - dxCmd << " --dex "; - dxCmd << "--output=" << GetAndroidProjectBinDir() << DIR_SEPS << "classes.dex "; - dxCmd << GetAndroidProjectClassesDir(); - // PutConsole(dxCmd); - if(Execute(dxCmd, ss) != 0) { - PutConsole(ss.GetResult()); - return false; + String classesDir = GetAndroidProjectClassesDir(); + if(DirectoryExists(classesDir)) { + PutConsole("-----"); + PutConsole("Creating dex file..."); + RealizeDirectory(GetAndroidProjectBinDir()); + String dxCmd; + dxCmd << NormalizeExePath(androidSDK.DxPath()); + dxCmd << " --dex "; + dxCmd << "--output=" << GetAndroidProjectBinDir() << DIR_SEPS << "classes.dex "; + dxCmd << classesDir; + // PutConsole(dxCmd); + if(Execute(dxCmd, ss) != 0) { + PutConsole(ss.GetResult()); + return false; + } } PutConsole("Creating apk file..."); diff --git a/uppsrc/ide/Builders/AndroidModuleMakeFile.cpp b/uppsrc/ide/Builders/AndroidModuleMakeFile.cpp index 1c31c31e8..31f428742 100644 --- a/uppsrc/ide/Builders/AndroidModuleMakeFile.cpp +++ b/uppsrc/ide/Builders/AndroidModuleMakeFile.cpp @@ -39,6 +39,7 @@ String AndroidModuleMakeFile::ToString() const AppendStaticLibraries(makeFile); AppendSharedLibraries(makeFile); makeFile << "include $(BUILD_SHARED_LIBRARY)\n"; + AppendModules(makeFile); return makeFile; } @@ -63,6 +64,11 @@ void AndroidModuleMakeFile::AddStaticLibrary(const String& staticLibrary) staticLibraries.Add(staticLibrary); } +void AndroidModuleMakeFile::AddStaticModuleLibrary(const String& staticModuleLibrary) +{ + staticModuleLibraries.Add(staticModuleLibrary); +} + void AndroidModuleMakeFile::AddSharedLibrary(const String& sharedLibrary) { sharedLibraries.Add(sharedLibrary); @@ -101,7 +107,11 @@ void AndroidModuleMakeFile::AppendLdLibraries(String& makeFile) const void AndroidModuleMakeFile::AppendStaticLibraries(String& makeFile) const { - AndroidMakeFile::AppendStringVector(makeFile, staticLibraries, "LOCAL_STATIC_LIBRARIES"); + Vector allLibs; + allLibs.Append(staticLibraries); + allLibs.Append(staticModuleLibraries); + + AndroidMakeFile::AppendStringVector(makeFile, allLibs, "LOCAL_STATIC_LIBRARIES"); } void AndroidModuleMakeFile::AppendSharedLibraries(String& makeFile) const @@ -109,4 +119,23 @@ void AndroidModuleMakeFile::AppendSharedLibraries(String& makeFile) const AndroidMakeFile::AppendStringVector(makeFile, sharedLibraries, "LOCAL_SHARED_LIBRARIES"); } +void AndroidModuleMakeFile::AppendModules(String& makeFile) const +{ + if(staticModuleLibraries.GetCount()) { + for(int i = 0; i < staticModuleLibraries.GetCount(); i++) { + if(i == 0) + makeFile << "\n"; + + const String androidPrefix = "android_"; + + String module = staticModuleLibraries[i]; + if(module.StartsWith(androidPrefix)) + module.Remove(0, androidPrefix.GetCount()); + module = "android/" + module; + + makeFile << "$(call import-module, " << module << ")\n"; + } + } +} + END_UPP_NAMESPACE diff --git a/uppsrc/ide/Core/Core.h b/uppsrc/ide/Core/Core.h index 4d2f32173..07460d9d4 100644 --- a/uppsrc/ide/Core/Core.h +++ b/uppsrc/ide/Core/Core.h @@ -315,6 +315,7 @@ public: Array uses; Array target; Array library; + Array static_library; Array link; Array option; Array include; diff --git a/uppsrc/ide/Core/Package.cpp b/uppsrc/ide/Core/Package.cpp index 2a953a68b..32bebbd4b 100644 --- a/uppsrc/ide/Core/Package.cpp +++ b/uppsrc/ide/Core/Package.cpp @@ -206,6 +206,7 @@ bool Package::Load(const char *path) for(;;) { Reset(); library.Clear(); + static_library.Clear(); target.Clear(); flag.Clear(); option.Clear(); @@ -227,6 +228,7 @@ bool Package::Load(const char *path) if(!LoadOpt(p, "options", option) && !LoadOpt(p, "link", link) && !LoadOpt(p, "library", library) && + !LoadOpt(p, "static_library", static_library) && !LoadOpt(p, "flags", flag) && !LoadOpt(p, "target", target) && !LoadOpt(p, "uses", uses) && @@ -436,6 +438,7 @@ bool Package::Save(const char *path) const { putopt(out, "uses", uses); putopt(out, "target", target); putopt(out, "library", library); + putopt(out, "static_library", static_library); putopt(out, "options", option); putopt(out, "link", link); putopt(out, "include", include); diff --git a/uppsrc/ide/UppDlg.cpp b/uppsrc/ide/UppDlg.cpp index a8509d1f8..3e5be8cce 100644 --- a/uppsrc/ide/UppDlg.cpp +++ b/uppsrc/ide/UppDlg.cpp @@ -609,6 +609,7 @@ PackageEditor::PackageEditor() Add("Uses", actual.uses); Add("Targets", actual.target); Add("Libraries", actual.library); + Add("Static libraries", actual.static_library); Add("Link options", actual.link); Add("Compiler options", actual.option); Add("Internal includes", actual.include); diff --git a/uppsrc/ide/UppDlg.h b/uppsrc/ide/UppDlg.h index 9cc5685cd..d341f7130 100644 --- a/uppsrc/ide/UppDlg.h +++ b/uppsrc/ide/UppDlg.h @@ -397,7 +397,7 @@ struct PackageEditor : WorkspaceWork, WithUppLayout { virtual void PackageCursor(); enum OptionType { - FLAG = 0, USES, TARGET, LIBRARY, LINK, COMPILER, INCLUDE, + FLAG = 0, USES, TARGET, LIBRARY, STATIC_LIBRARY, LINK, COMPILER, INCLUDE, FILEOPTION, FILEDEPENDS };