TypePHP 编译器 https://swoole.com/aot/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

224 lines
9.9 KiB

BUILD := build
OBJECT_DIR := $(BUILD)/objects
BOOTSTRAP_OBJECT := $(OBJECT_DIR)/bootstrap.o
KERNEL64_ENTRY_OBJECT := $(OBJECT_DIR)/kernel64-entry.o
PAYLOAD_ELF := $(BUILD)/kernel64.elf
PAYLOAD_BIN := $(BUILD)/kernel64.bin
PAYLOAD_OBJECT := $(OBJECT_DIR)/kernel64-payload.o
KERNEL := $(BUILD)/typephp-os.elf
DISK := $(BUILD)/typephp-os.img
USER_COMMANDS := ls cd date uname pwd cat echo write touch mkdir rm rmdir mv fault vmfault wrfault memtest systest builtins
USER_PROGRAMS := sh $(USER_COMMANDS)
USER_SH_ELF := $(BUILD)/sh.elf
USER_COMMAND_ELFS := $(addprefix $(BUILD)/,$(addsuffix .elf,$(USER_COMMANDS)))
NANO_USER_ELF := $(BUILD)/tnhello.elf
TYPEPHP_FREE_ELF := $(BUILD)/free.elf
TYPEPHP_OS_LIBRARY := $(BUILD)/libtypephp-os.a
TYPEPHP_OS_LIBRARY_OBJECT_DIR := $(BUILD)/libtypephp-os
COMPILER_RT_LIBRARY := $(BUILD)/libcompiler-rt-builtins.a
COMPILER_RT_OBJECT_DIR := $(BUILD)/compiler-rt-builtins
PHP_NANO_DIR := $(or $(realpath ../../vendor/swoole/php-nano),$(realpath ../../../php-nano))
PHPX_DIR := $(or $(realpath ../../vendor/swoole/phpx),$(realpath ../../../phpx))
OPENLIBM_SOURCES := $(shell sed -n 's|^\(.*\.c\)$$|thirdparty/openlibm/\1|p' tools/openlibm-files.txt)
COMPILER_RT_SOURCES := $(shell awk '$$2 ~ /\.c$$/ { print "thirdparty/compiler-rt/" $$2 }' tools/compiler-rt-builtins-files.sha256)
COMPILER_RT_OBJECTS := $(patsubst thirdparty/compiler-rt/lib/builtins/%.c,$(COMPILER_RT_OBJECT_DIR)/%.o,$(COMPILER_RT_SOURCES))
TYPEPHP_OS_LIBRARY_C_SOURCES := user/runtime/posix.c user/runtime/dirent.c \
user/runtime/fcntl.c user/runtime/ioctl.c kernel/core/abi/error.c kernel/core/abi/string.c \
user/runtime/memory.c kernel/core/abi/libc.c $(OPENLIBM_SOURCES)
TYPEPHP_OS_LIBRARY_CXX_SOURCES := user/runtime/host.cc kernel/core/abi/cxx.cpp
TYPEPHP_OS_LIBRARY_ASM_SOURCES := user/runtime/crt0.S user/runtime/syscall.S \
kernel/core/abi/unimplemented.S
TYPEPHP_OS_LIBRARY_OBJECTS := \
$(patsubst %.c,$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o,$(TYPEPHP_OS_LIBRARY_C_SOURCES)) \
$(patsubst %.cc,$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o,$(filter %.cc,$(TYPEPHP_OS_LIBRARY_CXX_SOURCES))) \
$(patsubst %.cpp,$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o,$(filter %.cpp,$(TYPEPHP_OS_LIBRARY_CXX_SOURCES))) \
$(patsubst %.S,$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o,$(TYPEPHP_OS_LIBRARY_ASM_SOURCES))
TYPEPHP_OS_LIBRARY_DEPFILES := $(addsuffix .d,$(TYPEPHP_OS_LIBRARY_OBJECTS))
NANO_USER_SOURCES := user/nano/hello.php user/nano/hello.yml user/runtime/linker.ld \
$(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY)
TYPEPHP_FREE_SOURCES := user/nano/free.php user/nano/memory.stub.php \
user/nano/free.cc user/nano/free.yml user/runtime/linker.ld \
$(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY)
BOOTFLAGS := -m32 -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -ffreestanding -fno-pic -fno-pie \
-fno-stack-protector -Wall -Wextra
KERNEL64_BOOTFLAGS := -m64 -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -ffreestanding -fno-builtin -fno-pic -fno-pie \
-fno-stack-protector -mno-red-zone -mcmodel=small -Wall -Wextra
USER_CFLAGS := -m64 -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -ffreestanding -fno-builtin -fno-pic -fno-pie \
-fno-stack-protector -mno-red-zone -Wall -Wextra -Iuser/include -Ikernel/core/abi
USER_HEADERS := $(shell find user/include -type f)
USER_LDFLAGS := -m elf_x86_64 -nostdlib -static --undefined=_start \
-T user/runtime/linker.ld
TYPEPHP_OS_RUNTIME_DEFINES := -DTYPEPHP_NATIVE=1 -DPHP_NANO=1 -DPHPX_NANO=1 \
-D_POSIX_C_SOURCE=200809L -DTYPEPHP_NO_MAIN=1 -DPHPX_NO_EXCEPTION=1 \
-DPHPX_NO_RTTI=1 -DPHP_NANO_NO_LIBC=1 -DHAVE_SYS_UTSNAME_H=1 \
-D__NO_CTYPE=1 -DZEND_MM_ERROR=0 -DZEND_MM_CUSTOM=0 -DASSEMBLER=1 \
-D__BSD_VISIBLE=1
TYPEPHP_OS_RUNTIME_INCLUDES := -Ikernel/core/abi \
-Ithirdparty/openlibm/include -Ithirdparty/openlibm/src \
-Ithirdparty/openlibm/amd64 -I$(PHP_NANO_DIR) -I$(PHP_NANO_DIR)/Zend \
-I$(PHP_NANO_DIR)/include -I$(PHP_NANO_DIR)/main -I$(PHP_NANO_DIR)/TSRM \
-I$(PHP_NANO_DIR)/ext/date/lib -I$(PHP_NANO_DIR)/ext/pcre/pcre2lib \
-I$(PHPX_DIR)/include -I$(PHPX_DIR)/thirdparty/wren-gc/include
TYPEPHP_OS_RUNTIME_CFLAGS := -m64 -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \
-std=c11 -ffreestanding -fno-builtin \
-fno-pic -fno-pie -fno-stack-protector -mno-red-zone -mcmodel=small \
-ffunction-sections -fdata-sections -Wall -Wextra \
$(TYPEPHP_OS_RUNTIME_DEFINES) $(TYPEPHP_OS_RUNTIME_INCLUDES)
TYPEPHP_OS_RUNTIME_CXXFLAGS := -m64 -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \
-std=c++17 -ffreestanding -fno-builtin \
-fno-pic -fno-pie -fno-stack-protector -mno-red-zone -mcmodel=small \
-fno-rtti -fno-threadsafe-statics -ffunction-sections -fdata-sections \
-Wall -Wextra \
$(TYPEPHP_OS_RUNTIME_DEFINES) $(TYPEPHP_OS_RUNTIME_INCLUDES)
TYPEPHP_OS_RUNTIME_ASMFLAGS := -m64 -ffreestanding -fno-pic -fno-pie \
-fno-stack-protector -mno-red-zone -mcmodel=small
ARFLAGS := rcs
# Keep symbol information on the host while installing only compact runtime
# ELF files into the FAT16 image. GDB can discover the adjacent .debug file
# through the GNU debug link retained in the stripped executable.
define STRIP_ELF
objcopy --only-keep-debug $(1) $(1).debug
strip --strip-all $(1)
objcopy --add-gnu-debuglink=$(1).debug $(1)
endef
.PHONY: all thirdparty thirdparty-smoke compiler-rt-builtins payload objects user-runtime nano-user disk run test clean
all: $(KERNEL) $(DISK)
thirdparty:
./tools/fetch-thirdparty.sh
thirdparty-smoke: thirdparty compiler-rt-builtins
./tools/test-thirdparty.sh
compiler-rt-builtins: $(COMPILER_RT_LIBRARY)
payload: thirdparty objects $(COMPILER_RT_LIBRARY)
cd ../.. && ./bin/tpc.php --nano examples/typephp-os/project.yml
$(call STRIP_ELF,$(PAYLOAD_ELF))
# Startup sources are built explicitly by Make. The 64-bit entry object is
# injected into tpc's final link through project.yml; the 32-bit Multiboot
# object participates only in the packaging link.
objects: $(BOOTSTRAP_OBJECT) $(KERNEL64_ENTRY_OBJECT)
user-runtime: $(TYPEPHP_OS_LIBRARY)
nano-user: $(TYPEPHP_OS_LIBRARY) $(NANO_USER_ELF) $(TYPEPHP_FREE_ELF)
disk: $(DISK)
$(DISK): $(USER_SH_ELF) $(USER_COMMAND_ELFS) $(NANO_USER_ELF) $(TYPEPHP_FREE_ELF) | $(BUILD)
truncate -s 32M $@
mkfs.fat -F 16 -n TYPEPHPOS $@
mmd -i $@ ::/BIN
for program in $(USER_PROGRAMS); do \
mcopy -o -i $@ $(BUILD)/$$program.elf ::/BIN/$$program.elf; \
done
mcopy -o -i $@ $(NANO_USER_ELF) ::/BIN/TNHELLO.ELF
mcopy -o -i $@ $(TYPEPHP_FREE_ELF) ::/BIN/FREE.ELF
$(BUILD):
mkdir -p $@
$(OBJECT_DIR):
mkdir -p $@
$(BOOTSTRAP_OBJECT): boot/boot.S | $(OBJECT_DIR)
gcc $(BOOTFLAGS) -c $< -o $@
$(KERNEL64_ENTRY_OBJECT): boot/kernel64-entry.S | $(OBJECT_DIR)
gcc $(KERNEL64_BOOTFLAGS) -c $< -o $@
$(OBJECT_DIR)/%.o: user/cmd/%.c $(USER_HEADERS) kernel/core/abi/typephp_os_syscall.h | $(OBJECT_DIR)
gcc $(USER_CFLAGS) -c $< -o $@
$(OPENLIBM_SOURCES): | thirdparty
$(COMPILER_RT_SOURCES): | thirdparty
$(COMPILER_RT_OBJECT_DIR)/%.o: thirdparty/compiler-rt/lib/builtins/%.c Makefile
@mkdir -p $(@D)
gcc $(USER_CFLAGS) -std=c11 -Ithirdparty/compiler-rt/lib/builtins -c $< -o $@
$(COMPILER_RT_LIBRARY): $(COMPILER_RT_OBJECTS) | $(BUILD)
$(AR) $(ARFLAGS) $@ $^
$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o: %.c Makefile
@mkdir -p $(@D)
gcc $(TYPEPHP_OS_RUNTIME_CFLAGS) -MMD -MP -MF $@.d -c $< -o $@
$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o: %.cc Makefile
@mkdir -p $(@D)
g++ $(TYPEPHP_OS_RUNTIME_CXXFLAGS) -MMD -MP -MF $@.d -c $< -o $@
$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o: %.cpp Makefile
@mkdir -p $(@D)
g++ $(TYPEPHP_OS_RUNTIME_CXXFLAGS) -MMD -MP -MF $@.d -c $< -o $@
$(TYPEPHP_OS_LIBRARY_OBJECT_DIR)/%.o: %.S Makefile
@mkdir -p $(@D)
gcc $(TYPEPHP_OS_RUNTIME_ASMFLAGS) -MMD -MP -MF $@.d -c $< -o $@
$(TYPEPHP_OS_LIBRARY): $(TYPEPHP_OS_LIBRARY_OBJECTS) | $(BUILD)
$(AR) $(ARFLAGS) $@ $^
$(NANO_USER_ELF): $(NANO_USER_SOURCES) | thirdparty $(BUILD)
cd ../.. && ./bin/tpc.php --nano examples/typephp-os/user/nano/hello.yml
$(call STRIP_ELF,$@)
$(TYPEPHP_FREE_ELF): $(TYPEPHP_FREE_SOURCES) | thirdparty $(BUILD)
cd ../.. && ./bin/tpc.php --nano examples/typephp-os/user/nano/free.yml
$(call STRIP_ELF,$@)
$(USER_SH_ELF): $(OBJECT_DIR)/sh.o $(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY) user/runtime/linker.ld Makefile | $(BUILD)
ld $(USER_LDFLAGS) --defsym USER_BASE=0x40000000 -o $@ \
$(OBJECT_DIR)/sh.o $(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY)
$(call STRIP_ELF,$@)
$(USER_COMMAND_ELFS): $(BUILD)/%.elf: $(OBJECT_DIR)/%.o $(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY) user/runtime/linker.ld Makefile | $(BUILD)
ld $(USER_LDFLAGS) --defsym USER_BASE=0x41000000 -o $@ \
$(OBJECT_DIR)/$*.o $(TYPEPHP_OS_LIBRARY) $(COMPILER_RT_LIBRARY)
$(call STRIP_ELF,$@)
$(KERNEL): payload
objcopy -O binary $(PAYLOAD_ELF) $(PAYLOAD_BIN)
objcopy -I binary -O elf32-i386 -B i386 \
--rename-section .data=.payload,alloc,load,readonly,data,contents \
$(PAYLOAD_BIN) $(PAYLOAD_OBJECT)
ld -m elf_i386 -T boot/linker.ld -o $@ \
$(BOOTSTRAP_OBJECT) $(PAYLOAD_OBJECT)
$(call STRIP_ELF,$@)
run: all
qemu-system-x86_64 -m 512M -kernel $(KERNEL) \
-drive file=$(DISK),format=raw,if=ide,index=0 \
-display none -serial stdio -monitor none -no-reboot -no-shutdown
test: $(KERNEL) $(USER_SH_ELF) $(USER_COMMAND_ELFS) $(NANO_USER_ELF) $(TYPEPHP_FREE_ELF)
truncate -s 32M $(DISK)
mkfs.fat -F 16 -n TYPEPHPOS $(DISK)
mmd -i $(DISK) ::/BIN
for program in $(USER_PROGRAMS); do \
mcopy -o -i $(DISK) $(BUILD)/$$program.elf ::/BIN/$$program.elf; \
done
mcopy -o -i $(DISK) $(NANO_USER_ELF) ::/BIN/TNHELLO.ELF
mcopy -o -i $(DISK) $(TYPEPHP_FREE_ELF) ::/BIN/FREE.ELF
# An alias not known while linking the kernel verifies disk-based discovery.
mcopy -o -i $(DISK) $(BUILD)/echo.elf ::/BIN/hello.elf
mcopy -o -i $(DISK) tools/invalid-elf.txt ::/BIN/bad.elf
# Fill one directory cluster (dot entries plus 62 files). The QEMU test
# creates F62.TXT and therefore exercises directory-chain growth once.
mmd -i $(DISK) ::/EXPAND
for index in $$(seq -w 0 61); do \
mcopy -o -i $(DISK) tools/invalid-elf.txt ::/EXPAND/F$$index.TXT; \
done
bash tools/test-qemu.sh $(KERNEL) $(DISK) $(BUILD)/qemu.log
clean:
rm -rf $(BUILD)
-include $(TYPEPHP_OS_LIBRARY_DEPFILES)