make capnp only necessary if modifying generated files

This commit is contained in:
Christien Rioux 2023-11-07 19:27:08 -05:00
parent 1e4e9c203c
commit 425b31c023
5 changed files with 179 additions and 244 deletions

View File

@ -26,22 +26,6 @@ deps-base:
RUN apt-get -y update RUN apt-get -y update
RUN apt-get install -y iproute2 curl build-essential cmake libssl-dev openssl file git pkg-config libdbus-1-dev libdbus-glib-1-dev libgirepository1.0-dev libcairo2-dev checkinstall unzip libncursesw5-dev libncurses5-dev RUN apt-get install -y iproute2 curl build-essential cmake libssl-dev openssl file git pkg-config libdbus-1-dev libdbus-glib-1-dev libgirepository1.0-dev libcairo2-dev checkinstall unzip libncursesw5-dev libncurses5-dev
# Install Cap'n Proto
deps-capnp:
FROM +deps-base
COPY scripts/earthly/install_capnproto.sh /
RUN /bin/bash /install_capnproto.sh 1; rm /install_capnproto.sh
SAVE ARTIFACT /usr/local/bin/capnp* bin/
SAVE ARTIFACT /usr/local/lib/lib* lib/
SAVE ARTIFACT /usr/local/lib/pkgconfig lib/
# Install protoc
deps-protoc:
FROM +deps-base
COPY scripts/earthly/install_protoc.sh /
RUN /bin/bash /install_protoc.sh; rm /install_protoc.sh
SAVE ARTIFACT /usr/local/bin/protoc bin/protoc
# Install Rust # Install Rust
deps-rust: deps-rust:
FROM +deps-base FROM +deps-base
@ -75,11 +59,6 @@ deps-rust:
# Install android tooling # Install android tooling
deps-android: deps-android:
FROM +deps-base FROM +deps-base
BUILD +deps-protoc
COPY +deps-protoc/bin/* /usr/local/bin/
BUILD +deps-capnp
COPY +deps-capnp/bin/* /usr/local/bin/
COPY +deps-capnp/lib/* /usr/local/lib/
BUILD +deps-rust BUILD +deps-rust
COPY +deps-rust/cargo /usr/local/cargo COPY +deps-rust/cargo /usr/local/cargo
COPY +deps-rust/rustup /usr/local/rustup COPY +deps-rust/rustup /usr/local/rustup
@ -96,11 +75,6 @@ deps-android:
# Just linux build not android # Just linux build not android
deps-linux: deps-linux:
FROM +deps-base FROM +deps-base
BUILD +deps-protoc
COPY +deps-protoc/bin/* /usr/local/bin/
BUILD +deps-capnp
COPY +deps-capnp/bin/* /usr/local/bin/
COPY +deps-capnp/lib/* /usr/local/lib/
BUILD +deps-rust BUILD +deps-rust
COPY +deps-rust/cargo /usr/local/cargo COPY +deps-rust/cargo /usr/local/cargo
COPY +deps-rust/rustup /usr/local/rustup COPY +deps-rust/rustup /usr/local/rustup

View File

@ -17,75 +17,75 @@ if ! lsb_release -d | grep -qEi 'debian|buntu|mint' && [ -z "$(command -v dnf)"
echo Not a supported Linux echo Not a supported Linux
exit 1 exit 1
fi fi
while true; do while true; do
read -p "Did you install Android SDK? Y/N " response read -p "Did you install Android SDK? Y/N " response
case $response in case $response in
[yY] ) echo Checking android setup...; [yY] ) echo Checking android setup...;
# ensure ANDROID_SDK_ROOT is defined and exists # ensure ANDROID_SDK_ROOT is defined and exists
if [ -d "$ANDROID_SDK_ROOT" ]; then if [ -d "$ANDROID_SDK_ROOT" ]; then
echo '[X] $ANDROID_SDK_ROOT is defined and exists' echo '[X] $ANDROID_SDK_ROOT is defined and exists'
else else
echo '$ANDROID_SDK_ROOT is not defined or does not exist' echo '$ANDROID_SDK_ROOT is not defined or does not exist'
exit 1 exit 1
fi fi
# ensure Android Command Line Tools exist # ensure Android Command Line Tools exist
if [ -d "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin" ]; then if [ -d "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin" ]; then
echo '[X] Android command line tools are installed' echo '[X] Android command line tools are installed'
else else
echo 'Android command line tools are not installed' echo 'Android command line tools are not installed'
exit 1 exit 1
fi fi
# ensure ANDROID_NDK_HOME is defined and exists # ensure ANDROID_NDK_HOME is defined and exists
if [ -d "$ANDROID_NDK_HOME" ]; then if [ -d "$ANDROID_NDK_HOME" ]; then
echo '[X] $ANDROID_NDK_HOME is defined and exists' echo '[X] $ANDROID_NDK_HOME is defined and exists'
else else
echo '$ANDROID_NDK_HOME is not defined or does not exist' echo '$ANDROID_NDK_HOME is not defined or does not exist'
exit 1 exit 1
fi fi
# ensure ndk is installed # ensure ndk is installed
if [ -f "$ANDROID_NDK_HOME/ndk-build" ]; then if [ -f "$ANDROID_NDK_HOME/ndk-build" ]; then
echo '[X] Android NDK is installed at the location $ANDROID_NDK_HOME' echo '[X] Android NDK is installed at the location $ANDROID_NDK_HOME'
else else
echo 'Android NDK is not installed at the location $ANDROID_NDK_HOME' echo 'Android NDK is not installed at the location $ANDROID_NDK_HOME'
exit 1 exit 1
fi fi
# ensure cmake is installed # ensure cmake is installed
if [ -d "$ANDROID_SDK_ROOT/cmake" ]; then if [ -d "$ANDROID_SDK_ROOT/cmake" ]; then
echo '[X] Android SDK CMake is installed' echo '[X] Android SDK CMake is installed'
else else
echo 'Android SDK CMake is not installed' echo 'Android SDK CMake is not installed'
exit 1 exit 1
fi fi
# ensure emulator is installed # ensure emulator is installed
if [ -d "$ANDROID_SDK_ROOT/emulator" ]; then if [ -d "$ANDROID_SDK_ROOT/emulator" ]; then
echo '[X] Android SDK emulator is installed' echo '[X] Android SDK emulator is installed'
else else
echo 'Android SDK emulator is not installed' echo 'Android SDK emulator is not installed'
exit 1 exit 1
fi fi
# ensure adb is installed # ensure adb is installed
if command -v adb &> /dev/null; then if command -v adb &> /dev/null; then
echo '[X] adb is available in the path' echo '[X] adb is available in the path'
else else
echo 'adb is not available in the path' echo 'adb is not available in the path'
exit 1 exit 1
fi fi
break;; break;;
[nN] ) echo Skipping android SDK config check...; [nN] ) echo Skipping Android SDK config check...;
break;; break;;
* ) echo invalid response;;
* ) echo invalid response;; esac
esac
done done
# ensure rustup is installed # ensure rustup is installed
if command -v rustup &> /dev/null; then if command -v rustup &> /dev/null; then
echo '[X] rustup is available in the path' echo '[X] rustup is available in the path'
@ -119,7 +119,21 @@ cargo install wasm-bindgen-cli wasm-pack cargo-edit
# install pip packages # install pip packages
pip3 install --upgrade bumpversion pip3 install --upgrade bumpversion
# Install capnproto using the same mechanism as our earthly build # install capnp
$SCRIPTDIR/../scripts/earthly/install_capnproto.sh while true; do
# Install protoc using the same mechanism as our earthly build read -p "Will you be modifying the capnproto schema? Y/N (say N if unsure)" response
$SCRIPTDIR/../scripts/earthly/install_protoc.sh
case $response in
[yY] ) echo Installing capnproto...;
# Install capnproto using the same mechanism as our earthly build
$SCRIPTDIR/../scripts/earthly/install_capnproto.sh
break;;
[nN] ) echo Skipping capnproto installation...;
break;;
* ) echo invalid response;;
esac
done

View File

@ -7,69 +7,77 @@ if [ ! "$(uname)" == "Darwin" ]; then
echo Not running on MacOS echo Not running on MacOS
exit 1 exit 1
fi fi
read -p "Did you install Android SDK? Y/N " response
case $response in
[yY] ) echo Checking android setup...;
# ensure ANDROID_SDK_ROOT is defined and exists while true; do
if [ -d "$ANDROID_SDK_ROOT" ]; then
echo '[X] $ANDROID_SDK_ROOT is defined and exists'
else
echo '$ANDROID_SDK_ROOT is not defined or does not exist'
exit 1
fi
# ensure Android Command Line Tools exist read -p "Did you install Android SDK? Y/N " response
if [ -d "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin" ]; then case $response in
echo '[X] Android command line tools are installed' [yY] ) echo Checking android setup...;
else # ensure ANDROID_SDK_ROOT is defined and exists
echo 'Android command line tools are not installed' if [ -d "$ANDROID_SDK_ROOT" ]; then
exit 1 echo '[X] $ANDROID_SDK_ROOT is defined and exists'
fi else
echo '$ANDROID_SDK_ROOT is not defined or does not exist'
exit 1
fi
# ensure Android SDK packages are installed # ensure Android Command Line Tools exist
$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager build-tools\;33.0.1 ndk\;25.1.8937393 cmake\;3.22.1 platform-tools platforms\;android-33 if [ -d "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin" ]; then
echo '[X] Android command line tools are installed'
else
echo 'Android command line tools are not installed'
exit 1
fi
# ensure ANDROID_NDK_HOME is defined and exists # ensure Android SDK packages are installed
if [ -d "$ANDROID_NDK_HOME" ]; then $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager build-tools\;33.0.1 ndk\;25.1.8937393 cmake\;3.22.1 platform-tools platforms\;android-33
echo '[X] $ANDROID_NDK_HOME is defined and exists'
else
echo '$ANDROID_NDK_HOME is not defined or does not exist'
exit 1
fi
# ensure ndk is installed # ensure ANDROID_NDK_HOME is defined and exists
if [ -f "$ANDROID_NDK_HOME/ndk-build" ]; then if [ -d "$ANDROID_NDK_HOME" ]; then
echo '[X] Android NDK is installed at the location $ANDROID_NDK_HOME' echo '[X] $ANDROID_NDK_HOME is defined and exists'
else else
echo 'Android NDK is not installed at the location $ANDROID_NDK_HOME' echo '$ANDROID_NDK_HOME is not defined or does not exist'
exit 1 exit 1
fi fi
# ensure cmake is installed # ensure ndk is installed
if [ -d "$ANDROID_SDK_ROOT/cmake" ]; then if [ -f "$ANDROID_NDK_HOME/ndk-build" ]; then
echo '[X] Android SDK CMake is installed' echo '[X] Android NDK is installed at the location $ANDROID_NDK_HOME'
else else
echo 'Android SDK CMake is not installed' echo 'Android NDK is not installed at the location $ANDROID_NDK_HOME'
exit 1 exit 1
fi fi
# ensure emulator is installed # ensure cmake is installed
if [ -d "$ANDROID_SDK_ROOT/emulator" ]; then if [ -d "$ANDROID_SDK_ROOT/cmake" ]; then
echo '[X] Android SDK emulator is installed' echo '[X] Android SDK CMake is installed'
else else
echo 'Android SDK emulator is not installed' echo 'Android SDK CMake is not installed'
exit 1 exit 1
fi fi
# ensure adb is installed # ensure emulator is installed
if command -v adb &> /dev/null; then if [ -d "$ANDROID_SDK_ROOT/emulator" ]; then
echo '[X] adb is available in the path' echo '[X] Android SDK emulator is installed'
else else
echo 'adb is not available in the path' echo 'Android SDK emulator is not installed'
exit 1 exit 1
fi fi
esac
# ensure adb is installed
if command -v adb &> /dev/null; then
echo '[X] adb is available in the path'
else
echo 'adb is not available in the path'
exit 1
fi
break;;
[nN] ) echo Skipping Android SDK config check...;
break;;
* ) echo invalid response;;
esac
done
# ensure brew is installed # ensure brew is installed
if command -v brew &> /dev/null; then if command -v brew &> /dev/null; then
@ -130,7 +138,7 @@ if [ "$BREW_USER" == "" ]; then
BREW_USER=`whoami` BREW_USER=`whoami`
fi fi
fi fi
sudo -H -u $BREW_USER brew install capnp cmake wabt llvm protobuf openjdk@17 jq sudo -H -u $BREW_USER brew install capnp cmake wabt llvm openjdk@17 jq
# install targets # install targets
rustup target add aarch64-apple-darwin aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-darwin x86_64-apple-ios wasm32-unknown-unknown aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android rustup target add aarch64-apple-darwin aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-darwin x86_64-apple-ios wasm32-unknown-unknown aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android

View File

@ -1,37 +0,0 @@
#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
PROTOC_VERSION="24.3" # Keep in sync with veilid-core/build.rs
UNAME_M=$(uname -m)
if [[ "$UNAME_M" == "x86_64" ]]; then
PROTOC_ARCH=x86_64
elif [[ "$UNAME_M" == "aarch64" ]]; then
PROTOC_ARCH=aarch_64
else
echo Unsupported build architecture
exit 1
fi
mkdir /tmp/protoc-install
pushd /tmp/protoc-install
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v$PROTOC_VERSION/protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip
unzip protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip
if [ "$EUID" -ne 0 ]; then
if command -v checkinstall &> /dev/null; then
sudo checkinstall --pkgversion=$PROTOC_VERSION -y cp -r bin include /usr/local/
cp *.deb ~
else
sudo cp -r bin include /usr/local/
fi
popd
sudo rm -rf /tmp/protoc-install
else
if command -v checkinstall &> /dev/null; then
checkinstall --pkgversion=$PROTOC_VERSION -y cp -r bin include /usr/local/
cp *.deb ~
else
cp -r bin include /usr/local/
fi
popd
rm -rf /tmp/protoc-install
fi

View File

@ -1,20 +1,16 @@
use glob::glob; use glob::glob;
use std::{ use std::{
env, env, fs, io,
path::Path,
process::{Command, Stdio}, process::{Command, Stdio},
}; };
const CAPNP_VERSION: &str = "1.0.1"; // Keep in sync with scripts/install_capnp.sh const CAPNP_VERSION: &str = "1.0.1";
const PROTOC_VERSION: &str = "24.3"; // Keep in sync with scripts/install_protoc.sh
fn get_desired_capnp_version_string() -> String { fn get_desired_capnp_version_string() -> String {
CAPNP_VERSION.to_string() CAPNP_VERSION.to_string()
} }
fn get_desired_protoc_version_string() -> String {
PROTOC_VERSION.to_string()
}
fn get_capnp_version_string() -> String { fn get_capnp_version_string() -> String {
let output = Command::new("capnp") let output = Command::new("capnp")
.arg("--version") .arg("--version")
@ -32,35 +28,29 @@ fn get_capnp_version_string() -> String {
s[20..].to_owned() s[20..].to_owned()
} }
fn get_protoc_version_string() -> String { fn is_input_file_outdated<P1, P2>(input: P1, output: P2) -> io::Result<bool>
let output = Command::new("protoc") where
.arg("--version") P1: AsRef<Path>,
.stdout(Stdio::piped()) P2: AsRef<Path>,
.output() {
.expect("protoc was not in the PATH"); let out_meta = fs::metadata(output);
let s = String::from_utf8(output.stdout) if let Ok(meta) = out_meta {
.expect("'protoc --version' output was not a valid string") let output_mtime = meta.modified()?;
.trim()
.to_owned();
if !s.starts_with("libprotoc ") { // if input file is more recent than our output, we are outdated
panic!("invalid protoc version string: {}", s); let input_meta = fs::metadata(input)?;
let input_mtime = input_meta.modified()?;
Ok(input_mtime > output_mtime)
} else {
// output file not found, we are outdated
Ok(true)
} }
s[10..].to_owned()
} }
fn main() { fn do_capnp_build() {
if std::env::var("DOCS_RS").is_ok()
|| std::env::var("CARGO_CFG_DOC").is_ok()
|| std::env::var("BUILD_DOCS").is_ok()
{
return;
}
let desired_capnp_version_string = get_desired_capnp_version_string(); let desired_capnp_version_string = get_desired_capnp_version_string();
let capnp_version_string = get_capnp_version_string(); let capnp_version_string = get_capnp_version_string();
let desired_protoc_version_string = get_desired_protoc_version_string();
let protoc_version_string = get_protoc_version_string();
// Check capnp version // Check capnp version
let desired_capnp_major_version = desired_capnp_version_string let desired_capnp_major_version = desired_capnp_version_string
@ -89,45 +79,16 @@ fn main() {
); );
} }
// Check protoc version
let desired_protoc_major_version = desired_protoc_version_string
.split_once('.')
.unwrap()
.0
.parse::<usize>()
.expect("should be valid int");
if protoc_version_string
.split_once('.')
.unwrap()
.0
.parse::<usize>()
.expect("should be valid int")
< desired_protoc_major_version
{
panic!(
"protoc version should be at least major version {} but is {}",
desired_protoc_major_version, protoc_version_string
);
} else if protoc_version_string != desired_protoc_version_string {
println!(
"cargo:warning=protoc version may be untested: {}",
protoc_version_string
);
}
::capnpc::CompilerCommand::new() ::capnpc::CompilerCommand::new()
.file("proto/veilid.capnp") .file("proto/veilid.capnp")
.output_path(".") .output_path(".")
.run() .run()
.expect("compiling schema"); .expect("compiling schema");
}
// Fix for missing __extenddftf2 on Android x86_64 Emulator // Fix for missing __extenddftf2 on Android x86_64 Emulator
fn fix_android_emulator() {
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap(); let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
// if target_os == "android" || target_os == "linux" {
// println!("cargo:rustc-link-lib=stdc++");
// } else {
// println!("cargo:rustc-link-lib=c++");
// }
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap();
if target_arch == "x86_64" && target_os == "android" { if target_arch == "x86_64" && target_os == "android" {
let missing_library = "clang_rt.builtins-x86_64-android"; let missing_library = "clang_rt.builtins-x86_64-android";
@ -142,3 +103,18 @@ fn main() {
println!("cargo:rustc-link-lib=static={missing_library}"); println!("cargo:rustc-link-lib=static={missing_library}");
} }
} }
fn main() {
if std::env::var("DOCS_RS").is_ok()
|| std::env::var("CARGO_CFG_DOC").is_ok()
|| std::env::var("BUILD_DOCS").is_ok()
{
return;
}
if is_input_file_outdated("./proto/veilid.capnp", "./proto/veilid_capnp.rs").unwrap() {
do_capnp_build();
}
fix_android_emulator();
}