Skip to content

Commit

Permalink
Update to using zig package manager
Browse files Browse the repository at this point in the history
  • Loading branch information
joncinque committed Jul 7, 2024
1 parent 12b679c commit 8095599
Show file tree
Hide file tree
Showing 10 changed files with 139 additions and 22 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:

- name: Download solana-zig compiler
shell: bash
run: SOLANA_ZIG_VERSION=$SOLANA_ZIG_VERSION ./sol/install-solana-zig.sh $SOLANA_ZIG_DIR
run: SOLANA_ZIG_VERSION=$SOLANA_ZIG_VERSION ./install-solana-zig.sh $SOLANA_ZIG_DIR

- name: Test program
shell: bash
Expand Down Expand Up @@ -57,7 +57,7 @@ jobs:

- name: Download solana-zig compiler
shell: bash
run: SOLANA_ZIG_VERSION=$SOLANA_ZIG_VERSION ./sol/install-solana-zig.sh $SOLANA_ZIG_DIR
run: SOLANA_ZIG_VERSION=$SOLANA_ZIG_VERSION ./install-solana-zig.sh $SOLANA_ZIG_DIR

- name: Install Rust
uses: dtolnay/rust-toolchain@master
Expand All @@ -66,7 +66,7 @@ jobs:

- name: Install build deps
shell: bash
run: ./sol/program-test/install-build-deps.sh
run: ./program-test/install-build-deps.sh

- name: Build and test program
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
solana-zig/
solana-zig
zig-cache/
zig-out/
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
[submodule "sol"]
path = sol
url = https://github.com/joncinque/solana-sdk-zig.git
10 changes: 4 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ First, you need a zig compiler built with Solana's LLVM fork. See the README of
on how to build it, or you can download it from the
[GitHub releases page](https://github.com/joncinque/solana-zig-bootstrap/releases).

### Submodules
### Dependencies

Since zig's package manager is still in development, this project opts for
directly including the upstream Solana package requirements, hosted at
This project opts for the zig package manager and the package declared at
[solana-sdk-zig](https://github.com/joncinque/solana-sdk-zig).

This repo uses git submodules:

```console
$ git submodule update --init --recursive
zig fetch --save https://github.com/joncinque/base58-zig/archive/refs/tags/v0.12.2.tar.gz
zig fetch --save https://github.com/joncinque/solana-sdk-zig/archive/refs/tags/v0.12.0.tar.gz
```

### Build
Expand Down
19 changes: 12 additions & 7 deletions build.zig
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
const std = @import("std");
const sol = @import("sol/sol.zig");
const solana = @import("solana-program-sdk");

pub fn build(b: *std.Build) !void {
const target = b.resolveTargetQuery(solana.sbf_target);
const optimize = .ReleaseSmall;
const program = b.addSharedLibrary(.{
.name = "helloworld",
.root_source_file = .{ .path = "src/main.zig" },
.optimize = .ReleaseSmall,
.target = b.resolveTargetQuery(sol.sbf_target),
.target = target,
.optimize = optimize,
});
try sol.buildProgram(b, program, "sol/");

// Adding required dependencies, link the program properly, and get a
// prepared modules
const solana_mod = solana.buildProgram(b, program, target, optimize);

const test_step = b.step("test", "Run unit tests");
const unit_tests = b.addTest(.{
const lib_unit_tests = b.addTest(.{
.root_source_file = .{ .path = "src/main.zig" },
});
sol.addSolModules(b, unit_tests, "sol/");
const run_unit_tests = b.addRunArtifact(unit_tests);
lib_unit_tests.root_module.addImport("solana-program-sdk", solana_mod);
const run_unit_tests = b.addRunArtifact(lib_unit_tests);
test_step.dependOn(&run_unit_tests.step);
}
46 changes: 46 additions & 0 deletions build.zig.zon
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
.{
.name = "solana-helloworld-zig",
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.12.0",

// This field is optional.
// This is currently advisory only; Zig does not yet do anything
// with this value.
.minimum_zig_version = "0.12.0",

// This field is optional.
// Each dependency must either provide a `url` and `hash`, or a `path`.
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
// Once all dependencies are fetched, `zig build` no longer requires
// internet connectivity.
.dependencies = .{
.base58 = .{
.url = "https://github.com/joncinque/base58-zig/archive/refs/tags/v0.12.2.tar.gz",
.hash = "12203cf62befaa692c11ed82c1cea15ae6da153a87d89a969b006d99267fc4ba8626",
},
.clap = .{
.url = "https://github.com/Hejsil/zig-clap/archive/refs/tags/0.8.0.tar.gz",
.hash = "1220949d4e88864579067b6d4cdad6476c6176f27e782782c2c39b7f2c4817a10efb",
},
.@"solana-program-sdk" = .{
.url = "https://github.com/joncinque/solana-sdk-zig/archive/refs/tags/v0.12.0.tar.gz",
.hash = "122027f10b77c99010365b20f2bb32314fccee9814deec30ac70258f6ec62654d859",
},
},

// Specifies the set of files and directories that are included in this package.
// Only files and directories listed here are included in the `hash` that
// is computed for this package.
// Paths are relative to the build root. Use the empty string (`""`) to refer to
// the build root itself.
// A directory listed here means that all files within, recursively, are included.
.paths = .{
// For example...
"build.zig",
"build.zig.zon",
"src",
"LICENSE",
"README.md",
},
}
51 changes: 51 additions & 0 deletions install-solana-zig.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env bash

if [[ -n $SOLANA_ZIG_VERSION ]]; then
solana_zig_version="$SOLANA_ZIG_VERSION"
else
solana_zig_version="v1.41"
fi
solana_zig_release_url="https://github.com/joncinque/solana-zig-bootstrap/releases/download/solana-$solana_zig_version"

output_dir="$1"
if [[ -z $output_dir ]]; then
output_dir="solana-zig"
fi
output_dir="$(mkdir -p "$output_dir"; cd "$output_dir"; pwd)"
cd $output_dir

arch=$(uname -m)
if [[ "$arch" == "arm64" ]]; then
arch="aarch64"
fi
case $(uname -s | cut -c1-7) in
"Linux")
os="linux"
abi="musl"
;;
"Darwin")
os="macos"
abi="none"
;;
"Windows" | "MINGW64")
os="windows"
abi="gnu"
;;
*)
echo "install-solana-zig.sh: Unknown OS $(uname -s)" >&2
exit 1
;;
esac

solana_zig_tar=zig-$arch-$os-$abi.tar.bz2
url="$solana_zig_release_url/$solana_zig_tar"
echo "Downloading $url"
curl --proto '=https' --tlsv1.2 -SfOL "$url"
echo "Unpacking $solana_zig_tar"
tar -xjf $solana_zig_tar
rm $solana_zig_tar

solana_zig_dir="zig-$arch-$os-$abi-baseline"
mv "$solana_zig_dir"/* .
rmdir $solana_zig_dir
echo "solana-zig compiler available at $output_dir"
21 changes: 21 additions & 0 deletions program-test/install-build-deps.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e
case $(uname -s | cut -c1-7) in
"Windows" | "MINGW64")
vcpkg install openssl:x64-windows-static-md
vcpkg integrate install
choco install protoc
export PROTOC='C:\ProgramData\chocolatey\lib\protoc\tools\bin\protoc.exe'
;;
"Darwin")
brew install protobuf
;;
"Linux")
sudo apt update
sudo apt install protobuf-compiler -y
;;
*)
echo "Unknown Operating System"
exit 1
;;
esac
1 change: 0 additions & 1 deletion sol
Submodule sol deleted from fc63ed
2 changes: 1 addition & 1 deletion src/main.zig
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const std = @import("std");
const sol = @import("sol");
const sol = @import("solana-program-sdk");

const ix = @import("instruction.zig");
const state = @import("state.zig");
Expand Down

0 comments on commit 8095599

Please sign in to comment.