From patchwork Mon Apr 6 18:58:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takuya ASADA X-Patchwork-Id: 4243 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id B94E1C348; Mon, 6 Apr 2015 20:58:29 +0200 (CEST) Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by dpdk.org (Postfix) with ESMTP id 4EAD8C346 for ; Mon, 6 Apr 2015 20:58:28 +0200 (CEST) Received: by pdbni2 with SMTP id ni2so52979074pdb.1 for ; Mon, 06 Apr 2015 11:58:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2e45c8e6ExODnZ9bYP4en90YK/J68Q92orRUzMHXFvI=; b=hU9s/le8FCXJJFCN6dS4/jeLxNoj9vQNRIqo7L52RWwZE4GiU6JjiTFRnwyDCoNms9 +CUqNpugIznJLDvWSgNOGmRXMjQNrOxyGYaR5GM2MydaKA9fr/tnZhZI2a79ChsQ/NOP 1c0GwokFaPkVurkwyftrH+iFnOPElKQk2yrKYCk0y35OiRxZqO2pPKAoGx+A3AUabDqE ANohP2EAQTLxIh/A6vCO4NNlIuX/CGf5Ro6GsvRjY8Lu1xKG8EfRtpkIT0MIteIklh77 FZzjlcUe4x9GnLHGoyiu61UrRvvG1Chp4HvXK07llWHJprAFYF+p/EpbIZ/u4wlfObJx C1Qw== X-Gm-Message-State: ALoCoQnbrSqLXYASA/RHp5p056D5netHDjvCyuBJgIZpAIFjunjINon7H4E3Rwi8KbM5io++Xitp X-Received: by 10.66.228.130 with SMTP id si2mr9293566pac.92.1428346707665; Mon, 06 Apr 2015 11:58:27 -0700 (PDT) Received: from localhost (7c295ef2.i-revonet.jp. [124.41.94.242]) by mx.google.com with ESMTPSA id j14sm5444220pbq.29.2015.04.06.11.58.26 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Apr 2015 11:58:26 -0700 (PDT) From: Takuya ASADA To: dev@dpdk.org Date: Tue, 7 Apr 2015 03:58:05 +0900 Message-Id: <1428346691-14894-2-git-send-email-syuu@cloudius-systems.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1428346691-14894-1-git-send-email-syuu@cloudius-systems.com> References: <1428346691-14894-1-git-send-email-syuu@cloudius-systems.com> Subject: [dpdk-dev] [RFC PATCHv3 1/7] mk: support compiling C++ code X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Since OSv is written in C++, we need to write OSv EAL in C++. To do so, we need to compile .cc files by $(CXX). This patch does not contain diff for clang and icc, but OSv EAL does not supported these toolchain, this is enough for now. Signed-off-by: Takuya ASADA --- mk/internal/rte.compile-pre.mk | 41 ++++++++++++++++++++++++++++++++++++++--- mk/target/generic/rte.vars.mk | 4 ++++ mk/toolchain/gcc/rte.vars.mk | 5 ++++- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/mk/internal/rte.compile-pre.mk b/mk/internal/rte.compile-pre.mk index b9bff4a..142f996 100644 --- a/mk/internal/rte.compile-pre.mk +++ b/mk/internal/rte.compile-pre.mk @@ -37,7 +37,7 @@ 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 %.cc,%.o,$(1))))) # add a dot in front of the file name dotfile = $(strip $(foreach f,$(1),\ @@ -46,12 +46,12 @@ 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 %.S,,$(patsubst %.cc,%.o.d,$(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 %.S,%_s.o.cmd,$(patsubst %.cc,%.o.cmd,$(1)))))) obj2cmd = $(strip $(call dotfile,$(patsubst %.o,%.o.cmd,$(1)))) OBJS-y := $(call src2obj,$(SRCS-y)) @@ -78,11 +78,19 @@ C_TO_O = $(HOSTCC) -Wp,-MD,$(call obj2dep,$(@)).tmp $(HOST_CFLAGS) \ $(CFLAGS_$(@)) $(HOST_EXTRA_CFLAGS) -o $@ -c $< C_TO_O_STR = $(subst ','\'',$(C_TO_O)) #'# fix syntax highlight C_TO_O_DISP = $(if $(V),"$(C_TO_O_STR)"," HOSTCC $(@)") +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 C_TO_O = $(CC) -Wp,-MD,$(call obj2dep,$(@)).tmp $(CFLAGS) \ $(CFLAGS_$(@)) $(EXTRA_CFLAGS) -o $@ -c $< C_TO_O_STR = $(subst ','\'',$(C_TO_O)) #'# fix syntax highlight C_TO_O_DISP = $(if $(V),"$(C_TO_O_STR)"," CC $(@)") +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 C_TO_O_CMD = 'cmd_$@ = $(C_TO_O_STR)' C_TO_O_DO = @set -e; \ @@ -91,6 +99,13 @@ C_TO_O_DO = @set -e; \ echo $(C_TO_O_CMD) > $(call obj2cmd,$(@)) && \ sed 's,'$@':,dep_'$@' =,' $(call obj2dep,$(@)).tmp > $(call obj2dep,$(@)) && \ rm -f $(call obj2dep,$(@)).tmp +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 # return an empty string if string are equal compare = $(strip $(subst $(1),,$(2)) $(subst $(2),,$(1))) @@ -136,6 +151,26 @@ boolean = $(if $1,1,0) $(depfile_missing),\ $(depfile_newer)),\ $(C_TO_O_DO)) +# +# Compile .cc file if needed +# Note: dep_$$@ is from the .d file and DEP_$$@ can be specified by +# user (by default it is empty) +# +.SECONDEXPANSION: +%.o: %.cc $$(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)) # command to assemble a .S file to generate an object ifeq ($(USE_HOST),1) diff --git a/mk/target/generic/rte.vars.mk b/mk/target/generic/rte.vars.mk index 53650c3..47d845b 100644 --- a/mk/target/generic/rte.vars.mk +++ b/mk/target/generic/rte.vars.mk @@ -146,7 +146,11 @@ endif LDFLAGS += -L$(RTE_SDK_BIN)/lib endif +# copy CFLAGS to CXXFLAGS +CXXFLAGS := $(CFLAGS) + export CFLAGS export LDFLAGS +export CXXFLAGS endif diff --git a/mk/toolchain/gcc/rte.vars.mk b/mk/toolchain/gcc/rte.vars.mk index 88f235c..4bdf2eb 100644 --- a/mk/toolchain/gcc/rte.vars.mk +++ b/mk/toolchain/gcc/rte.vars.mk @@ -39,6 +39,7 @@ # CC = $(CROSS)gcc +CXX = $(CROSS)g++ KERNELCC = $(CROSS)gcc CPP = $(CROSS)cpp # for now, we don't use as but nasm. @@ -54,8 +55,10 @@ GCOV = $(CROSS)gcov ifeq ("$(origin CC)", "command line") HOSTCC = $(CC) +HOSTCXX = $(CXX) else HOSTCC = gcc +HOSTCXX = gxx endif HOSTAS = as @@ -80,5 +83,5 @@ WERROR_FLAGS += -Wundef -Wwrite-strings # process cpu flags include $(RTE_SDK)/mk/toolchain/$(RTE_TOOLCHAIN)/rte.toolchain-compat.mk -export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF +export CC CXX AS AR LD OBJCOPY OBJDUMP STRIP READELF export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS