The rule "install" follows these conventions: https://www.gnu.org/prep/standards/html_node/Directory-Variables.html https://www.gnu.org/prep/standards/html_node/DESTDIR.html
The variable sdkdir has been added to the more standards ones, to configure the directory used with RTE_SDK when using the DPDK makefiles to build an application. The old installed tree was static and always had .config, includes and libs in a RTE_TARGET subdirectory. There is no such directory anymore in an installed SDK. So the top directory is checked. But RTE_TARGET can still be used, especially to build an app with a compiled but not installed SDK. That's why both cases are looked for RTE_SDK_BIN. The default prefix /usr/local is empty in the T= case which is used only for a local install. It is still possible to build DPDK with the "install T=" rule without specifying any DESTDIR. In such case there is no install, as before. The old usage of an installed SDK is: make -C examples/helloworld RTE_SDK=$(readlink -m $DESTDIR) \ RTE_TARGET=x86_64-native-linuxapp-gcc RTE_TARGET can be specified but is useless now with an installed SDK. The RTE_SDK directory must now point to a different path depending of the installation. Signed-off-by: Thomas Monjalon <thomas.monjalon at 6wind.com> --- doc/build-sdk-quick.txt | 1 + mk/internal/rte.extvars.mk | 8 +++++++ mk/rte.sdkinstall.mk | 59 ++++++++++++++++++++++++++++++++++++---------- mk/rte.vars.mk | 7 ------ 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/doc/build-sdk-quick.txt b/doc/build-sdk-quick.txt index b5f752e..662ef63 100644 --- a/doc/build-sdk-quick.txt +++ b/doc/build-sdk-quick.txt @@ -19,6 +19,7 @@ Build variables D debug dependencies O build directory (default: build/ - install default: ./) DESTDIR second-stage install directory + prefix root install directory T target template - used with config or install format: <arch-machine-execenv-toolchain> templates in config/defconfig_* diff --git a/mk/internal/rte.extvars.mk b/mk/internal/rte.extvars.mk index e248d19..dfba2f2 100644 --- a/mk/internal/rte.extvars.mk +++ b/mk/internal/rte.extvars.mk @@ -51,7 +51,15 @@ endif RTE_EXTMK ?= $(RTE_SRCDIR)/Makefile export RTE_EXTMK +# RTE_SDK_BIN must point to .config, include/ and lib/. RTE_SDK_BIN := $(RTE_SDK)/$(RTE_TARGET) +ifeq ($(wildcard $(RTE_SDK_BIN)/.config),) +# RTE_TARGET is empty when using a default SDK installation. +RTE_SDK_BIN := $(RTE_SDK) +ifeq ($(wildcard $(RTE_SDK_BIN)/.config),) +$(error Cannot find .config in $(RTE_SDK)) +endif +endif # # Output files wil go in a separate directory: default output is diff --git a/mk/rte.sdkinstall.mk b/mk/rte.sdkinstall.mk index ed3ed86..91273be 100644 --- a/mk/rte.sdkinstall.mk +++ b/mk/rte.sdkinstall.mk @@ -1,6 +1,7 @@ # BSD LICENSE # # Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +# Copyright 2015 6WIND S.A. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -32,10 +33,30 @@ # Build directory is given with O= O ?= . +prefix ?= /usr/local +exec_prefix ?= $(prefix) +bindir ?= $(exec_prefix)/bin +libdir ?= $(exec_prefix)/lib +includedir ?= $(prefix)/include/dpdk +datarootdir ?= $(prefix)/share +datadir ?= $(datarootdir)/dpdk +sdkdir ?= $(datadir) + +# The install directories may be staged in DESTDIR + # Configuration, compilation and installation can be done at once # with make install T=<config> # The build directory is T and may be prepended with O BUILD_DIR := $O/$T +# Default usage of T= will install an almost flat staging tree +export prefix = + +# Create the directory $1 if not exists +rte_mkdir = test -d $1 || mkdir -p $1 + +# Create the relative symbolic link $2 -> $1 +# May be replaced with --relative option of ln from coreutils-8.16 +rte_symlink = ln -snf $$($(RTE_SDK)/scripts/relpath.sh $1 $(dir $2)) $2 .PHONY: pre_install pre_install: @@ -58,16 +79,28 @@ pre_install: .PHONY: install install: pre_install - @echo ================== Installing $(DESTDIR) - $(Q)mkdir -p $(DESTDIR) - $(Q)tar -C $(RTE_SDK) -cf - mk scripts/*.sh | tar -C $(DESTDIR) -x \ - --keep-newer-files --warning=no-ignore-newer -f - - $(Q)mkdir -p $(DESTDIR)/$T - $(Q)tar -C $(BUILD_DIR) -chf - \ - --exclude app --exclude hostapp --exclude build \ - --exclude Makefile --exclude .depdirs . | \ - tar -C $(DESTDIR)/$T -x --keep-newer-files \ - --warning=no-ignore-newer -f - - $(Q)install -D $(BUILD_DIR)/app/testpmd \ - $(DESTDIR)/$T/app/testpmd - @echo Installation in $(DESTDIR) complete +ifeq '$(DESTDIR)$(if $T,,+)' '' + @echo Installation cannot run with T defined and DESTDIR undefined +else + @echo ================== Installing $(DESTDIR)$(prefix)/ + $(Q)$(call rte_mkdir, $(DESTDIR)$(libdir)) + $(Q)cp -a $(BUILD_DIR)/lib/* $(DESTDIR)$(libdir) + $(Q)$(call rte_mkdir, $(DESTDIR)$(bindir)) + $(Q)tar -cf - -C $(BUILD_DIR) app --exclude 'app/*.map' \ + --exclude 'app/cmdline*' --exclude app/test \ + --exclude app/testacl --exclude app/testpipeline | \ + tar -xf - -C $(DESTDIR)$(bindir) --strip-components=1 \ + --keep-newer-files --warning=no-ignore-newer + $(Q)$(call rte_mkdir, $(DESTDIR)$(datadir)) + $(Q)cp -a $(RTE_SDK)/tools $(DESTDIR)$(datadir) + $(Q)$(call rte_mkdir, $(DESTDIR)$(includedir)) + $(Q)tar -chf - -C $(BUILD_DIR) include | \ + tar -xf - -C $(DESTDIR)$(includedir) --strip-components=1 \ + --keep-newer-files --warning=no-ignore-newer + $(Q)$(call rte_mkdir, $(DESTDIR)$(sdkdir)) + $(Q)cp -a $(BUILD_DIR)/.config $(DESTDIR)$(sdkdir) + $(Q)cp -a $(RTE_SDK)/{mk,scripts} $(DESTDIR)$(sdkdir) + $(Q)$(call rte_symlink, $(DESTDIR)$(includedir), $(DESTDIR)$(sdkdir)/include) + $(Q)$(call rte_symlink, $(DESTDIR)$(libdir), $(DESTDIR)$(sdkdir)/lib) + @echo Installation in $(DESTDIR)$(prefix)/ complete +endif diff --git a/mk/rte.vars.mk b/mk/rte.vars.mk index f87cf4b..e26d193 100644 --- a/mk/rte.vars.mk +++ b/mk/rte.vars.mk @@ -67,13 +67,6 @@ endif RTE_LIBNAME := dpdk -# RTE_TARGET is deducted from config when we are building the SDK. -# Else, when building an external app, RTE_TARGET must be specified -# by the user. -ifeq ($(RTE_TARGET),) -$(error RTE_TARGET is not defined) -endif - ifeq ($(BUILDING_RTE_SDK),) # if we are building an external app/lib, include internal/rte.extvars.mk that will # define RTE_OUTPUT, RTE_SRCDIR, RTE_EXTMK, RTE_SDK_BIN, (etc ...) -- 2.5.2