From: Declan Doherty <declan.doherty@intel.com>
To: dev@dpdk.org
Cc: Anatoly Burakov <anatoly.burakov@intel.com>,
Declan Doherty <declan.doherty@intel.com>
Subject: [dpdk-dev] [RFC 1/4] mk: Add support for C++ compilation
Date: Tue, 2 Aug 2016 21:37:46 +0100 [thread overview]
Message-ID: <1470170269-20721-2-git-send-email-declan.doherty@intel.com> (raw)
In-Reply-To: <1470170269-20721-1-git-send-email-declan.doherty@intel.com>
From: Anatoly Burakov <anatoly.burakov@intel.com>
Adding support for compiling C++ files as part of the build system
Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
mk/internal/rte.compile-pre.mk | 52 ++++++++++++++++++++++++++++++++++++++----
mk/target/generic/rte.vars.mk | 3 +++
mk/toolchain/clang/rte.vars.mk | 14 +++++++++---
mk/toolchain/gcc/rte.vars.mk | 14 +++++++++---
mk/toolchain/icc/rte.vars.mk | 10 +++++---
5 files changed, 80 insertions(+), 13 deletions(-)
diff --git a/mk/internal/rte.compile-pre.mk b/mk/internal/rte.compile-pre.mk
index f740179..2342942 100644
--- a/mk/internal/rte.compile-pre.mk
+++ b/mk/internal/rte.compile-pre.mk
@@ -32,12 +32,12 @@
#
# Common to rte.lib.mk, rte.app.mk, rte.obj.mk
#
-
SRCS-all := $(SRCS-y) $(SRCS-n) $(SRCS-)
# convert source to obj file
src2obj = $(strip $(patsubst %.c,%.o,\
- $(patsubst %.S,%_s.o,$(1))))
+ $(patsubst %.S,%_s.o,\
+ $(patsubst %.cpp,%_cpp.o,$(1)))))
# add a dot in front of the file name
dotfile = $(strip $(foreach f,$(1),\
@@ -46,12 +46,14 @@ dotfile = $(strip $(foreach f,$(1),\
# convert source/obj files into dot-dep filename (does not
# include .S files)
src2dep = $(strip $(call dotfile,$(patsubst %.c,%.o.d, \
- $(patsubst %.S,,$(1)))))
+ $(patsubst %.cpp,%_cpp.o.d, \
+ $(patsubst %.S,,$(1))))))
obj2dep = $(strip $(call dotfile,$(patsubst %.o,%.o.d,$(1))))
# convert source/obj files into dot-cmd filename
src2cmd = $(strip $(call dotfile,$(patsubst %.c,%.o.cmd, \
- $(patsubst %.S,%_s.o.cmd,$(1)))))
+ $(patsubst %.cpp,%_cpp.o.cmd, \
+ $(patsubst %.S,%_s.o.cmd,$(1))))))
obj2cmd = $(strip $(call dotfile,$(patsubst %.o,%.o.cmd,$(1))))
OBJS-y := $(call src2obj,$(SRCS-y))
@@ -186,3 +188,45 @@ S_TO_O_DO = @set -e; \
$(depfile_missing),\
$(depfile_newer)),\
$(S_TO_O_DO))
+
+
+# command to compile a .cpp file to generate an object
+ifeq ($(USE_HOST),1)
+CXX_TO_O = $(HOSTCXX) -Wp,-MD,$(call obj2dep,$(@)).tmp $(HOST_CXXFLAGS) \
+ $(CXXFLAGS_$(@)) $(HOST_EXTRA_CXXFLAGS) -o $@ -c $<
+CXX_TO_O_STR = $(subst ','\'',$(CXX_TO_O)) #'# fix syntax highlight
+CXX_TO_O_DISP = $(if $(V),"$(CXX_TO_O_STR)"," HOSTCXX $(@)")
+else
+CXX_TO_O = $(CXX) -Wp,-MD,$(call obj2dep,$(@)).tmp $(CXXFLAGS) \
+ $(CXXFLAGS_$(@)) $(EXTRA_CXXFLAGS) -o $@ -c $<
+CXX_TO_O_STR = $(subst ','\'',$(CXX_TO_O)) #'# fix syntax highlight
+CXX_TO_O_DISP = $(if $(V),"$(CXX_TO_O_STR)"," CXX $(@)")
+endif
+CXX_TO_O_CMD = 'cmd_$@ = $(CXX_TO_O_STR)'
+CXX_TO_O_DO = @set -e; \
+ echo $(CXX_TO_O_DISP); \
+ $(CXX_TO_O) && \
+ echo $(CXX_TO_O_CMD) > $(call obj2cmd,$(@)) && \
+ sed 's,'$@':,dep_'$@' =,' $(call obj2dep,$(@)).tmp > $(call obj2dep,$(@)) && \
+ rm -f $(call obj2dep,$(@)).tmp
+
+#
+# Compile .cpp file if needed
+# Note: dep_$$@ is from the .d file and DEP_$$@ can be specified by
+# user (by default it is empty)
+#
+.SECONDEXPANSION:
+%_cpp.o: %.cpp $$(wildcard $$(dep_$$@)) $$(DEP_$$(@)) FORCE
+ @[ -d $(dir $@) ] || mkdir -p $(dir $@)
+ $(if $(D),\
+ @echo -n "$< -> $@ " ; \
+ echo -n "file_missing=$(call boolean,$(file_missing)) " ; \
+ echo -n "cmdline_changed=$(call boolean,$(call cmdline_changed,$(CXX_TO_O))) " ; \
+ echo -n "depfile_missing=$(call boolean,$(depfile_missing)) " ; \
+ echo "depfile_newer=$(call boolean,$(depfile_newer))")
+ $(if $(or \
+ $(file_missing),\
+ $(call cmdline_changed,$(CXX_TO_O)),\
+ $(depfile_missing),\
+ $(depfile_newer)),\
+ $(CXX_TO_O_DO))
\ No newline at end of file
diff --git a/mk/target/generic/rte.vars.mk b/mk/target/generic/rte.vars.mk
index 75a616a..128d4e2 100644
--- a/mk/target/generic/rte.vars.mk
+++ b/mk/target/generic/rte.vars.mk
@@ -138,7 +138,10 @@ endif
LDFLAGS += -L$(RTE_SDK_BIN)/lib
endif
+CXXFLAGS := $(CFLAGS)
+
export CFLAGS
+export CXXFLAGS
export LDFLAGS
endif
diff --git a/mk/toolchain/clang/rte.vars.mk b/mk/toolchain/clang/rte.vars.mk
index 7749b99..2a7105e 100644
--- a/mk/toolchain/clang/rte.vars.mk
+++ b/mk/toolchain/clang/rte.vars.mk
@@ -32,8 +32,9 @@
#
# toolchain:
#
-# - define CC, LD, AR, AS, ... (overriden by cmdline value)
+# - define CC, CXX, LD, AR, AS, ... (overriden by cmdline value)
# - define TOOLCHAIN_CFLAGS variable (overriden by cmdline value)
+# - define TOOLCHAIN_CXXFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_LDFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_ASFLAGS variable (overriden by cmdline value)
#
@@ -41,6 +42,7 @@
CC = $(CROSS)clang
KERNELCC = $(CROSS)gcc
CPP = $(CROSS)cpp
+CXX = $(CROSS)clang++
# for now, we don't use as but nasm.
# AS = $(CROSS)as
AS = nasm
@@ -57,10 +59,16 @@ HOSTCC = $(CC)
else
HOSTCC = clang
endif
+ifeq ("$(origin CXX)", "command line")
+HOSTCXX = $(CXX)
+else
+HOSTCXX = clang++
+endif
HOSTAS = as
TOOLCHAIN_ASFLAGS =
TOOLCHAIN_CFLAGS =
+TOOLCHAIN_CXXFLAGS =
TOOLCHAIN_LDFLAGS =
WERROR_FLAGS := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
@@ -79,5 +87,5 @@ include $(RTE_SDK)/mk/toolchain/$(RTE_TOOLCHAIN)/rte.toolchain-compat.mk
# workaround clang bug with warning "missing field initializer" for "= {0}"
WERROR_FLAGS += -Wno-missing-field-initializers
-export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF
-export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
+export CC CXX AS AR LD OBJCOPY OBJDUMP STRIP READELF
+export TOOLCHAIN_CFLAGS TOOLCHAIN_CXXFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
diff --git a/mk/toolchain/gcc/rte.vars.mk b/mk/toolchain/gcc/rte.vars.mk
index ff70f3d..1961f6c 100644
--- a/mk/toolchain/gcc/rte.vars.mk
+++ b/mk/toolchain/gcc/rte.vars.mk
@@ -32,8 +32,9 @@
#
# toolchain:
#
-# - define CC, LD, AR, AS, ... (overriden by cmdline value)
+# - define CC, CXX, LD, AR, AS, ... (overriden by cmdline value)
# - define TOOLCHAIN_CFLAGS variable (overriden by cmdline value)
+# - define TOOLCHAIN_CXXFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_LDFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_ASFLAGS variable (overriden by cmdline value)
#
@@ -41,6 +42,7 @@
CC = $(CROSS)gcc
KERNELCC = $(CROSS)gcc
CPP = $(CROSS)cpp
+CXX = $(CROSS)g++
# for now, we don't use as but nasm.
# AS = $(CROSS)as
AS = nasm
@@ -57,10 +59,16 @@ HOSTCC = $(CC)
else
HOSTCC = gcc
endif
+ifeq ("$(origin CXX)", "command line")
+HOSTCXX = $(CXX)
+else
+HOSTCXX = g++
+endif
HOSTAS = as
TOOLCHAIN_ASFLAGS =
TOOLCHAIN_CFLAGS =
+TOOLCHAIN_CXXFLAGS =
TOOLCHAIN_LDFLAGS =
ifeq ($(CONFIG_RTE_LIBRTE_GCOV),y)
@@ -99,5 +107,5 @@ ifeq ($(shell test $(GCC_VERSION) -lt 47 && echo 1), 1)
WERROR_FLAGS += -Wno-uninitialized
endif
-export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF
-export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
+export CC CXX AS AR LD OBJCOPY OBJDUMP STRIP READELF
+export TOOLCHAIN_CFLAGS TOOLCHAIN_CXXFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
diff --git a/mk/toolchain/icc/rte.vars.mk b/mk/toolchain/icc/rte.vars.mk
index ba69f1f..e9d6721 100644
--- a/mk/toolchain/icc/rte.vars.mk
+++ b/mk/toolchain/icc/rte.vars.mk
@@ -32,8 +32,9 @@
#
# toolchain:
#
-# - define CC, LD, AR, AS, ... (overriden by cmdline value)
+# - define CC, CXX, LD, AR, AS, ... (overriden by cmdline value)
# - define TOOLCHAIN_CFLAGS variable (overriden by cmdline value)
+# - define TOOLCHAIN_CXXFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_LDFLAGS variable (overriden by cmdline value)
# - define TOOLCHAIN_ASFLAGS variable (overriden by cmdline value)
#
@@ -42,6 +43,7 @@
# x86->x86 compiler
CC = icc
+CXX = icc
KERNELCC = gcc
CPP = cpp
AS = nasm
@@ -57,9 +59,11 @@ HOSTCC = icc
else
HOSTCC = gcc
endif
+HOSTCXX = icc
HOSTAS = as
TOOLCHAIN_CFLAGS =
+TOOLCHAIN_CXXFLAGS =
TOOLCHAIN_LDFLAGS =
TOOLCHAIN_ASFLAGS =
@@ -83,5 +87,5 @@ ifeq ($(shell test $(ICC_MAJOR_VERSION) -ge 14 && echo 1), 1)
TOOLCHAIN_CFLAGS += -no-inline-max-size -no-inline-max-total-size
endif
-export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF
-export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
+export CC CXX AS AR LD OBJCOPY OBJDUMP STRIP READELF
+export TOOLCHAIN_CFLAGS TOOLCHAIN_CXXFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
--
2.5.5
next prev parent reply other threads:[~2016-08-02 20:41 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-02 20:37 [dpdk-dev] [RFC 0/4] Use Google Test as DPDK unit test framework Declan Doherty
2016-08-02 20:37 ` Declan Doherty [this message]
2016-08-02 20:37 ` [dpdk-dev] [RFC 2/4] examples: add c++ example application Declan Doherty
2016-08-02 20:37 ` [dpdk-dev] [RFC 3/4] eal: add command line option to log output to stdout Declan Doherty
2016-08-03 11:25 ` Neil Horman
2016-08-02 20:37 ` [dpdk-dev] [RFC 4/4] app/test-gtest: example google test application Declan Doherty
2016-08-02 21:52 ` [dpdk-dev] [RFC 0/4] Use Google Test as DPDK unit test framework Thomas Monjalon
2016-08-03 9:16 ` Remy Horton
2016-08-03 9:57 ` Doherty, Declan
2016-08-03 12:51 ` Neil Horman
2016-08-03 20:46 ` Ming Zhao
2016-08-04 19:47 ` Jim Murphy
2016-08-04 19:55 ` Wiles, Keith
2016-08-05 7:42 ` Thomas Monjalon
2016-08-05 7:41 ` Yerden Zhumabekov
2016-08-05 9:11 ` Remy Horton
2016-08-05 12:59 ` Neil Horman
2016-08-05 14:54 ` Remy Horton
2016-08-03 11:31 ` Neil Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1470170269-20721-2-git-send-email-declan.doherty@intel.com \
--to=declan.doherty@intel.com \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).