diff --git a/uppsrc/ide/Builders/AndroidBuilder.cpp b/uppsrc/ide/Builders/AndroidBuilder.cpp index f91732a18..b5676a22b 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidBuilder.cpp @@ -1,7 +1,7 @@ #include "Builders.h" #include "AndroidBuilder.h" -#define METHOD_NAME "AndroidBuilder::" + String(__FUNCTION__) + "(): " +#define METHOD_NAME "AndroidBuilder::" + String(__func__) + "(): " #define ERROR_METHOD_NAME "[ERROR] " METHOD_NAME #define INFO_METHOD_NAME "[INFO] " METHOD_NAME @@ -44,7 +44,7 @@ bool AndroidBuilder::BuildPackage( const bool isMainPackage = HasFlag("MAIN"); const bool isResourcesPackage = HasFlag(RES_PKG_FLAG); - const bool isBlitz = HasFlag("BLITZ") && ndk_blitz; + const bool isBlitz = HasFlag("BLITZ") || ndk_blitz; String uppManifestPath = PackagePath(package); String packageDir = GetFileFolder(uppManifestPath); String assemblyDir = AndroidBuilderUtils::GetAssemblyDir(packageDir, package); @@ -103,12 +103,14 @@ bool AndroidBuilder::BuildPackage( else if(AndroidBuilderUtils::IsCppOrCFile(filePath)) { nativeSourcesOptions.Add(globalOptions); - if(pkg[i].noblitz) - noBlitzNativeSourceFiles.Add(packageFile); - - if(AndroidBuilderUtils::IsCppOrCFile(filePath)) { - nativeSources.Add(NormalizePathSeparator(filePath)); + if(pkg[i].noblitz) { + if (isBlitz) { + noBlitzNativeSourceFiles.Add(filePath); + continue; + } } + + nativeSources.Add(filePath); } else if(AndroidBuilderUtils::IsXmlFile(filePath)) { @@ -149,42 +151,35 @@ bool AndroidBuilder::BuildPackage( } if(isResourcesPackage || nativeSources.IsEmpty()) { - LOG(INFO_METHOD_NAME + "There are not native files in following package " + package + "."); + LOG(INFO_METHOD_NAME + "There are not native files in the following package " + package + "."); return true; } if(isBlitz) { + LOG(INFO_METHOD_NAME + "Creating blitz step for package " + package + "."); + BlitzBuilderComponent bc(this); + bc.SetWorkingDir(project->GetJniDir() + DIR_SEPS + package); + bc.SetBlitzFileName("blitz"); + Blitz blitz = bc.MakeBlitzStep( nativeSources, nativeSourcesOptions, nativeObjects, immfile, ".o", noBlitzNativeSourceFiles); - String destinationFileName = GetFileName(blitz.path); - destinationFileName.Replace("$blitz.cpp", "@blitz.cpp"); - - String blitzDestinationFileInPackage; - blitzDestinationFileInPackage << package << DIR_SEPS; - blitzDestinationFileInPackage << destinationFileName; - - if(FileExists(blitz.path)) { - String blitzDestinationFile; - blitzDestinationFile << project->GetJniDir() << DIR_SEPS; - blitzDestinationFile << blitzDestinationFileInPackage; - - CopyFile(blitzDestinationFile, blitz.path); - - nativeSources.Clear(); - nativeSources.Add(blitzDestinationFileInPackage); - for(int i = 0; i < noBlitzNativeSourceFiles.GetCount(); i++) - nativeSources.Add(noBlitzNativeSourceFiles[i]); + if(!FileExists(blitz.path)) { + LOG(ERROR_METHOD_NAME + "Blitz was enable, but no blitz file generated."); + } + else { + nativeSources.Add(blitz.path); } } - + AndroidModuleMakeFileCreator creator(config); creator.SetModuleName(NormalizeModuleName(package)); creator.AddSources(nativeSources); + creator.AddSources(noBlitzNativeSourceFiles); creator.AddInclude(assemblyDir); creator.AddIncludes(pkg.uses); creator.AddFlags(pkg.flag); @@ -779,7 +774,7 @@ void AndroidBuilder::InitProject() { if(!project) { project.Create(GetAndroidProjectDir(), HasFlag("DEBUG")); - commands.Create(~project, &sdk, ~jdk); + commands.Create(project.Get(), &sdk, jdk.Get()); } } diff --git a/uppsrc/ide/Builders/AndroidBuilder.h b/uppsrc/ide/Builders/AndroidBuilder.h index 2d2837c3e..fa622cb47 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.h +++ b/uppsrc/ide/Builders/AndroidBuilder.h @@ -153,6 +153,7 @@ public: void SetModuleName(const String& name) { makeFile.SetName(name); } void AddSources(Vector& sources); + void AddSources(Index& sources); void AddInclude(const String& path); void AddIncludes(const Array& uses); diff --git a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp index 9aee0a94c..061beb88c 100644 --- a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp @@ -18,6 +18,13 @@ void AndroidModuleMakeFileCreator::AddSources(Vector& sources) } } +void AndroidModuleMakeFileCreator::AddSources(Index& sources) +{ + for(const String& source : sources) { + makeFile.AddSourceFile(source); + } +} + void AndroidModuleMakeFileCreator::AddInclude(const String& path) { makeFile.AddInclude(path); diff --git a/uppsrc/ide/Builders/Blitz.cpp b/uppsrc/ide/Builders/Blitz.cpp index 4eb512f42..e665b1931 100644 --- a/uppsrc/ide/Builders/Blitz.cpp +++ b/uppsrc/ide/Builders/Blitz.cpp @@ -34,9 +34,17 @@ void InitBlitz() blitz_base_time = max(blitz_base_time, ltm + 3 * 60); // should solve first build after install/checkout } -Blitz BlitzBuilderComponent::MakeBlitzStep(Vector& sfile, Vector& soptions, - Vector& obj, Vector& immfile, - const char *objext, const Index& noblitz) +BlitzBuilderComponent::BlitzBuilderComponent(Builder* builder) + : BuilderComponent(builder) + , workingDir(builder->outdir) + , blitzFileName("$blitz") +{ +} + +Blitz BlitzBuilderComponent::MakeBlitzStep( + Vector& sourceFiles, Vector& soptions, + Vector& obj, Vector& immfile, + const char *objext, const Index& noblitz) { Blitz b; b.count = 0; @@ -47,27 +55,27 @@ Blitz BlitzBuilderComponent::MakeBlitzStep(Vector& sfile, Vector Vector excluded; Vector excludedoptions; - b.object = CatAnyPath(builder->outdir, "$blitz" + String(objext)); + b.object = CatAnyPath(workingDir, blitzFileName + String(objext)); Time blitztime = GetFileTime(b.object); String blitz; if(!IdeGetOneFile().IsEmpty()) return b; - for(int i = 0; i < sfile.GetCount(); i++) { - String fn = sfile[i]; - String ext = ToLower(GetFileExt(fn)); - String objfile = CatAnyPath(builder->outdir, GetFileTitle(fn) + objext); - Time fntime = GetFileTime(fn); + for(int i = 0; i < sourceFiles.GetCount(); i++) { + String sourceFile = sourceFiles[i]; + String ext = ToLower(GetFileExt(sourceFile)); + String objfile = CatAnyPath(workingDir, GetFileTitle(sourceFile) + objext); + Time sourceFileTime = GetFileTime(sourceFile); if((ext == ".cpp" || ext == ".cc" || ext == ".cxx" || ext == ".icpp") - && HdependBlitzApproved(fn) && IsNull(soptions[i]) - && fntime < blitz_base_time - && noblitz.Find(fn) < 0) { - if(HdependFileTime(fn) > blitztime) + && HdependBlitzApproved(sourceFile) && IsNull(soptions[i]) + && sourceFileTime < blitz_base_time + && noblitz.Find(sourceFile) < 0) { + if(HdependFileTime(sourceFile) > blitztime) b.build = true; blitz << "\r\n" << "#define BLITZ_INDEX__ F" << i << "\r\n" - << "#include \"" << builder->GetHostPath(fn) << "\"\r\n"; - b.info << ' ' << GetFileName(fn); - const Vector& d = HdependGetDefines(fn); + << "#include \"" << builder->GetHostPath(sourceFile) << "\"\r\n"; + b.info << ' ' << GetFileName(sourceFile); + const Vector& d = HdependGetDefines(sourceFile); for(int i = 0; i < d.GetCount(); i++) blitz << "#ifdef " << d[i] << "\r\n" << "#undef " << d[i] << "\r\n" @@ -76,16 +84,17 @@ Blitz BlitzBuilderComponent::MakeBlitzStep(Vector& sfile, Vector b.count++; } else { - excluded.Add(fn); + excluded.Add(sourceFile); excludedoptions.Add(soptions[i]); } } - b.path = CatAnyPath(builder->outdir, "$blitz.cpp"); + b.path = CatAnyPath(workingDir, blitzFileName + ".cpp"); if(b.count > 1) { - sfile = pick(excluded); + sourceFiles = pick(excluded); soptions = pick(excludedoptions); if(builder->LoadFile(b.path) != blitz) { + builder->RealizeDir(GetFileDirectory(b.path)); builder->SaveFile(b.path, blitz); b.build = true; } diff --git a/uppsrc/ide/Builders/Build.cpp b/uppsrc/ide/Builders/Build.cpp index 217c96efd..d71a467e7 100644 --- a/uppsrc/ide/Builders/Build.cpp +++ b/uppsrc/ide/Builders/Build.cpp @@ -252,8 +252,8 @@ struct OneFileHost : Host { virtual void DeleteFile(const Vector& path) { host->DeleteFile(path); } virtual void DeleteFolderDeep(const String& folder) { host->DeleteFolderDeep(folder); } virtual void ChDir(const String& path) { host->ChDir(path); } - virtual void RealizeDir(const String& path) { host->RealizeDir(path); } - virtual void SaveFile(const String& path, const String& data) { host->SaveFile(path, data); } + virtual bool RealizeDir(const String& path) { host->RealizeDir(path); } + virtual bool SaveFile(const String& path, const String& data) { host->SaveFile(path, data); } virtual String LoadFile(const String& path) { return host->LoadFile(path); } virtual int Execute(const char *c) { return host->Execute(c); } virtual int ExecuteWithInput(const char *c, bool noconvert) { return host->ExecuteWithInput(c, noconvert); } diff --git a/uppsrc/ide/Builders/BuilderComponents.h b/uppsrc/ide/Builders/BuilderComponents.h index 0fc50fbd9..6631cd5f2 100644 --- a/uppsrc/ide/Builders/BuilderComponents.h +++ b/uppsrc/ide/Builders/BuilderComponents.h @@ -32,11 +32,19 @@ void InitBlitz(); class BlitzBuilderComponent : public BuilderComponent { public: - BlitzBuilderComponent(Builder *builder) : BuilderComponent(builder) {} + BlitzBuilderComponent(Builder *builder); - Blitz MakeBlitzStep(Vector& sfile, Vector& soptions, - Vector& obj, Vector& immfile, - const char *objext, const Index& noblitz); + void SetWorkingDir(const String& workingDir) { this->workingDir = workingDir; } + void SetBlitzFileName(const String& blitzFileName) { this->blitzFileName = blitzFileName; } + + Blitz MakeBlitzStep( + Vector& sfile, Vector& soptions, + Vector& obj, Vector& immfile, + const char *objext, const Index& noblitz); + +private: + String workingDir; + String blitzFileName; }; } diff --git a/uppsrc/ide/Core/Builder.cpp b/uppsrc/ide/Core/Builder.cpp index 547b82ae0..b7f65bf95 100644 --- a/uppsrc/ide/Core/Builder.cpp +++ b/uppsrc/ide/Core/Builder.cpp @@ -74,9 +74,14 @@ void Builder::DeleteFile(const String& path) host->DeleteFile(Vector() << path); } -void Builder::SaveFile(const String& path, const String& data) +bool Builder::RealizeDir(const String& path) { - host->SaveFile(path, data); + return host->RealizeDir(path); +} + +bool Builder::SaveFile(const String& path, const String& data) +{ + return host->SaveFile(path, data); } String Builder::LoadFile(const String& path) diff --git a/uppsrc/ide/Core/Core.h b/uppsrc/ide/Core/Core.h index 27a1c9a3e..1b760a1b2 100644 --- a/uppsrc/ide/Core/Core.h +++ b/uppsrc/ide/Core/Core.h @@ -458,7 +458,8 @@ struct Builder { void DeleteFile(const Vector& path); void DeleteFile(const String& path); bool FileExists(const String& path) const; - void SaveFile(const String& path, const String& data); + bool RealizeDir(const String& path); + bool SaveFile(const String& path, const String& data); String LoadFile(const String& path); bool HasFlag(const char *f) const { return config.Find(f) >= 0; } }; diff --git a/uppsrc/ide/Core/Host.cpp b/uppsrc/ide/Core/Host.cpp index a1587ceb4..4bfaa59a5 100644 --- a/uppsrc/ide/Core/Host.cpp +++ b/uppsrc/ide/Core/Host.cpp @@ -73,16 +73,17 @@ void LocalHost::DoDir(const String& dir) } } -void LocalHost::RealizeDir(const String& path) +bool LocalHost::RealizeDir(const String& path) { - RealizeDirectory(path); + bool realized = RealizeDirectory(path); if(cmdout) DoDir(path); + return realized; } -void LocalHost::SaveFile(const String& path, const String& data) +bool LocalHost::SaveFile(const String& path, const String& data) { - ::SaveFile(path, data); + return ::SaveFile(path, data); } String LocalHost::LoadFile(const String& path) diff --git a/uppsrc/ide/Core/Host.h b/uppsrc/ide/Core/Host.h index 5c8e6737a..316868041 100644 --- a/uppsrc/ide/Core/Host.h +++ b/uppsrc/ide/Core/Host.h @@ -14,8 +14,8 @@ struct Host { virtual void DeleteFile(const Vector& path) = 0; virtual void DeleteFolderDeep(const String& dir) = 0; virtual void ChDir(const String& path) = 0; - virtual void RealizeDir(const String& path) = 0; - virtual void SaveFile(const String& path, const String& data) = 0; + virtual bool RealizeDir(const String& path) = 0; + virtual bool SaveFile(const String& path, const String& data) = 0; virtual String LoadFile(const String& path) = 0; virtual int Execute(const char *cmdline) = 0; virtual int ExecuteWithInput(const char *cmdline, bool noconvert) = 0; @@ -49,8 +49,8 @@ public: virtual void DeleteFile(const Vector& path); virtual void DeleteFolderDeep(const String& dir); virtual void ChDir(const String& path); - virtual void RealizeDir(const String& path); - virtual void SaveFile(const String& path, const String& data); + virtual bool RealizeDir(const String& path); + virtual bool SaveFile(const String& path, const String& data); virtual String LoadFile(const String& path); virtual int Execute(const char *cmdline); virtual int ExecuteWithInput(const char *cmdline, bool noconvert); diff --git a/uppsrc/ide/ide.lay b/uppsrc/ide/ide.lay index 164fe52c9..76aa0392e 100644 --- a/uppsrc/ide/ide.lay +++ b/uppsrc/ide/ide.lay @@ -213,7 +213,7 @@ LAYOUT(BuildMethodsAndroidBuilderSetupLayout, 648, 500) ITEM(DropList, sdk_build_tools_release, LeftPosZ(340, 100).TopPosZ(124, 19)) ITEM(LabelBox, dv___12, SetLabel(t_("Android NDK settings")).HSizePosZ(0, 0).TopPosZ(164, 164)) ITEM(StaticText, dv___13, SetText(t_("BLITZ:")).LeftPosZ(8, 116).TopPosZ(180, 19)) - ITEM(TextOption, ndk_blitz, SetLabel(t_("&Use BLITZ (Experimental)")).LeftPosZ(128, 232).TopPosZ(180, 20)) + ITEM(TextOption, ndk_blitz, SetLabel(t_("&Use BLITZ")).LeftPosZ(128, 232).TopPosZ(180, 20)) ITEM(StaticText, dv___15, SetText(t_("Target architectures:")).LeftPosZ(8, 116).TopPosZ(204, 19)) ITEM(TextOption, ndk_arch_armeabi, SetLabel(t_("armeabi")).LeftPosZ(128, 68).TopPosZ(204, 20)) ITEM(TextOption, ndk_arch_armeabi_v7a, SetLabel(t_("armeabi-v7a")).LeftPosZ(204, 84).TopPosZ(204, 20))