Merge "Convert mclinker to Android.bp"
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..6ecc52d
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,40 @@
+cc_defaults {
+    name: "mcld-defaults",
+    defaults: ["llvm-defaults"],
+
+    cppflags: [
+        "-Wall",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-unused-const-variable",
+        "-Werror",
+
+        //To enable asserts:
+        //"-D_DEBUG",
+        //"-UNDEBUG",
+    ],
+
+    target: {
+        arm_on_x86: {
+            cflags: [
+                "-DPROVIDE_ARM_CODEGEN",
+                "-DFORCE_BUILD_ARM",
+            ],
+        },
+        arm_on_x86_64: {
+            cflags: [
+                "-DPROVIDE_ARM_CODEGEN",
+                "-DFORCE_BUILD_ARM",
+            ],
+        },
+    },
+
+    include_dirs: [
+        "frameworks/compile/mclinker/include",
+    ],
+}
+
+subdirs = [
+    "lib",
+    "tools/mcld",
+]
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 5597fe2..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-MCLD_ROOT_PATH := $(LOCAL_PATH)
-# For mcld.mk
-LLVM_ROOT_PATH := external/llvm
-MCLD_ENABLE_ASSERTION := false
-
-include $(CLEAR_VARS)
-
-# MCLinker Libraries
-subdirs := \
-  lib/ADT \
-  lib/Core \
-  lib/Fragment \
-  lib/LD \
-  lib/MC \
-  lib/Object \
-  lib/Script \
-  lib/Support \
-  lib/Target
-
-# ARM Code Generation Libraries
-subdirs += \
-  lib/Target/ARM \
-  lib/Target/ARM/TargetInfo
-
-# AArch64 Code Generation Libraries
-subdirs += \
-  lib/Target/AArch64 \
-  lib/Target/AArch64/TargetInfo
-
-# MIPS Code Generation Libraries
-subdirs += \
-  lib/Target/Mips \
-  lib/Target/Mips/TargetInfo
-
-# X86 Code Generation Libraries
-subdirs += \
-  lib/Target/X86 \
-  lib/Target/X86/TargetInfo
-
-# mcld executable
-subdirs += tools/mcld
-
-include $(MCLD_ROOT_PATH)/mcld.mk
-include $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, $(subdirs)))
diff --git a/lib/ADT/Android.bp b/lib/ADT/Android.bp
new file mode 100644
index 0000000..ee09f47
--- /dev/null
+++ b/lib/ADT/Android.bp
@@ -0,0 +1,6 @@
+cc_library_static {
+    name: "libmcldADT",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: ["StringEntry.cpp"],
+}
diff --git a/lib/ADT/Android.mk b/lib/ADT/Android.mk
deleted file mode 100644
index 5318dd8..0000000
--- a/lib/ADT/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_adt_SRC_FILES := \
-  StringEntry.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_adt_SRC_FILES)
-LOCAL_MODULE:= libmcldADT
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_adt_SRC_FILES)
-LOCAL_MODULE:= libmcldADT
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Android.bp b/lib/Android.bp
new file mode 100644
index 0000000..b44c296
--- /dev/null
+++ b/lib/Android.bp
@@ -0,0 +1 @@
+subdirs = ["*"]
diff --git a/lib/Core/Android.bp b/lib/Core/Android.bp
new file mode 100644
index 0000000..e3934bd
--- /dev/null
+++ b/lib/Core/Android.bp
@@ -0,0 +1,17 @@
+cc_library_static {
+    name: "libmcldCore",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "AttributeOption.cpp",
+        "Environment.cpp",
+        "GeneralOptions.cpp",
+        "InputTree.cpp",
+        "IRBuilder.cpp",
+        "LinkerConfig.cpp",
+        "Linker.cpp",
+        "LinkerScript.cpp",
+        "Module.cpp",
+        "TargetOptions.cpp",
+    ],
+}
diff --git a/lib/Core/Android.mk b/lib/Core/Android.mk
deleted file mode 100644
index f75025b..0000000
--- a/lib/Core/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_core_SRC_FILES := \
-  AttributeOption.cpp \
-  Environment.cpp \
-  GeneralOptions.cpp \
-  InputTree.cpp \
-  IRBuilder.cpp \
-  LinkerConfig.cpp \
-  Linker.cpp \
-  LinkerScript.cpp \
-  Module.cpp \
-  TargetOptions.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_core_SRC_FILES)
-LOCAL_MODULE:= libmcldCore
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_core_SRC_FILES)
-LOCAL_MODULE:= libmcldCore
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Fragment/Android.bp b/lib/Fragment/Android.bp
new file mode 100644
index 0000000..0da4a5b
--- /dev/null
+++ b/lib/Fragment/Android.bp
@@ -0,0 +1,15 @@
+cc_library_static {
+    name: "libmcldFragment",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "AlignFragment.cpp",
+        "FillFragment.cpp",
+        "Fragment.cpp",
+        "FragmentRef.cpp",
+        "NullFragment.cpp",
+        "RegionFragment.cpp",
+        "Relocation.cpp",
+        "Stub.cpp",
+    ],
+}
diff --git a/lib/Fragment/Android.mk b/lib/Fragment/Android.mk
deleted file mode 100644
index 743232f..0000000
--- a/lib/Fragment/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_fragment_SRC_FILES := \
-  AlignFragment.cpp \
-  FillFragment.cpp \
-  Fragment.cpp \
-  FragmentRef.cpp \
-  NullFragment.cpp \
-  RegionFragment.cpp \
-  Relocation.cpp \
-  Stub.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_fragment_SRC_FILES)
-LOCAL_MODULE:= libmcldFragment
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_fragment_SRC_FILES)
-LOCAL_MODULE:= libmcldFragment
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/LD/Android.bp b/lib/LD/Android.bp
new file mode 100644
index 0000000..a296d81
--- /dev/null
+++ b/lib/LD/Android.bp
@@ -0,0 +1,78 @@
+// =====================================================
+// Static library: libmcldLD
+// =====================================================
+
+cc_library_static {
+    name: "libmcldLD",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+
+    srcs: [
+        "Archive.cpp",
+        "ArchiveReader.cpp",
+        "BranchIsland.cpp",
+        "BranchIslandFactory.cpp",
+        "BinaryReader.cpp",
+        "DWARFLineInfo.cpp",
+        "Diagnostic.cpp",
+        "DiagnosticEngine.cpp",
+        "DiagnosticInfos.cpp",
+        "DiagnosticLineInfo.cpp",
+        "DiagnosticPrinter.cpp",
+        "DebugString.cpp",
+        "DynObjReader.cpp",
+        "ELFBinaryReader.cpp",
+        "ELFSegment.cpp",
+        "ELFSegmentFactory.cpp",
+        "EhFrame.cpp",
+        "EhFrameHdr.cpp",
+        "EhFrameReader.cpp",
+        "GarbageCollection.cpp",
+        "GroupReader.cpp",
+        "IdenticalCodeFolding.cpp",
+        "LDContext.cpp",
+        "LDFileFormat.cpp",
+        "LDReader.cpp",
+        "LDSection.cpp",
+        "LDSymbol.cpp",
+        "MergedStringTable.cpp",
+        "MsgHandler.cpp",
+        "NamePool.cpp",
+        "ObjectWriter.cpp",
+        "RelocData.cpp",
+        "RelocationFactory.cpp",
+        "Relocator.cpp",
+        "ResolveInfo.cpp",
+        "Resolver.cpp",
+        "SectionData.cpp",
+        "SectionSymbolSet.cpp",
+        "StaticResolver.cpp",
+        "StubFactory.cpp",
+        "TextDiagnosticPrinter.cpp",
+    ],
+
+    static_libs: ["libz"],
+}
+
+// =====================================================
+// Static library: libmcldLDVariant
+// =====================================================
+
+cc_library_static {
+    name: "libmcldLDVariant",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+
+    srcs: [
+        "BSDArchiveReader.cpp",
+        "GNUArchiveReader.cpp",
+        "ELFDynObjFileFormat.cpp",
+        "ELFDynObjReader.cpp",
+        "ELFExecFileFormat.cpp",
+        "ELFFileFormat.cpp",
+        "ELFObjectReader.cpp",
+        "ELFObjectWriter.cpp",
+        "ELFReader.cpp",
+        "ELFReaderIf.cpp",
+    ],
+}
diff --git a/lib/LD/Android.mk b/lib/LD/Android.mk
deleted file mode 100644
index a9d0045..0000000
--- a/lib/LD/Android.mk
+++ /dev/null
@@ -1,114 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# =====================================================
-# Static library: libmcldLD
-# =====================================================
-
-mcld_ld_SRC_FILES := \
-  Archive.cpp \
-  ArchiveReader.cpp \
-  BranchIsland.cpp  \
-  BranchIslandFactory.cpp  \
-  BinaryReader.cpp \
-  DWARFLineInfo.cpp \
-  Diagnostic.cpp  \
-  DiagnosticEngine.cpp  \
-  DiagnosticInfos.cpp \
-  DiagnosticLineInfo.cpp  \
-  DiagnosticPrinter.cpp \
-  DebugString.cpp \
-  DynObjReader.cpp  \
-  ELFBinaryReader.cpp  \
-  ELFSegment.cpp  \
-  ELFSegmentFactory.cpp \
-  EhFrame.cpp \
-  EhFrameHdr.cpp  \
-  EhFrameReader.cpp  \
-  GarbageCollection.cpp \
-  GroupReader.cpp \
-  IdenticalCodeFolding.cpp \
-  LDContext.cpp \
-  LDFileFormat.cpp  \
-  LDReader.cpp  \
-  LDSection.cpp \
-  LDSymbol.cpp  \
-  MergedStringTable.cpp \
-  MsgHandler.cpp  \
-  NamePool.cpp  \
-  ObjectWriter.cpp  \
-  RelocData.cpp  \
-  RelocationFactory.cpp \
-  Relocator.cpp \
-  ResolveInfo.cpp \
-  Resolver.cpp  \
-  SectionData.cpp \
-  SectionSymbolSet.cpp \
-  StaticResolver.cpp  \
-  StubFactory.cpp  \
-  TextDiagnosticPrinter.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES += external/zlib
-LOCAL_SRC_FILES := $(mcld_ld_SRC_FILES)
-LOCAL_MODULE:= libmcldLD
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES += external/zlib
-LOCAL_SRC_FILES := $(mcld_ld_SRC_FILES)
-LOCAL_MODULE:= libmcldLD
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
-
-# =====================================================
-# Static library: libmcldLDVariant
-# =====================================================
-
-mcld_ld_variant_SRC_FILES := \
-  BSDArchiveReader.cpp  \
-  GNUArchiveReader.cpp  \
-  ELFDynObjFileFormat.cpp \
-  ELFDynObjReader.cpp \
-  ELFExecFileFormat.cpp \
-  ELFFileFormat.cpp \
-  ELFObjectReader.cpp \
-  ELFObjectWriter.cpp \
-  ELFReader.cpp \
-  ELFReaderIf.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_ld_variant_SRC_FILES)
-LOCAL_MODULE:= libmcldLDVariant
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_ld_variant_SRC_FILES)
-LOCAL_MODULE:= libmcldLDVariant
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/MC/Android.bp b/lib/MC/Android.bp
new file mode 100644
index 0000000..addc270
--- /dev/null
+++ b/lib/MC/Android.bp
@@ -0,0 +1,20 @@
+cc_library_static {
+    name: "libmcldMC",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "Attribute.cpp",
+        "AttributeSet.cpp",
+        "CommandAction.cpp",
+        "ContextFactory.cpp",
+        "FileAction.cpp",
+        "InputAction.cpp",
+        "InputBuilder.cpp",
+        "InputFactory.cpp",
+        "Input.cpp",
+        "MCLDDirectory.cpp",
+        "SearchDirs.cpp",
+        "SymbolCategory.cpp",
+        "ZOption.cpp",
+    ],
+}
diff --git a/lib/MC/Android.mk b/lib/MC/Android.mk
deleted file mode 100644
index cbd1962..0000000
--- a/lib/MC/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_mc_SRC_FILES := \
-  Attribute.cpp  \
-  AttributeSet.cpp  \
-  CommandAction.cpp  \
-  ContextFactory.cpp  \
-  FileAction.cpp  \
-  InputAction.cpp  \
-  InputBuilder.cpp  \
-  InputFactory.cpp  \
-  Input.cpp \
-  MCLDDirectory.cpp \
-  SearchDirs.cpp  \
-  SymbolCategory.cpp  \
-  ZOption.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mc_SRC_FILES)
-LOCAL_MODULE:= libmcldMC
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mc_SRC_FILES)
-LOCAL_MODULE:= libmcldMC
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Object/Android.bp b/lib/Object/Android.bp
new file mode 100644
index 0000000..c671359
--- /dev/null
+++ b/lib/Object/Android.bp
@@ -0,0 +1,10 @@
+cc_library_static {
+    name: "libmcldObject",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "ObjectBuilder.cpp",
+        "ObjectLinker.cpp",
+        "SectionMap.cpp",
+    ],
+}
diff --git a/lib/Object/Android.mk b/lib/Object/Android.mk
deleted file mode 100644
index 56334f9..0000000
--- a/lib/Object/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_object_SRC_FILES := \
-  ObjectBuilder.cpp \
-  ObjectLinker.cpp \
-  SectionMap.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_object_SRC_FILES)
-LOCAL_MODULE:= libmcldObject
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_object_SRC_FILES)
-LOCAL_MODULE:= libmcldObject
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Script/Android.bp b/lib/Script/Android.bp
new file mode 100644
index 0000000..b4daaba
--- /dev/null
+++ b/lib/Script/Android.bp
@@ -0,0 +1,39 @@
+cc_library_static {
+    name: "libmcldScript",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "AssertCmd.cpp",
+        "Assignment.cpp",
+        "BinaryOp.cpp",
+        "EntryCmd.cpp",
+        "FileToken.cpp",
+        "GroupCmd.cpp",
+        "InputCmd.cpp",
+        "InputSectDesc.cpp",
+        "InputToken.cpp",
+        "NameSpec.cpp",
+        "NullaryOp.cpp",
+        "Operand.cpp",
+        "Operator.cpp",
+        "OutputArchCmd.cpp",
+        "OutputCmd.cpp",
+        "OutputFormatCmd.cpp",
+        "OutputSectDesc.cpp",
+        "RpnEvaluator.cpp",
+        "RpnExpr.cpp",
+        "ScriptCommand.cpp",
+        "ScriptFile.cpp",
+        "ScriptReader.cpp",
+        "SearchDirCmd.cpp",
+        "SectionsCmd.cpp",
+        "ScriptScanner.ll",
+        "ScriptParser.yy",
+        "StrToken.cpp",
+        "StringList.cpp",
+        "TernaryOp.cpp",
+        "UnaryOp.cpp",
+        "WildcardPattern.cpp",
+    ],
+    include_dirs: ["frameworks/compile/mclinker/include/mcld/Script"],
+}
diff --git a/lib/Script/Android.mk b/lib/Script/Android.mk
deleted file mode 100644
index ed61f9b..0000000
--- a/lib/Script/Android.mk
+++ /dev/null
@@ -1,62 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_script_SRC_FILES := \
-  AssertCmd.cpp \
-  Assignment.cpp \
-  BinaryOp.cpp \
-  EntryCmd.cpp \
-  FileToken.cpp \
-  GroupCmd.cpp \
-  InputCmd.cpp \
-  InputSectDesc.cpp \
-  InputToken.cpp \
-  NameSpec.cpp \
-  NullaryOp.cpp \
-  Operand.cpp \
-  Operator.cpp \
-  OutputArchCmd.cpp \
-  OutputCmd.cpp \
-  OutputFormatCmd.cpp \
-  OutputSectDesc.cpp \
-  RpnEvaluator.cpp \
-  RpnExpr.cpp \
-  ScriptCommand.cpp \
-  ScriptFile.cpp \
-  ScriptReader.cpp \
-  SearchDirCmd.cpp \
-  SectionsCmd.cpp \
-  ScriptScanner.ll \
-  ScriptParser.yy \
-  StrToken.cpp \
-  StringList.cpp \
-  TernaryOp.cpp \
-  UnaryOp.cpp \
-  WildcardPattern.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_script_SRC_FILES)
-LOCAL_MODULE:= libmcldScript
-LOCAL_C_INCLUDES := $(MCLD_ROOT_PATH)/include/mcld/Script
-LOCAL_CFLAGS := -Wno-deprecated-register
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_script_SRC_FILES)
-LOCAL_MODULE:= libmcldScript
-LOCAL_C_INCLUDES := $(MCLD_ROOT_PATH)/include/mcld/Script
-LOCAL_CFLAGS := -Wno-deprecated-register
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Support/Android.bp b/lib/Support/Android.bp
new file mode 100644
index 0000000..324390a
--- /dev/null
+++ b/lib/Support/Android.bp
@@ -0,0 +1,22 @@
+cc_library_static {
+    name: "libmcldSupport",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "Demangle.cpp",
+        "Directory.cpp",
+        "FileHandle.cpp",
+        "FileOutputBuffer.cpp",
+        "FileSystem.cpp",
+        "LEB128.cpp",
+        "MemoryArea.cpp",
+        "MemoryAreaFactory.cpp",
+        "MsgHandling.cpp",
+        "Path.cpp",
+        "raw_ostream.cpp",
+        "RealPath.cpp",
+        "SystemUtils.cpp",
+        "Target.cpp",
+        "TargetRegistry.cpp",
+    ],
+}
diff --git a/lib/Support/Android.mk b/lib/Support/Android.mk
deleted file mode 100644
index 54cfc22..0000000
--- a/lib/Support/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_support_SRC_FILES := \
-  Demangle.cpp \
-  Directory.cpp \
-  FileHandle.cpp \
-  FileOutputBuffer.cpp \
-  FileSystem.cpp \
-  LEB128.cpp \
-  MemoryArea.cpp \
-  MemoryAreaFactory.cpp \
-  MsgHandling.cpp \
-  Path.cpp \
-  raw_ostream.cpp \
-  RealPath.cpp \
-  SystemUtils.cpp \
-  Target.cpp \
-  TargetRegistry.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_support_SRC_FILES)
-LOCAL_MODULE:= libmcldSupport
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_support_SRC_FILES)
-LOCAL_MODULE:= libmcldSupport
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/AArch64/Android.bp b/lib/Target/AArch64/Android.bp
new file mode 100644
index 0000000..d922741
--- /dev/null
+++ b/lib/Target/AArch64/Android.bp
@@ -0,0 +1,21 @@
+cc_library_static {
+    name: "libmcldAArch64Target",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "AArch64CA53Erratum835769Stub.cpp",
+        "AArch64CA53Erratum843419Stub2.cpp",
+        "AArch64CA53Erratum843419Stub.cpp",
+        "AArch64CA53ErratumStub.cpp",
+        "AArch64Diagnostic.cpp",
+        "AArch64ELFDynamic.cpp",
+        "AArch64Emulation.cpp",
+        "AArch64GOT.cpp",
+        "AArch64LDBackend.cpp",
+        "AArch64LongBranchStub.cpp",
+        "AArch64PLT.cpp",
+        "AArch64Relocator.cpp",
+    ],
+}
+
+subdirs = ["TargetInfo"]
diff --git a/lib/Target/AArch64/Android.mk b/lib/Target/AArch64/Android.mk
deleted file mode 100644
index 3abc1be..0000000
--- a/lib/Target/AArch64/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_aarch64_target_SRC_FILES := \
-  AArch64CA53Erratum835769Stub.cpp \
-  AArch64CA53Erratum843419Stub2.cpp \
-  AArch64CA53Erratum843419Stub.cpp \
-  AArch64CA53ErratumStub.cpp \
-  AArch64Diagnostic.cpp \
-  AArch64ELFDynamic.cpp \
-  AArch64Emulation.cpp \
-  AArch64GOT.cpp \
-  AArch64LDBackend.cpp \
-  AArch64LongBranchStub.cpp \
-  AArch64PLT.cpp \
-  AArch64Relocator.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_aarch64_target_SRC_FILES)
-LOCAL_MODULE:= libmcldAArch64Target
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_aarch64_target_SRC_FILES)
-LOCAL_MODULE:= libmcldAArch64Target
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
-
diff --git a/lib/Target/AArch64/TargetInfo/Android.bp b/lib/Target/AArch64/TargetInfo/Android.bp
new file mode 100644
index 0000000..6900d91
--- /dev/null
+++ b/lib/Target/AArch64/TargetInfo/Android.bp
@@ -0,0 +1,6 @@
+cc_library_static {
+    name: "libmcldAArch64Info",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: ["AArch64TargetInfo.cpp"],
+}
diff --git a/lib/Target/AArch64/TargetInfo/Android.mk b/lib/Target/AArch64/TargetInfo/Android.mk
deleted file mode 100644
index 1b4026d..0000000
--- a/lib/Target/AArch64/TargetInfo/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_arm_info_SRC_FILES := \
-  AArch64TargetInfo.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_info_SRC_FILES)
-LOCAL_MODULE:= libmcldAArch64Info
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_info_SRC_FILES)
-LOCAL_MODULE:= libmcldAArch64Info
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/ARM/Android.bp b/lib/Target/ARM/Android.bp
new file mode 100644
index 0000000..10e2a41
--- /dev/null
+++ b/lib/Target/ARM/Android.bp
@@ -0,0 +1,22 @@
+cc_library_static {
+    name: "libmcldARMTarget",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "ARMDiagnostic.cpp",
+        "ARMELFAttributeData.cpp",
+        "ARMELFDynamic.cpp",
+        "ARMEmulation.cpp",
+        "ARMException.cpp",
+        "ARMGOT.cpp",
+        "ARMLDBackend.cpp",
+        "ARMPLT.cpp",
+        "ARMRelocator.cpp",
+        "ARMToARMStub.cpp",
+        "ARMToTHMStub.cpp",
+        "THMToARMStub.cpp",
+        "THMToTHMStub.cpp",
+    ],
+}
+
+subdirs = ["TargetInfo"]
diff --git a/lib/Target/ARM/Android.mk b/lib/Target/ARM/Android.mk
deleted file mode 100644
index a2d5d97..0000000
--- a/lib/Target/ARM/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_arm_target_SRC_FILES := \
-  ARMDiagnostic.cpp \
-  ARMELFAttributeData.cpp \
-  ARMELFDynamic.cpp \
-  ARMEmulation.cpp \
-  ARMException.cpp \
-  ARMGOT.cpp  \
-  ARMLDBackend.cpp  \
-  ARMPLT.cpp  \
-  ARMRelocator.cpp  \
-  ARMToARMStub.cpp \
-  ARMToTHMStub.cpp \
-  THMToARMStub.cpp \
-  THMToTHMStub.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_target_SRC_FILES)
-LOCAL_MODULE:= libmcldARMTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_target_SRC_FILES)
-LOCAL_MODULE:= libmcldARMTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
-
diff --git a/lib/Target/ARM/TargetInfo/Android.bp b/lib/Target/ARM/TargetInfo/Android.bp
new file mode 100644
index 0000000..8717576
--- /dev/null
+++ b/lib/Target/ARM/TargetInfo/Android.bp
@@ -0,0 +1,6 @@
+cc_library_static {
+    name: "libmcldARMInfo",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: ["ARMTargetInfo.cpp"],
+}
diff --git a/lib/Target/ARM/TargetInfo/Android.mk b/lib/Target/ARM/TargetInfo/Android.mk
deleted file mode 100644
index 1920bb3..0000000
--- a/lib/Target/ARM/TargetInfo/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_arm_info_SRC_FILES := \
-  ARMTargetInfo.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_info_SRC_FILES)
-LOCAL_MODULE:= libmcldARMInfo
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_arm_info_SRC_FILES)
-LOCAL_MODULE:= libmcldARMInfo
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/Android.bp b/lib/Target/Android.bp
new file mode 100644
index 0000000..d852c11
--- /dev/null
+++ b/lib/Target/Android.bp
@@ -0,0 +1,25 @@
+cc_library_static {
+    name: "libmcldTarget",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "ELFAttribute.cpp",
+        "ELFAttributeData.cpp",
+        "ELFAttributeValue.cpp",
+        "ELFDynamic.cpp",
+        "ELFEmulation.cpp",
+        "GNUInfo.cpp",
+        "GNULDBackend.cpp",
+        "GOT.cpp",
+        "OutputRelocSection.cpp",
+        "PLT.cpp",
+        "TargetLDBackend.cpp",
+    ],
+}
+
+subdirs = [
+    "AArch64",
+    "ARM",
+    "Mips",
+    "X86",
+]
diff --git a/lib/Target/Android.mk b/lib/Target/Android.mk
deleted file mode 100644
index aaeb589..0000000
--- a/lib/Target/Android.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_target_SRC_FILES := \
-  ELFAttribute.cpp \
-  ELFAttributeData.cpp \
-  ELFAttributeValue.cpp \
-  ELFDynamic.cpp \
-  ELFEmulation.cpp \
-  GNUInfo.cpp \
-  GNULDBackend.cpp \
-  GOT.cpp \
-  OutputRelocSection.cpp \
-  PLT.cpp \
-  TargetLDBackend.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_target_SRC_FILES)
-LOCAL_MODULE:= libmcldTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_target_SRC_FILES)
-LOCAL_MODULE:= libmcldTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/Mips/Android.bp b/lib/Target/Mips/Android.bp
new file mode 100644
index 0000000..3e281b4
--- /dev/null
+++ b/lib/Target/Mips/Android.bp
@@ -0,0 +1,20 @@
+cc_library_static {
+    name: "libmcldMipsTarget",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "MipsAbiFlags.cpp",
+        "MipsDiagnostic.cpp",
+        "MipsELFDynamic.cpp",
+        "MipsEmulation.cpp",
+        "MipsGNUInfo.cpp",
+        "MipsGOT.cpp",
+        "MipsGOTPLT.cpp",
+        "MipsLA25Stub.cpp",
+        "MipsLDBackend.cpp",
+        "MipsPLT.cpp",
+        "MipsRelocator.cpp",
+    ],
+}
+
+subdirs = ["TargetInfo"]
diff --git a/lib/Target/Mips/Android.mk b/lib/Target/Mips/Android.mk
deleted file mode 100644
index 17e93f5..0000000
--- a/lib/Target/Mips/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_mips_target_SRC_FILES := \
-  MipsAbiFlags.cpp \
-  MipsDiagnostic.cpp  \
-  MipsELFDynamic.cpp  \
-  MipsEmulation.cpp \
-  MipsGNUInfo.cpp \
-  MipsGOT.cpp \
-  MipsGOTPLT.cpp \
-  MipsLA25Stub.cpp \
-  MipsLDBackend.cpp \
-  MipsPLT.cpp \
-  MipsRelocator.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mips_target_SRC_FILES)
-LOCAL_MODULE:= libmcldMipsTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mips_target_SRC_FILES)
-LOCAL_MODULE:= libmcldMipsTarget
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
-
diff --git a/lib/Target/Mips/TargetInfo/Android.bp b/lib/Target/Mips/TargetInfo/Android.bp
new file mode 100644
index 0000000..6c60603
--- /dev/null
+++ b/lib/Target/Mips/TargetInfo/Android.bp
@@ -0,0 +1,6 @@
+cc_library_static {
+    name: "libmcldMipsInfo",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: ["MipsTargetInfo.cpp"],
+}
diff --git a/lib/Target/Mips/TargetInfo/Android.mk b/lib/Target/Mips/TargetInfo/Android.mk
deleted file mode 100644
index 5a92217..0000000
--- a/lib/Target/Mips/TargetInfo/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_mips_info_SRC_FILES := \
-  MipsTargetInfo.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mips_info_SRC_FILES)
-LOCAL_MODULE:= libmcldMipsInfo
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_mips_info_SRC_FILES)
-LOCAL_MODULE:= libmcldMipsInfo
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/X86/Android.bp b/lib/Target/X86/Android.bp
new file mode 100644
index 0000000..603bff1
--- /dev/null
+++ b/lib/Target/X86/Android.bp
@@ -0,0 +1,17 @@
+cc_library_static {
+    name: "libmcldX86Target",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: [
+        "X86Diagnostic.cpp",
+        "X86ELFDynamic.cpp",
+        "X86Emulation.cpp",
+        "X86GOT.cpp",
+        "X86GOTPLT.cpp",
+        "X86LDBackend.cpp",
+        "X86PLT.cpp",
+        "X86Relocator.cpp",
+    ],
+}
+
+subdirs = ["TargetInfo"]
diff --git a/lib/Target/X86/Android.mk b/lib/Target/X86/Android.mk
deleted file mode 100644
index ee136ff..0000000
--- a/lib/Target/X86/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_x86_target_SRC_FILES := \
-  X86Diagnostic.cpp \
-  X86ELFDynamic.cpp \
-  X86Emulation.cpp  \
-  X86GOT.cpp  \
-  X86GOTPLT.cpp  \
-  X86LDBackend.cpp  \
-  X86PLT.cpp  \
-  X86Relocator.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_x86_target_SRC_FILES)
-LOCAL_MODULE:= libmcldX86Target
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_x86_target_SRC_FILES)
-LOCAL_MODULE:= libmcldX86Target
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Target/X86/TargetInfo/Android.bp b/lib/Target/X86/TargetInfo/Android.bp
new file mode 100644
index 0000000..b02c039
--- /dev/null
+++ b/lib/Target/X86/TargetInfo/Android.bp
@@ -0,0 +1,6 @@
+cc_library_static {
+    name: "libmcldX86Info",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    srcs: ["X86TargetInfo.cpp"],
+}
diff --git a/lib/Target/X86/TargetInfo/Android.mk b/lib/Target/X86/TargetInfo/Android.mk
deleted file mode 100644
index d520580..0000000
--- a/lib/Target/X86/TargetInfo/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-mcld_x86_info_SRC_FILES := \
-  X86TargetInfo.cpp
-
-# For the host
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_x86_info_SRC_FILES)
-LOCAL_MODULE:= libmcldX86Info
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-# For the device
-# =====================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(mcld_x86_info_SRC_FILES)
-LOCAL_MODULE:= libmcldX86Info
-
-LOCAL_MODULE_TAGS := optional
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_STATIC_LIBRARY)
diff --git a/mcld-device-build.mk b/mcld-device-build.mk
deleted file mode 100644
index 5734e91..0000000
--- a/mcld-device-build.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-include $(LLVM_DEVICE_BUILD_MK)
-
-# The three inline options together reduce libbcc.so almost 1MB.
-# We move them from global build/core/combo/TARGET_linux-arm.mk
-# to here.
-LOCAL_CFLAGS := \
-  -DANDROID_TARGET_BUILD \
-  -finline-functions \
-  -include $(MCLD_ROOT_PATH)/include/mcld/Config/Config.h \
-  $(LOCAL_CFLAGS)
-
-LOCAL_CPPFLAGS := \
-  $(LOCAL_CPPFLAGS) \
-  -Wall \
-  -Wno-unused-parameter \
-  -Wno-unused-private-field \
-  -Wno-unused-const-variable \
-  -Werror
-
-ifeq ($(MCLD_ENABLE_ASSERTION),true)
-  LOCAL_CPPFLAGS += \
-    -D_DEBUG \
-    -UNDEBUG
-endif
-
-ifeq ($(HOST_OS),darwin)
-LOCAL_CFLAGS += -DDARWIN_FLEX=1
-endif
-
-ifeq ($(BUILD_ARM_FOR_X86),true)
-LOCAL_CFLAGS_x86 += -DPROVIDE_ARM_CODEGEN -DFORCE_BUILD_ARM
-LOCAL_CFLAGS_x86_64 += -DPROVIDE_ARM_CODEGEN -DFORCE_BUILD_ARM
-endif
-
-# Make sure bionic is first so we can include system headers.
-LOCAL_C_INCLUDES := \
-  bionic \
-  external/libcxx/include \
-  external/libcxxabi/include \
-  $(MCLD_ROOT_PATH)/include \
-  $(LLVM_ROOT_PATH) \
-  $(LLVM_ROOT_PATH)/include \
-  $(LLVM_ROOT_PATH)/device/include \
-  $(LOCAL_C_INCLUDES)
diff --git a/mcld-host-build.mk b/mcld-host-build.mk
deleted file mode 100644
index 9bfc958..0000000
--- a/mcld-host-build.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-include $(LLVM_HOST_BUILD_MK)
-
-LOCAL_CFLAGS := \
-  -include $(MCLD_ROOT_PATH)/include/mcld/Config/Config.h \
-  $(LOCAL_CFLAGS)
-
-LOCAL_CPPFLAGS := \
-  $(LOCAL_CPPFLAGS) \
-  -Wno-unused-private-field \
-  -Wno-unused-const-variable \
-  -Wall
-
-ifeq ($(MCLD_ENABLE_ASSERTION),true)
-  LOCAL_CPPFLAGS += \
-    -D_DEBUG \
-    -UNDEBUG
-endif
-
-LOCAL_CLANG := true
-
-ifeq ($(HOST_OS),darwin)
-LOCAL_CFLAGS += -DDARWIN_FLEX=1
-endif
-
-LOCAL_C_INCLUDES := \
-  $(MCLD_ROOT_PATH)/include \
-  $(LLVM_ROOT_PATH) \
-  $(LLVM_ROOT_PATH)/include \
-  $(LLVM_ROOT_PATH)/host/include \
-  $(LOCAL_C_INCLUDES)
-
-LOCAL_IS_HOST_MODULE := true
diff --git a/mcld.mk b/mcld.mk
deleted file mode 100644
index 3fa71f9..0000000
--- a/mcld.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-ifeq ($(MCLD_ROOT_PATH),)
-$(error Must set variable MCLD_ROOT_PATH before including this! $(LOCAL_PATH))
-endif
-
-MCLD_HOST_BUILD_MK := $(MCLD_ROOT_PATH)/mcld-host-build.mk
-MCLD_DEVICE_BUILD_MK := $(MCLD_ROOT_PATH)/mcld-device-build.mk
-
-ifeq ($(LLVM_ROOT_PATH),)
-$(error Must set variable LLVM_ROOT_PATH before including this! $(LOCAL_PATH))
-endif
-
-include $(LLVM_ROOT_PATH)/llvm.mk
diff --git a/tools/mcld/Android.bp b/tools/mcld/Android.bp
new file mode 100644
index 0000000..297e646
--- /dev/null
+++ b/tools/mcld/Android.bp
@@ -0,0 +1,91 @@
+// Collect target specific code generation libraries
+MCLD_ARM_LIBS = [
+    "libmcldARMTarget",
+    "libmcldARMInfo",
+]
+MCLD_AARCH64_LIBS = [
+    "libmcldAArch64Target",
+    "libmcldAArch64Info",
+]
+MCLD_MIPS_LIBS = [
+    "libmcldMipsTarget",
+    "libmcldMipsInfo",
+]
+MCLD_X86_LIBS = [
+    "libmcldX86Target",
+    "libmcldX86Info",
+]
+
+// Build Options.inc from Options.td
+llvm_tblgen {
+    name: "mcld-gen-options",
+    in: "Options.td",
+    outs: ["Options.inc"],
+}
+
+cc_binary {
+    name: "ld.mc",
+    defaults: ["mcld-defaults"],
+    host_supported: true,
+    generated_headers: ["mcld-gen-options"],
+
+    srcs: ["Main.cpp"],
+
+    // arch-specific static libraries depend on libmcldTarget.
+    // Can be removed once soong supports transitive static library dependencies
+    group_static_libs: true,
+    static_libs: [
+        "libmcldADT",
+        "libmcldCore",
+        "libmcldFragment",
+        "libmcldLD",
+        "libmcldLDVariant",
+        "libmcldMC",
+        "libmcldObject",
+        "libmcldScript",
+        "libmcldSupport",
+        "libmcldTarget",
+    ],
+
+    shared_libs: [
+        "libLLVM",
+    ],
+
+    target: {
+        host: {
+            shared_libs: ["libz-host"],
+            static_libs: MCLD_ARM_LIBS + MCLD_AARCH64_LIBS +
+                MCLD_MIPS_LIBS + MCLD_X86_LIBS,
+        },
+        android: {
+            shared_libs: ["libz"],
+        },
+
+        // Add target specific code generation libraries
+        android_arm: {
+            static_libs: MCLD_ARM_LIBS,
+        },
+        android_arm64: {
+            // Include ARM libs to enable 32-bit linking on AARCH64 targets
+            static_libs: MCLD_ARM_LIBS + MCLD_AARCH64_LIBS,
+        },
+        android_mips: {
+            static_libs: MCLD_MIPS_LIBS,
+        },
+        android_mips64: {
+            static_libs: MCLD_MIPS_LIBS,
+        },
+        android_x86: {
+            static_libs: MCLD_X86_LIBS,
+        },
+        android_x86_64: {
+            static_libs: MCLD_X86_LIBS,
+        },
+        arm_on_x86: {
+            static_libs: MCLD_ARM_LIBS + MCLD_AARCH64_LIBS,
+        },
+        arm_on_x86_64: {
+            static_libs: MCLD_ARM_LIBS + MCLD_AARCH64_LIBS,
+        },
+    },
+}
diff --git a/tools/mcld/Android.mk b/tools/mcld/Android.mk
deleted file mode 100644
index 0405848..0000000
--- a/tools/mcld/Android.mk
+++ /dev/null
@@ -1,115 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-LOCAL_MODULE_TAGS := optional
-
-# Set up common build variables
-# =====================================================
-
-MCLD_C_INCLUDES := $(LOCAL_PATH)/include
-
-MCLD_SRC_FILES := \
-  Main.cpp
-
-
-MCLD_WHOLE_STATIC_LIBRARIES := \
-  libmcldADT \
-  libmcldCore \
-  libmcldFragment \
-  libmcldLD \
-  libmcldLDVariant \
-  libmcldMC \
-  libmcldObject \
-  libmcldScript \
-  libmcldSupport \
-  libmcldTarget
-
-MCLD_SHARED_LIBRARIES := libLLVM
-
-# Collect target specific code generation libraries
-MCLD_ARM_LIBS := libmcldARMTarget libmcldARMInfo
-MCLD_AARCH64_LIBS := libmcldAArch64Target libmcldAArch64Info
-MCLD_MIPS_LIBS := libmcldMipsTarget libmcldMipsInfo
-MCLD_X86_LIBS := libmcldX86Target libmcldX86Info
-
-MCLD_MODULE:= ld.mc
-
-# Executable for the device
-# =====================================================
-include $(CLEAR_VARS)
-include $(CLEAR_TBLGEN_VARS)
-
-LOCAL_C_INCLUDES := $(MCLD_C_INCLUDES)
-LOCAL_SRC_FILES := $(MCLD_SRC_FILES)
-LOCAL_WHOLE_STATIC_LIBRARIES := $(MCLD_WHOLE_STATIC_LIBRARIES)
-
-# Add target specific code generation libraries
-ifeq ($(TARGET_ARCH), arm)
-  LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_ARM_LIBS)
-endif
-
-# Include ARM libs to enable 32-bit linking on AARCH64 targets
-ifeq ($(TARGET_ARCH), arm64)
-  LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_AARCH64_LIBS) \
-                                  $(MCLD_ARM_LIBS)
-endif
-
-ifneq (, $(findstring mips,$(TARGET_ARCH)))
-  LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_MIPS_LIBS)
-endif
-
-# Add x86 libraries for both x86 and x86_64 targets
-ifneq (, $(findstring x86,$(TARGET_ARCH)))
-  LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_X86_LIBS)
-ifeq ($(BUILD_ARM_FOR_X86),true)
-  LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_ARM_LIBS) \
-                                  $(MCLD_AARCH64_LIBS)
-endif
-endif
-
-
-# zlib's libnames are different for the host and target.
-# For the target, it is the standard libz
-LOCAL_SHARED_LIBRARIES := $(MCLD_SHARED_LIBRARIES) libz
-
-LOCAL_MODULE := $(MCLD_MODULE)
-LOCAL_MODULE_CLASS := EXECUTABLES
-
-# Build Options.inc from Options.td for the device
-intermediates := $(call local-generated-sources-dir)
-LOCAL_GENERATED_SOURCES += $(intermediates)/Options.inc
-$(intermediates)/Options.inc: $(LOCAL_PATH)/Options.td $(LLVM_ROOT_PATH)/include/llvm/Option/OptParser.td $(LLVM_TBLGEN)
-	$(call transform-device-td-to-out,opt-parser-defs)
-
-include $(MCLD_DEVICE_BUILD_MK)
-include $(BUILD_EXECUTABLE)
-
-# Executable for the host
-# =====================================================
-include $(CLEAR_VARS)
-include $(CLEAR_TBLGEN_VARS)
-
-LOCAL_C_INCLUDES := $(MCLD_C_INCLUDES)
-LOCAL_SRC_FILES := $(MCLD_SRC_FILES)
-
-LOCAL_WHOLE_STATIC_LIBRARIES := $(MCLD_WHOLE_STATIC_LIBRARIES)
-LOCAL_WHOLE_STATIC_LIBRARIES += $(MCLD_ARM_LIBS) \
-                                $(MCLD_AARCH64_LIBS) \
-                                $(MCLD_MIPS_LIBS) \
-                                $(MCLD_X86_LIBS)
-
-# zlib's libnames are different for the host and target.
-# For the host, it is libz-host
-LOCAL_SHARED_LIBRARIES := $(MCLD_SHARED_LIBRARIES) libz-host
-
-LOCAL_MODULE := $(MCLD_MODULE)
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_IS_HOST_MODULE := true
-
-# Build Options.inc from Options.td for the host
-intermediates := $(call local-generated-sources-dir)
-LOCAL_GENERATED_SOURCES += $(intermediates)/Options.inc
-$(intermediates)/Options.inc: $(LOCAL_PATH)/Options.td $(LLVM_ROOT_PATH)/include/llvm/Option/OptParser.td $(LLVM_TBLGEN)
-	$(call transform-host-td-to-out,opt-parser-defs)
-
-include $(MCLD_HOST_BUILD_MK)
-include $(BUILD_HOST_EXECUTABLE)