Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / native_client / build / toolchain / BUILD.gn
index 88c73c9..5a5e5c2 100644 (file)
@@ -9,10 +9,26 @@
 #
 
 #
+# Toolchain Assembly
+#
+# Assembling the (P)NaCl toolchains is done with the default toolchain.  Any
+# pieces that need to be compile for a fully assembled toolchain are created
+# by default toolchain groups which depend on targets specifiying a raw
+# toolchain such as libnacl.a or crtX.S.
+#
+# Toolchain assembly happens through the template "prep_toolchain" which
+# in turn invokes the following three steps:
+# 1- toolchain_untar
+# 2- toolchain_copies (at this point the raw toolchain is ready)
+# 3- toolchain_build (which generates the CRT and libnacl files)
+#
+
+#
 # Untar the toolchain and generate the untar'd stamp which is really a copy
-# of the json describing the file.
+# of the json describing the file.  This used the default toolchain to avoid
+# circular dependencies.
 #
-template("untar_toolchain") {
+template("toolchain_untar") {
   package = invoker.package
   action(target_name) {
     sources = [
@@ -32,16 +48,16 @@ template("untar_toolchain") {
   }
 }
 
+
 #
-# Prepare the toolchain by copying in the appropriate headers, crtX.o files,
-# and libnacl.a.
+# Copy appropriate nacl headers and empty crt1.o
 #
-template("prep_toolchain") {
+template("toolchain_copies") {
   package_libc = invoker.package_libc
   package_arch = invoker.package_arch
   package = "nacl_${package_arch}_${package_libc}"
+  toolchain_dir = invoker.toolchain_dir
 
-  toolchain_dir = "${root_build_dir}/toolchain/${build_os}_x86/${package}"
   if (package_arch != "arm") {
     install_dir = "${toolchain_dir}/x86_64-nacl"
   } else {
@@ -57,7 +73,7 @@ template("prep_toolchain") {
       "//native_client/src/untrusted/irt/irt_dev.h",
     ]
 
-    if (nacl_libc == "newlib") {
+    if (package_libc == "newlib") {
       sources += [
         "//native_client/src/untrusted/pthread/pthread.h",
         "//native_client/src/untrusted/pthread/semaphore.h",
@@ -65,7 +81,7 @@ template("prep_toolchain") {
     }
     outputs = [ "${install_dir}/include/{{source_file_part}}" ]
     deps = [
-      "//native_client/build/toolchain:untar_${package}"
+      "//native_client/build/toolchain:${package}_untar"
     ]
   }
 
@@ -83,171 +99,242 @@ template("prep_toolchain") {
     ]
     outputs = [ "${install_dir}/include//nacl/{{source_file_part}}" ]
     deps = [
-      "//native_client/build/toolchain:untar_${package}"
+      "//native_client/build/toolchain:${package}_untar"
     ]
   }
 
   #
+  # Copy empty CRT files to <TC>/<ARCH>/lib
+  #
+  copy("${target_name}_crt1") {
+    sources = [  "//native_client/src/untrusted/stubs/crt1.x" ]
+    outputs = [ "${install_dir}/lib/crt1.o" ]
+    deps = [
+      "//native_client/build/toolchain:${package}_untar"
+    ]
+  }
+  if (package_arch == "x86") {
+    copy("${target_name}_crt1_32") {
+      sources = [  "//native_client/src/untrusted/stubs/crt1.x" ]
+      outputs = [ "${install_dir}/lib32/crt1.o" ]
+      deps = [
+        "//native_client/build/toolchain:${package}_untar"
+      ]
+    }
+  }
+
+  group(target_name) {
+    if (defined(datadeps) == false) {
+      datadeps = []
+    }
+
+    datadeps += [
+      # Header copy targets
+      ":${target_name}_root_headers",
+      ":${target_name}_nacl_headers",
+      ":${target_name}_crt1"
+    ]
+
+    if (package_arch == "x86") {
+      datadeps += [
+        ":${target_name}_crt1_32"
+      ]
+    }
+  }
+}
+
+
+#
+# Source sets for the various crtX.o files which can be used by multiple
+# nacl toolchains.
+#
+source_set("crt_x86_32") {
+  sources = [
+    "//native_client/src/untrusted/stubs/crti_x86_32.S",
+    "//native_client/src/untrusted/stubs/crtn_x86_32.S",
+  ]
+}
+
+source_set("crt_x86_64") {
+  sources = [
+    "//native_client/src/untrusted/stubs/crti_x86_64.S",
+    "//native_client/src/untrusted/stubs/crtn_x86_64.S",
+  ]
+}
+
+source_set("crt_arm") {
+  sources = [
+    "//native_client/src/untrusted/stubs/crti_arm.S",
+    "//native_client/src/untrusted/stubs/crtn_arm.S",
+  ]
+}
+
+
+#
+# Invoke toolchain specific dependencies on the CRT files and libnacl.a then
+# copy them to the toolchain directory.
+#
+template("toolchain_build") {
+  package_arch = invoker.package_arch
+  package_libc = invoker.package_libc
+  toolchain_dir = invoker.toolchain_dir
+
+  if (package_arch != "arm") {
+    install_dir = "${toolchain_dir}/x86_64-nacl"
+  } else {
+    install_dir = "${toolchain_dir}/arm-nacl"
+  }
+  obj_dir = "${root_build_dir}/raw_${package_libc}_${package_arch}/obj"
+
+  #
   # Copy crti, crtn, and crt1 into <TC>/<ARCH>/lib
   #
   if (package_arch == "arm") {
-    crt_path = "${root_build_dir}/raw_newlib_arm/obj/native_client/src/untrusted/stubs"
+    crt_path = "${obj_dir}/native_client/src/untrusted/stubs"
     copy("${target_name}_crti_arm") {
       sources = [  "${crt_path}/crt_arm.crti_arm.o" ]
       outputs = [ "${install_dir}/lib/crti.o" ]
+      deps = [
+        ":crt_arm(//native_client/build/toolchain/nacl:raw_${package_libc}_arm)"
+      ]
     }
     copy("${target_name}_crtn_arm") {
       sources = [  "${crt_path}/crt_arm.crtn_arm.o" ]
       outputs = [ "${install_dir}/lib/crtn.o" ]
+      deps = [
+        ":crt_arm(//native_client/build/toolchain/nacl:raw_${package_libc}_arm)"
+      ]
     }
-    copy("${target_name}_crt1_arm") {
-      sources = [  "//native_client/src/untrusted/stubs/crt1.x" ]
-      outputs = [ "${install_dir}/lib/crt1.o" ]
-    }
-
-    nacl_path = "${root_build_dir}/raw_newlib_arm/obj/native_client/src/untrusted/nacl"
+    nacl_path = "${obj_dir}/native_client/src/untrusted/nacl"
     copy("${target_name}_libnacl_arm") {
       sources = [ "${nacl_path}/libnacl.a" ]
       outputs = [ "${install_dir}/lib/libnacl.a" ]
+      deps = [
+        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_${package_libc}_arm)",
+      ]
     }
   } else {
-    crt_path = "${root_build_dir}/raw_newlib_x86/obj/native_client/src/untrusted/stubs"
+    crt_path = "${obj_dir}/native_client/src/untrusted/stubs"
     copy("${target_name}_crti_x86_32") {
       sources = [  "${crt_path}/crt_x86_32.crti_x86_32.o" ]
       outputs = [ "${install_dir}/lib32/crti.o" ]
+      deps = [
+        ":crt_x86_32(//native_client/build/toolchain/nacl:raw_${package_libc}_x86)",
+      ]
     }
     copy("${target_name}_crtn_x86_32") {
       sources = [  "${crt_path}/crt_x86_32.crtn_x86_32.o" ]
       outputs = [ "${install_dir}/lib32/crtn.o" ]
+      deps = [
+        ":crt_x86_32(//native_client/build/toolchain/nacl:raw_${package_libc}_x86)",
+      ]
     }
-    copy("${target_name}_crt1_x86_32") {
-      sources = [  "//native_client/src/untrusted/stubs/crt1.x" ]
-      outputs = [ "${install_dir}/lib32/crt1.o" ]
+    nacl_path = "${obj_dir}/native_client/src/untrusted/nacl"
+    copy("${target_name}_libnacl_x86_32") {
+      sources = [ "${nacl_path}/libnacl.a" ]
+      outputs = [ "${install_dir}/lib32/libnacl.a" ]
+      deps = [
+        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_${package_libc}_x86)",
+      ]
     }
 
-    crt_path = "${root_build_dir}/raw_newlib_x64/obj/native_client/src/untrusted/stubs"
+    obj_dir = "${root_build_dir}/raw_${package_libc}_x64/obj"
+    crt_path = "${obj_dir}/native_client/src/untrusted/stubs"
     copy("${target_name}_crti_x86_64") {
       sources = [  "${crt_path}/crt_x86_64.crti_x86_64.o" ]
       outputs = [ "${install_dir}/lib/crti.o" ]
+      deps = [
+        ":crt_x86_64(//native_client/build/toolchain/nacl:raw_${package_libc}_x64)",
+      ]
     }
     copy("${target_name}_crtn_x86_64") {
       sources = [  "${crt_path}/crt_x86_64.crtn_x86_64.o" ]
       outputs = [ "${install_dir}/lib/crtn.o" ]
+      deps = [
+        ":crt_x86_64(//native_client/build/toolchain/nacl:raw_${package_libc}_x64)",
+      ]
     }
-    copy("${target_name}_crt1_x86_64") {
-      sources = [  "//native_client/src/untrusted/stubs/crt1.x" ]
-      outputs = [ "${install_dir}/lib/crt1.o" ]
-    }
-
-    nacl_path = "${root_build_dir}/raw_newlib_x86/obj/native_client/src/untrusted/nacl"
-    copy("${target_name}_libnacl_x86_32") {
-      sources = [ "${nacl_path}/libnacl.a" ]
-      outputs = [ "${install_dir}/lib32/libnacl.a" ]
-    }
-    nacl_path = "${root_build_dir}/raw_newlib_x64/obj/native_client/src/untrusted/nacl"
+    nacl_path = "${obj_dir}/native_client/src/untrusted/nacl"
     copy("${target_name}_libnacl_x86_64") {
       sources = [ "${nacl_path}/libnacl.a" ]
       outputs = [ "${install_dir}/lib/libnacl.a" ]
+      deps = [
+        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_${package_libc}_x64)",
+      ]
     }
   }
 
-  #
-  # Create the group (target) which contains all the dependencies
-  #
   group(target_name) {
-    if (defined(datadeps) == false) {
-      datadeps = []
-    }
-
-    datadeps += [
-      # Untar target
-      ":untar_${package}",
-
-      # Header copy targets
-      ":${target_name}_root_headers",
-      ":${target_name}_nacl_headers",
-    ]
-
-    if (package_arch != "arm") {
-      datadeps += [
-        # Build x86_32 & x86_64 targets
-        ":crt_x86_32(//native_client/build/toolchain/nacl:raw_newlib_x86)",
-        ":crt_x86_64(//native_client/build/toolchain/nacl:raw_newlib_x64)",
-        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_newlib_x86)",
-        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_newlib_x64)",
-
-        # Copy x86 crtX targets
+    if (package_arch == "arm") {
+      datadeps = [
+        ":${target_name}_crti_arm",
+        ":${target_name}_crtn_arm",
+        ":${target_name}_libnacl_arm",
+     ]
+    } else {
+      datadeps = [
         ":${target_name}_crti_x86_32",
         ":${target_name}_crtn_x86_32",
-        ":${target_name}_crt1_x86_32",
-        ":${target_name}_crti_x86_64",
+        ":${target_name}_libnacl_x86_32",
         ":${target_name}_crtn_x86_64",
-        ":${target_name}_crt1_x86_64",
-
-      ]
-    } else {
-      datadeps += [
-        # Build arm targets
-        ":crt_arm(//native_client/build/toolchain/nacl:raw_newlib_arm)",
-        "//native_client/src/untrusted/nacl:nacl(//native_client/build/toolchain/nacl:raw_newlib_arm)",
-
-        # Copy arm crtX targets
-        ":${target_name}_crti_arm",
-        ":${target_name}_crtn_arm",
-        ":${target_name}_crt1_arm",
+        ":${target_name}_crti_x86_64",
+        ":${target_name}_libnacl_x86_64",
       ]
     }
   }
 }
 
 #
-# These sources must be build with the RAW toolchains to avoid cyclic
-# dependencies.
+# Untarring and prepping the toolchains happens with the default toolchain
+# to pull in COPY and TOUCH tools, and to avoid a cyclic dependency.  All
+# normal NaCl targets should depend on :prep_<arch>_<libc>(<host_toolchain>)
 #
-if (nacl_prep == "raw") {
-  source_set("crt_x86_32") {
-    sources = [
-      "//native_client/src/untrusted/stubs/crti_x86_32.S",
-      "//native_client/src/untrusted/stubs/crtn_x86_32.S",
-    ]
-  }
+template("prep_toolchain") {
+  package_arch = invoker.package_arch
+  package_libc = invoker.package_libc
+  package = "nacl_${package_arch}_${package_libc}"
 
-  source_set("crt_x86_64") {
-    sources = [
-      "//native_client/src/untrusted/stubs/crti_x86_64.S",
-      "//native_client/src/untrusted/stubs/crtn_x86_64.S",
-    ]
+  toolchain_untar("${package}_untar") {}
+  toolchain_copies("${package}_copies") {
+    toolchain_dir = "${root_build_dir}/toolchain/${build_os}_x86/${package}"
+  }
+  toolchain_build("${package}_build") {
+    toolchain_dir = "${root_build_dir}/toolchain/${build_os}_x86/${package}"
   }
 
-  source_set("crt_arm") {
-    sources = [
-      "//native_client/src/untrusted/stubs/crti_arm.S",
-      "//native_client/src/untrusted/stubs/crtn_arm.S",
+  group(target_name) {
+    datadeps = [
+      ":${package}_untar",
+      ":${package}_copies",
+      ":${package}_build"
     ]
   }
 }
 
 #
-# Untarring and prepping the toolchains happens with the default toolchain
-# to pull in COPY and TOUCH tools, and to avoid a cyclic dependency.  All
-# normal NaCl targets should depend on :prep_<arch>_<libc>(<host_toolchain>)
+# Only default prep targets for the default toolchain
 #
 if (nacl_prep == "none") {
-  untar_toolchain("untar_nacl_x86_newlib") {
-    package = "nacl_x86_newlib"
-  }
-
-  untar_toolchain("untar_nacl_arm_newlib") {
-    package = "nacl_arm_newlib"
-  }
-
-  prep_toolchain("prep_x86_newlib") {
-    package_arch = "x86"
-    package_libc = "newlib"
+  if (use_nacl_arm) {
+    if (use_newlib) {
+      prep_toolchain("prep_nacl_arm_newlib") {
+        package_arch = "arm"
+        package_libc = "newlib"
+      }
+    }
   }
-
-  prep_toolchain("prep_arm_newlib") {
-    package_arch = "arm"
-    package_libc = "newlib"
+  if (use_nacl_x86 || use_nacl_x64) {
+    if (use_newlib) {
+      prep_toolchain("prep_nacl_x86_newlib") {
+        package_arch = "x86"
+        package_libc = "newlib"
+      }
+    }
+    if (use_glibc) {
+      prep_toolchain("prep_nacl_x86_glibc") {
+        package_arch = "x86"
+        package_libc = "glibc"
+      }
+    }
   }
 }