# # Arduinoライブラリ用の定義 # ARDUINO_LIB_DIR = $(R2CA_DIR)/arduino_lib # # コアライブラリ # APPL_COBJS += delay.o \ wiring.o wiring_digital.o wiring_analog.o wiring_shift.o \ WInterrupts.o \ samd21_host.o \ dtostrf.o \ itoa.o \ syscalls.o \ APPL_CXXOBJS += r2ca_lib.o \ variant.o \ SERCOM.o Uart.o RingBuffer.o Print.o \ CDC.o HID.o USBCore.o Reset.o \ Stream.o \ wiring_pulse.o \ WMath.o \ WString.o \ IPAddress.o \ Tone.o \ ifeq ($(USE_ETHERNET2), true) # # Ethenet2ライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/Ethernet2/src/ $(R2CA_DIR)/arduino_lib/libraries/Ethernet2/src/utility APPL_CXXOBJS += Dhcp.o Dns.o Ethernet2.o EthernetClient.o EthernetServer.o EthernetUdp2.o Twitter.o socket.o w5500.o APPL_COBJS += USE_ARDUINO_SPI = true endif ifeq ($(USE_NCESCAN), true) # # NCESCANライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/NcesCan/ APPL_CXXOBJS += mcp_can.o APPL_COBJS += USE_ARDUINO_SPI = true endif ifeq ($(USE_NAXESMOTION), true) # # NAxesMotionライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/NAxesMotion $(R2CA_DIR)/arduino_lib/libraries/NAxesMotion/utility APPL_CXXOBJS += NAxisMotion.o APPL_COBJS += BNO055.o USE_WIRE = true endif ifeq ($(USE_ARDUINO_SD), true) # # SDライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/SD/src/ $(R2CA_DIR)/arduino_lib/libraries/SD/src/utility APPL_CXXOBJS += File.o SD.o Sd2Card.o SdFile.o SdVolume.o APPL_COBJS += endif ifeq ($(USE_ARDUINO_TFT), true) # # TFTライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/TFT/src/ $(R2CA_DIR)/arduino_lib/libraries/TFT/src/utility APPL_CXXOBJS += TFT.o Adafruit_GFX.o Adafruit_ST7735.o APPL_COBJS += glcdfont.o endif ifeq ($(USE_WIRE), true) # # Wireライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/hardware/arduino/samd/libraries/Wire/ APPL_CXXOBJS += Wire.o APPL_COBJS += endif ifeq ($(USE_ARDUINO_SPI), true) # # SPIライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/hardware/arduino/samd/libraries/SPI/ APPL_CXXOBJS += SPI.o APPL_COBJS += endif ifeq ($(USE_ARDUINO_RTC), true) # # RTCライブラリ # APPL_DIR += $(R2CA_DIR)/arduino_lib/libraries/RTC/src/ APPL_CXXOBJS += RTCInt.o APPL_COBJS += endif APPL_DIR += $(R2CA_DIR)/lib \ $(ARDUINO_LIB_DIR)/hardware/arduino/samd/cores/arduino/ \ $(ARDUINO_LIB_DIR)/hardware/arduino/samd/cores/arduino/avr \ $(ARDUINO_LIB_DIR)/hardware/arduino/samd/cores/arduino/USB \ $(ARDUINO_LIB_DIR)/hardware/arduino/samd/variants/arduino_zero/ CDEFS += -Dprintf=iprintf \ -DF_CPU=48000000L \ -DARDUINO=10710 \ -DARDUINO_SAM_ZERO \ -DARDUINO_ARCH_SAMD \ -D__SAMD21G18A__ \ -DUSB_VID=0x2a03 \ -DUSB_PID=0x804f \ -DUSBCON \ -DUSB_MANUFACTURER= \ -DTOPPERS_WITH_ARDUINO CXXLIBS += -lm -lstdc++ CXXFLAGS = -fno-rtti -fno-exceptions vpath %.cpp $(APPL_DIR) $(TOPPERS_ARDUINO_DIR)/lib INCLUDES += -I$(TOPPERS_ARDUINO_DIR)/lib # # Serialの扱い # ifeq ($(ARDUINO_SERIAL), NOUSE_SERIAL) USE_LOGTASK = true endif ifeq ($(ARDUINO_SERIAL), USE_SERIAL) CDEFS += -DTOPPERS_USE_ARDUINO_SERIAL endif # # ターゲット略称の定義 # TARGET = arduino_m0_gcc # # プログラミング言語の定義 # SRCLANG = c ifeq ($(SRCLANG),c) LIBS = -lc endif ifeq ($(SRCLANG),c++) USE_CXX = true CXXLIBS = -lstdc++ -lm -lc CXXRTS = cxxrt.o newlibrt.o endif # # オブジェクトファイル名の拡張子の設定 # OBJEXT = elf # # 実行環境の定義(ターゲット依存に上書きされる場合がある) # DBGENV := # # カーネルライブラリ(libkernel.a)のディレクトリ名 # (カーネルライブラリもmake対象にする時は,空に定義する) # KERNEL_LIB = # # カーネルを関数単位でコンパイルするかどうかの定義 # KERNEL_FUNCOBJS = # # トレースログを取得するかどうかの定義 # ENABLE_TRACE = # # ユーティリティプログラムの名称 # PERL = /usr/bin/perl CFG = "$(SRCDIR)/cfg/cfg/cfg" # # オブジェクトファイル名の定義 # OBJNAME = r2ca ifdef OBJEXT OBJFILE = $(OBJNAME).$(OBJEXT) CFG1_OUT = cfg1_out.$(OBJEXT) else OBJFILE = $(OBJNAME) CFG1_OUT = cfg1_out endif # # ターゲット依存部のディレクトリの定義 # TARGETDIR = $(SRCDIR)/target/$(TARGET) # # ターゲット依存の定義のインクルード # include $(TARGETDIR)/Makefile.target # # コンフィギュレータ関係の変数の定義 # CFG_TABS := --api-table $(SRCDIR)/kernel/kernel_api.csv \ --cfg1-def-table $(SRCDIR)/kernel/kernel_def.csv $(CFG_TABS) CFG_ASMOBJS := $(CFG_ASMOBJS) CFG_COBJS := kernel_cfg.o $(CFG_COBJS) CFG_OBJS := $(CFG_ASMOBJS) $(CFG_COBJS) CFG2_OUT_SRCS := kernel_cfg.h kernel_cfg.c $(CFG2_OUT_SRCS) # # 共通コンパイルオプションの定義 # COPTS := $(COPTS) -g -MD ifndef OMIT_WARNING_ALL COPTS := $(COPTS) -Wall endif ifndef OMIT_OPTIMIZATION COPTS := $(COPTS) -Os endif CDEFS := $(CDEFS) INCLUDES := -I. -I$(SRCDIR)/include -I$(SRCDIR)/arch -I$(SRCDIR) $(INCLUDES) LDFLAGS := $(LDFLAGS) CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) LIBS := $(LIBS) $(CXXLIBS) CFLAGS = $(COPTS) $(CDEFS) $(INCLUDES) # # アプリケーションプログラムに関する定義 # APPL_DIR += $(SRCDIR)/library APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o ifdef APPL_DIR INCLUDES := $(INCLUDES) $(foreach dir,$(APPL_DIR),-I$(dir)) endif # # システムサービスに関する定義 # SYSSVC_DIR := $(SYSSVC_DIR) $(SRCDIR)/syssvc $(SRCDIR)/library SYSSVC_ASMOBJS := $(SYSSVC_ASMOBJS) SYSSVC_COBJS := $(SYSSVC_COBJS) banner.o syslog.o \ $(CXXRTS) ifeq ($(USE_LOGTASK),true) SYSSVC_COBJS := $(SYSSVC_COBJS) serial.o logtask.o CDEFS := $(CDEFS) -DTOPPERS_USE_LOGTASK endif SYSSVC_CFLAGS := $(SYSSVC_CFLAGS) SYSSVC_LIBS := $(SYSSVC_LIBS) INCLUDES := $(INCLUDES) # # カーネルに関する定義 # # KERNEL_ASMOBJS: カーネルライブラリに含める,ソースがアセンブリ言語の # オブジェクトファイル. # KERNEL_COBJS: カーネルのライブラリに含める,ソースがC言語で,ソース # ファイルと1対1に対応するオブジェクトファイル. # KERNEL_LCSRCS: カーネルのライブラリに含めるC言語のソースファイルで, # 1つのソースファイルから複数のオブジェクトファイルを生 # 成するもの. # KERNEL_LCOBJS: 上のソースファイルから生成されるオブジェクトファイル. # KERNEL_AUX_COBJS: ロードモジュールに含めないが,カーネルのソースファ # イルと同じオプションを適用してコンパイルすべき,ソー # スがC言語のオブジェクトファイル. # KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/kernel KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) KERNEL_COBJS := $(KERNEL_COBJS) KERNEL_CFLAGS := $(KERNEL_CFLAGS) -I$(SRCDIR)/kernel ifdef OMIT_MAKEOFFSET OFFSET_H = else OFFSET_H = offset.h ifndef OFFSET_TF KERNEL_AUX_COBJS := $(KERNEL_AUX_COBJS) makeoffset.o endif endif # # ターゲットファイル(複数を同時に選択してはならない) # all: $(OBJFILE) #all: $(OBJNAME).bin #all: $(OBJNAME).srec ##### 以下は編集しないこと ##### # # 環境に依存するコンパイルオプションの定義 # ifdef DBGENV CDEFS := $(CDEFS) -D$(DBGENV) endif # # 実行環境の判定 # ifneq (,$(findstring /cygdrive/,$(PATH))) UNAME := Cygwin else ifeq ($(OS),Windows_NT) UNAME := Windows else ifeq ($(UNAME),Linux) UNAME := Linux ifeq ($(UNAME),Darwin) UNAME := Darwin endif endif endif endif # # カーネルのファイル構成の定義 # include $(SRCDIR)/kernel/Makefile.kernel ifdef KERNEL_FUNCOBJS KERNEL_LCSRCS := $(KERNEL_FCSRCS) KERNEL_LCOBJS := $(foreach file,$(KERNEL_FCSRCS),$($(file:.c=))) else KERNEL_CFLAGS := -DALLFUNC $(KERNEL_CFLAGS) KERNEL_COBJS := $(KERNEL_COBJS) \ $(foreach file,$(KERNEL_FCSRCS),$(file:.c=.o)) endif # # ソースファイルのあるディレクトリに関する定義 # vpath %.c $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR) vpath %.S $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR) vpath %.cfg $(APPL_DIR) # # コンパイルのための変数の定義 # KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS) SYSSVC_OBJS = $(SYSSVC_ASMOBJS) $(SYSSVC_COBJS) APPL_OBJS = $(APPL_ASMOBJS) $(APPL_COBJS) $(APPL_CXXOBJS) ALL_OBJS = $(START_OBJS) $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) \ $(END_OBJS) $(HIDDEN_OBJS) ifdef KERNEL_LIB ALL_LIBS = $(APPL_LIBS) $(SYSSVC_LIBS) -lkernel $(LIBS) LIBS_DEP = $(filter %.a,$(ALL_LIBS)) $(KERNEL_LIB)/libkernel.a LDFLAGS := $(LDFLAGS) -L$(KERNEL_LIB) REALCLEAN_FILES := libkernel.a $(REALCLEAN_FILES) else ALL_LIBS = $(APPL_LIBS) $(SYSSVC_LIBS) libkernel.a $(LIBS) LIBS_DEP = $(filter %.a,$(ALL_LIBS)) endif ifdef TEXT_START_ADDRESS LDFLAGS := $(LDFLAGS) -Wl,-Ttext,$(TEXT_START_ADDRESS) CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-Ttext,$(TEXT_START_ADDRESS) endif ifdef DATA_START_ADDRESS LDFLAGS := $(LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS) CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS) endif ifdef LDSCRIPT LDFLAGS := $(LDFLAGS) -T $(LDSCRIPT) CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -T $(LDSCRIPT) endif # # オフセットファイル(offset.h)の生成規則 # ifdef OFFSET_TF offset.h: $(APPL_CFG) kernel_cfg.timestamp $(CFG) --pass 3 --kernel asp $(INCLUDES) \ --rom-image cfg1_out.srec --symbol-table cfg1_out.syms \ -T $(OFFSET_TF) $(CFG_TABS) $< else offset.h: makeoffset.s $(SRCDIR)/utils/genoffset $(PERL) $(SRCDIR)/utils/genoffset makeoffset.s > offset.h endif # # カーネルのコンフィギュレーションファイルの生成 # cfg1_out.c: $(APPL_CFG) $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) $< $(CFG) -M cfg1_out.c $(INCLUDES) $< > cfg1_out.c.d $(CFG2_OUT_SRCS): kernel_cfg.timestamp kernel_cfg.timestamp: $(APPL_CFG) \ $(START_OBJS) cfg1_out.o $(END_OBJS) $(HIDDEN_OBJS) $(LINK) $(CFLAGS) $(CFG1_OUT_LDFLAGS) -o $(CFG1_OUT) \ $(START_OBJS) cfg1_out.o $(END_OBJS) $(NM) -n $(CFG1_OUT) > cfg1_out.syms $(OBJCOPY) -O srec -S $(CFG1_OUT) cfg1_out.srec $(CFG) --pass 2 --kernel asp $(INCLUDES) \ -T $(TARGETDIR)/target.tf $(CFG_TABS) $< ifeq ($(UNAME), Windows) copy /B kernel_cfg.c +,, echo -n > kernel_cfg.timestamp else touch -r kernel_cfg.c kernel_cfg.timestamp endif # # カーネルライブラリファイルの生成 # libkernel.a: $(OFFSET_H) $(KERNEL_LIB_OBJS) rm -f libkernel.a $(AR) -rcs libkernel.a $(KERNEL_LIB_OBJS) $(RANLIB) libkernel.a # # 特別な依存関係の定義 # banner.o: kernel_cfg.timestamp $(filter-out banner.o,$(ALL_OBJS)) $(LIBS_DEP) # # 全体のリンク # $(OBJFILE): $(APPL_CFG) kernel_cfg.timestamp $(ALL_OBJS) $(LIBS_DEP) $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) $(START_OBJS) \ $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) $(ALL_LIBS) $(END_OBJS) $(NM) -n $(OBJFILE) > $(OBJNAME).syms $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec $(CFG) --pass 3 --kernel asp $(INCLUDES) \ --rom-image $(OBJNAME).srec --symbol-table $(OBJNAME).syms \ -T $(TARGETDIR)/target_check.tf $(CFG_TABS) $< # # バイナリファイルの生成 # $(OBJNAME).bin: $(OBJFILE) $(OBJCOPY) -O binary -R .bss -S $(OBJFILE) $(OBJNAME).bin # # Sレコードファイルの生成 # $(OBJNAME).srec: $(OBJFILE) $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec # # コンパイル結果の消去 # .PHONY: clean clean: rm -f $(OBJFILE) $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).bin $(OBJFILE).shadow rm -f kernel_cfg.timestamp $(CFG2_OUT_SRCS) rm -f cfg1_out.c $(CFG1_OUT) cfg1_out.syms cfg1_out.srec rm -f kernel_cfg.timestamp $(CFG2_OUT_SRCS); rm -f cfg1_out.c cfg1_out.o $(CFG1_OUT) cfg1_out.syms cfg1_out.srec; rm -f makeoffset.s offset.h; ifndef KERNEL_LIB rm -f libkernel.a endif rm -f makeoffset.s offset.h rm -f \#* *~ *.o *.d $(CLEAN_FILES) .PHONY: cleankernel cleankernel: rm -rf $(KERNEL_LIB_OBJS) rm -f makeoffset.s offset.h .PHONY: cleandep cleandep: if ! [ -f Makefile.depend ]; then \ rm -f kernel_cfg.timestamp $(CFG2_OUT_SRCS); \ rm -f cfg1_out.c cfg1_out.o $(CFG1_OUT) cfg1_out.syms cfg1_out.srec; \ rm -f makeoffset.s offset.h; \ fi rm -f Makefile.depend .PHONY: realclean realclean: cleandep clean rm -f $(REALCLEAN_FILES) # # コンフィギュレータが生成したファイルのコンパイルルールと依存関係作成 # ルールの定義 # # コンフィギュレータが生成したファイルは,アプリケーションプログラム用, # システムサービス用,カーネル用のすべてのオプションを付けてコンパイル # する. # ALL_CFG_COBJS = $(CFG_COBJS) cfg1_out.o ALL_CFG_ASMOBJS = $(CFG_ASMOBJS) CFG_CFLAGS = $(APPL_CFLAGS) $(SYSSVC_CFLAGS) $(KERNEL_CFLAGS) $(ALL_CFG_COBJS): %.o: %.c $(CC) -c $(CFLAGS) $(CFG_CFLAGS) $< #$(ALL_CFG_COBJS:.o=.s): %.s: %.c # $(CC) -S $(CFLAGS) $(CFG_CFLAGS) $< $(ALL_CFG_ASMOBJS): %.o: %.S $(CC) -c $(CFLAGS) $(CFG_CFLAGS) $< # # 依存関係ファイルをインクルード # -include *.d # # 開発ツールのコマンド名の定義 # ifeq ($(TOOL),gcc) # # GNU開発環境用 # ifdef GCC_TARGET GCC_TARGET_PREFIX = $(GCC_TARGET)- else GCC_TARGET_PREFIX = endif # # Windowsの場合はフルパスにする # ifeq ($(UNAME),Windows) GCC_PATH_WIN = $(ARDUINO_BASE_DIR_WIN)\hardware\tools\gcc-arm-none-eabi-4.8.3-2014q1\bin CC = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)gcc" CXX = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)g++" AS = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)as" LD = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)ld" AR = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)ar" NM = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)nm" RANLIB = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)ranlib" OBJCOPY = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)objcopy" OBJDUMP = "$(GCC_PATH_WIN)\$(GCC_TARGET_PREFIX)objdump" else CC = $(GCC_TARGET_PREFIX)gcc CXX = $(GCC_TARGET_PREFIX)g++ AS = $(GCC_TARGET_PREFIX)as LD = $(GCC_TARGET_PREFIX)ld AR = $(GCC_TARGET_PREFIX)ar NM = $(GCC_TARGET_PREFIX)nm RANLIB = $(GCC_TARGET_PREFIX)ranlib OBJCOPY = $(GCC_TARGET_PREFIX)objcopy OBJDUMP = $(GCC_TARGET_PREFIX)objdump endif endif ifdef USE_CXX LINK = $(CXX) else LINK = $(CC) endif # # コンパイルルールの定義 # KERNEL_ALL_COBJS = $(KERNEL_COBJS) $(KERNEL_AUX_COBJS) $(KERNEL_ALL_COBJS): %.o: %.c $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< #$(KERNEL_ALL_COBJS:.o=.s): %.s: %.c # $(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $< $(KERNEL_LCOBJS): %.o: $(CC) -DTOPPERS_$(*F) -o $@ -c $(CFLAGS) $(KERNEL_CFLAGS) $< #$(KERNEL_LCOBJS:.o=.s): %.s: # $(CC) -DTOPPERS_$(*F) -o $@ -S $(CFLAGS) $(KERNEL_CFLAGS) $< $(KERNEL_ASMOBJS): %.o: %.S $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< $(SYSSVC_COBJS): %.o: %.c $(CC) -c $(CFLAGS) $(SYSSVC_CFLAGS) $< #$(SYSSVC_COBJS:.o=.s): %.s: %.c # $(CC) -S $(CFLAGS) $(SYSSVC_CFLAGS) $< $(SYSSVC_ASMOBJS): %.o: %.S $(CC) -c $(CFLAGS) $(SYSSVC_CFLAGS) $< $(APPL_COBJS): %.o: %.c $(CC) -c $(CFLAGS) $(APPL_CFLAGS) $< #$(APPL_COBJS:.o=.s): %.s: %.c # $(CC) -S $(CFLAGS) $(APPL_CFLAGS) $< $(APPL_CXXOBJS): %.o: %.cpp $(CXX) -c $(CFLAGS) $(APPL_CFLAGS) $(CXXFLAGS) $< #$(APPL_CXXOBJS:.o=.s): %.s: %.cpp # $(CXX) -S $(CFLAGS) $(APPL_CFLAGS) $(CXXFLAGS) $< $(APPL_ASMOBJS): %.o: %.S $(CC) -c $(CFLAGS) $(APPL_CFLAGS) $< # # デフォルトコンパイルルールを上書き # %.o: %.c @echo "*** Default compile rules should not be used." $(CC) -c $(CFLAGS) $< #%.s: %.c # @echo "*** Default compile rules should not be used." # $(CC) -S $(CFLAGS) $< %.o: %.cpp @echo "*** Default compile rules should not be used." $(CXX) -c $(CFLAGS) $(CXXFLAGS) $< #%.s: %.cpp # @echo "*** Default compile rules should not be used." # $(CXX) -S $(CFLAGS) $(CXXFLAGS) $< %.o: %.S @echo "*** Default compile rules should not be used." $(CC) -c $(CFLAGS) $<