From patchwork Sat Mar 21 03:22:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takuya ASADA X-Patchwork-Id: 4089 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 DF7DC5ABA; Sat, 21 Mar 2015 04:23:31 +0100 (CET) Received: from mail-pa0-f47.google.com (mail-pa0-f47.google.com [209.85.220.47]) by dpdk.org (Postfix) with ESMTP id 1883E5AA1 for ; Sat, 21 Mar 2015 04:23:30 +0100 (CET) Received: by pacwe9 with SMTP id we9so127446593pac.1 for ; Fri, 20 Mar 2015 20:23:29 -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=EggElDC8vClBGbx+ADmONPPDtEe13saYwZAp31XyNYzwIBKoHX+NpMelUC9aIgZlRO FicTLLY9h4uz2J5dSCE3S7cSPpPznwi/MehlKZzPtsSysRNY6ZyNkm+uQEC20q4TX/8c ThAVHs3peUeRApSKF5ac8i+qpUgyGXNcktGttqcsOBjoHilZA2mfposI9SnyAJZPGs12 /3XO/BjvAy6xMICybBG6FWnC7oeGrL11Uxg0lyTEdbuwgIbdzVglAoFSINztNfIh/tik IFfdZ7jSwKkeUjeF0f84KmhJd2eMRWvMnP9gs4loN5k786i+3BM7CwpPA5mQIxZmVNPP fO+A== X-Gm-Message-State: ALoCoQkjbiCbSOnQco6F9Iy1ZwXYP3eaz406VWkrJvc1kKo1V3m2GlzOHrOB6/w3i4lbiSezagNn X-Received: by 10.68.179.67 with SMTP id de3mr1811683pbc.85.1426908209331; Fri, 20 Mar 2015 20:23:29 -0700 (PDT) Received: from localhost (7c295ef2.i-revonet.jp. [124.41.94.242]) by mx.google.com with ESMTPSA id gx1sm453254pbd.3.2015.03.20.20.23.27 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Mar 2015 20:23:28 -0700 (PDT) From: Takuya ASADA To: dev@dpdk.org Date: Sat, 21 Mar 2015 12:22:58 +0900 Message-Id: <1426908185-27940-2-git-send-email-syuu@cloudius-systems.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1426908185-27940-1-git-send-email-syuu@cloudius-systems.com> References: <1426194348-4406-1-git-send-email-syuu@cloudius-systems.com> <1426908185-27940-1-git-send-email-syuu@cloudius-systems.com> Subject: [dpdk-dev] [RFC PATCHv2 1/8] 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