Skip to content

Commit

Permalink
lkl tools: improve the build system
Browse files Browse the repository at this point in the history
Improve the auto configuration process by moving it to a separate
makefile and by generating both makefile and C header auto
configuration.

For clarity, it also adds a Targets file to describe what the targets
are and what link flags to use instead of doing it in the main
makefile.

Also, build the tests with the main targets instead of having to issue
"make tests" to both build and run the tests. This change is needed
since we will switch to a different test runner.

Signed-off-by: Octavian Purdila <tavi@cs.pub.ro>
  • Loading branch information
tavip committed Dec 22, 2017
1 parent 835d56a commit 2030bf6
Show file tree
Hide file tree
Showing 15 changed files with 270 additions and 208 deletions.
3 changes: 3 additions & 0 deletions tools/lkl/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ tests/valgrind*.xml
*.dll
tests/net-test
tests/disk
Makefile.conf
include/autoconf.h
tests/autoconf.sh
6 changes: 3 additions & 3 deletions tools/lkl/Build
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
CFLAGS_lklfuse.o += -D_FILE_OFFSET_BITS=64

cptofs-y += cptofs.o
fs2tar-y += fs2tar.o
lklfuse-y += lklfuse.o
cptofs-$(LKL_HOST_CONFIG_ARCHIVE) += cptofs.o
fs2tar-$(LKL_HOST_CONFIG_ARCHIVE) += fs2tar.o
lklfuse-$(LKL_HOST_CONFIG_FUSE) += lklfuse.o

204 changes: 53 additions & 151 deletions tools/lkl/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,21 @@
# (this improves performance and avoids hard-to-debug behaviour);
# also do not print "Entering directory..." messages from make
.SUFFIXES:
MAKEFLAGS += -r --no-print-directory
MAKEFLAGS += -r --no-print-directory

ifeq ($(V),1)
Q =
else
Q = @
ifneq ($(silent),1)
ifneq ($(V),1)
QUIET_AUTOCONF = @echo ' AUTOCONF '$@;
Q = @
endif
endif

# default target
all:

-include ../scripts/Makefile.include

# By default we want to use gcc (as does Linux), especially as the clang
# cross toolchain does not use prefixed names
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)$(LD)
AR := $(CROSS_COMPILE)$(AR)
export CC LD AR

EXESUF :=
SOSUF := .so
ifneq ($(OUTPUT),)
OUTPUT := $(OUTPUT)/tools/lkl/
else
OUTPUT := $(CURDIR)/
endif
export OUTPUT

PREFIX := /usr

Expand All @@ -33,162 +26,65 @@ ifeq (,$(srctree))
endif
export srctree

-include ../scripts/Makefile.include

# Target build configuration

export CFLAGS += -I$(OUTPUT)/include -Iinclude -Wall -g -O2 -Wextra \
-Wno-unused-parameter \
-Wno-missing-field-initializers -fno-strict-aliasing
LDFLAGS += -pie

OUTPUT_FORMAT = $(shell $(LD) -r -print-output-format)

ifneq (,$(filter $(OUTPUT_FORMAT),elf64-x86-64 elf32-i386 elf64-x86-64-freebsd elf32-littlearm elf64-littleaarch64))
OUTPUT_DEF = $(shell echo | $(CC) -dM -E -)
CFLAGS += -fPIC -pthread
ifeq (,$(filter $(OUTPUT_DEF),__ANDROID__))
LDLIBS += -lrt -lpthread
endif
export CONFIG_AUTO_LKL_POSIX_HOST=y
CFLAGS += -DCONFIG_AUTO_LKL_POSIX_HOST

# Intel DPDK configuration
ifeq ($(dpdk),yes)
export CONFIG_AUTO_LKL_VIRTIO_NET_DPDK=y
RTE_SDK ?= $(shell pwd)/dpdk-17.02
RTE_TARGET ?= build
DPDK_LIBS = -lrte_pmd_vmxnet3_uio -lrte_pmd_ixgbe -lrte_pmd_e1000
DPDK_LIBS += -lrte_pmd_virtio
DPDK_LIBS += -lrte_timer -lrte_hash -lrte_mbuf -lrte_ethdev -lrte_eal
DPDK_LIBS += -lrte_mempool -lrte_ring -lrte_pmd_ring
DPDK_LIBS += -lrte_kvargs -lrte_net
CFLAGS += -I$(RTE_SDK)/$(RTE_TARGET)/include -msse4.2 -mpopcnt
CFLAGS += -DCONFIG_AUTO_LKL_VIRTIO_NET_DPDK
LDFLAGS +=-L$(RTE_SDK)/$(RTE_TARGET)/lib
LDFLAGS +=-Wl,--whole-archive $(DPDK_LIBS) -Wl,--no-whole-archive -lm -ldl
endif
# Virtual Distributed Ethernet configuration
ifeq ($(vde),yes)
export CONFIG_AUTO_LKL_VIRTIO_NET_VDE=y
CFLAGS += -DCONFIG_AUTO_LKL_VIRTIO_NET_VDE
LDLIBS += $(shell pkg-config --libs vdeplug)
endif
else ifneq (,$(filter $(OUTPUT_FORMAT),pe-i386 pe-x86-64 ))
KOPT = "KALLSYMS_EXTRA_PASS=1"
LDLIBS += -lws2_32
EXESUF := .exe
SOSUF := .dll
export CONFIG_AUTO_LKL_NT_HOST=y
CFLAGS += -DCONFIG_AUTO_LKL_NT_HOST -Iinclude/mingw32
ifneq (,$(filter $(OUTPUT_FORMAT),pe-x86-64))
CFLAGS += -Wl,--enable-auto-image-base -Wl,--image-base -Wl,0x10000000 -Wl,--out-implib=$(OUTPUT)liblkl.dll.a -Wl,--export-all-symbols -Wl,--enable-auto-import
LDFLAGS +=-Wl,--image-base -Wl,0x10000000 -Wl,--enable-auto-image-base -Wl,--out-implib=$(OUTPUT)liblkl.dll.a -Wl,--export-all-symbols -Wl,--enable-auto-import
endif
else
$(error Unrecognized platform: $(OUTPUT_FORMAT))
endif

ifneq ($(OUTPUT),)
OUTPUT := $(OUTPUT)/tools/lkl/
else
OUTPUT := $(CURDIR)/
endif
export OUTPUT

ifneq (,$(filter $(OUTPUT_FORMAT),pe-i386 pe-x86-64 ))
ALL_PROGRAMS :=
ALL_LIBRARIES := $(OUTPUT)liblkl.a $(OUTPUT)liblkl$(SOSUF)
else
ALL_PROGRAMS := $(OUTPUT)lklfuse$(EXESUF) $(OUTPUT)cptofs$(EXESUF) $(OUTPUT)cpfromfs$(EXESUF) $(OUTPUT)fs2tar$(EXESUF)
ALL_LIBRARIES := $(OUTPUT)liblkl.a $(OUTPUT)liblkl$(SOSUF) $(OUTPUT)liblkl-hijack$(SOSUF)
endif

static: $(OUTPUT)liblkl.a
shared: $(OUTPUT)liblkl$(SOSUF)
hijack: $(OUTPUT)liblkl-hijack$(SOSUF)

$(OUTPUT)liblkl$(SOSUF): $(OUTPUT)lib/lkl-in.o $(OUTPUT)lib/lkl.o
$(OUTPUT)liblkl$(SOSUF): LDFLAGS += -shared

$(OUTPUT)liblkl-hijack$(SOSUF): $(OUTPUT)lib/hijack/hijack-in.o $(OUTPUT)liblkl.a
$(OUTPUT)liblkl-hijack$(SOSUF): LDFLAGS += -shared -nodefaultlibs
$(OUTPUT)liblkl-hijack$(SOSUF): LDLIBS += -ldl
ifneq (,$(filter $(OUTPUT_DEF),__ANDROID__))
$(OUTPUT)liblkl-hijack$(SOSUF): LDLIBS += -lgcc -lc
endif

$(OUTPUT)lklfuse$(EXESUF): $(OUTPUT)lklfuse-in.o $(OUTPUT)liblkl.a
$(OUTPUT)lklfuse$(EXESUF): LDLIBS += -lfuse
all:

$(OUTPUT)fs2tar$(EXESUF): $(OUTPUT)fs2tar-in.o $(OUTPUT)liblkl.a
$(OUTPUT)fs2tar$(EXESUF): LDLIBS += -larchive
ifneq (,$(filter $(OUTPUT_FORMAT),elf64-x86-64-freebsd pe-x86-64))
$(OUTPUT)fs2tar$(EXESUF): LDLIBS += -largp
endif
conf: $(OUTPUT)Makefile.conf

$(OUTPUT)cptofs$(EXESUF): $(OUTPUT)cptofs-in.o $(OUTPUT)liblkl.a
ifneq (,$(filter $(OUTPUT_FORMAT),elf64-x86-64-freebsd))
$(OUTPUT)cptofs$(EXESUF): LDLIBS += -largp
endif
$(OUTPUT)Makefile.conf: Makefile.autoconf
$(call QUIET_AUTOCONF, headers)$(MAKE) -f Makefile.autoconf -s

-include $(OUTPUT)Makefile.conf

TEST_TARGETS := test valgrind gdb
export CFLAGS += -I$(OUTPUT)/include -Iinclude -Wall -g -O2 -Wextra \
-Wno-unused-parameter \
-Wno-missing-field-initializers -fno-strict-aliasing

$(OUTPUT)tests/boot: $(OUTPUT)tests/boot-in.o $(OUTPUT)liblkl.a
ifneq (,$(filter $(OUTPUT_DEF),__ANDROID__))
$(OUTPUT)tests/boot: LDLIBS += -lc
endif
$(OUTPUT)tests/net-test: $(OUTPUT)tests/net-test-in.o $(OUTPUT)liblkl.a
$(OUTPUT)tests/disk: $(OUTPUT)tests/disk-in.o $(OUTPUT)liblkl.a
$(TEST_TARGETS): $(OUTPUT)tests/boot $(OUTPUT)tests/net-test $(OUTPUT)tests/disk

# because of libdl, liblkl-hijack will not compile on windows
# fortunately, the test target will handle a missing libhijack.so correctly
ifeq (,$(filter $(OUTPUT_FORMAT),pe-i386))
test: liblkl-hijack$(SOSUF)
endif
-include Targets

$(OUTPUT)%-in.o: $(OUTPUT)lib/lkl.o FORCE
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(patsubst %/,%,$(dir $*)) obj=$(notdir $*)
TARGETS := $(progs-y:%=$(OUTPUT)%$(EXESUF))
TARGETS += $(libs-y:%=$(OUTPUT)%$(SOSUF))
all: $(TARGETS)

# rule to build lkl.o
$(OUTPUT)lib/lkl.o:
$(Q)$(MAKE) -C ../.. ARCH=lkl $(KOPT) defconfig
# this workaround is for arm32 linker (ld.gold)
$(Q)export PATH=$(srctree)/tools/lkl/bin/:${PATH} ;\
$(MAKE) -C ../.. ARCH=lkl $(KOPT) install INSTALL_PATH=$(OUTPUT)

$(OUTPUT)liblkl.a: $(OUTPUT)lib/lkl-in.o $(OUTPUT)lib/lkl.o
# rules to link libs
$(OUTPUT)%$(SOSUF): LDFLAGS += -shared
$(OUTPUT)%$(SOSUF): $(OUTPUT)%-in.o $(OUTPUT)liblkl.a
$(QUIET_LINK)$(CC) $(LDFLAGS) $(LDFLAGS_$*-y) -o $@ $^ $(LDLIBS) $(LDLIBS_$*-y)

# liblkl is special
$(OUTPUT)liblkl$(SOSUF): $(OUTPUT)%-in.o $(OUTPUT)lib/lkl.o
$(OUTPUT)liblkl.a: $(OUTPUT)lib/liblkl-in.o $(OUTPUT)lib/lkl.o
$(QUIET_AR)$(AR) -rc $@ $^

$(OUTPUT)liblkl$(SOSUF) $(OUTPUT)liblkl-hijack$(SOSUF) $(OUTPUT)lklfuse$(EXESUF) $(OUTPUT)fs2tar$(EXESUF) $(OUTPUT)cptofs$(EXESUF) $(OUTPUT)tests/boot $(OUTPUT)tests/net-test $(OUTPUT)tests/disk:
$(QUIET_LINK)$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
# rule to link programs
$(OUTPUT)%$(EXESUF): $(OUTPUT)%-in.o $(OUTPUT)liblkl.a
$(QUIET_LINK)$(CC) $(LDFLAGS) $(LDFLAGS_$*-y) -o $@ $^ $(LDLIBS) $(LDLIBS_$*-y)

# rule to build objects
$(OUTPUT)%-in.o: $(OUTPUT)lib/lkl.o FORCE
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(patsubst %/,%,$(dir $*)) obj=$(notdir $*)


$(OUTPUT)cpfromfs$(EXESUF): cptofs$(EXESUF)
$(Q)if ! [ -e $@ ]; then ln -s $< $@; fi

# because of argp and fuse, none of the binaries will compile on windows
# because of libdl, liblkl-hijack will not compile on windows
# arm-android neither for the moment
ifneq (,$(filter $(OUTPUT_FORMAT),pe-i386))
all: $(filter-out $(OUTPUT)liblkl-hijack$(SOSUF), $(ALL_LIBRARIES))
else ifneq (,$(filter $(OUTPUT_DEF),__ANDROID__))
all: $(ALL_LIBRARIES)
else
all: $(ALL_PROGRAMS) $(ALL_LIBRARIES)
endif

clean:
$(call QUIET_CLEAN, objects)find $(OUTPUT) -name '*.o' -delete -o -name '\.*.cmd'\
-delete -o -name '\.*.d' -delete
$(call QUIET_CLEAN, headers)$(RM) -r $(OUTPUT)/include/lkl/
$(call QUIET_CLEAN, "host libraries")$(RM) $(OUTPUT)/liblkl.a liblkl$(SOSUF)
$(call QUIET_CLEAN, "hijack library")$(RM) $(OUTPUT)/liblkl-hijack$(SOSUF)
$(call QUIET_CLEAN, programs)$(RM) $(ALL_PROGRAMS)
$(call QUIET_CLEAN, tests)$(RM) tests/boot tests/net-test tests/disk

$(TEST_TARGETS):
$(MAKE) -C tests $@
$(call QUIET_CLEAN, liblkl.a)$(RM) $(OUTPUT)/liblkl.a
$(call QUIET_CLEAN, targets)$(RM) $(TARGETS)

clean-conf: clean
$(call QUIET_CLEAN, Makefile.conf)$(RM) $(OUTPUT)/Makefile.conf

headers_install:
$(call QUIET_INSTALL, headers) \
Expand All @@ -208,8 +104,14 @@ programs_install: $(ALL_PROGRAMS)

install: headers_install libraries_install programs_install

TEST_TARGETS := test valgrind gdb

$(TEST_TARGETS):
$(MAKE) -C tests $@

FORCE: ;
.PHONY: all clean $(TEST_TARGETS) FORCE
.PHONY: all clean FORCE
.PHONY: headers_install libraries_install programs_install install
.NOTPARALLEL : lib/lkl.o
.SECONDARY:

91 changes: 91 additions & 0 deletions tools/lkl/Makefile.autoconf
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
POSIX_HOSTS=elf64-x86-64 elf32-i386 elf64-x86-64-freebsd elf32-littlearm elf64-littleaarch64
NT_HOSTS=pe-i386 pe-x86-64

define set_autoconf_var
$(file >> $(OUTPUT)/include/autoconf.h,#define LKL_HOST_CONFIG_$(1) $(2))
$(file >> $(OUTPUT)/tests/autoconf.sh,LKL_HOST_CONFIG_$(1)=$(2))
export LKL_HOST_CONFIG_$(1)=$(2)
endef

define find_include
$(eval include_paths=$(shell $(CC) -E -Wp,-v -xc /dev/null 2>&1 | grep '^ '))
$(foreach f, $(include_paths), $(wildcard $(f)/$(1)))
endef

define is_defined
$(shell $(CC) -dM -E - </dev/null | grep $(1))
endef

define android_host
$(call set_autoconf_var,ANDROID,y)
endef

define virtio_net_dpdk
$(call set_autoconf_var,VIRTIO_NET_DPDK,y)
RTE_SDK ?= $(OUTPUT)/dpdk-17.02
RTE_TARGET ?= build
DPDK_LIBS = -lrte_pmd_vmxnet3_uio -lrte_pmd_ixgbe -lrte_pmd_e1000
DPDK_LIBS += -lrte_pmd_virtio
DPDK_LIBS += -lrte_timer -lrte_hash -lrte_mbuf -lrte_ethdev -lrte_eal
DPDK_LIBS += -lrte_mempool -lrte_ring -lrte_pmd_ring
DPDK_LIBS += -lrte_kvargs -lrte_net
CFLAGS += -I$$(RTE_SDK)/$$(RTE_TARGET)/include -msse4.2 -mpopcnt
LDFLAGS +=-L$$(RTE_SDK)/$$(RTE_TARGET)/lib
LDFLAGS +=-Wl,--whole-archive $$(DPDK_LIBS) -Wl,--no-whole-archive -lm -ldl
endef

define virtio_net_vde
$(call set_autoconf_var,VIRTIO_NET_VDE,y)
LDLIBS += $(shell pkg-config --libs vdeplug)
endef

define posix_host
$(call set_autoconf_var,POSIX,y)
$(call set_autoconf_var,VIRTIO_NET,y)
LDFLAGS += -pie
CFLAGS += -fPIC -pthread
SOSUF := .so
$(if $(call is_defined,__ANDROID__),$(call android_host),LDLIBS += -lrt -lpthread)
$(if $(filter yes,$(dpdk)),$(call virtio_net_dpdk))
$(if $(filter yes,$(vde)),$(call virtio_net_vde))
$(if $(strip $(call find_include,fuse.h)),$(call set_autoconf_var,FUSE,y))
$(if $(strip $(call find_include,archive.h)),$(call set_autoconf_var,ARCHIVE,y))
$(if $(filter $(1),elf64-x86-64-freebsd),$(call set_autoconf_var,NEEDS_LARGP,y))
endef

define nt64_host
$(call set_autoconf_var,NEEDS_LARGP,y)
CFLAGS += -Wl,--enable-auto-image-base -Wl,--image-base -Wl,0x10000000 \
-Wl,--out-implib=$(OUTPUT)liblkl.dll.a -Wl,--export-all-symbols \
-Wl,--enable-auto-import
LDFLAGS +=-Wl,--image-base -Wl,0x10000000 -Wl,--enable-auto-image-base \
-Wl,--out-implib=$(OUTPUT)liblkl.dll.a -Wl,--export-all-symbols \
-Wl,--enable-auto-import
endef

define nt_host
$(call set_autoconf_var,NT,y)
KOPT = "KALLSYMS_EXTRA_PASS=1"
LDLIBS += -lws2_32
EXESUF := .exe
SOSUF := .dll
CFLAGS += -Iinclude/mingw32
$(if $(filter $(1),pe-x86-64),$(call nt64_host))
endef

define do_autoconf
export CROSS_COMPILE := $(CROSS_COMPILE)
export CC := $(CROSS_COMPILE)gcc
export LD := $(CROSS_COMPILE)ld
export AR := $(CROSS_COMPILE)ar
$(eval LD := $(CROSS_COMPILE)ld)
$(eval CC := $(CROSS_COMPILE)gcc)
$(eval LD_FMT := $(shell $(LD) -r -print-output-format))
$(if $(filter $(LD_FMT),$(POSIX_HOSTS)),$(call posix_host,$(LD_FMT)))
$(if $(filter $(LD_FMT),$(NT_HOSTS)),$(call nt_host,$(LD_FMT)))
endef

$(OUTPUT)Makefile.conf: Makefile.autoconf
$(file > $(OUTPUT)/include/autoconf.h)
$(file > $(OUTPUT)/tests/autoconf.sh)
$(file > $(OUTPUT)/Makefile.conf,$(call do_autoconf))
23 changes: 23 additions & 0 deletions tools/lkl/Targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
libs-y += lib/liblkl

libs-$(LKL_HOST_CONFIG_POSIX) += lib/hijack/liblkl-hijack
LDFLAGS_lib/hijack/liblkl-hijack-y += -shared -nodefaultlibs
LDLIBS_lib/hijack/liblkl-hijack-y += -ldl
LDLIBS_lib/hijack/liblkl-hijack-$(LKL_HOST_CONFIG_ANDROID) += -lgcc -lc

progs-$(LKL_HOST_CONFIG_FUSE) += lklfuse
LDLIBS_lklfuse-y := -lfuse

progs-$(LKL_HOST_CONFIG_ARCHIVE) += fs2tar
LDLIBS_fs2tar-y := -larchive
LDLIBS_fs2tar-$(LKL_HOST_CONFIG_NEEDS_LARGP) += -largs


progs-$(LKL_HOST_CONFIG_ARCHIVE) += cptofs
LDLIBS_cptofs-y := -larchive
LDLIBS_cptofs-$(LKL_HOST_CONFIG_NEEDS_LARGP) += -largs

progs-y += tests/boot
progs-y += tests/disk
progs-y += tests/net-test

2 changes: 1 addition & 1 deletion tools/lkl/bin/lkl-hijack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)

export LD_LIBRARY_PATH=${script_dir}/../
export LD_LIBRARY_PATH=${script_dir}/../lib/hijack
if [ -n ${LKL_HIJACK_DEBUG+x} ]
then
trap '' TSTP
Expand Down
Loading

0 comments on commit 2030bf6

Please sign in to comment.