#
#
+# 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 = [
}
}
+
#
-# 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 {
"//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",
}
outputs = [ "${install_dir}/include/{{source_file_part}}" ]
deps = [
- "//native_client/build/toolchain:untar_${package}"
+ "//native_client/build/toolchain:${package}_untar"
]
}
]
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"
+ }
+ }
}
}