Skip to content

Commit b9d5c22

Browse files
committed
Cleanup build
1 parent 4ccd51a commit b9d5c22

File tree

8 files changed

+134
-115
lines changed

8 files changed

+134
-115
lines changed

.github/workflows/build-gems.yml

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,17 @@ jobs:
6262
steps:
6363
- uses: actions/checkout@v4
6464

65-
- name: Add LLVM apt Repo
66-
run: |-
67-
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
68-
sudo add-apt-repository "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-21 main"
69-
sudo apt update
70-
71-
- name: Install APT dependencies
72-
run: xargs sudo apt-get install -y --no-install-recommends < Aptfile
73-
7465
- name: Setup Ruby
7566
uses: ruby/setup-ruby@v1
7667
with:
77-
bundler-cache: false
78-
79-
- name: bundle install
80-
run: bundle install
68+
ruby-version: '3.4'
69+
bundler-cache: true
8170

8271
- name: Render Templates
8372
run: bundle exec rake templates
8473

85-
- name: Compile Herb
86-
run: bundle exec rake make
74+
- name: Vendor Prism
75+
run: bundle exec rake prism:vendor
8776

8877
- name: Build gem
8978
run: |
@@ -128,7 +117,7 @@ jobs:
128117
uses: ruby/setup-ruby@v1
129118
with:
130119
ruby-version: '3.4'
131-
bundler-cache: false
120+
bundler-cache: true
132121

133122
- name: Download gem artifacts
134123
uses: actions/download-artifact@v4

.github/workflows/build.yml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,11 @@ jobs:
3838
with:
3939
bundler-cache: true
4040

41-
- name: bundle install
42-
run: bundle install
43-
4441
- name: Render Templates
4542
run: bundle exec rake templates
4643

4744
- name: Compile Herb
48-
run: bundle exec rake make
45+
run: make
4946

5047
- name: Compile Ruby extension
5148
run: bundle exec rake compile
@@ -63,7 +60,7 @@ jobs:
6360
# run: bundle exec srb tc
6461

6562
- name: Run C tests
66-
run: ./run_herb_tests
63+
run: make test && ./run_herb_tests
6764

6865
- name: Run valgrind on examples/
6966
run: ./bin/valgrind_check_examples

.github/workflows/java.yml

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,8 @@ jobs:
3030
with:
3131
bundler-cache: true
3232

33-
- name: Render Templates
34-
run: bundle exec rake templates
35-
36-
- name: Compile Herb
37-
run: bundle exec rake make
38-
39-
- name: Build JNI library
40-
run: make jni
41-
working-directory: java
42-
43-
- name: Compile Java classes
44-
run: make java
33+
- name: Build JNI library and Java classes
34+
run: make all
4535
working-directory: java
4636

4737
- name: Run tests

.github/workflows/rust.yml

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ jobs:
4444
with:
4545
bundler-cache: true
4646

47-
- name: bundle install
48-
run: bundle install
49-
50-
- name: Render Templates
51-
run: bundle exec rake templates
47+
- name: Setup
48+
run: make setup
49+
working-directory: rust
5250

53-
- name: Compile Herb
54-
run: bundle exec rake make
51+
- name: Build Rust
52+
run: make build
53+
working-directory: rust
5554

5655
- name: Check Rust formatting
5756
run: make format-check
@@ -61,10 +60,6 @@ jobs:
6160
run: make lint
6261
working-directory: rust
6362

64-
- name: Build Rust
65-
run: make build
66-
working-directory: rust
67-
6863
- name: Run Rust tests
6964
run: make test
7065
working-directory: rust

Makefile

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ extension_sources = $(wildcard ext/**/*.c)
99
extension_headers = $(wildcard ext/**/*.h)
1010
extension_objects = $(extension_sources:.o)
1111

12-
prism_objects = $(filter-out src/main.c, $(sources))
13-
1412
project_files = $(sources) $(headers)
1513
extension_files = $(extension_sources) $(extension_headers)
1614
nodejs_extension_files = $(wildcard node/**/*.cpp) $(wildcard node/**/*.h) $(wildcard node/**/*.hpp)
@@ -30,37 +28,27 @@ $(shell mkdir -p $(build_dir))
3028

3129
os := $(shell uname -s)
3230

33-
prism_path = $(shell bundle show prism)
34-
prism_include = $(prism_path)/include
35-
prism_build = $(prism_path)/build
31+
prism_vendor_path = vendor/prism
32+
prism_include = $(prism_vendor_path)/include
33+
prism_src = $(prism_vendor_path)/src
3634

37-
prism_flags = -I$(prism_include)
38-
prism_ldflags = $(prism_build)/libprism.a
35+
prism_sources = $(wildcard $(prism_src)/*.c) $(wildcard $(prism_src)/util/*.c)
36+
prism_objects = $(prism_sources:.c=.o)
37+
prism_static_lib = $(build_dir)/libprism.a
3938

40-
# Enable strict warnings
41-
warning_flags = -Wall -Wextra -Werror -pedantic
39+
prism_flags = -I$(prism_include) -I$(prism_src)
4240

43-
# Debug build (no optimizations, debug symbols)
41+
warning_flags = -Wall -Wextra -Werror -pedantic
4442
debug_flags = -g -O0 -Wno-unused-parameter
45-
46-
# Production build (optimized)
4743
production_flags = $(warning_flags) -O3 -march=native -flto
48-
49-
# Shared library flags (only for `.so`/`.dylib`/`.bundle`)
5044
shared_library_flags = -fPIC
51-
52-
# Default build mode (change this as needed)
5345
flags = $(warning_flags) $(debug_flags) $(prism_flags) -std=c99
54-
55-
# Separate test compilation flags
5646
test_flags = $(debug_flags) $(prism_flags) -std=gnu99
57-
58-
# Shared library build (if needed)
5947
shared_flags = $(production_flags) $(shared_library_flags) $(prism_flags)
6048

6149
ifeq ($(os),Linux)
6250
test_cflags = $(test_flags) -I/usr/include/check
63-
test_ldflags = -L/usr/lib/x86_64-linux-gnu -lcheck -lm -lsubunit $(prism_ldflags)
51+
test_ldflags = -L/usr/lib/x86_64-linux-gnu -lcheck -lm -lsubunit
6452
cc = clang-21
6553
clang_format = clang-format-21
6654
clang_tidy = clang-tidy-21
@@ -69,7 +57,7 @@ endif
6957
ifeq ($(os),Darwin)
7058
brew_prefix := $(shell brew --prefix check)
7159
test_cflags = $(test_flags) -I$(brew_prefix)/include
72-
test_ldflags = -L$(brew_prefix)/lib -lcheck -lm $(prism_ldflags)
60+
test_ldflags = -L$(brew_prefix)/lib -lcheck -lm
7361
llvm_path = $(shell brew --prefix llvm@21)
7462
cc = $(llvm_path)/bin/clang
7563
clang_format = $(llvm_path)/bin/clang-format
@@ -78,30 +66,42 @@ endif
7866

7967
all: templates prism $(exec) $(lib_name) $(static_lib_name) test wasm clangd_config
8068

81-
$(exec): $(objects)
82-
$(cc) $(objects) $(flags) $(ldflags) $(prism_ldflags) -o $(exec)
69+
$(exec): $(objects) $(prism_objects)
70+
$(cc) $(objects) $(prism_objects) $(flags) $(ldflags) -o $(exec)
8371

84-
$(lib_name): $(objects)
85-
$(cc) -shared $(objects) $(shared_flags) $(ldflags) $(prism_ldflags) -o $(lib_name)
86-
# cp $(lib_name) $(ruby_extension)
72+
$(lib_name): $(objects) $(prism_objects)
73+
$(cc) -shared $(objects) $(prism_objects) $(shared_flags) $(ldflags) -o $(lib_name)
8774

8875
$(static_lib_name): $(objects)
8976
ar rcs $(static_lib_name) $(objects)
9077

78+
$(prism_static_lib): $(prism_objects)
79+
ar rcs $(prism_static_lib) $(prism_objects)
80+
81+
prism_lib: prism $(prism_static_lib)
82+
83+
herb_lib: templates prism $(non_main_objects)
84+
@echo "Herb objects built: $(non_main_objects)"
85+
9186
src/%.o: src/%.c templates
9287
$(cc) -c $(flags) -fPIC $< -o $@
9388

89+
$(prism_src)/%.o: $(prism_src)/%.c prism
90+
$(cc) -c $(flags) -fPIC $(prism_flags) $< -o $@
91+
92+
$(prism_src)/util/%.o: $(prism_src)/util/%.c prism
93+
$(cc) -c $(flags) -fPIC $(prism_flags) $< -o $@
94+
9495
test/%.o: test/%.c templates
9596
$(cc) -c $(test_cflags) $(test_flags) $(prism_flags) $< -o $@
9697

97-
test: $(test_objects) $(non_main_objects)
98-
$(cc) $(test_objects) $(non_main_objects) $(test_cflags) $(test_ldflags) -o $(test_exec)
98+
test: $(test_objects) $(non_main_objects) $(prism_objects)
99+
$(cc) $(test_objects) $(non_main_objects) $(prism_objects) $(test_cflags) $(test_ldflags) -o $(test_exec)
99100

100101
clean:
101-
rm -f $(exec) $(test_exec) $(lib_name) $(shared_lib_name) $(ruby_extension)
102-
rm -rf $(objects) $(test_objects) $(extension_objects) lib/herb/*.bundle tmp
103-
rm -rf $(prism_path)
104-
rake prism:clean
102+
rm -f $(exec) $(test_exec) $(lib_name) $(shared_lib_name) $(prism_static_lib) $(ruby_extension)
103+
rm -rf $(objects) $(test_objects) $(prism_objects) $(extension_objects) lib/herb/*.bundle tmp
104+
bundle exec rake prism:clean
105105

106106
bundle_install:
107107
bundle install
@@ -110,8 +110,7 @@ templates: bundle_install
110110
bundle exec rake templates
111111

112112
prism: bundle_install
113-
cd $(prism_path) && ruby templates/template.rb && make static && cd -
114-
rake prism:vendor
113+
bundle exec rake prism:vendor
115114

116115
format:
117116
$(clang_format) -i $(project_and_extension_files)

Rakefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ namespace :prism do
144144
exit 1
145145
end
146146

147+
puts "Generating Prism templates..."
148+
Dir.chdir(prism_bundle_path) do
149+
system("ruby templates/template.rb", exception: true)
150+
end
151+
147152
FileUtils.mkdir_p(prism_vendor_path)
148153

149154
files = [

java/Makefile

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,71 @@ endif
2424

2525
BUILD_DIR = ../build
2626
SRC_DIR = ../src
27-
PRISM_PATH = $(shell cd .. && bundle show prism)
28-
PRISM_INCLUDE = $(PRISM_PATH)/include
29-
PRISM_BUILD = $(PRISM_PATH)/build
27+
PRISM_VENDOR_PATH = ../vendor/prism
28+
PRISM_SRC = $(PRISM_VENDOR_PATH)/src
29+
PRISM_INCLUDE = $(PRISM_VENDOR_PATH)/include
30+
PRISM_LIB = $(BUILD_DIR)/libprism.a
3031

3132
JAVAC = $(JAVA_HOME)/bin/javac
3233
JAVA_CMD = $(JAVA_HOME)/bin/java
3334
CFLAGS = -std=c99 -Wall -Wextra -fPIC -O2
34-
INCLUDES = -I. -I$(SRC_DIR)/include -I$(PRISM_INCLUDE) $(JNI_INCLUDES)
35+
HERB_CFLAGS = $(CFLAGS) -Wno-unused-parameter
36+
PRISM_CFLAGS = -std=c99 -fPIC -O2
37+
INCLUDES = -I. -I$(SRC_DIR)/include -I$(PRISM_INCLUDE) -I$(PRISM_SRC) $(JNI_INCLUDES)
3538
LDFLAGS = -shared
36-
LIBS = $(PRISM_BUILD)/libprism.a
3739

38-
HERB_SOURCES = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/**/*.c)
39-
HERB_OBJECTS = $(filter-out $(SRC_DIR)/main.o, $(HERB_SOURCES:.c=.o))
40-
41-
JNI_SOURCES = herb_jni.c extension_helpers.c
42-
JNI_GENERATED_SOURCES = nodes.c error_helpers.c
43-
44-
JNI_OBJECTS = $(JNI_SOURCES:.c=.o) $(JNI_GENERATED_SOURCES:.c=.o)
40+
JNI_SOURCES = herb_jni.c extension_helpers.c nodes.c error_helpers.c
41+
JNI_OBJECTS = $(JNI_SOURCES:.c=.o)
4542

4643
JNI_LIB = $(BUILD_DIR)/$(JNI_LIB_PREFIX)herb_jni.$(JNI_LIB_EXT)
4744

4845
JAVA_SOURCES = $(shell find org -name "*.java" 2>/dev/null)
4946
JAVA_TIMESTAMP = target/.java_compiled
5047

51-
.PHONY: all clean java jni test
48+
.PHONY: all clean java jni setup templates prism prism_lib herb_objects help cli
5249

53-
all: templates jni java
50+
all: jni java
5451

55-
templates:
52+
# Setup: install deps, generate templates, vendor prism
53+
setup:
54+
cd .. && bundle install
5655
cd .. && bundle exec rake templates
56+
cd .. && bundle exec rake prism:vendor
5757

58-
jni: $(JNI_LIB)
58+
templates:
59+
cd .. && bundle install && bundle exec rake templates
60+
61+
prism:
62+
cd .. && bundle install && bundle exec rake prism:vendor
5963

60-
$(JNI_LIB): $(JNI_OBJECTS) $(HERB_OBJECTS)
64+
prism_lib: prism
65+
@mkdir -p $(BUILD_DIR)
66+
@echo "Compiling prism sources..."
67+
@for src in $$(find $(PRISM_SRC) -name '*.c'); do \
68+
obj=$${src%.c}.o; \
69+
if [ ! -f "$$obj" ] || [ "$$src" -nt "$$obj" ]; then \
70+
echo " CC $$src"; \
71+
$(CC) $(PRISM_CFLAGS) -I$(PRISM_INCLUDE) -I$(PRISM_SRC) -c "$$src" -o "$$obj"; \
72+
fi; \
73+
done
74+
@echo "Creating prism static library..."
75+
ar rcs $(PRISM_LIB) $$(find $(PRISM_SRC) -name '*.o')
76+
@echo "Built: $(PRISM_LIB)"
77+
78+
herb_objects: templates
79+
@echo "Compiling herb sources..."
80+
@for src in $$(find $(SRC_DIR) -name '*.c' ! -name 'main.c'); do \
81+
obj=$${src%.c}.o; \
82+
if [ ! -f "$$obj" ] || [ "$$src" -nt "$$obj" ]; then \
83+
echo " CC $$src"; \
84+
$(CC) $(HERB_CFLAGS) $(INCLUDES) -c "$$src" -o "$$obj"; \
85+
fi; \
86+
done
87+
@echo "Herb objects compiled"
88+
89+
jni: prism_lib herb_objects $(JNI_OBJECTS)
6190
@mkdir -p $(BUILD_DIR)
62-
$(CC) $(LDFLAGS) -o $@ $(JNI_OBJECTS) $(HERB_OBJECTS) $(LIBS)
91+
$(CC) $(LDFLAGS) -o $(JNI_LIB) $(JNI_OBJECTS) $$(find $(SRC_DIR) -name '*.o' ! -name 'main.o') $(PRISM_LIB)
6392
@echo "Built JNI library: $(JNI_LIB)"
6493

6594
%.o: %.c
@@ -83,19 +112,25 @@ cli: all
83112
clean:
84113
rm -f $(JNI_OBJECTS) $(JNI_LIB)
85114
rm -rf target/
86-
rm -f nodes.o error_helpers.o
115+
find $(SRC_DIR) -name '*.o' -delete 2>/dev/null || true
116+
find $(PRISM_SRC) -name '*.o' -delete 2>/dev/null || true
117+
rm -f $(PRISM_LIB)
87118

88119
help:
89120
@echo "Herb Java/JNI Build System"
90121
@echo ""
91122
@echo "Targets:"
92-
@echo " all - Build everything (templates + JNI + Java)"
93-
@echo " templates - Generate code from ERB templates"
94-
@echo " jni - Build JNI shared library"
95-
@echo " java - Compile Java classes"
96-
@echo " cli - Show CLI usage"
97-
@echo " clean - Remove built files"
98-
@echo " help - Show this help"
123+
@echo " all - Build everything (JNI + Java)"
124+
@echo " setup - Install deps, generate templates, vendor prism"
125+
@echo " templates - Generate code from ERB templates"
126+
@echo " prism - Vendor prism library sources"
127+
@echo " prism_lib - Compile prism static library"
128+
@echo " herb_objects - Compile herb source files"
129+
@echo " jni - Build JNI shared library"
130+
@echo " java - Compile Java classes"
131+
@echo " cli - Show CLI usage"
132+
@echo " clean - Remove built files"
133+
@echo " help - Show this help"
99134
@echo ""
100135
@echo "Environment:"
101136
@echo " JAVA_HOME = $(JAVA_HOME)"

0 commit comments

Comments
 (0)