From bc45729a516eaf4c1af7aad8bd169e26d7200c28 Mon Sep 17 00:00:00 2001 From: chyyran Date: Sat, 11 Feb 2023 18:05:50 -0500 Subject: [PATCH] build: replace cargo post with custom buildscript --- .github/workflows/build.yml | 9 +- Cargo.lock | 305 +++++++++++++++++- Cargo.toml | 6 + README.md | 7 +- librashader-build-script/Cargo.toml | 14 + .../src/main.rs | 38 ++- librashader-capi/Cargo.toml | 1 - 7 files changed, 363 insertions(+), 17 deletions(-) create mode 100644 librashader-build-script/Cargo.toml rename librashader-capi/post_build.rs => librashader-build-script/src/main.rs (53%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c4e069..cdeeab3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] + profile: ['dev', 'release', 'optimized'] fail-fast: false runs-on: ${{ matrix.os }} steps: @@ -31,10 +32,6 @@ jobs: vulkan-query-version: latest vulkan-components: Vulkan-Headers, Vulkan-Loader, SPIRV-Cross, SPIRV-Headers, SPIRV-Reflect, SPIRV-Tools, Glslang vulkan-use-cache: true - - name: Setup cargo post - uses: baptiste0928/cargo-install@bf6758885262d0e6f61089a9d8c8790d3ac3368f - with: - crate: cargo-post - uses: actions/setup-python@v1 name: Setup Python with: @@ -42,9 +39,9 @@ jobs: - run: pip install meson ninja mako name: Install Meson for spirv-to-dxil-sys - name: Build dynamic library - run: cargo post build --release --package librashader-capi + run: cargo run -p librashader-build-script -- --profile ${{ matrix.profile }} - name: Upload build artifacts uses: actions/upload-artifact@v3.1.2 with: - name: build-outputs + name: ${{ format('build-outputs-{0}-{1}', matrix.os, matrix.profile) }} path: "target/release/librashader.*" diff --git a/Cargo.lock b/Cargo.lock index db525df..0c40494 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,17 @@ dependencies = [ "raw-window-metal", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "auto_ops" version = "0.3.0" @@ -178,6 +189,24 @@ dependencies = [ "vec_map", ] +[[package]] +name = "cbindgen" +version = "0.24.3" +source = "git+https://github.com/eqrion/cbindgen#b6e73017e679caf3b01217e62642d0722a464887" +dependencies = [ + "clap 3.2.23", + "heck", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "tempfile", + "toml", +] + [[package]] name = "cc" version = "1.0.79" @@ -193,6 +222,67 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "3.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +dependencies = [ + "atty", + "bitflags", + "clap_lex 0.2.4", + "indexmap", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap" +version = "4.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex 0.3.1", + "is-terminal", + "once_cell", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_derive" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "clap_lex" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cmake" version = "0.1.49" @@ -458,6 +548,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "expat-sys" version = "2.1.6" @@ -468,6 +579,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -673,6 +793,21 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.2.6" @@ -682,6 +817,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "ident_case" version = "1.0.1" @@ -727,6 +868,34 @@ dependencies = [ "web-sys", ] +[[package]] +name = "io-lifetimes" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "itoa" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" + [[package]] name = "jni-sys" version = "0.3.0" @@ -802,6 +971,14 @@ dependencies = [ "windows", ] +[[package]] +name = "librashader-build-script" +version = "0.1.0" +dependencies = [ + "cbindgen", + "clap 4.1.4", +] + [[package]] name = "librashader-capi" version = "0.1.0-rc.2" @@ -1000,6 +1177,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lock_api" version = "0.4.9" @@ -1301,7 +1484,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] @@ -1350,6 +1533,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +[[package]] +name = "os_str_bytes" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1432,6 +1621,30 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.51" @@ -1517,6 +1730,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + [[package]] name = "roxmltree" version = "0.14.1" @@ -1549,6 +1771,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.36.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + [[package]] name = "safe_arch" version = "0.5.2" @@ -1587,6 +1829,9 @@ name = "serde" version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] [[package]] name = "serde_derive" @@ -1599,6 +1844,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "servo-fontconfig" version = "0.5.1" @@ -1729,6 +1985,35 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + [[package]] name = "thiserror" version = "1.0.38" @@ -1785,6 +2070,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.5.1" @@ -1997,6 +2291,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 1ffb60e..781a6d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,12 @@ members = [ "librashader-runtime-gl", "librashader-runtime-vk", "librashader-capi", + "librashader-build-script" ] [workspace.metadata.release] + +[profile.optimized] +inherits = "release" +lto = true +codegen-units = 1 \ No newline at end of file diff --git a/README.md b/README.md index 7549892..13951e2 100644 --- a/README.md +++ b/README.md @@ -51,13 +51,14 @@ For Rust projects, simply add the crate to your `Cargo.toml`. cargo add librashader ``` -To build the C compatible dynamic library, [cargo-post](https://crates.io/crates/cargo-post) is required. +To build the C compatible dynamic library, run the build script. ``` -cargo post build --release --package librashader-capi +cargo run -p librashader-build-script -- --profile optimized ``` -This will output a `librashader.dll` or `librashader.so` in the target folder. +This will output a `librashader.dll` or `librashader.so` in the target folder. Profile can be `debug`, `release`, or +`optimized` for full LTO. ### C ABI Compatibility As the recommended way of integrating `librashader` is by the `librashader_ld` single header library, ABI stability diff --git a/librashader-build-script/Cargo.toml b/librashader-build-script/Cargo.toml new file mode 100644 index 0000000..9adce20 --- /dev/null +++ b/librashader-build-script/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "librashader-build-script" +version = "0.1.0" +edition = "2021" +publish = false + + +[dependencies] +cbindgen = { git = "https://github.com/eqrion/cbindgen" } +clap = { version = "4.1.0", features = ["derive"] } + + +[package.metadata.release] +release = false \ No newline at end of file diff --git a/librashader-capi/post_build.rs b/librashader-build-script/src/main.rs similarity index 53% rename from librashader-capi/post_build.rs rename to librashader-build-script/src/main.rs index 7fcb14f..5474f0f 100644 --- a/librashader-capi/post_build.rs +++ b/librashader-build-script/src/main.rs @@ -1,7 +1,16 @@ use std::{env, fs}; use std::fs::File; use std::io::{BufWriter, Write}; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; +use std::process::Command; +use clap::Parser; + +#[derive(Parser, Debug)] +#[command(version, about)] +struct Args { + #[arg(long, default_value="debug", global = true)] + profile: String, +} pub fn main() { // Do not update files on docsrs @@ -9,8 +18,25 @@ pub fn main() { return; } + let args = Args::parse(); + + let profile = args.profile; + + let crate_dir = Path::new("librashader-capi"); + println!("Building librashader C API..."); + + let mut cmd = Command::new("cargo"); + cmd.arg("build"); + cmd.args(["--package", "librashader-capi"]); + cmd.arg(format!("--profile={}", if profile == "debug" { "dev" } else { &profile })); + Some(cmd.status().expect("Failed to build librashader-capi")); + + let output_dir = PathBuf::from(format!("target/{}", profile)) + .canonicalize().expect("Could not find output directory."); + + println!("Generating C headers..."); + // Create headers. - let crate_dir = env::var("CRATE_MANIFEST_DIR").unwrap(); let mut buf = BufWriter::new(Vec::new()); cbindgen::generate(crate_dir) .expect("Unable to generate bindings") @@ -18,18 +44,18 @@ pub fn main() { let bytes = buf.into_inner().expect("Unable to extract bytes"); let string = String::from_utf8(bytes).expect("Unable to create string"); - File::create(PathBuf::from(env::var("CRATE_OUT_DIR").unwrap()).join("librashader.h")) + File::create(output_dir.join("librashader.h")) .expect("Unable to open file") .write_all(string.as_bytes()) .expect("Unable to write bindings."); - + println!("Moving artifacts..."); if cfg!(target_os = "linux") { let artifacts = &["liblibrashader_capi.so", "liblibrashader_capi.a"]; for artifact in artifacts { let ext = artifact.strip_prefix("lib").unwrap(); let ext = ext.replace("_capi", ""); - fs::rename(PathBuf::from(env::var("CRATE_OUT_DIR").unwrap()).join(artifact), PathBuf::from(env::var("CRATE_OUT_DIR").unwrap()).join(ext)).unwrap(); + fs::rename(output_dir.join(artifact), output_dir.join(ext)).unwrap(); } } @@ -37,7 +63,7 @@ pub fn main() { let artifacts = &["librashader_capi.dll", "librashader_capi.lib", "librashader_capi.d", "librashader_capi.dll.exp", "librashader_capi.dll.lib", "librashader_capi.pdb"]; for artifact in artifacts { let ext = artifact.replace("_capi", ""); - fs::rename(PathBuf::from(env::var("CRATE_OUT_DIR").unwrap()).join(artifact), PathBuf::from(env::var("CRATE_OUT_DIR").unwrap()).join(ext)).unwrap(); + fs::rename(output_dir.join(artifact), output_dir.join(ext)).unwrap(); } } } diff --git a/librashader-capi/Cargo.toml b/librashader-capi/Cargo.toml index 2d608e3..0b634a3 100644 --- a/librashader-capi/Cargo.toml +++ b/librashader-capi/Cargo.toml @@ -35,7 +35,6 @@ version = "0.44.0" optional = true [package.metadata.cargo-post.dependencies] -cbindgen = { git = "https://github.com/eqrion/cbindgen" } [package.metadata.docs.rs] targets = ["x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu"]