diff --git a/.envrc b/.envrc index 45097a203e..daafe18d9a 100644 --- a/.envrc +++ b/.envrc @@ -93,7 +93,7 @@ use_nix() { fi log_status "use nix: updating cache" - nix-shell --pure "${drv}" --show-trace --run "$(join_args "$direnv" dump bash)" > "${dump}" + nix-shell "${drv}" --show-trace --run "$(join_args "$direnv" dump bash)" > "${dump}" if [[ "${?}" -ne 0 ]] || [[ ! -f "${dump}" ]] || ! grep -q IN_NIX_SHELL "${dump}"; then rm -rf "${wd}" fail "use nix: was not able to update the cache of the environment. Please run 'direnv reload' to try again." diff --git a/compiler/builtins/bitcode/build.sh b/compiler/builtins/bitcode/build.sh new file mode 100755 index 0000000000..e863770c8e --- /dev/null +++ b/compiler/builtins/bitcode/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -euxo pipefail + +zig build-obj src/main.zig -O ReleaseFast -femit-llvm-ir=builtins.ll -femit-bin=builtins.o --strip diff --git a/compiler/builtins/build.rs b/compiler/builtins/build.rs index b6a4e41f14..57ec6d7a71 100644 --- a/compiler/builtins/build.rs +++ b/compiler/builtins/build.rs @@ -10,15 +10,29 @@ use std::str; fn main() { let out_dir = env::var_os("OUT_DIR").unwrap(); + let big_sur_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"; + let use_build_script = Path::new(big_sur_path).exists(); + // "." is relative to where "build.rs" is let build_script_dir_path = fs::canonicalize(Path::new(".")).unwrap(); let bitcode_path = build_script_dir_path.join("bitcode"); let src_obj_path = bitcode_path.join("builtins.o"); let src_obj = src_obj_path.to_str().expect("Invalid src object path"); - println!("Compiling zig object to: {}", src_obj); - run_command(&bitcode_path, "zig", &["build", "object", "-Drelease=true"]); + let dest_ir_path = bitcode_path.join("builtins.ll"); + let dest_ir = dest_ir_path.to_str().expect("Invalid dest ir path"); + + if use_build_script { + println!("Compiling zig object & ir to: {} and {}", src_obj, dest_ir); + run_command_with_no_args(&bitcode_path, "./build.sh"); + } else { + println!("Compiling zig object to: {}", src_obj); + run_command(&bitcode_path, "zig", &["build", "object", "-Drelease=true"]); + + println!("Compiling ir to: {}", dest_ir); + run_command(&bitcode_path, "zig", &["build", "ir", "-Drelease=true"]); + } let dest_obj_path = Path::new(&out_dir).join("builtins.o"); let dest_obj = dest_obj_path.to_str().expect("Invalid dest object path"); @@ -26,12 +40,6 @@ fn main() { run_command(&bitcode_path, "mv", &[src_obj, dest_obj]); - let dest_ir_path = bitcode_path.join("builtins.ll"); - let dest_ir = dest_ir_path.to_str().expect("Invalid dest ir path"); - println!("Compiling ir to: {}", dest_ir); - - run_command(&bitcode_path, "zig", &["build", "ir", "-Drelease=true"]); - let dest_bc_path = bitcode_path.join("builtins.bc"); let dest_bc = dest_bc_path.to_str().expect("Invalid dest bc path"); println!("Compiling bitcode to: {}", dest_bc); @@ -78,6 +86,26 @@ where } } +fn run_command_with_no_args>(path: P, command_str: &str) +{ + let output_result = Command::new(OsStr::new(&command_str)) + .current_dir(path) + .output(); + match output_result { + Ok(output) => match output.status.success() { + true => (), + false => { + let error_str = match str::from_utf8(&output.stderr) { + Ok(stderr) => stderr.to_string(), + Err(_) => format!("Failed to run \"{}\"", command_str), + }; + panic!("{} failed: {}", command_str, error_str); + } + }, + Err(reason) => panic!("{} failed: {}", command_str, reason), + } +} + fn get_zig_files(dir: &Path, cb: &dyn Fn(&Path)) -> io::Result<()> { if dir.is_dir() { for entry in fs::read_dir(dir)? { diff --git a/shell.nix b/shell.nix index 10c965b2e8..7b7d61fd55 100644 --- a/shell.nix +++ b/shell.nix @@ -1,116 +1,116 @@ -{ }: +{}: let splitSystem = builtins.split "-" builtins.currentSystem; currentArch = builtins.elemAt splitSystem 0; currentOS = builtins.elemAt splitSystem 2; -in with { - # Look here for information about how pin version of nixpkgs - # → https://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs - pkgs = import (builtins.fetchGit { - name = "nixpkgs-2021-04-23"; - url = "https://github.com/nixos/nixpkgs/"; - ref = "refs/heads/nixpkgs-unstable"; - rev = "8d0340aee5caac3807c58ad7fa4ebdbbdd9134d6"; - }) { }; - - isMacOS = currentOS == "darwin"; - isLinux = currentOS == "linux"; - isAarch64 = currentArch == "aarch64"; -}; - -with (pkgs); - -let - darwin-inputs = - if isMacOS then - with pkgs.darwin.apple_sdk.frameworks; [ - AppKit - CoreFoundation - CoreServices - CoreVideo - Foundation - Metal - Security - ] - else - [ ]; - - linux-inputs = - if isLinux then - [ - valgrind - vulkan-headers - vulkan-loader - vulkan-tools - vulkan-validation-layers - xorg.libX11 - xorg.libXcursor - xorg.libXrandr - xorg.libXi - xorg.libxcb - ] - else - [ ]; - - nixos-env = - if isLinux && builtins.pathExists /etc/nixos/configuration.nix then - { XDG_DATA_DIRS = "/run/opengl-driver/share:$XDG_DATA_DIRS"; +in + with { + # Look here for information about how pin version of nixpkgs + # → https://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs + pkgs = import ( + builtins.fetchGit { + # name = "nixpkgs-2021-04-23"; + url = "https://github.com/nixos/nixpkgs/"; + ref = "refs/heads/nixpkgs-unstable"; + rev = "8d0340aee5caac3807c58ad7fa4ebdbbdd9134d6"; } - else - { }; + ) {}; - llvmPkgs = pkgs.llvmPackages_10; - zig = import ./nix/zig.nix { inherit pkgs isMacOS isAarch64; }; - inputs = [ - # build libraries - rustc - cargo - clippy - rustfmt - cmake - git - python3 - llvmPkgs.llvm - llvmPkgs.clang - pkg-config - zig - # lib deps - llvmPkgs.libcxx - llvmPkgs.libcxxabi - libffi - libunwind - libxml2 - ncurses - zlib - libiconv - # faster builds - see https://github.com/rtfeldman/roc/blob/trunk/BUILDING_FROM_SOURCE.md#use-lld-for-the-linker - llvmPkgs.lld - # dev tools - # rust-analyzer - # (import ./nix/zls.nix { inherit pkgs zig; }) - ]; + isMacOS = currentOS == "darwin"; + isLinux = currentOS == "linux"; + isAarch64 = currentArch == "aarch64"; + }; -in mkShell (nixos-env // { - buildInputs = inputs ++ darwin-inputs ++ linux-inputs; + with (pkgs); - # Additional Env vars - LLVM_SYS_100_PREFIX = "${llvmPkgs.llvm}"; - LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath - ([ + let + darwin-inputs = + if isMacOS then + with pkgs.darwin.apple_sdk.frameworks; [ + AppKit + CoreFoundation + CoreServices + CoreVideo + Foundation + Metal + Security + ] + else + []; + + linux-inputs = + if isLinux then + [ + valgrind + vulkan-headers + vulkan-loader + vulkan-tools + vulkan-validation-layers + xorg.libX11 + xorg.libXcursor + xorg.libXrandr + xorg.libXi + xorg.libxcb + ] + else + []; + + llvmPkgs = pkgs.llvmPackages_10; + zig = import ./nix/zig.nix { inherit pkgs isMacOS isAarch64; }; + inputs = [ + # build libraries + rustc + cargo + clippy + rustfmt + cmake + git + python3 + llvmPkgs.llvm + llvmPkgs.clang pkg-config - stdenv.cc.cc.lib + zig + # lib deps llvmPkgs.libcxx llvmPkgs.libcxxabi - libunwind libffi + libunwind + libxml2 ncurses zlib - ] ++ linux-inputs); + libiconv + # faster builds - see https://github.com/rtfeldman/roc/blob/trunk/BUILDING_FROM_SOURCE.md#use-lld-for-the-linker + llvmPkgs.lld + # dev tools + # rust-analyzer + # (import ./nix/zls.nix { inherit pkgs zig; }) + ]; - # Aliases don't work cross shell, so we do this - shellHook = '' - export PATH="$PATH:$PWD/nix/bin" - ''; -}) + in + mkShell ( + { + buildInputs = inputs ++ darwin-inputs ++ linux-inputs; + # Additional Env vars + LLVM_SYS_100_PREFIX = "${llvmPkgs.llvm}"; + LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath + ( + [ + pkg-config + stdenv.cc.cc.lib + llvmPkgs.libcxx + llvmPkgs.libcxxabi + libunwind + libffi + ncurses + zlib + ] ++ linux-inputs + ); + + # Aliases don't work cross shell, so we do this + shellHook = '' + export PATH="$PATH:$PWD/nix/bin" + ''; + } + )