blob: e917e9cd0e9bd54effe5a2fa10ea8683579f16e2 [file] [log] [blame]
#!/bin/bash
DRY_RUN=""
if [ $# -gt 0 ]; then
if [ "$1" == "--dry-run" ]; then
DRY_RUN="echo "
fi
fi
REQUIRED="git cargo"
for name in $(echo ${REQUIRED});
do
type -P "$name" &>/dev/null || { echo "Install '$name'" >&2; exit 1;}
done
FIRST_DIR="$(pwd)"
# Vars
URL_GN="http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/gn-3e43fac03281e2f5e5ae5f27c8e9a6bb45966ea9.bin"
URL_PLATFORM2_GIT="https://chromium.googlesource.com/chromiumos/platform2"
URL_RUST_CRATES_GIT="https://chromium.googlesource.com/chromiumos/third_party/rust_crates"
URL_PROTO_LOGGING_GIT="https://android.googlesource.com/platform/frameworks/proto_logging"
CHROMIUM_BRANCH="release-R92-13982.B"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PARENT_DIR="$(echo ${SCRIPT_DIR} | rev | cut -d '/' -f 2- | rev )"
TMP_DIR=$(mktemp -d)
trap ctrl_c INT
function ctrl_c() {
rm -rf "${TMP_DIR}"
exit 1
}
echo Generating source package in "${TMP_DIR}"
OUT_DIR="${TMP_DIR}/out"
BIN_DIR="${TMP_DIR}/bin"
${DRY_RUN} mkdir -p "${OUT_DIR}"
${DRY_RUN} mkdir -p "${BIN_DIR}"
pushd "${BIN_DIR}"
wget -O gn "${URL_GN}"
popd
export PATH="${PATH}:${BIN_DIR}"
# Check dependencies
# libchrome requires modp_b64
APT_REQUIRED="modp-b64 libchrome flatbuffers-compiler flex g++-multilib gcc-multilib generate-ninja gnupg gperf libc++-dev libdbus-1-dev libevent-dev libevent-dev libflatbuffers-dev libflatbuffers1 libgl1-mesa-dev libglib2.0-dev liblz4-tool libncurses5 libnss3-dev libprotobuf-dev libre2-9 libssl-dev libtinyxml2-dev libx11-dev libxml2-utils ninja-build openssl protobuf-compiler unzip x11proto-core-dev xsltproc zip zlib1g-dev"
# SPEED UP TEST, REMOVE ME
APT_REQUIRED="modp-b64 libchrome flatbuffers-compiler"
APT_MISSING=()
for name in $(echo ${APT_REQUIRED});
do
R="$(apt -qq list "${name}" 2>/dev/null | grep "installed")"
if [ "${R}" == "" ]; then
echo "Need to install '${name}'" >&2;
if [ "${name}" == "modp-b64" ]; then
echo "${name} source is available to build in this repository"
echo Run the following to build and install:
echo " pushd ${PARENT_DIR}/${name}/"
echo " ./gen-src-pkg.sh ${OUT_DIR}"
echo " sudo dpkg -i ${OUT_DIR}"/${name}*.deb || ctrl_c
echo " popd"
${DRY_RUN} rm -rf ${TMP_DIR}
exit 1
elif [ "${name}" == "libchrome" ]; then
echo "${name} source is available to build in this repository"
echo Run the following to build and install:
echo pushd "${PARENT_DIR}/${name}/"
echo ./gen-src-pkg.sh "${OUT_DIR}"
echo sudo dpkg -i "${OUT_DIR}"/${name}*.deb || ctrl_c
echo popd
${DRY_RUN} rm -rf ${TMP_DIR}
exit 1
else
APT_MISSING+=("${name}")
fi
fi
done
APT_MISSING_LEN="${#APT_MISSING[@]}"
if [ $APT_MISSING_LEN -gt 0 ]; then
echo "Missing Packages:"
echo " ${APT_MISSING[*]}"
echo
echo Run the following to build and install:
echo " sudo apt install" "${APT_MISSING[*]}" || ctrl_c
${DRY_RUN} rm -rf ${TMP_DIR}
exit 1
fi
# Check cargo for cxxbridge-cmd
HAS_CXX="$(cargo install --list | grep cxxbridge-cmd)"
if [ "$HAS_CXX" == "" ]; then
echo "Missing cxxbridge-cmd cargo package"
echo Run the following to build and install:
echo cargo install cxxbridge-cmd || ctrl_c
${DRY_RUN} rm -rf ${TMP_DIR}
exit 1
fi
HAS_CXX="$(cargo install --list | grep cargo-proc-macro)"
if [ "$HAS_CXX" == "" ]; then
echo "Missing cargo-proc-macro cargo package"
echo Run the following to build and install:
echo cargo install cargo-proc-macro || ctrl_c
${DRY_RUN} rm -rf ${TMP_DIR}
exit 1
fi
# Git
GIT_DIR="${OUT_DIR}/repos"
GIT_DIR_PLATFORM2="${GIT_DIR}/platform2"
GIT_DIR_PLATFORM2_COMMON_MK="${GIT_DIR_PLATFORM2}/common-mk"
GIT_DIR_PLATFORM2_GN="${GIT_DIR_PLATFORM2}/.gn"
GIT_DIR_RUST_CRATES="${GIT_DIR}/rust_crates"
GIT_DIR_PROTO_LOGGING="${GIT_DIR}/proto_logging"
GIT_DIR_BT="$(echo "${PARENT_DIR}" | rev | cut -d '/' -f 3- | rev)"
# Staging
STAGING_DIR="${OUT_DIR}/staging"
STAGING_DIR_PLATFORM2="${STAGING_DIR}/platform2"
STAGING_DIR_COMMON_MK="${STAGING_DIR}/common-mk"
STAGING_DIR_GN="${STAGING_DIR}/.gn"
STAGING_DIR_BT="${STAGING_DIR}/bt"
# No it isn't a typo, use 'rust'
STAGING_DIR_RUST_CRATES="${STAGING_DIR}/rust"
STAGING_DIR_PROTO_LOGGING="${STAGING_DIR}/proto_logging"
OUTPUT_DIR="${OUT_DIR}/output"
EXTERNAL_DIR="${STAGING_DIR}/external"
EXTERNAL_DIR_RUST="${EXTERNAL_DIR}/rust"
EXTERNAL_DIR_PROTO_LOGGING="${EXTERNAL_DIR}/proto_logging"
${DRY_RUN} mkdir -p "${GIT_DIR}"
${DRY_RUN} mkdir -p "${STAGING_DIR}"
${DRY_RUN} mkdir -p "${OUTPUT_DIR}"
${DRY_RUN} mkdir -p "${EXTERNAL_DIR}"
${DRY_RUN} git clone -b "${CHROMIUM_BRANCH}" "${URL_PLATFORM2_GIT}" "${GIT_DIR_PLATFORM2}"
${DRY_RUN} git clone "${URL_RUST_CRATES_GIT}" "${GIT_DIR_RUST_CRATES}"
${DRY_RUN} git clone "${URL_PROTO_LOGGING_GIT}" "${GIT_DIR_PROTO_LOGGING}"
${DRY_RUN} ln -s "${GIT_DIR_PLATFORM2_COMMON_MK}" "${STAGING_DIR_COMMON_MK}" || ctrl_c
${DRY_RUN} ln -s "${GIT_DIR_PLATFORM2_GN}" "${STAGING_DIR_GN}" || ctrl_c
${DRY_RUN} ln -s "${GIT_DIR_BT}" "${STAGING_DIR_BT}" || ctrl_c
${DRY_RUN} ln -s "${GIT_DIR_RUST_CRATES}" "${EXTERNAL_DIR_RUST}" || ctrl_c
${DRY_RUN} ln -s "${GIT_DIR_PROTO_LOGGING}" "${EXTERNAL_DIR_PROTO_LOGGING}" || ctrl_c
${DRY_RUN} "${GIT_DIR_BT}"/build.py --bootstrap-dir "$(readlink -f "${OUT_DIR}")" --libdir /usr/lib || ctrl_c
PKG_DIR="${SCRIPT_DIR}/package"
PKG_USR_DIR="${PKG_DIR}/usr"
OUT_PKG_DIR="${OUT_DIR}/package"
OUT_PKG_USR_DIR="${OUT_PKG_DIR}/usr"
BIN_OUTPUT="${OUTPUT_DIR}/debug"
BTCLIENT_BIN="${BIN_OUTPUT}/btclient"
BTMANAGERD_BIN="${BIN_OUTPUT}/btmanagerd"
BTADAPTERD_BIN="${BIN_OUTPUT}/btadapterd"
${DRY_RUN} cp -r "${PKG_DIR}" "${OUT_DIR}/"
${DRY_RUN} cp "${BTCLIENT_BIN}" "${OUT_PKG_USR_DIR}/bin/"
${DRY_RUN} cp "${BTMANAGERD_BIN}" "${OUT_PKG_USR_DIR}/libexec/bluetooth/"
${DRY_RUN} cp "${BTADAPTERD_BIN}" "${OUT_PKG_USR_DIR}/libexec/bluetooth/"
${DRY_RUN} dpkg-deb --build "${OUT_PKG_DIR}" "${FIRST_DIR}/floss.deb"
${DRY_RUN} rm -rf ${TMP_DIR}
echo
echo "Now run:"
echo " sudo dpkg -i "${FIRST_DIR}"/floss.deb"