-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompile_code.sh
More file actions
106 lines (86 loc) · 3.12 KB
/
compile_code.sh
File metadata and controls
106 lines (86 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash
set -euo pipefail
trap 'echo "❌ Error occurred. Exiting..."; exit 1' ERR
# Constants
readonly ROOT_DIRECTORY=$(pwd)
readonly SOURCE_DIRECTORY="$ROOT_DIRECTORY/src"
readonly COMPILED_CODE_DIRECTORY="$ROOT_DIRECTORY/systemguard_compiled"
readonly COMPILED_CODE_SOURCE_DIRECTORY="$COMPILED_CODE_DIRECTORY/src"
readonly PROMETHEUS_OUTPUT_DIRECTORY="$COMPILED_CODE_DIRECTORY/prometheus_config"
mkdir -p "$COMPILED_CODE_SOURCE_DIRECTORY" "$PROMETHEUS_OUTPUT_DIRECTORY" "$COMPILED_CODE_DIRECTORY/logs"
log() {
echo -e "\033[1;34m[INFO]\033[0m $*"
}
safe_copy() {
cp -r "$1" "$2" || { echo "Error: Failed to copy $1"; exit 1; }
}
find_python_files() {
find "$SOURCE_DIRECTORY" -name '*.py' -print0
}
find_c_files() {
find "$SOURCE_DIRECTORY" -name '*.c' -print0
}
generate_c_files_parallel() {
log "Generating C files from Python in parallel..."
find_python_files | xargs -0 -n 1 -P "$(nproc)" -I {} bash -c '
f="{}"
if ! grep -q "# cython: language_level=" "$f"; then
echo "# cython: language_level=3" | cat - "$f" > tmp && mv tmp "$f"
fi
cython "$f" -o "${f%.py}.c"
'
}
compile_c_to_so_parallel() {
log "Compiling .c files to .so in parallel..."
find_c_files | xargs -0 -n 1 -P "$(nproc)" -I {} bash -c '
c_file="{}"
source_dir="'"$SOURCE_DIRECTORY"'"
output_dir="'"$COMPILED_CODE_SOURCE_DIRECTORY"'"
relative_path="${c_file#$source_dir/}"
output_subdir="$(dirname "$relative_path")"
mkdir -p "$output_dir/$output_subdir"
base_name="$(basename "$c_file" .c)"
gcc -shared -o "$output_dir/$output_subdir/$base_name.so" -fPIC $(python3 -m pybind11 --includes) "$c_file"
'
}
copy_files() {
log "Copying project files..."
safe_copy requirements.txt "$COMPILED_CODE_DIRECTORY"
safe_copy src/core/config/config.ini "$COMPILED_CODE_SOURCE_DIRECTORY"
safe_copy systemguard.py "$COMPILED_CODE_DIRECTORY"
safe_copy setup.sh "$COMPILED_CODE_DIRECTORY"
safe_copy docs "$COMPILED_CODE_DIRECTORY"
rsync -av --exclude='.initialized' src/assets "$COMPILED_CODE_SOURCE_DIRECTORY"
safe_copy src/templates "$COMPILED_CODE_SOURCE_DIRECTORY"
safe_copy src/static "$COMPILED_CODE_SOURCE_DIRECTORY"
rsync -av --exclude='*.py' --exclude='*.c' src/scripts "$COMPILED_CODE_SOURCE_DIRECTORY"
safe_copy prometheus_config/alert_rules.yml "$PROMETHEUS_OUTPUT_DIRECTORY/"
}
cleanup() {
log "Cleaning up generated C files..."
find "$SOURCE_DIRECTORY" -name "*.c" -delete
rm -rf build
}
# Time tracking
start_timer() {
date +%s.%N
}
elapsed_time() {
start=$1
end=$(date +%s.%N)
echo "$(echo "$end - $start" | bc)"
}
# ------------------ EXECUTION ------------------
log "🚀 Build started..."
start=$(start_timer)
copy_files
log "✅ Files copied in $(elapsed_time "$start") seconds"
start=$(start_timer)
generate_c_files_parallel
log "✅ C files generated in $(elapsed_time "$start") seconds"
start=$(start_timer)
compile_c_to_so_parallel
log "✅ Shared objects compiled in $(elapsed_time "$start") seconds"
# Optional cleanup
# cleanup
log "🎉 Build completed successfully."