ultimatepp/uppsrc/ide/Builders/AndroidBuilder.h
klugier d02a00f19a Core can be fully compiled on Windows with Android Builder.
git-svn-id: svn://ultimatepp.org/upp/trunk@10672 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2017-01-07 22:55:56 +00:00

177 lines
4.9 KiB
C++

#ifndef _ide_Builders_AndroidBuilder_h_
#define _ide_Builders_AndroidBuilder_h_
#include "Android.h"
#include <ide/Core/Core.h>
#include <ide/Android/Android.h>
#include <ide/Java/Java.h>
namespace Upp {
class AndroidBuilderCommands;
class AndroidBuilder : public Builder {
public:
AndroidSDK sdk;
AndroidNDK ndk;
bool ndk_blitz;
Vector<String> ndkArchitectures;
String ndkToolchain;
String ndkCppRuntime;
String ndkCppFlags;
String ndkCFlags;
public:
static Index<String> GetBuildersNames();
public:
AndroidBuilder();
void SetJdk(One<Jdk> jdk);
String GetTargetExt() const override;
bool BuildPackage(
const String& packageName,
Vector<String>& linkfile,
Vector<String>& immfile,
String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int optimize) override;
bool Link(const Vector<String>& linkfile, const String& linkoptions, bool createmap) override;
bool Preprocess(
const String& package,
const String& file,
const String& target,
bool asmout) override;
void AddFlags(Index<String>& cfg) override;
void CleanPackage(const String& package, const String& outdir) override;
void AfterClean() override;
protected:
void ManageProjectCohesion();
void DetectAndManageUnusedPackages(const String& nest, const Index<String>& packages);
void DeleteUnusedSourceFiles(
const String& nest,
const Vector<String>& 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> jdk;
One<AndroidProject> project;
One<AndroidBuilderCommands> 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<String>& 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<String>& exts);
static String NormalizeAndGetFileExt(const String& path);
};
class AndroidModuleMakeFileCreator {
public:
AndroidModuleMakeFileCreator(const Index<String>& builderConfig);
virtual ~AndroidModuleMakeFileCreator() {}
void SetModuleName(const String& name) { makeFile.SetName(name); }
void AddSources(Vector<String>& sources);
void AddInclude(const String& path);
void AddIncludes(const Array<OptItem>& uses);
void AddFlags(const Array<OptItem>& flags);
void AddLdLibraries(const Array<OptItem>& libraries);
void AddStaticModuleLibrary(Array<OptItem>& staticLibraries);
void AddSharedLibraries(const Array<OptItem>& uses);
bool Save(const String& path);
String Create() { return makeFile.ToString(); }
private:
AndroidModuleMakeFile makeFile;
const Index<String>& config;
};
}
#endif