asterinas/regression/Makefile

139 lines
3.8 KiB
Makefile

# SPDX-License-Identifier: MPL-2.0
MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
CUR_DIR := $(patsubst %/,%,$(dir $(MKFILE_PATH)))
BUILD_DIR := $(CUR_DIR)/build
VDSO_DIR := $(BUILD_DIR)/linux_vdso
INITRAMFS := $(BUILD_DIR)/initramfs
INITRAMFS_FILELIST := $(BUILD_DIR)/initramfs.filelist
INITRAMFS_IMAGE := $(BUILD_DIR)/initramfs.cpio.gz
EXT2_IMAGE := $(BUILD_DIR)/ext2.img
EXFAT_IMAGE := $(BUILD_DIR)/exfat.img
INITRAMFS_EMPTY_DIRS := \
$(INITRAMFS)/sbin \
$(INITRAMFS)/root \
$(INITRAMFS)/tmp \
$(INITRAMFS)/opt \
$(INITRAMFS)/proc \
$(INITRAMFS)/dev \
$(INITRAMFS)/ext2 \
$(INITRAMFS)/exfat
INITRAMFS_ALL_DIRS := \
$(INITRAMFS)/etc \
$(INITRAMFS)/lib/x86_64-linux-gnu \
$(INITRAMFS)/lib64 \
$(INITRAMFS)/bin \
$(INITRAMFS)/usr/bin \
$(INITRAMFS)/regression \
$(INITRAMFS)/benchmark \
$(INITRAMFS_EMPTY_DIRS)
SYSCALL_TEST_DIR := $(INITRAMFS)/opt/syscall_test
.PHONY: all
all: build
$(INITRAMFS)/lib/x86_64-linux-gnu: | $(VDSO_DIR)
@mkdir -p $@
@cp -L /lib/x86_64-linux-gnu/libc.so.6 $@
@cp -L /lib/x86_64-linux-gnu/libstdc++.so.6 $@
@cp -L /lib/x86_64-linux-gnu/libm.so.6 $@
@cp -L /lib/x86_64-linux-gnu/libgcc_s.so.1 $@
@cp -L /lib/x86_64-linux-gnu/libpthread.so.0 $@
@# required for benchmarks
@cp -L /lib/x86_64-linux-gnu/libcrypto.so.3 $@
@cp -L /lib/x86_64-linux-gnu/libcrypt.so.1 $@
@cp -L /lib/x86_64-linux-gnu/libdl.so.2 $@
@cp -L /lib/x86_64-linux-gnu/libz.so.1 $@
@cp -L /usr/local/benchmark/iperf/lib/libiperf.so.0 $@
@cp -L $(VDSO_DIR)/vdso64.so $@
$(VDSO_DIR):
@# TODO: use a custom compiled vdso.so file in the future.
@rm -rf $@ && mkdir -p $@
@cd $@ && git clone https://github.com/asterinas/linux_vdso.git .
@cd $@ && git checkout 2a6d2db 2>/dev/null
$(INITRAMFS)/lib64:
@mkdir -p $@
@cp -L /lib64/ld-linux-x86-64.so.2 $@
$(INITRAMFS)/etc:
@mkdir -p $@
@cp $(CUR_DIR)/etc/passwd $@
@cp $(CUR_DIR)/etc/group $@
# Install busybox into /bin and /usr/bin.
$(INITRAMFS)/bin:
@mkdir -p $@
@/bin/busybox --install -s $@
$(INITRAMFS)/usr/bin: | $(INITRAMFS)/bin
@mkdir -p $@
@cp /usr/bin/busybox $@
.PHONY: $(INITRAMFS)/regression
$(INITRAMFS)/regression:
@make --no-print-directory -C apps
$(INITRAMFS)/benchmark:
@mkdir -p $@
@cp /usr/local/benchmark/sysbench/bin/sysbench $@
@cp /usr/local/benchmark/iperf/bin/iperf3 $@
@cp /usr/local/benchmark/membench/membench $@
# Make necessary directories.
$(INITRAMFS_EMPTY_DIRS):
@mkdir -p $@
.PHONY: $(SYSCALL_TEST_DIR)
$(SYSCALL_TEST_DIR):
@make --no-print-directory -C syscall_test
.PHONY: $(INITRAMFS_IMAGE)
$(INITRAMFS_IMAGE): $(INITRAMFS_FILELIST)
@if ! cmp -s $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous ; then \
echo "Generating the initramfs image..."; \
cp -f $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous; \
( \
cd $(INITRAMFS); \
# `$(INITRAMFS_FILELIST)` contains files' last modification \
# time in the first column, and files' relative path to \
# `$(INITRAMFS)` in the second column. This prunes the first \
# column and passes the second column to `cpio`. \
cut -d " " -f 2- $(INITRAMFS_FILELIST) | \
cpio -o -H newc | gzip \
) > $@; \
fi
.PHONY: $(INITRAMFS_FILELIST)
# If the BUILD_SYSCALL_TEST variable is set, we should depend on the
# sub make output to do incremental building.
ifeq ($(BUILD_SYSCALL_TEST), 1)
$(INITRAMFS_FILELIST): | $(INITRAMFS_ALL_DIRS) $(SYSCALL_TEST_DIR)
else
$(INITRAMFS_FILELIST): | $(INITRAMFS_ALL_DIRS)
endif
@(cd $(INITRAMFS); find . -printf "%T@ %p\n") > $(INITRAMFS_FILELIST)
$(EXT2_IMAGE):
@dd if=/dev/zero of=$(EXT2_IMAGE) bs=2G count=1
@mke2fs $(EXT2_IMAGE)
$(EXFAT_IMAGE):
@fallocate -l 64M $(EXFAT_IMAGE)
@mkfs.exfat $(EXFAT_IMAGE)
.PHONY: build
build: $(INITRAMFS_IMAGE) $(EXT2_IMAGE) $(EXFAT_IMAGE)
.PHONY: format
format:
@make --no-print-directory -C apps format
.PHONY: check
check:
@make --no-print-directory -C apps check
.PHONY: clean
clean:
@rm -rf $(BUILD_DIR)