ifdef DEBUG
CONFIG = Debug
CXXCONFIGFLAGS = -O0 -g -D_DEBUG
else
CONFIG = Release
CXXCONFIGFLAGS = -O3 -DNDEBUG
endif
KERNEL = $(shell uname -s)
ifeq ($(KERNEL), Darwin)
OS = osx
EXTENSION = dylib
TARGETOS = darwin
TARGETARCH_X86 = i386
TARGETARCH_X64 = x86_64
TARGETARCH_ARM = arm
TARGETARCH_ARM64 = arm64
MAKELINUX = true
else ifeq ($(KERNEL), Linux)
OS = linux
EXTENSION = so
TARGETOS = linux
TARGETARCH_X86 = i386
TARGETARCH_X64 = x86_64
TARGETARCH_ARM = arm
TARGETARCH_ARM64 = aarch64
MAKELINUX = make
else
$(error unsupported operating system '$(KERNEL)')
endif
ARCH = $(shell uname -m)
ifeq ($(ARCH), i386)
HOSTCPU = x86
else ifeq ($(ARCH), x86_64)
HOSTCPU = x64
else ifeq ($(ARCH), arm)
HOSTCPU = arm
else ifeq ($(ARCH), arm32)
HOSTCPU = arm
else ifeq ($(ARCH), aarch32)
HOSTCPU = arm
else ifeq ($(ARCH), arm64)
HOSTCPU = arm64
else ifeq ($(ARCH), aarch64)
HOSTCPU = arm64
else
$(error unsupported machine architecture '$(ARCH)')
endif
ifeq ($(HOSTCPU), x64)
OTHERCPU = arm64
else ifeq ($(HOSTCPU), arm64)
OTHERCPU = x64
else
$(error unsupported build machine architecture '$(ARCH)')
endif
ifndef CPU
CPU = $(HOSTCPU)
endif
ifeq ($(CPU), x86)
TARGETARCH = $(TARGETARCH_X86)
else ifeq ($(CPU), x64)
TARGETARCH = $(TARGETARCH_X64)
else ifeq ($(CPU), arm)
TARGETARCH = $(TARGETARCH_ARM)
TARGETSUFFIX = eabihf
else ifeq ($(CPU), arm64)
TARGETARCH = $(TARGETARCH_ARM64)
else
$(error unsupported target CPU '$(CPU)')
endif
STRIP = true
CODESIGN = true
ifeq ($(TARGETOS), linux)
TARGET = $(TARGETARCH)-$(TARGETOS)-gnu$(TARGETSUFFIX)
ifndef DEBUG
CXXLINKFLAGS := -s
endif
CXXLINKFLAGS := $(CXXLINKFLAGS) -static-libstdc++ -static-libgcc -ldl -lrt --no-undefined
ifneq ($(HOSTCPU), $(CPU))
CXXCROSSFLAGS = -I/usr/$(TARGET)/include
CXXLINKFLAGS := -fuse-ld=/usr/$(TARGET)/bin/ld $(CXXLINKFLAGS)
endif
else ifeq ($(TARGETOS), darwin)
TARGET = $(TARGETARCH)-$(TARGETOS)
CXXLINKFLAGS := -framework CoreFoundation
ifndef DEBUG
STRIP = strip -r -u
ENTITLEMENTS = $(MAKEDIR)/entitlements.xml
CODESIGN = codesign --sign - --options linker-signed --entitlements $(ENTITLEMENTS) --force
endif
else
$(error unsupported target operating system '$(TARGETOS)')
endif
MAKEFILE = $(word $(words $(MAKEFILE_LIST)), $(MAKEFILE_LIST))
MAKEDIR = $(dir $(abspath $(MAKEFILE)))
ROOTDIR = $(abspath $(MAKEDIR)/../..)
SRCDIR = $(ROOTDIR)/ClearScriptV8
UNIXDIR = $(ROOTDIR)/Unix
EXPORTSDIR = $(ROOTDIR)/ClearScript/Exports
V8ROOTDIR = $(ROOTDIR)/V8
V8BUILDDIR = $(V8ROOTDIR)/build
V8DIR = $(V8BUILDDIR)/v8
V8INCDIR = $(V8DIR)/include
V8OUTDIR = $(V8DIR)/out/$(CPU)/$(CONFIG)
V8LIBDIR = $(V8OUTDIR)/obj
JSONDIR = $(V8BUILDDIR)/json
JSONINCDIR = $(JSONDIR)/single_include
OUTDIR = $(ROOTDIR)/bin/$(CONFIG)/Unix
OBJDIR = $(OUTDIR)/obj/$(CPU)
CLEARSCRIPTV8 = $(OUTDIR)/ClearScriptV8.$(OS)-$(CPU).$(EXTENSION)
CXX = clang++
CXXFLAGS = --target=$(TARGET) -std=c++20 -fvisibility=default -fPIC -fno-rtti -Wno-deprecated-declarations -Wno-ignored-attributes $(CXXCONFIGFLAGS) -I$(V8INCDIR) -I$(JSONINCDIR) $(CXXCROSSFLAGS)
HEADERS = $(wildcard $(SRCDIR)/*.h) $(wildcard $(EXPORTSDIR)/*.h)
OBJECTS = \
$(OBJDIR)/HighResolutionClock.o \
$(OBJDIR)/HighResolutionClock.Unix.o \
$(OBJDIR)/HostObjectHolderImpl.o \
$(OBJDIR)/HostObjectUtil.o \
$(OBJDIR)/Mutex.o \
$(OBJDIR)/RefCount.o \
$(OBJDIR)/StdString.o \
$(OBJDIR)/V8Context.o \
$(OBJDIR)/V8ContextImpl.o \
$(OBJDIR)/V8Isolate.o \
$(OBJDIR)/V8IsolateImpl.o \
$(OBJDIR)/V8ObjectHelpers.o \
$(OBJDIR)/V8ObjectHolderImpl.o \
$(OBJDIR)/V8ScriptHolderImpl.o \
$(OBJDIR)/V8SplitProxyManaged.o \
$(OBJDIR)/V8SplitProxyNative.o
.PHONY: all objdir clean buildv8 cleanv8 zapv8 buildallrelease buildalldebug buildall cleanallrelease cleanalldebug cleanall
all: objdir buildv8 $(CLEARSCRIPTV8)
objdir:
@mkdir -p $(OBJDIR)
$(CLEARSCRIPTV8): $(OBJECTS) $(V8LIBDIR)/libv8_monolith.a $(ENTITLEMENTS)
$(CXX) $(CXXFLAGS) $(CXXLINKFLAGS) --shared -L$(V8LIBDIR) $(OBJECTS) -o $@ -pthread -lv8_monolith && $(STRIP) $@ && $(CODESIGN) $@
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(HEADERS)
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -rf $(CLEARSCRIPTV8) $(OBJDIR)
buildv8:
cd $(UNIXDIR); ./V8Update.sh -n -y $(CPU) $(CONFIG)
cleanv8:
rm -rf $(V8OUTDIR)
zapv8:
rm -rf $(V8BUILDDIR)
buildallrelease:
make CPU=$(HOSTCPU)
make CPU=$(OTHERCPU)
$(MAKELINUX) CPU=arm
buildalldebug:
make CPU=$(HOSTCPU) DEBUG=1
make CPU=$(OTHERCPU) DEBUG=1
$(MAKELINUX) CPU=arm DEBUG=1
buildall: buildallrelease buildalldebug
cleanallrelease:
make clean CPU=$(HOSTCPU)
make clean CPU=$(OTHERCPU)
$(MAKELINUX) clean CPU=arm
cleanalldebug:
make clean CPU=$(HOSTCPU) DEBUG=1
make clean CPU=$(OTHERCPU) DEBUG=1
$(MAKELINUX) clean CPU=arm DEBUG=1
cleanall: cleanallrelease cleanalldebug