#ifndef _ide_Builders_AndroidBuilder_h_ #define _ide_Builders_AndroidBuilder_h_ #include "Android.h" #include #include #include namespace Upp { class AndroidBuilderCommands; class AndroidBuilder : public Builder { public: AndroidSDK sdk; AndroidNDK ndk; bool ndk_blitz; Vector ndkArchitectures; String ndkToolchain; String ndkCppRuntime; String ndkCppFlags; String ndkCFlags; public: static Index GetBuildersNames(); public: AndroidBuilder(); void SetJdk(One jdk); String GetTargetExt() const override; bool BuildPackage( const String& packageName, Vector& linkfile, Vector& immfile, String& linkoptions, const Vector& all_uses, const Vector& all_libraries, int optimize) override; bool Link(const Vector& linkfile, const String& linkoptions, bool createmap) override; bool Preprocess( const String& package, const String& file, const String& target, bool asmout) override; void AddFlags(Index& cfg) override; void CleanPackage(const String& package, const String& outdir) override; 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& package) const; private: void InitProject(); String GetSandboxDir() const; String GetAndroidProjectDir() const; private: 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; AndroidBuilderUtils(AndroidBuilderUtils&) = delete; AndroidBuilderUtils& operator=(AndroidBuilderUtils&) = delete; ~AndroidBuilderUtils() = delete; // TODO: Core should support creating symbolic link - not builder... static bool CreateSymlink(const String& symbolicLink, const String& target); static String GetAssemblyDir(const String& package); static String GetAssemblyDir(const String& packageDir, const String& package); static bool IsJavaFile(const String& path); static bool IsHeaderFile(const String& path); static bool IsCFile(const String& path); static bool IsCppFile(const String& path); static bool IsCppOrCFile(const String& path); static bool IsObjectFile(const String& path); static bool IsXmlFile(const String& path); static bool IsTranslationFile(const String& path); private: static bool HasExt(const String& path, const Index& exts); static String NormalizeAndGetFileExt(const String& path); }; class AndroidModuleMakeFileCreator { public: AndroidModuleMakeFileCreator(const Index& builderConfig); virtual ~AndroidModuleMakeFileCreator() {} void SetModuleName(const String& name) { makeFile.SetName(name); } void AddSources(Vector& sources); void AddInclude(const String& path); void AddIncludes(const Array& uses); void AddFlags(const Array& flags); void AddLdLibraries(const Array& libraries); void AddStaticModuleLibrary(Array& staticLibraries); void AddSharedLibraries(const Array& uses); bool Save(const String& path); String Create() { return makeFile.ToString(); } private: AndroidModuleMakeFile makeFile; const Index& config; }; } #endif