asterinas/Makefile

293 lines
8.5 KiB
Makefile
Raw Normal View History

# SPDX-License-Identifier: MPL-2.0
# =========================== Makefile options. ===============================
# Global build options.
ARCH ?= x86_64
BENCHMARK ?= none
2024-04-12 17:08:36 +00:00
BOOT_METHOD ?= grub-rescue-iso
BOOT_PROTOCOL ?= multiboot2
BUILD_SYSCALL_TEST ?= 0
ENABLE_KVM ?= 1
INTEL_TDX ?= 0
2024-07-07 16:13:02 +00:00
MEM ?= 8G
2024-05-06 09:36:31 +00:00
RELEASE ?= 0
RELEASE_LTO ?= 0
LOG_LEVEL ?= error
2024-04-12 17:08:36 +00:00
SCHEME ?= ""
2024-07-07 16:13:02 +00:00
SMP ?= 1
OSTD_TASK_STACK_SIZE_IN_PAGES ?= 64
# End of global build options.
# GDB debugging and profiling options.
GDB_TCP_PORT ?= 1234
GDB_PROFILE_FORMAT ?= flame-graph
GDB_PROFILE_COUNT ?= 200
GDB_PROFILE_INTERVAL ?= 0.1
# End of GDB options.
# The Makefile provides a way to run arbitrary tests in the kernel
# mode using the kernel command line.
# Here are the options for the auto test feature.
AUTO_TEST ?= none
EXTRA_BLOCKLISTS_DIRS ?= ""
2023-11-28 04:17:42 +00:00
SYSCALL_TEST_DIR ?= /tmp
2024-11-02 02:59:39 +00:00
FEATURES ?=
# End of auto test features.
2024-10-22 02:02:19 +00:00
# Network settings
NETDEV ?= user # Possible values are user,tap
2024-11-02 02:59:39 +00:00
VHOST ?= off
2024-10-22 02:02:19 +00:00
# End of network settings
# ========================= End of Makefile options. ==========================
2024-03-01 07:42:06 +00:00
CARGO_OSDK := ~/.cargo/bin/cargo-osdk
CARGO_OSDK_ARGS := --target-arch=$(ARCH) --kcmd-args="ostd.log_level=$(LOG_LEVEL)"
ifeq ($(AUTO_TEST), syscall)
BUILD_SYSCALL_TEST := 1
2024-04-12 17:08:36 +00:00
CARGO_OSDK_ARGS += --kcmd-args="SYSCALL_TEST_DIR=$(SYSCALL_TEST_DIR)"
CARGO_OSDK_ARGS += --kcmd-args="EXTRA_BLOCKLISTS_DIRS=$(EXTRA_BLOCKLISTS_DIRS)"
CARGO_OSDK_ARGS += --init-args="/opt/syscall_test/run_syscall_test.sh"
2024-06-28 11:12:24 +00:00
else ifeq ($(AUTO_TEST), test)
ifneq ($(SMP), 1)
CARGO_OSDK_ARGS += --kcmd-args="BLOCK_UNSUPPORTED_SMP_TESTS=1"
endif
2024-06-28 11:12:24 +00:00
CARGO_OSDK_ARGS += --init-args="/test/run_general_test.sh"
else ifeq ($(AUTO_TEST), boot)
2024-06-28 11:12:24 +00:00
CARGO_OSDK_ARGS += --init-args="/test/boot_hello.sh"
2024-04-07 15:08:18 +00:00
else ifeq ($(AUTO_TEST), vsock)
export VSOCK=1
2024-06-28 11:12:24 +00:00
CARGO_OSDK_ARGS += --init-args="/test/run_vsock_test.sh"
endif
2024-05-06 09:36:31 +00:00
ifeq ($(RELEASE_LTO), 1)
CARGO_OSDK_ARGS += --profile release-lto
OSTD_TASK_STACK_SIZE_IN_PAGES = 8
2024-05-06 09:36:31 +00:00
else ifeq ($(RELEASE), 1)
CARGO_OSDK_ARGS += --release
OSTD_TASK_STACK_SIZE_IN_PAGES = 8
endif
# If the BENCHMARK is set, we will run the benchmark in the kernel mode.
ifneq ($(BENCHMARK), none)
2024-09-13 09:35:52 +00:00
CARGO_OSDK_ARGS += --init-args="/benchmark/common/bench_runner.sh $(BENCHMARK) asterinas"
endif
ifeq ($(INTEL_TDX), 1)
2024-07-09 02:34:59 +00:00
BOOT_METHOD = grub-qcow2
2024-05-08 07:58:56 +00:00
BOOT_PROTOCOL = linux-efi-handover64
CARGO_OSDK_ARGS += --scheme tdx
endif
2024-04-12 17:08:36 +00:00
ifneq ($(SCHEME), "")
CARGO_OSDK_ARGS += --scheme $(SCHEME)
else
CARGO_OSDK_ARGS += --boot-method="$(BOOT_METHOD)"
endif
2024-11-02 02:59:39 +00:00
ifdef FEATURES
CARGO_OSDK_ARGS += --features="$(FEATURES)"
endif
# To test the linux-efi-handover64 boot protocol, we need to use Debian's
# GRUB release, which is installed in /usr/bin in our Docker image.
ifeq ($(BOOT_PROTOCOL), linux-efi-handover64)
2024-03-22 05:50:45 +00:00
CARGO_OSDK_ARGS += --grub-mkrescue=/usr/bin/grub-mkrescue
2024-04-12 17:08:36 +00:00
CARGO_OSDK_ARGS += --grub-boot-protocol="linux"
2024-10-15 17:08:10 +00:00
CARGO_OSDK_ARGS += --encoding raw # FIXME: GZIP self-decompression triggers CPU faults
2024-04-12 17:08:36 +00:00
else ifeq ($(BOOT_PROTOCOL), linux-legacy32)
CARGO_OSDK_ARGS += --linux-x86-legacy-boot
CARGO_OSDK_ARGS += --grub-boot-protocol="linux"
else
CARGO_OSDK_ARGS += --grub-boot-protocol=$(BOOT_PROTOCOL)
2023-11-04 08:41:30 +00:00
endif
ifeq ($(ENABLE_KVM), 1)
2024-07-09 02:34:59 +00:00
CARGO_OSDK_ARGS += --qemu-args="-accel kvm"
endif
# Pass make variables to all subdirectory makes
export
2024-02-27 16:44:55 +00:00
# Basically, non-OSDK crates do not depend on Aster Frame and can be checked
# or tested without OSDK.
NON_OSDK_CRATES := \
2024-06-19 08:18:39 +00:00
ostd/libs/align_ext \
ostd/libs/id-alloc \
ostd/libs/linux-bzimage/builder \
ostd/libs/linux-bzimage/boot-params \
2024-06-21 05:51:13 +00:00
ostd/libs/ostd-macros \
ostd/libs/ostd-test \
2024-02-27 16:44:55 +00:00
kernel/libs/cpio-decoder \
kernel/libs/int-to-c-enum \
kernel/libs/int-to-c-enum/derive \
kernel/libs/aster-rights \
kernel/libs/aster-rights-proc \
kernel/libs/keyable-arc \
kernel/libs/typeflags \
kernel/libs/typeflags-util \
kernel/libs/atomic-integer-wrapper
2024-02-27 16:44:55 +00:00
2024-06-19 08:18:39 +00:00
# In contrast, OSDK crates depend on OSTD (or being `ostd` itself)
2024-02-27 16:44:55 +00:00
# and need to be built or tested with OSDK.
OSDK_CRATES := \
osdk/test-kernel \
2024-06-19 08:18:39 +00:00
ostd \
ostd/libs/linux-bzimage/setup \
2024-02-27 16:44:55 +00:00
kernel \
kernel/comps/block \
kernel/comps/console \
kernel/comps/framebuffer \
kernel/comps/input \
kernel/comps/network \
kernel/comps/softirq \
2024-02-27 16:44:55 +00:00
kernel/comps/time \
kernel/comps/virtio \
2024-09-06 10:49:37 +00:00
kernel/libs/aster-util \
kernel/libs/aster-bigtcp
2024-02-23 03:50:27 +00:00
.PHONY: all
2023-04-10 03:12:42 +00:00
all: build
2022-08-08 22:43:47 +00:00
2024-02-28 05:11:45 +00:00
# Install or update OSDK from source
# To uninstall, do `cargo uninstall cargo-osdk`
2024-02-23 03:50:27 +00:00
.PHONY: install_osdk
2024-03-01 07:42:06 +00:00
install_osdk:
@# The `OSDK_LOCAL_DEV` environment variable is used for local development
@# without the need to publish the changes of OSDK's self-hosted
@# dependencies to `crates.io`.
@OSDK_LOCAL_DEV=1 cargo install cargo-osdk --path osdk
2022-08-17 03:22:49 +00:00
2024-03-01 07:42:06 +00:00
# This will install OSDK if it is not already installed
# To update OSDK, we need to run `install_osdk` manually
$(CARGO_OSDK):
@make --no-print-directory install_osdk
2024-02-28 05:11:45 +00:00
.PHONY: check_osdk
check_osdk:
@cd osdk && cargo clippy -- -D warnings
.PHONY: test_osdk
test_osdk:
@cd osdk && \
OSDK_LOCAL_DEV=1 cargo build && \
OSDK_LOCAL_DEV=1 cargo test
2024-02-29 15:44:41 +00:00
.PHONY: initramfs
initramfs:
2024-06-28 11:12:24 +00:00
@make --no-print-directory -C test
2024-02-29 15:44:41 +00:00
.PHONY: build
build: initramfs $(CARGO_OSDK)
@cargo osdk build $(CARGO_OSDK_ARGS)
2023-08-07 02:56:03 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: tools
2023-02-07 08:05:21 +00:00
tools:
2024-02-27 08:40:16 +00:00
@cd kernel/libs/comp-sys && cargo install --path cargo-component
2023-02-07 08:05:21 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: run
run: initramfs $(CARGO_OSDK)
@cargo osdk run $(CARGO_OSDK_ARGS)
# Check the running status of auto tests from the QEMU log
ifeq ($(AUTO_TEST), syscall)
@tail --lines 100 qemu.log | grep -q "^.* of .* test cases passed." \
|| (echo "Syscall test failed" && exit 1)
2024-06-28 11:12:24 +00:00
else ifeq ($(AUTO_TEST), test)
@tail --lines 100 qemu.log | grep -q "^All general tests passed." \
|| (echo "General test failed" && exit 1)
else ifeq ($(AUTO_TEST), boot)
@tail --lines 100 qemu.log | grep -q "^Successfully booted." \
|| (echo "Boot test failed" && exit 1)
2024-04-07 15:08:18 +00:00
else ifeq ($(AUTO_TEST), vsock)
@tail --lines 100 qemu.log | grep -q "^Vsock test passed." \
|| (echo "Vsock test failed" && exit 1)
endif
.PHONY: gdb_server
gdb_server: initramfs $(CARGO_OSDK)
@cargo osdk run $(CARGO_OSDK_ARGS) --gdb-server wait-client,vscode,addr=:$(GDB_TCP_PORT)
2024-03-20 21:52:55 +00:00
.PHONY: gdb_client
gdb_client: $(CARGO_OSDK)
@cargo osdk debug $(CARGO_OSDK_ARGS) --remote :$(GDB_TCP_PORT)
.PHONY: profile_server
profile_server: initramfs $(CARGO_OSDK)
@cargo osdk run $(CARGO_OSDK_ARGS) --gdb-server addr=:$(GDB_TCP_PORT)
.PHONY: profile_client
profile_client: $(CARGO_OSDK)
@cargo osdk profile $(CARGO_OSDK_ARGS) --remote :$(GDB_TCP_PORT) \
--samples $(GDB_PROFILE_COUNT) --interval $(GDB_PROFILE_INTERVAL) --format $(GDB_PROFILE_FORMAT)
2024-03-20 21:52:55 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: test
2023-11-04 08:41:30 +00:00
test:
2024-02-27 16:44:55 +00:00
@for dir in $(NON_OSDK_CRATES); do \
(cd $$dir && cargo test) || exit 1; \
done
2022-08-08 22:43:47 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: ktest
2024-02-29 15:44:41 +00:00
ktest: initramfs $(CARGO_OSDK)
2024-02-27 16:44:55 +00:00
@# Exclude linux-bzimage-setup from ktest since it's hard to be unit tested
@for dir in $(OSDK_CRATES); do \
2024-06-19 08:18:39 +00:00
[ $$dir = "ostd/libs/linux-bzimage/setup" ] && continue; \
(cd $$dir && cargo osdk test) || exit 1; \
tail --lines 10 qemu.log | grep -q "^\\[ktest runner\\] All crates tested." \
|| (echo "Test failed" && exit 1); \
done
.PHONY: docs
docs: $(CARGO_OSDK)
@for dir in $(NON_OSDK_CRATES); do \
(cd $$dir && cargo doc --no-deps) || exit 1; \
done
@for dir in $(OSDK_CRATES); do \
(cd $$dir && cargo osdk doc --no-deps) || exit 1; \
done
@echo "" # Add a blank line
2022-08-08 23:02:55 +00:00
@cd docs && mdbook build # Build mdBook
2022-08-08 22:43:47 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: format
format:
2024-02-27 12:28:43 +00:00
@./tools/format_all.sh
2024-06-28 11:12:24 +00:00
@make --no-print-directory -C test format
2024-02-23 03:50:27 +00:00
.PHONY: check
check: initramfs $(CARGO_OSDK)
2024-02-27 16:44:55 +00:00
@./tools/format_all.sh --check # Check Rust format issues
@# Check if STD_CRATES and NOSTD_CRATES combined is the same as all workspace members
2024-02-23 03:50:27 +00:00
@sed -n '/^\[workspace\]/,/^\[.*\]/{/members = \[/,/\]/p}' Cargo.toml | \
grep -v "members = \[" | tr -d '", \]' | \
sort > /tmp/all_crates
2024-02-27 16:44:55 +00:00
@echo $(NON_OSDK_CRATES) $(OSDK_CRATES) | tr ' ' '\n' | sort > /tmp/combined_crates
2024-02-23 03:50:27 +00:00
@diff -B /tmp/all_crates /tmp/combined_crates || \
(echo "Error: The combination of STD_CRATES and NOSTD_CRATES" \
"is not the same as all workspace members" && exit 1)
2024-02-27 16:44:55 +00:00
@rm /tmp/all_crates /tmp/combined_crates
@for dir in $(NON_OSDK_CRATES); do \
2024-04-12 17:08:36 +00:00
echo "Checking $$dir"; \
2024-02-27 16:44:55 +00:00
(cd $$dir && cargo clippy -- -D warnings) || exit 1; \
done
@for dir in $(OSDK_CRATES); do \
2024-04-12 17:08:36 +00:00
echo "Checking $$dir"; \
(cd $$dir && cargo osdk clippy -- -- -D warnings) || exit 1; \
2024-02-27 16:44:55 +00:00
done
2024-06-28 11:12:24 +00:00
@make --no-print-directory -C test check
2024-08-20 09:45:22 +00:00
@typos
2022-08-08 22:43:47 +00:00
2024-02-23 03:50:27 +00:00
.PHONY: clean
2022-08-08 22:43:47 +00:00
clean:
@echo "Cleaning up Asterinas workspace target files"
2023-04-10 03:12:42 +00:00
@cargo clean
@echo "Cleaning up OSDK workspace target files"
@cd osdk && cargo clean
@echo "Cleaning up documentation target files"
2022-08-17 03:22:49 +00:00
@cd docs && mdbook clean
@echo "Cleaning up test target files"
2024-06-28 11:12:24 +00:00
@make --no-print-directory -C test clean
@echo "Uninstalling OSDK"
@rm -f $(CARGO_OSDK)