From d509a3df87da55a1f3a6b0abd79ed0769c8b0587 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sun, 13 Dec 2020 12:54:28 +1100 Subject: [PATCH] Cleanup --- workspace/TS100/Core/BSP/Pine64/README.md | 13 +- .../gd32vf103v_eval/Include/gd32vf103v_eval.h | 48 --- .../gd32vf103v_eval/Include/nuclei_sdk_hal.h | 19 -- .../Source/GCC/gcc_gd32vf103_flashxip.ld | 294 ------------------ .../gd32vf103v_eval/Source/gd32vf103v_eval.c | 39 --- .../gd32vf103v_eval/openocd_gd32vf103.cfg | 47 --- .../Board/pinecil/openocd_gd32vf103.cfg | 3 +- workspace/TS100/Core/BSP/Pine64/flash.c | 2 +- workspace/TS100/Makefile | 8 +- 9 files changed, 7 insertions(+), 466 deletions(-) delete mode 100644 workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h delete mode 100644 workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/nuclei_sdk_hal.h delete mode 100644 workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/GCC/gcc_gd32vf103_flashxip.ld delete mode 100644 workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/gd32vf103v_eval.c delete mode 100644 workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/openocd_gd32vf103.cfg diff --git a/workspace/TS100/Core/BSP/Pine64/README.md b/workspace/TS100/Core/BSP/Pine64/README.md index bb9de245..944507c4 100755 --- a/workspace/TS100/Core/BSP/Pine64/README.md +++ b/workspace/TS100/Core/BSP/Pine64/README.md @@ -1,12 +1,3 @@ -# BSP section for STM32F103 based Miniware products +# BSP section for Pinecil -This folder contains the hardware abstractions required for the TS100, TS80 and probably TS80P soldering irons. - -## Main abstractions - -* Hardware Init -* -> Should contain all bootstrap to bring the hardware up to an operating point -* -> Two functions are required, a pre and post FreeRToS call -* I2C read/write -* Set PWM for the tip -* Links between IRQ's on the system and the calls in the rest of the firmware +This folder contains the hardware abstractions required for the Pinecil. A RISC-V based soldering iron. diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h deleted file mode 100644 index 88957f51..00000000 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h +++ /dev/null @@ -1,48 +0,0 @@ -/*! - \file gd32vf103v_eval.h - \brief definitions for GD32VF103V_EVAL's leds, keys and COM ports hardware resources - - \version 2019-6-5, V1.0.0, demo for GD32VF103 -*/ - -/* - Copyright (c) 2019, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#ifndef GD32VF103V_EVAL_H -#define GD32VF103V_EVAL_H - -#ifdef cplusplus - extern "C" { -#endif - -#include "nuclei_sdk_soc.h" - -#ifdef cplusplus -} -#endif - -#endif /* GD32VF103V_EVAL_H */ diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/nuclei_sdk_hal.h b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/nuclei_sdk_hal.h deleted file mode 100644 index fab446a7..00000000 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Include/nuclei_sdk_hal.h +++ /dev/null @@ -1,19 +0,0 @@ -// See LICENSE for license details. -#ifndef _NUCLEI_SDK_HAL_H -#define _NUCLEI_SDK_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -#include "gd32vf103v_eval.h" - - -#ifndef NUCLEI_BANNER -#define NUCLEI_BANNER 0 -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/GCC/gcc_gd32vf103_flashxip.ld b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/GCC/gcc_gd32vf103_flashxip.ld deleted file mode 100644 index 9b6264f8..00000000 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/GCC/gcc_gd32vf103_flashxip.ld +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2019 Nuclei Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/****************************************************************************** - * @file gcc_Device.ld - * @brief GNU Linker Script for gd32vf103 based device - * @version V1.0.0 - * @date 17. Dec 2019 - ******************************************************************************/ - -/*********** Use Configuration Wizard in Context Menu *************************/ - -OUTPUT_ARCH( "riscv" ) -/********************* Flash Configuration ************************************ - * Flash Configuration - * Flash Base Address <0x0-0xFFFFFFFF:8> - * Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> - * - */ -__ROM_BASE = 0x08000000; -__ROM_SIZE = 0x00020000; - -/*--------------------- ILM RAM Configuration --------------------------- - * ILM RAM Configuration - * ILM RAM Base Address <0x0-0xFFFFFFFF:8> - * ILM RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> - * - */ -__ILM_RAM_BASE = 0x80000000; -__ILM_RAM_SIZE = 0x00010000; - -/*--------------------- Embedded RAM Configuration --------------------------- - * RAM Configuration - * RAM Base Address <0x0-0xFFFFFFFF:8> - * RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> - * -*/ -__RAM_BASE = 0x20000000; -__RAM_SIZE = 0x00005000; - -/********************* Stack / Heap Configuration **************************** - * Stack / Heap Configuration - * Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> - * Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> - * - */ -__STACK_SIZE = 0x00000800; -__HEAP_SIZE = 0x00000800; - -/**************************** end of configuration section ********************/ - -/* Define base address and length of flash and ram */ -MEMORY -{ - flash (rxai!w) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE - ram (wxa!ri) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE -} -/* Linker script to place sections and symbol values. Should be used together - * with other linker script that defines memory regions FLASH,ILM and RAM. - * It references following symbols, which must be defined in code: - * _Start : Entry of reset handler - * - * It defines following symbols, which code can use without definition: - * _ilm_lma - * _ilm - * __etext - * _etext - * etext - * _eilm - * __preinit_array_start - * __preinit_array_end - * __init_array_start - * __init_array_end - * __fini_array_start - * __fini_array_end - * _data_lma - * _edata - * edata - * __data_end__ - * __bss_start - * __fbss - * _end - * end - * __heap_end - * __StackLimit - * __StackTop - * __STACK_SIZE - */ -/* Define entry label of program */ -ENTRY(_start) -SECTIONS -{ - __STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2K; - - .init : - { - /* vector table locate at flash */ - *(.vtable) - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash - - .ilalign : - { - . = ALIGN(4); - /* Create a section label as _ilm_lma which located at flash */ - PROVIDE( _ilm_lma = . ); - } >flash AT>flash - - .ialign : - { - /* Create a section label as _ilm which located at flash */ - PROVIDE( _ilm = . ); - } >flash AT>flash - - /* Code section located at flash */ - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash - - .rodata : ALIGN(4) - { - . = ALIGN(4); - *(.rdata) - *(.rodata .rodata.*) - /* section information for initial. */ - . = ALIGN(4); - __rt_init_start = .; - KEEP(*(SORT(.rti_fn*))) - __rt_init_end = .; - /* section information for finsh shell */ - . = ALIGN(4); - __fsymtab_start = .; - KEEP(*(FSymTab)) - __fsymtab_end = .; - . = ALIGN(4); - __vsymtab_start = .; - KEEP(*(VSymTab)) - __vsymtab_end = .; - *(.gnu.linkonce.r.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >flash AT>flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash - - . = ALIGN(4); - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - PROVIDE( _eilm = . ); - - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - * the constructors, so we make sure it is - * first. Because this is a wildcard, it - * doesn't matter if the user does not - * actually link against crtbegin.o; the - * linker won't look for a file to match a - * wildcard. The wildcard also means that it - * doesn't matter which directory crtbegin.o - * is in. - */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - * the crtend.o file until after the sorted ctors. - * The .ctor section from the crtend file contains the - * end of ctors marker and it must be last - */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash - - /* Define data section virtual address is ram and physical address is flash */ - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.* .sdata*) - *(.gnu.linkonce.s.*) - } >ram AT>flash - .logo_page (NOLOAD) : - { - . = ABSOLUTE(__FLASH_END_ADDR__ - 2048); - KEEP (*(.logo_page*)) - } > flash - - .settings_page (NOLOAD) : - { - . = ABSOLUTE(__FLASH_END_ADDR__ - 1024); - KEEP (*(.settings_page*)) - } > flash - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - /* Define stack and head location at ram */ - .stack ORIGIN(ram) + LENGTH(ram) - __STACK_SIZE : - { - PROVIDE( _heap_end = . ); - . = __STACK_SIZE; - PROVIDE( _sp = . ); - } >ram AT>ram -} diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/gd32vf103v_eval.c b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/gd32vf103v_eval.c deleted file mode 100644 index 127b2078..00000000 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/Source/gd32vf103v_eval.c +++ /dev/null @@ -1,39 +0,0 @@ -/*! - \file gd32vf103v_eval.c - \brief firmware functions to manage leds, keys, COM ports - - \version 2019-6-5, V1.0.0, demo for GD32VF103 -*/ - -/* - Copyright (c) 2019, GigaDevice Semiconductor Inc. - - Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ - -#include "nuclei_sdk_hal.h" -#include "gd32vf103_usart.h" -#include "gd32vf103_gpio.h" -#include "gd32vf103_exti.h" - diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/openocd_gd32vf103.cfg b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/openocd_gd32vf103.cfg deleted file mode 100644 index 4dfe1fe0..00000000 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/gd32vf103v_eval/openocd_gd32vf103.cfg +++ /dev/null @@ -1,47 +0,0 @@ -adapter_khz 1000 -reset_config srst_only -adapter_nsrst_assert_width 100 - -interface cmsis-dap - -transport select jtag - -autoexit true - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1e200a6d - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size 20480 -work-area-backup 0 - -# Work-area is a space in RAM used for flash programming -if { [info exists WORKAREASIZE] } { - set _WORKAREASIZE $WORKAREASIZE -} else { - set _WORKAREASIZE 0x5000 -} - -# Allow overriding the Flash bank size -if { [info exists FLASH_SIZE] } { - set _FLASH_SIZE $FLASH_SIZE -} else { - # autodetect size - set _FLASH_SIZE 0 -} - -# flash size will be probed -set _FLASHNAME $_CHIPNAME.flash - -flash bank $_FLASHNAME gd32vf103 0x08000000 0 0 0 $_TARGETNAME - -# Expose Nuclei self-defined CSRS range 770-800,835-850,1984-2032,2064-2070 -# See https://github.com/riscv/riscv-gnu-toolchain/issues/319#issuecomment-358397306 -# Then user can view the csr register value in gdb using: info reg csr775 for CSR MTVT(0x307) -riscv expose_csrs 770-800,835-850,1984-2032,2064-2070 - -riscv set_reset_timeout_sec 1 - -init - -halt diff --git a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/openocd_gd32vf103.cfg b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/openocd_gd32vf103.cfg index 23970612..733b4bd9 100644 --- a/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/openocd_gd32vf103.cfg +++ b/workspace/TS100/Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/openocd_gd32vf103.cfg @@ -1,10 +1,11 @@ -adapter_khz 4000 +adapter_khz 100 reset_config srst_only adapter_nsrst_assert_width 100 interface cmsis-dap transport select jtag +adapter_khz 100 autoexit true diff --git a/workspace/TS100/Core/BSP/Pine64/flash.c b/workspace/TS100/Core/BSP/Pine64/flash.c index 46a18bcf..ba85c89b 100755 --- a/workspace/TS100/Core/BSP/Pine64/flash.c +++ b/workspace/TS100/Core/BSP/Pine64/flash.c @@ -12,7 +12,7 @@ #define FMC_PAGE_SIZE ((uint16_t)0x400U) //static uint16_t settings_page[FMC_PAGE_SIZE] __attribute__ ((section (".settings_page"))); //Linker script doesnt want to play, so for now its hard coded -#define SETTINGS_START_PAGE (0x08000000 +(63*1024)) +#define SETTINGS_START_PAGE (0x08000000 +(127*1024)) uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { /* unlock the flash program/erase controller */ diff --git a/workspace/TS100/Makefile b/workspace/TS100/Makefile index 8be49bf6..2dfc9355 100644 --- a/workspace/TS100/Makefile +++ b/workspace/TS100/Makefile @@ -150,8 +150,6 @@ AS=$(COMPILER_PREFIX)-as OBJCOPY=$(COMPILER_PREFIX)-objcopy OBJDUMP=$(COMPILER_PREFIX)-objdump SIZE=$(COMPILER_PREFIX)-size -SREC=srec_cat -SREC_INFO=srec_info # For the Pinecil, use GCC rather than as? (Copying other makefiles) ifeq ($(model),Pinecil) @@ -246,6 +244,7 @@ CFLAGS=$(DEV_CFLAGS) \ -ffreestanding \ -T$(LDSCRIPT) \ -c + AFLAGS= $(CPUFLAGS) \ @@ -255,9 +254,6 @@ AFLAGS= $(CPUFLAGS) \ $(INCLUDES) -CFLAGS += -ffunction-sections -fdata-sections -CXXFLAGS += -ffunction-sections -fdata-sections - OBJS = $(SOURCE:.c=.o) @@ -289,7 +285,7 @@ $(OUT_HEXFILE).elf : $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) Makefile $(LDSCRI @test -d $(@D) || mkdir -p $(@D) @echo Linking $(OUTPUT_EXE).elf @echo $(LINKER_FLAGS) - @$(CPP) $(CXXFLAGS) $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) $(LIBS) $(LINKER_FLAGS) + @$(CPP) $(CXXFLAGS) $(OUT_OBJS) $(OUT_OBJS_CPP) $(OUT_OBJS_S) $(LIBS) $(LINKER_FLAGS) $(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile @test -d $(@D) || mkdir -p $(@D)