| # Copyright 2016 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # @ECLASS: cros-factory.eclass |
| # @MAINTAINER: |
| # The Chromium OS Authors <chromium-os-dev@chromium.org> |
| # @BUGREPORTS: |
| # Please report bugs via http://crbug.com/new (with label Build) |
| # @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/@ECLASS@ |
| # @BLURB: Eclass to help creating per-board factory resources. |
| |
| # Check for EAPI 3+ |
| case "${EAPI:-0}" in |
| 0|1|2) |
| die "unsupported EAPI (${EAPI}) in eclass (${ECLASS})" ;; |
| esac |
| |
| # @ECLASS-VARIABLE: CROS_FACTORY_BOARD_RESOURCES_DIR |
| # @DESCRIPTION: Folder of factory resources to current board. |
| : "${CROS_FACTORY_BOARD_RESOURCES_DIR:=/usr/share/factory/resources}" |
| |
| # @FUNCTION: factory_get_resource_archive_path |
| # @USAGE: <name> <res_root> |
| # @DESCRIPTION: |
| # Get the path of a resource archive for ChromeOS Factory |
| # (chromeos-base/chromeos-factory). |
| # |
| # <name> is the name of resource archive without file name extension. |
| # |
| # <res_root> is the path to system root of resource folder. Defaults to |
| # "${SYSROOT}". When creating resource archive, this should be "${ED}". |
| # (Function factory_create_resource already takes care of this. In most cases, |
| # this argument should not be set.) |
| # |
| # @EXAMPLE: |
| # To get the path of resource archive "factory-board": |
| # |
| # @CODE |
| # factory_get_resource_archive_path factory-board |
| # @CODE |
| factory_get_resource_archive_path() { |
| local name="$1" |
| local res_root="${2:-${SYSROOT}}" |
| |
| echo "${res_root}${CROS_FACTORY_BOARD_RESOURCES_DIR}/${name}.tar" |
| } |
| |
| # @FUNCTION: factory_create_resource |
| # @USAGE: <name> <local_dir> <resource_dir> <objects...> |
| # @DESCRIPTION: |
| # Adds a resource for ChromeOS Factory (chromeos-base/chromeos-factory) to merge |
| # into build outputs. |
| # |
| # <name> is the name of resource archive without file name extension, which |
| # should be in format $TARGET-$IDENTIFIER. TARGET is the build targets in |
| # src/platform/factory/Makefile. Currently you can use following targets: |
| # toolkit - only included when building toolkit (not in par). |
| # par - only included when building par (not in toolkits). |
| # resource - included in all targets (toolkit & par). |
| # factory - same as resource. |
| # Defaults to "factory-board" if param is empty. |
| # |
| # <local_dir> is the path to where prepared files lives, for example ${WORKDIR}. |
| # Defaults to "${WORKDIR}" if param is empty. |
| # |
| # <resource_dir> is the path to where the files should be located in resource |
| # file, under /usr/local/factory. For example "py". Defaults to "." if param is |
| # empty. |
| # |
| # <objects> are files or directories to be copied into resource archive. |
| # |
| # @EXAMPLE: |
| # To copy files from ${WORKDIR}/dist/webgl_aquarium_static as |
| # /usr/local/factory/py/test/pytests/webgl_aquarium_static/* in resource file |
| # ${D}/usr/share/factory/resources/factory-board.tar: |
| # |
| # @CODE |
| # factory_create_resource factory-board "${WORKDIR}/dist" \ |
| # py/test/pytests webgl_aquarium_static |
| # @CODE |
| factory_create_resource() { |
| local params="<name> <local_dir> <resource_dir> <objects>..." |
| [[ $# -gt 3 ]] || die "Usage: ${FUNCNAME[0]} ${params}" |
| |
| local name="${1:-factory-board}" |
| local local_dir="${2:-${WORKDIR}}" |
| local resource_dir="${3:-.}" |
| shift |
| shift |
| shift |
| |
| local archive_path="$(factory_get_resource_archive_path \ |
| "${name}" "${ED}")" |
| local archive_dir="$(dirname "${archive_path}")" |
| local archive_name="$(basename "${archive_path}")" |
| mkdir -p "${archive_dir}" |
| |
| if [[ -f "${archive_path}" ]]; then |
| die "Failed because ${archive_name} already exists." |
| fi |
| |
| # transform regular file paths, but not targets of symbolic links and hard |
| # links. |
| tar -cf "${archive_path}" \ |
| -C "${local_dir}" --transform "s'^'${resource_dir}/'SH" \ |
| "$@" || die "Failed to create resource file." |
| } |
| |
| # @FUNCTION: factory_unpack_resource |
| # @USAGE: <name> [output_dir] |
| # @DESCRIPTION: |
| # Unpacks a resource file prepared for ChromeOS Factory |
| # (chromeos-base/chromeos-factory). See factory_create_resource for more |
| # details. |
| # |
| # <name> is the name of resource archive without file name extension. |
| # |
| # [output_dir] is the path to unpack resource contents, for example ${WORKDIR}. |
| # Defaults to "${WORKDIR}" if param is empty. |
| # |
| # @EXAMPLE: |
| # To extract files from |
| # ${EROOT}usr/share/factory/resources/factory-board.tar |
| # to ${WORKDIR}/py/test/pytests: |
| # |
| # @CODE |
| # factory_unpack_resource factory-board "${WORKDIR}/py/test/pytests" |
| # @CODE |
| factory_unpack_resource() { |
| local name="$1" |
| local output_dir="${2:-${WORKDIR}}" |
| [[ $# -gt 2 ]] && die "Usage: ${FUNCNAME} <name> [output dir]" |
| |
| local archive_path="$(factory_get_resource_archive_path "${name}")" |
| mkdir -p "${output_dir}" |
| tar -xvf "${archive_path}" \ |
| -C "${output_dir}" \ |
| || die "Failed to unpack ${archive_path} to ${output_dir}" |
| } |