diff --git a/.gitignore b/.gitignore index 8be7f979d1..413098c1d5 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ gclient_config.py_entries /tests/napi/node_modules /tests/napi/build /tests/napi/third_party_tests/node_modules +.buildtool # MacOS generated files .DS_Store diff --git a/tools/buildtools/Dockerfile b/tools/buildtools/Dockerfile new file mode 100644 index 0000000000..ff018b1c12 --- /dev/null +++ b/tools/buildtools/Dockerfile @@ -0,0 +1,29 @@ +# Use Ubuntu 24.04 LTS as the base image +FROM ubuntu:24.04 + +WORKDIR /mnt +RUN apt-get update && apt-get install -y \ + curl \ + build-essential \ + libssl-dev \ + pkg-config \ + wget \ + cmake \ + libglib2.0-dev \ + lsb-release \ + software-properties-common \ + gnupg \ + && rm -rf /var/lib/apt/lists/* + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +# Add the Cargo and Rust binaries to the PATH +ENV PATH="/root/.cargo/bin:${PATH}" + +# Verify the installation +RUN rustc --version && cargo --version + +RUN wget https://apt.llvm.org/llvm.sh && \ + chmod +x llvm.sh && \ + ./llvm.sh 17 && \ + apt-get install --install-recommends -y cmake libglib2.0-dev \ No newline at end of file diff --git a/tools/buildtools/denobuild b/tools/buildtools/denobuild new file mode 100755 index 0000000000..aba25536b6 --- /dev/null +++ b/tools/buildtools/denobuild @@ -0,0 +1,90 @@ +#!/bin/bash + +is_debian_based() { + if [ -f /etc/os-release ]; then + source /etc/os-release + if [[ "$ID_LIKE" == *debian* || "$ID" == *debian* ]]; then + return 0 + fi + fi + return 1 +} + +if ! is_debian_based; then + echo "Only works on debian based systems" + exit 1 +fi + +buildtools_folder="$(realpath $(dirname "$0"))" +deno_root="$(realpath "$buildtools_folder/../..")" + +if command -v docker &> /dev/null +then + echo "Docker is installed." + docker --version +else + echo "Docker is not installed." + exit 1 +fi + +DOCKERFILE="$buildtools_folder/Dockerfile" +IMAGE_NAME="denobuildtool" +IMAGE_TAG="current" +BUILD_TOOL_WORKING_DIR="$deno_root/.buildtool" +STORED_DOCKER_FILE_CHECKSUM_FILE="$BUILD_TOOL_WORKING_DIR/dockerfile_check_sum" + +if [ ! -d "$BUILD_TOOL_WORKING_DIR" ]; then + mkdir -p "$BUILD_TOOL_WORKING_DIR" +fi + +DOCKERFILE_CHECKSUM=$(sha256sum "$DOCKERFILE" | awk '{ print $1 }') + +run_with_docker() { + if [[ $# != 0 ]]; then + args=("$@") + else + args=(/bin/bash -i) + fi + + docker_args=() + if [ "$PWD" != "$deno_root" ]; then + docker_args+=(-v "$deno_root:$deno_root") + fi + + image="$IMAGE_NAME:$IMAGE_TAG" + docker_args+=( + --network host \ + --privileged \ + -v "$PWD:$PWD" \ + -v /etc/localtime:/etc/localtime:ro \ + --env CARGO_HOME \ + -v "${CARGO_HOME}:${CARGO_HOME}" \ + -w "$PWD" \ + -e HOME="$HOME" \ + "$image" \ + "${args[@]}" + ) + + docker run --rm "${docker_args[@]}" +} + +if [ -f "$STORED_DOCKER_FILE_CHECKSUM_FILE" ]; then + STORED_DOCKERFILE_CHECKSUM=$(cat "$STORED_DOCKER_FILE_CHECKSUM_FILE") + + # Compare the current checksums with the stored checksums + if [ "$DOCKERFILE_CHECKSUM" == "$STORED_DOCKERFILE_CHECKSUM" ]; then + echo "Dockerfile not changed, no need to rebuild" + run_with_docker "$@" + else + echo "Dockerfile changed Proceeding with building docker image..." + docker buildx build -t "$IMAGE_NAME:$IMAGE_TAG" "$buildtools_folder" && + echo "$DOCKERFILE_CHECKSUM" > "$STORED_DOCKER_FILE_CHECKSUM_FILE" + fi +else + echo "No previous checksum found. Building the image..." + docker buildx build -t "$IMAGE_NAME:$IMAGE_TAG" "$buildtools_folder" && + echo "$DOCKERFILE_CHECKSUM" > "$STORED_DOCKER_FILE_CHECKSUM_FILE" +fi + + +