Skip to content

Commit d2f477a

Browse files
committed
feat: bash build/clean scripts
1 parent c5c90b7 commit d2f477a

File tree

3 files changed

+127
-8
lines changed

3 files changed

+127
-8
lines changed

build.sh

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
6+
7+
ROOT_DIR=$SCRIPT_DIR
8+
9+
cd $ROOT_DIR
10+
11+
CPPFRONT=$ROOT_DIR/.cache/tools/cppfront
12+
CPP2B_DIST=$ROOT_DIR/dist/debug/cpp2b
13+
MODULES_DIR=$ROOT_DIR/.cache/modules
14+
15+
mkdir -p $ROOT_DIR/.cache/repos
16+
mkdir -p $MODULES_DIR
17+
mkdir -p $ROOT_DIR/.cache/tools
18+
mkdir -p $ROOT_DIR/dist/debug
19+
20+
CPP2B_COMPILER=clang-18
21+
22+
function log_info() {
23+
echo "INFO: $1"
24+
}
25+
26+
function log_error() {
27+
echo "ERROR: $1"
28+
}
29+
30+
function fatal() {
31+
echo "FATAL: $1"
32+
exit 1
33+
}
34+
35+
if ! [ -x "$(command -v $CPP2B_COMPILER)" ]; then
36+
fatal "cannot find $CPP2B_COMPILER in your PATH"
37+
fi
38+
39+
if [[ -z "${CPP2B_LIBCXX_BUILD_ROOT}" ]]; then
40+
log_error "libcxx with module support must be built from source"
41+
log_error "follow these instructions https://github.com/llvm/llvm-project/blob/main/libcxx/docs/Modules.rst"
42+
fatal "missing CPP2B_LIBCXX_BUILD_ROOT environment variable"
43+
fi
44+
45+
log_info "using libcxx build root $CPP2B_LIBCXX_BUILD_ROOT"
46+
47+
if ! [ -d $CPP2B_LIBCXX_BUILD_ROOT ]; then
48+
log_fatal "directory $CPP2B_LIBCXX_BUILD_ROOT does not exixt"
49+
fi
50+
51+
function ensure_gh_repo() {
52+
local repo=$1
53+
local repo_path=$ROOT_DIR/.cache/repos/$repo
54+
if ! [ -d $repo_path ]; then
55+
mkdir -p $repo_path
56+
git clone --quiet --depth=1 --filter=blob:none --sparse https://github.com/$repo $repo_path
57+
fi
58+
}
59+
60+
function ensure_gh_repo_subdir() {
61+
local repo=$1
62+
local repo_path=$ROOT_DIR/.cache/repos/$repo
63+
local repo_subdir=$2
64+
local repo_subdir_path=$repo_path/$repo_subdir
65+
if ! [ -d $repo_subdir_path ]; then
66+
cd $repo_path
67+
log_info "checking out repo $repo/$reposubdir"
68+
git sparse-checkout add $repo_subdir --quiet
69+
cd $ROOT_DIR
70+
fi
71+
}
72+
73+
ensure_gh_repo "hsutter/cppfront"
74+
ensure_gh_repo_subdir "hsutter/cppfront" "source"
75+
ensure_gh_repo_subdir "hsutter/cppfront" "include"
76+
77+
CPPFRONT_INCLUDE_DIR=$ROOT_DIR/.cache/repos/hsutter/cppfront/include
78+
79+
LIBCXX_MODULES_DIR=$CPP2B_LIBCXX_BUILD_ROOT/modules
80+
LIBCXX_INCLUDE_DIR=$CPP2B_LIBCXX_BUILD_ROOT/include
81+
LIBCXX_LIB_DIR=$CPP2B_LIBCXX_BUILD_ROOT/lib
82+
83+
if ! [ -x $CPPFRONT ]; then
84+
log_info "compiling cppfront..."
85+
cd $ROOT_DIR/.cache/repos/hsutter/cppfront/source
86+
$CPP2B_COMPILER -lstdc++ -lc -lm -fuse-ld=lld -std=c++23 cppfront.cpp -o $CPPFRONT
87+
cd $ROOT_DIR
88+
fi
89+
90+
if ! [ -f $MODULES_DIR/std.pcm ]; then
91+
cd $LIBCXX_MODULES_DIR/c++/v1
92+
log_info "compiling std module..."
93+
94+
$CPP2B_COMPILER \
95+
-stdlib=libc++ \
96+
-std=c++23 \
97+
-Wno-reserved-module-identifier \
98+
std.cppm \
99+
--precompile -o $MODULES_DIR/std.pcm
100+
101+
cd $ROOT_DIR
102+
fi
103+
104+
log_info "running cppfront..."
105+
$CPPFRONT src/main.cpp2 -pure -import-std -add-source-info -format-colon-errors
106+
107+
log_info "compiling..."
108+
$CPP2B_COMPILER \
109+
-stdlib=libc++ \
110+
src/main.cpp \
111+
-std=c++23 \
112+
-fprebuilt-module-path=$MODULES_DIR \
113+
-L$LIBCXX_LIB_DIR \
114+
-lc++ \
115+
-I"$CPPFRONT_INCLUDE_DIR" \
116+
-o $CPP2B_DIST
117+
118+
log_info "successfully built $CPP2B_DIST"

clean.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bash
2+
3+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
4+
5+
ROOT_DIR=$SCRIPT_DIR
6+
7+
cd $ROOT_DIR
8+
9+
rm -rf .cache

src/main.cpp2

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ expect: <T>(move opt: std::optional<T>, message) -> T = {
3131
return opt*;
3232
}
3333

34-
expect: <T>(move v: std::variant, message) -> T = {
35-
if !std::holds_alternative<T>(v) {
36-
panic("ERROR: {}", message);
37-
}
38-
39-
return std::get<T>(v);
40-
}
41-
4234
main: (args) -> int = {
4335
cpp2b_config_file := find_closest_file("cpp2b.toml").expect("Cannot find cpp2b config file. Are you sure you're running cpp2b in a cpp2b project?");
4436

0 commit comments

Comments
 (0)