corda/makefile
Joel Dice 38cea04322 progress towards thread support
This includes support for using the least significant bits of the class
pointer to indicate object state, which we'll use to indicate the
presence of a monitor pointer, among other things.
2007-07-01 15:34:22 -06:00

292 lines
7.7 KiB
Makefile

#MAKEFLAGS = -s
arch = $(shell uname -m)
ifeq ($(arch),i586)
arch = i386
endif
ifeq ($(arch),i686)
arch = i386
endif
bld = build/$(arch)
src = src
classpath = classpath
cxx = g++
cc = gcc
vg = nice valgrind --leak-check=full --num-callers=32 --db-attach=yes \
--freelist-vol=100000000
javac = javac
warnings = -Wall -Wextra -Werror -Wold-style-cast -Wunused-parameter \
-Winit-self -Wconversion
slow = -O0 -g3
fast = -Os -DNDEBUG
#thread-cflags = -DNO_THREADS
thread-cflags = -pthread
thread-lflags = -lpthread
cflags = $(warnings) -fPIC -fno-rtti -fno-exceptions -fvisibility=hidden \
-I$(src) -I$(bld) $(thread-cflags)
lflags = $(thread-lflags) -ldl
test-cflags = -DDEBUG_MEMORY
stress-cflags = -DDEBUG_MEMORY -DDEBUG_MEMORY_MAJOR
cpp-objects = $(foreach x,$(1),$(patsubst $(2)/%.cpp,$(bld)/%.o,$(x)))
asm-objects = $(foreach x,$(1),$(patsubst $(2)/%.S,$(bld)/%.o,$(x)))
java-classes = \
$(foreach x,$(1),$(patsubst $(2)/%.java,$(bld)/classes/%.class,$(x)))
stdcpp-sources = $(src)/stdc++.cpp
stdcpp-objects = $(call cpp-objects,$(stdcpp-sources),$(src))
stdcpp-cflags = $(fast) $(cflags)
jni-sources = $(classpath)/java/lang/System.cpp
jni-objects = $(call cpp-objects,$(jni-sources),$(classpath))
jni-cflags = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux \
$(slow) $(cflags)
jni-library = $(bld)/libnatives.so
generated-code = \
$(bld)/type-enums.cpp \
$(bld)/type-declarations.cpp \
$(bld)/type-constructors.cpp \
$(bld)/type-initializations.cpp \
$(bld)/type-java-initializations.cpp
interpreter-depends = \
$(generated-code) \
$(src)/common.h \
$(src)/system.h \
$(src)/heap.h \
$(src)/class-finder.h \
$(src)/stream.h \
$(src)/constants.h \
$(src)/vm.h
interpreter-sources = \
$(src)/vm.cpp \
$(src)/heap.cpp \
$(src)/main.cpp
ifeq ($(arch),i386)
interpreter-asm-sources = $(src)/cdecl.S
endif
ifeq ($(arch),x86_64)
interpreter-asm-sources = $(src)/amd64.S
endif
interpreter-cpp-objects = \
$(call cpp-objects,$(interpreter-sources),$(src))
interpreter-asm-objects = \
$(call asm-objects,$(interpreter-asm-sources),$(src))
interpreter-objects = \
$(interpreter-cpp-objects) \
$(interpreter-asm-objects)
interpreter-cflags = $(slow) $(cflags)
generator-headers = \
$(src)/input.h \
$(src)/output.h
generator-sources = \
$(src)/type-generator.cpp
generator-objects = $(call cpp-objects,$(generator-sources),$(src))
generator-executable = $(bld)/generator
generator-cflags = $(slow) $(cflags)
executable = $(bld)/vm
test-cpp-objects = \
$(patsubst $(bld)/%,$(bld)/test-%,$(interpreter-cpp-objects))
test-asm-objects = \
$(patsubst $(bld)/%,$(bld)/test-%,$(interpreter-asm-objects))
test-objects = \
$(test-cpp-objects) \
$(test-asm-objects)
test-executable = $(bld)/test-vm
stress-cpp-objects = \
$(patsubst $(bld)/%,$(bld)/stress-%,$(interpreter-cpp-objects))
stress-asm-objects = \
$(patsubst $(bld)/%,$(bld)/stress-%,$(interpreter-asm-objects))
stress-objects = \
$(stress-cpp-objects) \
$(stress-asm-objects)
stress-executable = $(bld)/stress-vm
fast-cpp-objects = \
$(patsubst $(bld)/%,$(bld)/fast-%,$(interpreter-cpp-objects))
fast-asm-objects = \
$(patsubst $(bld)/%,$(bld)/fast-%,$(interpreter-asm-objects))
fast-objects = \
$(fast-cpp-objects) \
$(fast-asm-objects)
fast-executable = $(bld)/fast-vm
fast-cflags = $(fast) $(cflags)
classpath-sources = $(shell find $(classpath)/java -name '*.java')
classpath-classes = $(call java-classes,$(classpath-sources),$(classpath))
input = $(bld)/classes/Test.class
input-depends = \
$(classpath-classes) \
$(jni-library)
gen-run-arg = $(shell echo $(1) | sed -e 's:$(bld)/classes/\(.*\)\.class:\1:')
args = -cp $(bld)/classes -hs 67108864 $(call gen-run-arg,$(input))
.PHONY: build
build: $(executable)
$(input): $(input-depends)
.PHONY: run
run: $(executable) $(input)
LD_LIBRARY_PATH=$(bld) $(<) $(args)
.PHONY: debug
debug: $(executable) $(input)
LD_LIBRARY_PATH=$(bld) gdb --args $(<) $(args)
.PHONY: fast
fast: $(fast-executable)
ls -lh $(<)
.PHONY: vg
vg: $(executable) $(input)
LD_LIBRARY_PATH=$(bld) $(vg) $(<) $(args)
.PHONY: test
test: $(test-executable) $(input)
LD_LIBRARY_PATH=$(bld) $(vg) $(<) $(args)
.PHONY: stress
stress: $(stress-executable) $(input)
LD_LIBRARY_PATH=$(bld) $(vg) $(<) $(args)
.PHONY: run-all
run-all: $(executable)
set -e; for x in $(all-input); do echo "$$x:"; $(<) $$x; echo; done
.PHONY: vg-all
vg-all: $(executable)
set -e; for x in $(all-input); do echo "$$x:"; $(vg) -q $(<) $$x; done
.PHONY: test-all
test-all: $(test-executable)
set -e; for x in $(all-input); do echo "$$x:"; $(vg) -q $(<) $$x; done
.PHONY: stress-all
stress-all: $(stress-executable)
set -e; for x in $(all-input); do echo "$$x:"; $(vg) -q $(<) $$x; done
.PHONY: clean
clean:
@echo "removing build"
rm -rf build
gen-arg = $(shell echo $(1) | sed -e 's:$(bld)/type-\(.*\)\.cpp:\1:')
$(generated-code): %.cpp: $(src)/types.def $(generator-executable)
@echo "generating $(@)"
$(generator-executable) $(call gen-arg,$(@)) < $(<) > $(@)
$(bld)/type-generator.o: \
$(generator-headers)
$(bld)/classes/%.class: $(classpath)/%.java
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(javac) -bootclasspath $(classpath) -classpath $(classpath) \
-d $(bld)/classes $(<)
$(stdcpp-objects): $(bld)/%.o: $(src)/%.cpp
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(stdcpp-cflags) -c $(<) -o $(@)
$(interpreter-cpp-objects): $(bld)/%.o: $(src)/%.cpp $(interpreter-depends)
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) -c $(<) -o $(@)
$(interpreter-asm-objects): $(bld)/%.o: $(src)/%.S
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) -c $(<) -o $(@)
$(test-cpp-objects): $(bld)/test-%.o: $(src)/%.cpp $(interpreter-depends)
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) $(test-cflags) -c $(<) -o $(@)
$(test-asm-objects): $(bld)/test-%.o: $(src)/%.S
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) $(test-cflags) -c $(<) -o $(@)
$(stress-cpp-objects): $(bld)/stress-%.o: $(src)/%.cpp $(interpreter-depends)
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) $(stress-cflags) -c $(<) -o $(@)
$(stress-asm-objects): $(bld)/stress-%.o: $(src)/%.S
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(interpreter-cflags) $(stress-cflags) -c $(<) -o $(@)
$(generator-objects): $(bld)/%.o: $(src)/%.cpp
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(generator-cflags) -c $(<) -o $(@)
$(fast-cpp-objects): $(bld)/fast-%.o: $(src)/%.cpp $(interpreter-depends)
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(fast-cflags) -c $(<) -o $(@)
$(fast-asm-objects): $(bld)/fast-%.o: $(src)/%.S
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(fast-cflags) -c $(<) -o $(@)
$(jni-objects): $(bld)/%.o: $(classpath)/%.cpp
@echo "compiling $(@)"
@mkdir -p $(dir $(@))
$(cxx) $(jni-cflags) -c $(<) -o $(@)
$(jni-library): $(jni-objects)
@echo "linking $(@)"
$(cc) $(lflags) -shared $(^) -o $(@)
$(executable): $(interpreter-objects) $(stdcpp-objects)
@echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@)
$(test-executable): $(test-objects) $(stdcpp-objects)
@echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@)
$(stress-executable): $(stress-objects) $(stdcpp-objects)
@echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@)
$(fast-executable): $(fast-objects) $(stdcpp-objects)
@echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@)
strip --strip-all $(@)
.PHONY: generator
generator: $(generator-executable)
.PHONY: run-generator
run-generator: $(generator-executable)
$(<) < $(src)/types.def
.PHONY: vg-generator
vg-generator: $(generator-executable)
$(vg) $(<) < $(src)/types.def
$(generator-executable): $(generator-objects) $(stdcpp-objects)
@echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@)