Jekyll2016-08-19T17:32:18-04:00https://james919.github.io/James WrightA developer blog that gets updated as often as the average developer updates their blog.James WrightMakefile for PSoC Creator projects in GNU ARM Eclipse2016-07-06T00:00:00-04:002016-07-06T00:00:00-04:00https://james919.github.io/PSoC-makefile<p>This is a Makefile suitable for PSoC Creator projects that uses build rules and GCC’s autodependency feature. By passing in command line arguments, this makefile will build a Release or Debug binary.</p>
<p>See the section at the bottom of the listing, titled <code class="highlighter-rouge">Defaults</code>, for other options.</p>
<p><strong>NOTE</strong> This makefile is specialized for the CY8C4247LQI-BL483 variant. You should customize this for your board as necessary.</p>
<div class="language-makefile highlighter-rouge"><pre class="highlight"><code>
<span class="c">#########################################################################################################################################
# PSoC 4 Makefile
# - This makefile builds a PSoC Creator project with Debug and Release versions.
# - It will also flash the PSoC using J-Link. Haven't yet added this for the discovery version that uses an on-board JTAG programmer.
# - It uses GCC's autodependency feature to maintain a list of dependencies for each source file in the build directory -- this means
# it will recompile only the files that need to be recompiled, automatically.
# - The majority of the makefile is a defined variable that is evaluated with a set of parameters that can either be set at the bottom
# of this file or passed in via the command line. Evaluation happens at the end of the file, with defaults defined just before.
#########################################################################################################################################
# Use Bash
</span><span class="nv">SHELL</span> <span class="o">=</span> /bin/sh
<span class="c"># Functions
</span><span class="nv">find_includes_in_dir</span> <span class="o">=</span> <span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="o">(</span>1<span class="nv">)</span> -name <span class="s2">"*.h"</span> | sed <span class="s1">'s|/[^/]*$$||'</span> | sort -u<span class="nv">)</span>
<span class="c"># -----------------------------------------------------------------------------
# Configuration Constants -- These are static and should not be discovered
# using the greedy 'find's in the Build Configuration Rule defined below.
# -----------------------------------------------------------------------------
</span><span class="nv">CYDEVICE</span> <span class="o">:=</span> CY8C4247LQI-BL483
<span class="nv">CYDSN_DIR</span> <span class="o">:=</span> PSoC_Creator_Project_Directory.cydsn
<span class="nv">CYGENERATED_SOURCE</span> <span class="o">:=</span> <span class="nv">$(CYDSN_DIR)</span>/Generated_Source/PSoC4
<span class="nv">LDSCRIPTS</span> <span class="o">:=</span> <span class="err">$</span><span class="o">(</span>addprefix -T, <span class="nv">$(CYGENERATED_SOURCE)</span>/cm0gcc.ld<span class="o">)</span>
<span class="nv">ASM_SRC</span> <span class="o">:=</span> <span class="nv">$(CYGENERATED_SOURCE)</span>/CyBootAsmGnu.s
<span class="c"># -----------------------------------------------------------------------------------------------
# J-Link Configuration
# -----------------------------------------------------------------------------------------------
</span><span class="nv">JLINK_ROOT</span> <span class="o">?=</span> /Applications/SEGGER/JLink
<span class="nv">JLINKEXE</span> <span class="o">:=</span> <span class="nv">$(JLINK_ROOT)</span>/JLinkExe
<span class="nv">JLINKGDBSERVER</span> <span class="o">:=</span> <span class="nv">$(JLINK_ROOT)</span>/JLinkGDBServer
<span class="nv">JLINKDEVICE</span> <span class="o">:=</span> CY8C4247xxx-BLxxx
<span class="nv">JLINKGDBCMD</span> <span class="o">:=</span> <span class="nv">$(JLINKGDBSERVER)</span> -if SWD -device <span class="nv">$(JLINKDEVICE)</span> >/tmp/jlink.log 2>&1
<span class="c"># ---------------------------------------------------------------------
# Toolchain Configuration
# ---------------------------------------------------------------------
</span><span class="nv">BINUTILS_ROOT</span> <span class="o">?=</span> /usr/local/gcc-arm-none-eabi-5_3-2016q1
<span class="nv">TOOLCHAIN</span> <span class="o">:=</span> arm-none-eabi
<span class="nv">CC</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-gcc
<span class="nv">CXX</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-g++
<span class="nv">AS</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-as
<span class="nv">OBJCOPY</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-objcopy
<span class="nv">SIZE</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-size
<span class="nv">CYELFTOOL</span> <span class="o">:=</span> <span class="nv">$(CYDSN_DIR)</span>/Export/CyElfTool.exe
<span class="nv">WINE</span> <span class="o">:=</span> /usr/local/bin/wine
<span class="nv">C_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu11
<span class="nv">CXX_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu++11
<span class="c"># -----------------------------------------------------------------------------------------------------------------
# Defined Symbols
# -----------------------------------------------------------------------------------------------------------------
</span><span class="nv">DEFS</span> <span class="o">:=</span>
<span class="c">#-DSTM32F437xx -DUSE_HAL_DRIVER -DARM_MATH_CM4 -D__FPU_PRESENT=1U -DHSE_VALUE=25000000
</span>
<span class="c"># ---------------------------------------------------------------------------------------------------------------------------------------
# Compiler & Linker Flags
# ---------------------------------------------------------------------------------------------------------------------------------------
# Flags sent to all tools in the Toolchain (except Assembler)
</span><span class="nv">TOOLCHAIN_SETTINGS</span> <span class="o">:=</span> -mcpu<span class="o">=</span>cortex-m0 -march<span class="o">=</span>armv6-m -mthumb
<span class="nv">TOOLCHAIN_SETTINGS</span> <span class="o">+=</span> -fmessage-length<span class="o">=</span>0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants
<span class="c"># Assembler -- Required Flags
</span><span class="nv">ASFLAGS</span> <span class="o">+=</span> -mcpu<span class="o">=</span>cortex-m0 -march<span class="o">=</span>armv6-m -mthumb
<span class="nv">ASFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="o">(</span>addprefix -I, <span class="nv">$(INC_DIRS)</span><span class="o">)</span>
<span class="c"># gcc flags
</span><span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span> <span class="err">$</span><span class="o">(</span>addprefix -I, <span class="nv">$(INC_DIRS)</span><span class="o">)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wall
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wextra
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfatal-errors
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wpacked
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Winline
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wlogical-op
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wdisabled-optimization
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wno-unused-parameter
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wa,-alh<span class="o">=</span><span class="err">$</span><span class="o">(</span>@:.o<span class="o">=</span>.lst<span class="o">)</span>
<span class="c"># C++ Compiler -- Required & Optimization Flags
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> <span class="nv">$(CFLAGS)</span>
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fabi-version<span class="o">=</span>0
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-rtti
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-exceptions
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-use-cxa-atexit
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-threadsafe-statics
<span class="c"># C++ -- Warnings
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Weffc++
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsign-promo
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wzero-as-null-pointer-constant
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Woverloaded-virtual
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-final-types
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-final-methods
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-override
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>pure
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>const
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>noreturn
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>format
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wmissing-format-attribute
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wold-style-cast
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wshadow
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wctor-dtor-privacy
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wstrict-null-sentinel
<span class="c"># Linker
</span><span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span> -Xlinker --gc-sections --specs<span class="o">=</span>nano.specs
<span class="c"># CyElfTool flags
</span><span class="nv">CYFLAGS</span> <span class="o">+=</span> --flash_row_size 128 --flash_size 131072
<span class="c"># -------------------------------------------------------------
# Build Type Modifiers
# -------------------------------------------------------------
# Debug
</span><span class="nv">DEFS_DEBUG</span> <span class="o">+=</span> -DDEBUG -DTRACE -DOS_USE_TRACE_ITM
<span class="nv">CFLAGS_DEBUG</span> <span class="o">+=</span> -ggdb -g3 -Og
<span class="nv">LDFLAGS_DEBUG</span> <span class="o">+=</span> --specs<span class="o">=</span>rdimon.specs -Og
<span class="c"># Release
</span><span class="nv">CFLAGS_RELEASE</span> <span class="o">+=</span> -Os
<span class="nv">LDFLAGS_RELEASE</span> <span class="o">+=</span> --specs<span class="o">=</span>nosys.specs
<span class="c"># -------------------------------------------------------------------------------
# J-Link Flash Command
# The following command string (between define/endef) flashes a code to a PSoC4
# The trick here is to define a multi-line variable in make and then export it
# to the subshell that will run JLinkExe
# -------------------------------------------------------------------------------
</span><span class="err">define</span> <span class="err">JLINK_FLASH_PSoC4_CMD</span>
<span class="err">speed</span> <span class="err">1000</span>
<span class="err">if</span> <span class="err">SWD</span>
<span class="err">device</span> <span class="err">$(JLINKDEVICE)</span>
<span class="err">halt</span>
<span class="err">r</span>
<span class="err">erase</span>
<span class="err">loadfile</span> <span class="err">$(BUILD_DIR)/$(PRODUCT).hex</span>
<span class="err">r</span>
<span class="err">g</span>
<span class="err">exit</span>
<span class="err">endef</span>
<span class="k">export</span> <span class="nv">JLINK_FLASH_PSoC4_CMD</span>
<span class="c">#########################################################################################################################################
# RULE DEFINITIONS -- This section is generic
#########################################################################################################################################
</span>
<span class="c"># =======================================================================================================================================
# Build Configuration Rule
# - Generate build config using Product Root Directory ($1), Build Type ("Debug" or "Release") ($2)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">CONFIG_RULE</span>
<span class="nv">BUILD_DIR</span> <span class="o">:=</span> <span class="nv">$1</span>/Build/<span class="nv">$2</span>
<span class="nv">OBJ_DIR</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span>/obj
<span class="nv">INC_DIRS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>call find_includes_in_dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span><span class="o">)</span> <span class="nv">$(CYDSN_DIR)</span>
<span class="nv">HEADERS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.h"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">C_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.c"</span> -not -name <span class="s2">"*main.c"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">CXX_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.cpp"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">CYLIBS</span> <span class="o">:=</span> <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(CYDSN_DIR)</span>/Export -name <span class="s2">"*.a"</span><span class="nv">)</span>
<span class="nv">OBJECTS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>addprefix <span class="err">$</span><span class="nv">$(OBJ_DIR)</span>/, <span class="err">$$</span><span class="o">(</span>C_SRC:.c<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>CXX_SRC:.cpp<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>ASM_SRC:.s<span class="o">=</span>.o<span class="o">))</span>
<span class="nv">AUTODEPS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>OBJECTS:.o<span class="o">=</span>.d<span class="o">)</span>
<span class="nv">DIRS</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span> <span class="err">$$</span><span class="o">(</span>sort <span class="err">$$</span><span class="o">(</span>dir <span class="err">$</span><span class="nv">$(OBJECTS)</span><span class="o">))</span>
<span class="err">ifeq</span> <span class="err">($2,</span> <span class="err">Release)</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_RELEASE)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_RELEASE)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_RELEASE)</span>
<span class="err">else</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_DEBUG)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_DEBUG)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_DEBUG)</span>
<span class="err">endif</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End CONFIG_RULE
# =======================================================================================================================================
</span>
<span class="c"># =======================================================================================================================================
# Build Target Rule
# - Generate build config using Product Name ($1), Product Root Directory ($2), Build Type ("Debug" or "Release") ($3)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">BUILD_TARGET_RULE</span>
<span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">CONFIG_RULE,$2,$3))</span>
<span class="nl">all </span><span class="o">:</span> <span class="nf">$$(BUILD_DIR)/$1.hex</span>
<span class="c"># Tool Invocations
</span><span class="nl">%.hex </span><span class="o">:</span> <span class="nf">%.elf</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: CyElfTool.exe'</span>
<span class="p">@</span><span class="nv">WINEDEBUG</span><span class="o">=</span>-all <span class="err">$</span><span class="nv">$(WINE)</span> <span class="err">$</span><span class="nv">$(CYELFTOOL)</span> -C <span class="err">$$</span><span class="o">(</span><<span class="o">)</span> <span class="err">$</span><span class="nv">$(CYFLAGS)</span>
<span class="p">@</span><span class="nv">WINEDEBUG</span><span class="o">=</span>-all <span class="err">$</span><span class="nv">$(WINE)</span> <span class="err">$</span><span class="nv">$(CYELFTOOL)</span> -S <span class="err">$$</span><span class="o">(</span><<span class="o">)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: Cross ARM GNU Print Size'</span>
<span class="err">$</span><span class="nv">$(SIZE)</span> --format<span class="o">=</span>berkeley <span class="nv">$$</span><
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="nl">$$(BUILD_DIR)/$1.elf </span><span class="o">:</span> <span class="nf">$$(OBJECTS) | $$(BUILD_DIR)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Building $$(@)'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: Cross ARM C++ Linker'</span>
<span class="p">@</span>touch cycodeshareexport.ld cycodeshareimport.ld
<span class="err">$</span><span class="nv">$(CXX)</span> <span class="se">\</span>
-Xlinker -Map<span class="o">=</span><span class="err">$$</span><span class="o">(</span>patsubst %.elf,%.map,<span class="err">$$</span><span class="o">(</span>@<span class="o">))</span> <span class="se">\</span>
<span class="err">$</span><span class="nv">$(LDFLAGS)</span> <span class="se">\</span>
<span class="err">$</span><span class="nv">$(LDSCRIPTS)</span> <span class="se">\</span>
-o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span> <span class="err">$</span><span class="nv">$(OBJECTS)</span> <span class="err">$</span><span class="nv">$(CYLIBS)</span>
<span class="p">@</span>rm cycodeshareexport.ld cycodeshareimport.ld
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="nl">$$(OBJECTS) </span><span class="o">:</span> <span class="nf">| $$(DIRS)</span>
<span class="nl">$$(DIRS) </span><span class="o">:</span>
<span class="p">@</span><span class="nb">echo </span>Creating <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span>mkdir -p <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.c</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CC)</span> <span class="err">$</span><span class="nv">$(C_STANDARD)</span> <span class="err">$</span><span class="nv">$(CFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.cpp</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CXX)</span> <span class="err">$</span><span class="nv">$(CXX_STANDARD)</span> <span class="err">$</span><span class="nv">$(CXXFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.s</span>
<span class="p">@</span><span class="nb">echo </span>Assembling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(AS)</span> <span class="err">$</span><span class="nv">$(ASFLAGS)</span> <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">flashit </span><span class="o">:</span> <span class="nf">$$(BUILD_DIR)/$1.hex</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$$$$</span><span class="s2">JLINK_FLASH_PSoC4_CMD"</span> | <span class="err">$</span><span class="nv">$(JLINKEXE)</span>
<span class="nl">$$(BUILD_DIR)/.gdbinit </span><span class="o">:</span> <span class="nf">$$(BUILD_DIR)</span>
<span class="p">@</span>rm -f <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s2">"shell </span><span class="err">$</span><span class="nv">$(JLINKGDBCMD)</span><span class="s2">&"</span> >> <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s2">"target remote :2331"</span> >> <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s2">"monitor reset"</span> >> <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">clean </span><span class="o">:</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Cleaning build directory...'</span>
rm -rf <span class="err">$</span><span class="nv">$(PRODUCT_DIR)</span>/Build
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished cleaning.'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="nl">.PHONY </span><span class="o">:</span> <span class="nf">clean all</span>
<span class="c"># include by auto dependencies
</span><span class="err">-include</span> <span class="err">$$(AUTODEPS)</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End BUILD_TARGET_RULE
# =======================================================================================================================================
#########################################################################################################################################
#########################################################################################################################################
</span>
<span class="c"># Build Type
</span><span class="err">ifeq</span> <span class="err">($(build),</span> <span class="err">Release)</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Release
<span class="err">else</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Debug
<span class="err">endif</span>
<span class="c"># Defaults
</span><span class="nv">PRODUCT</span> <span class="o">?=</span> Product_Name
<span class="nv">PRODUCT_DIR</span> <span class="o">?=</span> .
<span class="nv">BUILD_TYPE</span> <span class="o">?=</span> Debug
<span class="nv">SRC_DIRS</span> <span class="o">?=</span> <span class="nv">$(CYGENERATED_SOURCE)</span> src
<span class="c"># Evaluate Rules Defined Above
</span><span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">BUILD_TARGET_RULE,$(PRODUCT),$(PRODUCT_DIR),$(BUILD_TYPE)))</span>
</code></pre>
</div>James WrightThis is a Makefile suitable for PSoC Creator projects that uses build rules and GCC's autodependency feature.Using GNU ARM Eclipse with PSoC Creator Projects2016-07-05T00:00:00-04:002016-07-05T00:00:00-04:00https://james919.github.io/PSoC-Creator-GNU-ARM-Eclipse-Setup<p>This is how to use GNU ARM Eclipse instead of PSoC Creator to develop for Cypress PSoCs.</p>
<p>Caveats:</p>
<ul>
<li>Requires the use of virtualized Windows and PSoC Creator to configure your project and generate source</li>
<li>There is one tool in the build process that must be invoked using Wine: <code class="highlighter-rouge">CyElfTool.exe</code> – this tool does something similar to <code class="highlighter-rouge">objcopy</code>, but produces markedly different .elf and .bin files.</li>
</ul>
<h2 id="prerequisites">Prerequisites</h2>
<h4 id="virtualbox">VirtualBox</h4>
<ul>
<li>Download and install the <strong>VirtualBox Platform Package</strong> and the <strong>VirtualBox Extension Pack</strong> from the <a href="https://www.virtualbox.org/wiki/Downloads">VirtualBox Downloads Page</a>.</li>
<li>Setup a shared directory between VirtualBox and the host, like <code class="highlighter-rouge">~/VirtualBoxShared</code></li>
</ul>
<h4 id="windows-7">Windows 7</h4>
<p>Microsoft has made virtualizing Windows freely available through the Microsoft Edge developer site.</p>
<ul>
<li>Download the <strong>IE 11 on Win7</strong> for <strong>VirtualBox</strong> archive from the <a href="https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/mac/">Microsoft Edge Developer Site</a>.</li>
<li>Disable Windows Update by following the instructions <a href="http://www.techtalkz.com/windows-7/515869-windows-update-enable-disable-automatic-updates-windows-7-guide.html">here</a> and <a href="https://www.youtube.com/watch?v=vWd4k2OggJY">here</a>.</li>
<li>Create a VirtualBox Snapshot when you have everything configured.</li>
</ul>
<h4 id="psoc-creator">PSoC Creator</h4>
<p>Cypress requires a developer account to access their tool and documentation.</p>
<ul>
<li>Download and install <a href="http://www.cypress.com/products/psoc-creator-integrated-design-environment-ide">PSoC Creator</a> in Windows.</li>
</ul>
<h4 id="homebrew">Homebrew</h4>
<p>If you don’t already have it, install Homebrew by pasting this into your terminal:</p>
<p><code class="highlighter-rouge">/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</code></p>
<h4 id="wine">Wine</h4>
<ul>
<li>Install using Homebrew (takes a little while): <code class="highlighter-rouge">brew install wine</code></li>
<li>When finished, type <code class="highlighter-rouge">winecfg</code> at the command prompt. Wine will setup its default config in <code class="highlighter-rouge">~/.wine/</code>, and will then be usable.</li>
</ul>
<hr />
<h2 id="psoc-creator-project-export">PSoC Creator Project Export</h2>
<ul>
<li>in PSoC Creator, right-click on your project and select <strong>Export to IDE (<em>Project Name</em>)…</strong></li>
<li>select <strong>Eclipse</strong> and hit <strong>Next</strong></li>
<li>on the next page, hit <strong>Export</strong></li>
<li>copy the (<em>ProjectName</em>.cydn) directory over to your VirtualBox shared directory</li>
</ul>
<h2 id="gnu-arm-eclipse-project-setup">GNU ARM Eclipse Project Setup</h2>
<p>Once you have your environment setup and a PSoC Creator project exported, you’re ready to import it into GNU ARM Eclipse.</p>
<h4 id="project-directory-structure">Project Directory Structure</h4>
<p>In the File System:</p>
<ul>
<li>Create a new root directory to hold the exported PSoC Creator project</li>
<li>Copy the exported project (<em>ProjectName</em>.cydsn) into the root directory</li>
<li>Copy the makefile into the root directory</li>
<li>In the root directory, create a new user source directory named <code class="highlighter-rouge">source</code>. This is where any new code written in GNU ARM Eclipse goes.</li>
</ul>
<h4 id="import-existing-code">Import Existing Code</h4>
<p>In Eclipse:</p>
<ul>
<li>select <strong>Makefile Project with Existing Code</strong></li>
<li>give your project a name, and select the project root directory as the <strong>Existing Code Location</strong>.</li>
<li>select <strong>Cross ARM GCC</strong> for <strong>Toolchain for Indexer Settings</strong></li>
<li>click <strong>Finish</strong></li>
</ul>
<h4 id="configure-eclipse-project">Configure Eclipse Project</h4>
<h6 id="populate-build-environment-variables">Populate Build Environment Variables</h6>
<p>For whatever reason, the build environment variables are not populated when you select the toolchain in the project import dialog.</p>
<p>In Project Preferences:</p>
<ul>
<li>in <strong>Preferences → C/C++ Build → Settings</strong></li>
<li>select the <strong>Toolchains</strong> tab</li>
<li>for field <em>Name</em>, select <strong>GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc)</strong>
<ul>
<li>this is because of a strange bug – the build environment variables are not set until this selection is made.</li>
</ul>
</li>
</ul>
<h6 id="tell-the-indexer-where-code-is-located">Tell the Indexer Where Code is Located</h6>
<p>At this point, the project will build correctly, but the indexer has no idea where all the code you’re referencing is located.</p>
<p>In Project Preferences:</p>
<ul>
<li>in <strong>Preferences → C/C++ General → Paths and Symbols</strong></li>
<li>select the <strong>Includes</strong> tab</li>
<li>click <strong>Add…</strong></li>
<li>check all 3 boxes (“Add to all configurations”, “Add to all languages”, “Is a workspace path”)</li>
<li>click <strong>Workspace…</strong></li>
<li>select your project root directory</li>
<li>hit <strong>OK</strong></li>
</ul>
<h2 id="makefile">Makefile</h2>
<p>For your specific project, look at the console output of the PSoC Creator build.</p>
<p>Example makefile <a href="/psoc-makefile/">here</a></p>James WrightInstructions to setup GNU ARM Eclipse with PSoC Creator Projects on Mac OS X (macOS) or LinuxMakefile for STM32 Projects2016-07-04T00:00:00-04:002016-07-04T00:00:00-04:00https://james919.github.io/STM32-makefile<p>This is a Makefile suitable for STM32 projects that uses build rules and GCC’s autodependency feature. By passing in command line arguments, this makefile will build a Release or Debug binary.</p>
<p>See the section at the bottom of the listing, titled <code class="highlighter-rouge">Defaults</code>, for other options.</p>
<p><strong>NOTE</strong> This makefile is specialized for the STM32F437xx variant. You should customize this for your board as necessary.</p>
<div class="language-makefile highlighter-rouge"><pre class="highlight"><code>
<span class="c">#########################################################################################################################################
# Basic Makefile
# - It uses GCC's autodependency feature to maintain a list of dependencies for each source file in the build directory -- this means
# it will recompile only the files that need to be recompiled, automatically.
# - The majority of the makefile is a defined variable that is evaluated with a set of parameters that can either be set at the bottom
# of this file or passed in via the command line. Evaluation happens at the end of the file, with defaults defined just before.
#########################################################################################################################################
</span>
<span class="c"># Use Bash sdf
</span><span class="nv">SHELL</span> <span class="o">=</span> /bin/sh
<span class="c"># Functions
</span><span class="nv">find_includes_in_dir</span> <span class="o">=</span> <span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="o">(</span>1<span class="nv">)</span> -name <span class="s2">"*.h"</span> | sed <span class="s1">'s|/[^/]*$$||'</span> | sort -u<span class="nv">)</span>
<span class="c"># ---------------------------------------------------------------------
# Toolchain Configuration
# ---------------------------------------------------------------------
</span><span class="nv">BINUTILS_ROOT</span> <span class="o">?=</span> /usr/local/gcc-arm-none-eabi-5_3-2016q1
<span class="nv">TOOLCHAIN</span> <span class="o">:=</span> arm-none-eabi
<span class="nv">CC</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-gcc
<span class="nv">CXX</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-g++
<span class="nv">AS</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-as
<span class="nv">OBJCOPY</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-objcopy
<span class="nv">SIZE</span> <span class="o">:=</span> <span class="nv">$(BINUTILS_ROOT)</span>/bin/<span class="nv">$(TOOLCHAIN)</span>-size
<span class="nv">C_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu11
<span class="nv">CXX_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu++11
<span class="c"># -----------------------------------------------------------------------------------------------------------------
# Defined Symbols
# -----------------------------------------------------------------------------------------------------------------
</span><span class="nv">DEFS</span> <span class="o">:=</span> -DSTM32F437xx -DUSE_HAL_DRIVER -DARM_MATH_CM4 -D__FPU_PRESENT<span class="o">=</span>1U -DHSE_VALUE<span class="o">=</span>25000000
<span class="c"># ---------------------------------------------------------------------------------------------------------------------------------------
# Compiler & Linker Flags
# ---------------------------------------------------------------------------------------------------------------------------------------
# Flags sent to all tools in the Toolchain
</span><span class="nv">TOOLCHAIN_SETTINGS</span> <span class="o">:=</span> -mcpu<span class="o">=</span>cortex-m4 -march<span class="o">=</span>armv7e-m -mthumb -mfloat-abi<span class="o">=</span>hard -mfpu<span class="o">=</span>fpv4-sp-d16
<span class="nv">TOOLCHAIN_SETTINGS</span> <span class="o">+=</span> -fmessage-length<span class="o">=</span>0 -ffunction-sections -fdata-sections
<span class="c"># C Compiler -- Warnings
</span><span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span> <span class="err">$</span><span class="o">(</span>addprefix -I, <span class="nv">$(INC_DIRS)</span><span class="o">)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wall
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wextra
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfatal-errors
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wpacked
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Winline
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wconversion
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wlogical-op
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wpointer-arith
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wdisabled-optimization
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wno-unused-parameter
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wa,-alh<span class="o">=</span><span class="err">$</span><span class="o">(</span>@:.o<span class="o">=</span>.lst<span class="o">)</span>
<span class="c"># C++ Compiler -- Required & Optimization Flags
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> <span class="nv">$(CFLAGS)</span>
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fabi-version<span class="o">=</span>0
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-rtti
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-exceptions
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-use-cxa-atexit
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -fno-threadsafe-statics
<span class="c"># C++ -- Warnings
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Weffc++
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsign-promo
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wzero-as-null-pointer-constant
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wmissing-declarations
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Woverloaded-virtual
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-final-types
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-final-methods
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-override
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>pure
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>const
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>noreturn
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsuggest-attribute<span class="o">=</span>format
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wmissing-format-attribute
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wold-style-cast
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wshadow
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wuseless-cast
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wctor-dtor-privacy
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wstrict-null-sentinel
<span class="c"># Linker
</span><span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span> -Xlinker --gc-sections --specs<span class="o">=</span>nano.specs
<span class="c"># -------------------------------------------------------------
# Build Type Modifiers
# -------------------------------------------------------------
# Debug
</span><span class="nv">DEFS_DEBUG</span> <span class="o">+=</span> -DDEBUG
<span class="nv">CFLAGS_DEBUG</span> <span class="o">+=</span> -ggdb -g3 -Og
<span class="nv">LDFLAGS_DEBUG</span> <span class="o">+=</span> --specs<span class="o">=</span>rdimon.specs -Og
<span class="c"># Release
</span><span class="nv">CFLAGS_RELEASE</span> <span class="o">+=</span> -Os
<span class="nv">LDFLAGS_RELEASE</span> <span class="o">+=</span> --specs<span class="o">=</span>nosys.specs
<span class="c">#########################################################################################################################################
# RULE DEFINITIONS -- This section is generic
#########################################################################################################################################
</span>
<span class="c"># =======================================================================================================================================
# Build Configuration Rule
# - Generate build config using Product Root Directory ($1), Build Type ("Debug" or "Release") ($2)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">CONFIG_RULE</span>
<span class="nv">BUILD_DIR</span> <span class="o">:=</span> <span class="nv">$1</span>/Build/<span class="nv">$2</span>
<span class="nv">OBJ_DIR</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span>/obj
<span class="nv">INC_DIRS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>call find_includes_in_dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span><span class="o">)</span>
<span class="nv">HEADERS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.h"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">ASM_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.s"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">C_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.c"</span> -not -name <span class="s2">"*main.c"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">CXX_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.cpp"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">OBJECTS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>addprefix <span class="err">$</span><span class="nv">$(OBJ_DIR)</span>/, <span class="err">$$</span><span class="o">(</span>C_SRC:.c<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>CXX_SRC:.cpp<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>ASM_SRC:.s<span class="o">=</span>.o<span class="o">))</span>
<span class="nv">LDSCRIPTS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>addprefix -T, <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.ld"</span><span class="nv">)</span><span class="o">))</span>
<span class="nv">DIRS</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span> <span class="err">$$</span><span class="o">(</span>sort <span class="err">$$</span><span class="o">(</span>dir <span class="err">$</span><span class="nv">$(OBJECTS)</span><span class="o">))</span>
<span class="nv">AUTODEPS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>OBJECTS:.o<span class="o">=</span>.d<span class="o">)</span>
<span class="err">ifeq</span> <span class="err">($2,</span> <span class="err">Release)</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_RELEASE)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_RELEASE)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_RELEASE)</span>
<span class="err">else</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_DEBUG)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_DEBUG)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_DEBUG)</span>
<span class="err">endif</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End CONFIG_RULE
# =======================================================================================================================================
</span>
<span class="c"># =======================================================================================================================================
# Build Target Rule
# - Generate build config using Product Name ($1), Product Root Directory ($2), Build Type ("Debug" or "Release") ($3)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">BUILD_TARGET_RULE</span>
<span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">CONFIG_RULE,$2,$3))</span>
<span class="nl">all </span><span class="o">:</span> <span class="nf">$$(BUILD_DIR)/$1.elf $$(BUILD_DIR)/$1.hex</span>
<span class="c"># Tool Invocations
</span><span class="nl">$$(BUILD_DIR)/$1.elf </span><span class="o">:</span> <span class="nf">$$(OBJECTS) | $$(BUILD_DIR)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Building $$(@)'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: Cross ARM C++ Linker'</span>
<span class="err">$</span><span class="nv">$(CXX)</span> <span class="se">\</span>
-Xlinker -Map<span class="o">=</span><span class="err">$$</span><span class="o">(</span>patsubst %.elf,%.map,<span class="err">$$</span><span class="o">(</span>@<span class="o">))</span> <span class="se">\</span>
<span class="err">$</span><span class="nv">$(LDFLAGS)</span> <span class="se">\</span>
<span class="err">$</span><span class="nv">$(LDSCRIPTS)</span> <span class="se">\</span>
-o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span> <span class="err">$</span><span class="nv">$(OBJECTS)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="p">@</span><span class="nb">echo</span> <span class="err">$</span><span class="nv">$(build)</span>
<span class="nl">%.hex </span><span class="o">:</span> <span class="nf">%.elf</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: Cross ARM GNU Create Flash Image'</span>
<span class="err">$</span><span class="nv">$(OBJCOPY)</span> -O ihex <span class="nv">$$</span>< <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: Cross ARM GNU Print Size'</span>
<span class="err">$</span><span class="nv">$(SIZE)</span> --format<span class="o">=</span>berkeley <span class="nv">$$</span><
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="nl">$$(OBJECTS) </span><span class="o">:</span> <span class="nf">| $$(DIRS)</span>
<span class="nl">$$(DIRS) </span><span class="o">:</span>
<span class="p">@</span><span class="nb">echo </span>Creating <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span>mkdir -p <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.c</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CC)</span> <span class="err">$</span><span class="nv">$(C_STANDARD)</span> <span class="err">$</span><span class="nv">$(CFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.cpp</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CXX)</span> <span class="err">$</span><span class="nv">$(CXX_STANDARD)</span> <span class="err">$</span><span class="nv">$(CXXFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.s</span>
<span class="p">@</span><span class="nb">echo </span>Assembling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(AS)</span> <span class="err">$</span><span class="nv">$(ASFLAGS)</span> <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">clean </span><span class="o">:</span>
<span class="p">@</span>rm -rf <span class="err">$</span><span class="nv">$(PRODUCT_DIR)</span>/Build
<span class="nl">.PHONY </span><span class="o">:</span> <span class="nf">clean all</span>
<span class="c"># include by auto dependencies
</span><span class="err">-include</span> <span class="err">$$(AUTODEPS)</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End BUILD_TARGET_RULE
# =======================================================================================================================================
#########################################################################################################################################
#########################################################################################################################################
</span>
<span class="c"># Build Type
</span><span class="err">ifeq</span> <span class="err">($(build),</span> <span class="err">Debug)</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Debug
<span class="err">else</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Release
<span class="err">endif</span>
<span class="c"># Defaults
</span><span class="nv">PRODUCT</span> <span class="o">?=</span> hello
<span class="nv">PRODUCT_DIR</span> <span class="o">?=</span> project
<span class="nv">BUILD_TYPE</span> <span class="o">?=</span> Debug
<span class="nv">SRC_DIRS</span> <span class="o">?=</span> <span class="nv">$(PRODUCT_DIR)</span>
<span class="c"># Evaluate Rules Defined Above
</span><span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">BUILD_TARGET_RULE,$(PRODUCT),$(PRODUCT_DIR),$(BUILD_TYPE)))</span>
</code></pre>
</div>James WrightThis is a Makefile suitable for STM32 projects that uses build rules and GCC's autodependency feature.STM32CubeMX Projects and GNU ARM Eclipse2016-07-03T00:00:00-04:002016-07-03T00:00:00-04:00https://james919.github.io/STM32CubeMX-GNU-Arm-Eclipse-Setup<h2 id="stm32cubemx-project-export">STM32CubeMX Project Export</h2>
<ul>
<li>Open STM32CubeMX and open the your project
<ul>
<li>in <strong>Project -> Settings…</strong></li>
<li>select the <strong>Project</strong> tab</li>
<li>under <strong>Toolchain / IDE</strong></li>
<li>select <strong>SW4STM32</strong></li>
<li>hit <strong>OK</strong>
<ul>
<li>It will warn you that the previously generated files will be corrupted. That’s ok. They’re not there.</li>
</ul>
</li>
<li>select <strong>Project -> Generate Code</strong></li>
</ul>
</li>
</ul>
<h2 id="import-project-into-eclipse">Import Project into Eclipse</h2>
<p>Pretty simple:</p>
<ul>
<li>in the Project Exporer tab, right-click to show the context menu and select <strong>Import…</strong></li>
<li>under C/C++, select <strong>Existing Code as Makefile Project</strong></li>
<li>hit <strong>Next</strong></li>
<li>in the Import Existing Code dialog
<ul>
<li>name the project</li>
<li>hit <strong>Browse</strong> and select your repo top-level directory</li>
<li>under <em>Toolchain for Indexer Settings</em>, select <strong>Cross ARM GCC</strong></li>
<li>hit <strong>Finish</strong></li>
</ul>
</li>
</ul>
<p>Configure the Project</p>
<ul>
<li>Enable Parallel Build
<ul>
<li>in <strong>C/C++ Build</strong>, select the <strong>Behavior</strong> tab</li>
<li>under <em>Build Settings</em>, check the <strong>Enable parallel build</strong> box, and select the <strong>Use unlimited jobs</strong> radiobutton</li>
<li>under <em>Workbench Build Behavior</em>, check the <strong>Build on resource save (Auto build)</strong> box</li>
</ul>
</li>
<li>Specify Build Configurations
<ul>
<li>in <strong>C/C++ Build</strong>, click the <strong>Manage Configurations…</strong> button
<ul>
<li>create a new configuration called <code class="highlighter-rouge">Release</code> by copying the current configuration</li>
<li>rename the current configuration to <code class="highlighter-rouge">Debug</code></li>
<li>click <strong>Ok</strong></li>
</ul>
</li>
<li>with the <strong>Debug</strong> configuration selected,
<ul>
<li>select the <strong>Behavior</strong> tab</li>
<li>under <em>Workbench Build Behavior</em>, for the <em>Build</em> field, enter <code class="highlighter-rouge">target=<_your_target_name_here_> build=Debug</code></li>
<li>for the <em>Build on Resource Save (Auto Build)</em>, enter the same value from the <em>Build</em> field</li>
<li>for the <em>Clean</em> field, enter <code class="highlighter-rouge">clean target=<_your_target_name_here_></code></li>
</ul>
</li>
<li>with the <strong>Release</strong> configuration selected,
<ul>
<li>select the <strong>Behavior</strong> tab</li>
<li>under <em>Workbench Build Behavior</em>, for the <em>Build</em> field, enter <code class="highlighter-rouge">target=<_your_target_name_here_> build=Release</code></li>
<li>for the <em>Build on Resource Save (Auto Build)</em>, enter the same value from the <em>Build</em> field</li>
<li>for the <em>Clean</em> field, enter <code class="highlighter-rouge">clean target=<_your_target_name_here_></code></li>
</ul>
</li>
</ul>
</li>
</ul>James WrightInstructions to setup GNU ARM Eclipse with STM32CubeMX Projects on Mac OS X (macOS) or LinuxMinimal GNU ARM Eclipse Setup2016-07-02T00:00:00-04:002016-07-02T00:00:00-04:00https://james919.github.io/Minimal-GNU-ARM-Eclipse<h2 id="installation">Installation</h2>
<p>This is how to install the most GNU ARM Eclipse development environment without any of the extra tools included in the standard Eclipse CDT distribution.</p>
<h3 id="toolchain">Toolchain</h3>
<p>Follow the instructions under the <strong>Downloading</strong> and <strong>OS X</strong> headings of the <a href="http://gnuarmeclipse.github.io/toolchain/install/">Toolchain Installation Instructions</a>.</p>
<h3 id="segger-j-link">SEGGER J-Link</h3>
<p>Download the <strong>Software and Documentation Pack</strong> for OS X from the <a href="https://www.segger.com/jlink-software.html">J-Link Software Site</a>.</p>
<h3 id="openocd">OpenOCD</h3>
<p>From the GNU ARM Eclipse Installation Guide:</p>
<blockquote>
<p>OpenOCD might be needed when using development boards with integrated debuggers, like STM32F4-DISCOVERY boards, although the recommended solution is to prepare a custom cable and connect them to J-Link.</p>
</blockquote>
<p>Download and install the .pkg from the <a href="https://github.com/gnuarmeclipse/openocd/releases/latest">OpenOCD GitHub Releases</a> page. (Note that this may be a development release.)</p>
<h3 id="qemu">QEMU</h3>
<p>Download and install the most recent .pkg release from the <a href="https://github.com/gnuarmeclipse/qemu/releases/latest">QEMU GitHub Releases page</a>.</p>
<h3 id="eclipse">Eclipse</h3>
<p><strong>DO NOT</strong> get the Eclipse IDE for C/C++ Developers. While this will work fine, it includes a bunch of plugins that cannot be uninstalled later.</p>
<h4 id="eclipse-platform-runtime-binary">Eclipse Platform Runtime Binary</h4>
<p>The Eclipse Platform Runtime Binary is the most stripped-down version of Eclipse available. Here’s how to get it:
* Main downloads page: <a href="http://download.eclipse.org/eclipse/downloads/">http://download.eclipse.org/eclipse/downloads/</a>
* Go to the most recent build (Latest Downloads → Build Name). The build number is the link, not the “(X of Y Platforms)” part – that takes you to the test results report.
* Scroll down to “Platform Runtime Binary” and download the appropriate archive. Notice the size – for Mars, it’s 66M vs 203M for the entire SDK.</p>
<h4 id="install-gnu-arm-eclipse-plug-ins">Install GNU ARM Eclipse Plug-ins</h4>
<p>Since the Platform Runtime Binary doesn’t include Eclipse Marketplace, use the Eclipse Update Site method as detailed under the heading “The Eclipse update site way” of the official <a href="http://gnuarmeclipse.github.io/plugins/install/">GNU ARM Eclipse Installation Instructions</a>, reprinted here:</p>
<h5 id="add-repository">Add Repository</h5>
<ul>
<li>in the <em>Install</em> window, click the <strong>Add…</strong> button (on future updates, just select the URL in the <strong>Work with:</strong> combo)</li>
<li>fill in <em>Name:</em> with <strong>GNU ARM Eclipse Plug-ins</strong></li>
<li>fill in <em>Location:</em> with <strong>http://gnuarmeclipse.sourceforge.net/updates</strong></li>
<li>click the <strong>OK</strong> button</li>
</ul>
<h5 id="select-installation-items">Select Installation Items</h5>
<ul>
<li>Cross Compiler</li>
<li>Generic Cortex-M Template</li>
<li>J-Link Debugging</li>
<li>OpenOCD Debugging</li>
<li>Packs</li>
<li>QEMU Debugging</li>
<li>STM32Fx Templates</li>
</ul>
<h4 id="workspace-configuration">Workspace Configuration</h4>
<p>Follow the instructions here <a href="http://gnuarmeclipse.github.io/eclipse/workspace/preferences/">http://gnuarmeclipse.github.io/eclipse/workspace/preferences/</a> with the following additions:</p>
<ul>
<li>Refresh using native hooks</li>
<li>Refresh on access</li>
<li>Disable spell checking
<ul>
<li>in <strong>General → Editors → Text Editors → Spelling</strong></li>
<li>uncheck <strong>Enable spell checking</strong></li>
</ul>
</li>
<li>Disable Quick Diff
<ul>
<li>in <strong>General → Editors → Text Editors → Quick Diff</strong></li>
<li>uncheck <strong>Enable quick diff</strong></li>
</ul>
</li>
<li>Disable indexing of files not included in the build
<ul>
<li>in <strong>Preferences → C/C++ → Indexer</strong></li>
<li>uncheck <strong>Index source files not included in the build</strong></li>
</ul>
</li>
<li>Mark occurences
<ul>
<li>in <strong>Preferences → C/C++ → Editor</strong></li>
<li>uncheck <strong>Keep marks when the selection changes</strong></li>
</ul>
</li>
<li>Don’t load UI Responsiveness Monitoring Plug-in on startup
<ul>
<li>in <strong>General → Startup and Shutdown</strong></li>
<li>uncheck <strong>UI Responsiveness Monitoring</strong></li>
</ul>
</li>
<li>Menlo font (Mac OS X only)
<ul>
<li>in <strong>General → Appearance → Colors and Fonts</strong></li>
<li>expand <strong>Basic</strong></li>
<li>select <strong>Text Font</strong></li>
<li>hit <em>Edit…</em> and select <strong>Menlo</strong></li>
</ul>
</li>
<li>Make scrollbars visible always (Mac OS X only)
<ul>
<li>in your shell startup script, add: <code class="highlighter-rouge">defaults write -app Eclipse AppleShowScrollBars Always</code></li>
<li>restart Eclipse</li>
<li>this improves scrolling performance related to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=366471">a 5+ year old bug in Eclipse</a></li>
</ul>
</li>
</ul>James WrightInstructions to setup a minimal GNU ARM Eclipse installation on Mac OS X (macOS) or LinuxModern Makefile for Mixed Assembly, C, and C++ Projects2016-07-01T00:00:00-04:002016-07-01T00:00:00-04:00https://james919.github.io/basic-makefile-autodependencies<p>This is a Makefile suitable for mixed Assembly, C, and C++ projects that uses build rules and GCC’s autodependency feature. By passing in command line arguments, this makefile will build a Release or Debug binary.</p>
<p>See the section at the bottom of the listing, titled <code class="highlighter-rouge">Defaults</code>, for other options.</p>
<div class="language-makefile highlighter-rouge"><pre class="highlight"><code>
<span class="c">###############################################################################
# Basic Makefile
###############################################################################
</span>
<span class="c"># Use Bash sdf
</span><span class="nv">SHELL</span> <span class="o">=</span> /bin/sh
<span class="c"># Functions
</span><span class="nv">find_includes_in_dir</span> <span class="o">=</span> <span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="o">(</span>1<span class="nv">)</span> -name <span class="s2">"*.h"</span> | sed <span class="s1">'s|/[^/]*$$||'</span> | sort -u<span class="nv">)</span>
<span class="c"># ---------------------------------------------------------------------
# Toolchain Configuration
# ---------------------------------------------------------------------
</span><span class="nv">C_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu11
<span class="nv">CXX_STANDARD</span> <span class="o">:=</span> -std<span class="o">=</span>gnu++11
<span class="c"># -----------------------------------------------------------------------------------------------------------------
# Defined Symbols
# -----------------------------------------------------------------------------------------------------------------
</span><span class="nv">DEFS</span> <span class="o">:=</span>
<span class="c"># ---------------------------------------------------------------------------------------------------------------------------------------
# Compiler & Linker Flags
# ---------------------------------------------------------------------------------------------------------------------------------------
# Flags sent to all tools in the Toolchain
</span><span class="nv">TOOLCHAIN_SETTINGS</span> <span class="o">:=</span> -fmessage-length<span class="o">=</span>0
<span class="c"># C Compiler -- Warnings
</span><span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span> <span class="err">$</span><span class="o">(</span>addprefix -I, <span class="nv">$(INC_DIRS)</span><span class="o">)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wall
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wextra
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfatal-errors
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wpacked
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Winline
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wconversion
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wpointer-arith
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wdisabled-optimization
<span class="nv">CFLAGS</span> <span class="o">+=</span> -Wno-unused-parameter
<span class="c"># C++ Compiler -- Required & Optimization Flags
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> <span class="nv">$(CFLAGS)</span>
<span class="c"># C++ -- Warnings
</span><span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Weffc++
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wfloat-equal
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wsign-promo
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wmissing-declarations
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Woverloaded-virtual
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wmissing-format-attribute
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wold-style-cast
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wshadow
<span class="nv">CXXFLAGS</span> <span class="o">+=</span> -Wctor-dtor-privacy
<span class="c"># Linker
</span><span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="nv">$(TOOLCHAIN_SETTINGS)</span> <span class="nv">$(DEFS)</span>
<span class="c"># -------------------------------------------------------------
# Build Type Modifiers
# -------------------------------------------------------------
# Debug
</span><span class="nv">DEFS_DEBUG</span> <span class="o">:=</span> -DDEBUG
<span class="nv">CFLAGS_DEBUG</span> <span class="o">:=</span> -ggdb -g3 -Og
<span class="c"># Release
</span><span class="nv">CFLAGS_RELEASE</span> <span class="o">:=</span> -O3
<span class="c">#########################################################################################################################################
# RULE DEFINITIONS -- This section is generic
#########################################################################################################################################
</span>
<span class="c"># =======================================================================================================================================
# Build Configuration Rule
# - Generate build config using Product Root Directory ($1), Build Type ("Debug" or "Release") ($2)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">CONFIG_RULE</span>
<span class="nv">BUILD_DIR</span> <span class="o">:=</span> <span class="nv">$1</span>/Build/<span class="nv">$2</span>
<span class="nv">OBJ_DIR</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span>/obj
<span class="nv">INC_DIRS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>call find_includes_in_dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span><span class="o">)</span>
<span class="nv">HEADERS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.h"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">ASM_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.s"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">C_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.c"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">CXX_SRC</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.cpp"</span><span class="nv">)</span><span class="o">)</span>
<span class="nv">OBJECTS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>addprefix <span class="err">$</span><span class="nv">$(OBJ_DIR)</span>/, <span class="err">$$</span><span class="o">(</span>C_SRC:.c<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>CXX_SRC:.cpp<span class="o">=</span>.o<span class="o">)</span> <span class="err">$$</span><span class="o">(</span>ASM_SRC:.s<span class="o">=</span>.o<span class="o">))</span>
<span class="nv">LDSCRIPTS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>addprefix -T, <span class="err">$$</span><span class="o">(</span>foreach dir, <span class="err">$</span><span class="nv">$(SRC_DIRS)</span>, <span class="err">$</span><span class="nf">$(</span><span class="nb">shell</span> find <span class="err">$</span><span class="nv">$(dir)</span> -name <span class="s2">"*.ld"</span><span class="nv">)</span><span class="o">))</span>
<span class="nv">DIRS</span> <span class="o">:=</span> <span class="err">$</span><span class="nv">$(BUILD_DIR)</span> <span class="err">$$</span><span class="o">(</span>sort <span class="err">$$</span><span class="o">(</span>dir <span class="err">$</span><span class="nv">$(OBJECTS)</span><span class="o">))</span>
<span class="nv">AUTODEPS</span> <span class="o">:=</span> <span class="err">$$</span><span class="o">(</span>OBJECTS:.o<span class="o">=</span>.d<span class="o">)</span>
<span class="err">ifeq</span> <span class="err">($2,</span> <span class="err">Release)</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_RELEASE)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_RELEASE)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_RELEASE)</span>
<span class="err">else</span>
<span class="nv">DEFS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(DEFS_DEBUG)</span>
<span class="nv">CFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(CFLAGS_DEBUG)</span>
<span class="nv">LDFLAGS</span> <span class="o">+=</span> <span class="err">$</span><span class="nv">$(LDFLAGS_DEBUG)</span>
<span class="err">endif</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End CONFIG_RULE
# =======================================================================================================================================
</span>
<span class="c"># =======================================================================================================================================
# Build Target Rule
# - Generate build config using Product Name ($1), Product Root Directory ($2), Build Type ("Debug" or "Release") ($3)
# =======================================================================================================================================
</span><span class="err">define</span> <span class="err">BUILD_TARGET_RULE</span>
<span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">CONFIG_RULE,$2,$3))</span>
<span class="nl">all </span><span class="o">:</span> <span class="nf">$$(BUILD_DIR)/$1</span>
<span class="c"># Tool Invocations
</span><span class="nl">$$(BUILD_DIR)/$1 </span><span class="o">:</span> <span class="nf">$$(OBJECTS) | $$(BUILD_DIR)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Building $$(@)'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Invoking: C++ Linker'</span>
<span class="err">$</span><span class="nv">$(CXX)</span> <span class="err">$</span><span class="nv">$(LDFLAGS)</span> <span class="err">$</span><span class="nv">$(LDSCRIPTS)</span> -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span> <span class="err">$</span><span class="nv">$(OBJECTS)</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">'Finished building: $$@'</span>
<span class="p">@</span><span class="nb">echo</span> <span class="s1">' '</span>
<span class="nl">$$(OBJECTS) </span><span class="o">:</span> <span class="nf">| $$(DIRS)</span>
<span class="nl">$$(DIRS) </span><span class="o">:</span>
<span class="p">@</span><span class="nb">echo </span>Creating <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="p">@</span>mkdir -p <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.c</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CC)</span> <span class="err">$</span><span class="nv">$(C_STANDARD)</span> <span class="err">$</span><span class="nv">$(CFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.cpp</span>
<span class="p">@</span><span class="nb">echo </span>Compiling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(CXX)</span> <span class="err">$</span><span class="nv">$(CXX_STANDARD)</span> <span class="err">$</span><span class="nv">$(CXXFLAGS)</span> -c -MMD -MP <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">$$(OBJ_DIR)/%.o </span><span class="o">:</span> <span class="nf">%.s</span>
<span class="p">@</span><span class="nb">echo </span>Assembling <span class="err">$$</span><span class="o">(</span><F<span class="o">)</span>
<span class="p">@</span><span class="err">$</span><span class="nv">$(AS)</span> <span class="err">$</span><span class="nv">$(ASFLAGS)</span> <span class="nv">$$</span>< -o <span class="err">$$</span><span class="o">(</span>@<span class="o">)</span>
<span class="nl">clean </span><span class="o">:</span>
<span class="p">@</span>rm -rf <span class="err">$</span><span class="nv">$(PRODUCT_DIR)</span>/Build
<span class="nl">.PHONY </span><span class="o">:</span> <span class="nf">clean all</span>
<span class="c"># include by auto dependencies
</span><span class="err">-include</span> <span class="err">$$(AUTODEPS)</span>
<span class="err">endef</span>
<span class="c"># =======================================================================================================================================
# End BUILD_TARGET_RULE
# =======================================================================================================================================
#########################################################################################################################################
#########################################################################################################################################
</span>
<span class="c"># Build Type
</span><span class="err">ifeq</span> <span class="err">($(build),</span> <span class="err">Debug)</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Debug
<span class="err">else</span>
<span class="nv">BUILD_TYPE</span> <span class="o">:=</span> Release
<span class="err">endif</span>
<span class="c"># Defaults
</span><span class="nv">PRODUCT</span> <span class="o">?=</span> hello
<span class="nv">PRODUCT_DIR</span> <span class="o">?=</span> project
<span class="nv">BUILD_TYPE</span> <span class="o">?=</span> Debug
<span class="nv">SRC_DIRS</span> <span class="o">?=</span> <span class="nv">$(PRODUCT_DIR)</span>
<span class="c"># Evaluate Rules Defined Above
</span><span class="err">$(eval</span> <span class="err">$(call</span> <span class="err">BUILD_TARGET_RULE,$(PRODUCT),$(PRODUCT_DIR),$(BUILD_TYPE)))</span>
</code></pre>
</div>James WrightThis is a Makefile suitable for mixed Assembly, C, and C++ projects that uses build rules and GCC's autodependency feature.Swift Tuples vs Structs2014-12-10T00:00:00-05:002014-12-10T00:00:00-05:00https://james919.github.io/swift-tuples-vs-structs<p><a href="http://stackoverflow.com/a/27386550/919790">Answer</a> to a StackOverflow <a href="http://stackoverflow.com/q/27384151/919790">question</a> concerning the differences between tuples and structs.</p>
<p><strong>Similarities Between Tuples and Structs</strong></p>
<ul>
<li>Both may have any number of members of any type, including closures</li>
<li>Both can be constructed inline (see <code class="highlighter-rouge">typealias</code> in the code below)</li>
<li>Both prevent mutation of any members if declared as constants</li>
<li>If a tuple has labeled members, both structs and tuples allow member access by label</li>
</ul>
<p><strong>Differences Between Tuples and Structs</strong></p>
<ul>
<li>Structs require a definition before use</li>
<li>Structs do not allow pattern matching against their members</li>
<li>Structs allow mutability of members declared as variables if the instance is a variable</li>
<li>Tuples do not allow mutating functions or functions that refer to any of its members</li>
<li>Tuples may not implement Protocols</li>
<li>If a tuple has anonymous members, its members can be accessed by index, unlike structs</li>
</ul>
<p><strong>Some code for a playground illustrating these differences and similarities</strong></p>
<div class="language-swift highlighter-rouge"><pre class="highlight"><code><span class="c1">// All commented code causes a compilation error. Uncomment to view error messages.</span>
<span class="kd">struct</span> <span class="kt">StructureX</span> <span class="p">{</span>
<span class="k">let</span> <span class="nv">a</span><span class="p">:</span> <span class="kt">Int</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="s">"string"</span>
<span class="p">}</span>
<span class="c1">//</span>
<span class="c1">// Struct member variability</span>
<span class="c1">//</span>
<span class="k">var</span> <span class="nv">structureA</span><span class="p">:</span> <span class="kt">StructureX</span> <span class="o">=</span> <span class="kt">StructureX</span><span class="p">()</span>
<span class="k">let</span> <span class="nv">structureB</span><span class="p">:</span> <span class="kt">StructureX</span> <span class="o">=</span> <span class="kt">StructureX</span><span class="p">()</span>
<span class="c1">//structureA.a = 2 // declared as a constant, instance is variable</span>
<span class="n">structureA</span><span class="o">.</span><span class="n">b</span> <span class="o">=</span> <span class="s">"allowed"</span> <span class="c1">// declared as a variable, instance is variable</span>
<span class="c1">//structureB.a = 2 // declared as constant, instance is constant</span>
<span class="c1">//structureB.b = "not allowed" // declared as constant, instance is constant</span>
<span class="n">structureA</span> <span class="o">=</span> <span class="n">structureB</span> <span class="c1">// these are the same type</span>
<span class="n">structureA</span>
<span class="c1">//</span>
<span class="c1">// Typealias a labeled tuple and it can be constructed similarly to a struct</span>
<span class="c1">//</span>
<span class="kd">typealias</span> <span class="kt">StructureT</span> <span class="o">=</span> <span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">structureD</span><span class="p">:</span> <span class="kt">StructureT</span> <span class="o">=</span> <span class="kt">StructureT</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="s">"asdf"</span><span class="p">)</span>
<span class="n">structureD</span>
<span class="k">var</span> <span class="nv">structureE</span><span class="p">:</span> <span class="kt">StructureX</span> <span class="o">=</span> <span class="kt">StructureX</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="s">"asdf"</span><span class="p">)</span>
<span class="c1">//structureD = structureA // but they are distinct types</span>
<span class="k">let</span> <span class="nv">emptyTuple</span><span class="p">:</span> <span class="p">()</span> <span class="o">=</span> <span class="p">()</span> <span class="c1">// philosophically, isn't this the definition of Void?</span>
<span class="k">let</span> <span class="nv">single</span><span class="p">:</span> <span class="p">(</span><span class="kt">Int</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">23</span><span class="p">)</span>
<span class="c1">//let namedSingle: (a: Int) = (a: 42)</span>
<span class="c1">//</span>
<span class="c1">// Tuple Labeled Member Access</span>
<span class="c1">//</span>
<span class="k">var</span> <span class="nv">labeledTupleA</span><span class="p">:</span> <span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="s">"string"</span><span class="p">)</span>
<span class="n">labeledTupleA</span><span class="o">.</span><span class="mi">0</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">labeledTupleA</span><span class="o">.</span><span class="n">a</span>
<span class="n">labeledTupleA</span>
<span class="k">var</span> <span class="nv">check</span><span class="p">:</span> <span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span>
<span class="n">check</span> <span class="o">=</span> <span class="n">labeledTupleA</span> <span class="c1">// same type</span>
<span class="n">check</span>
<span class="c1">//</span>
<span class="c1">// Tuples can have functions/closures</span>
<span class="c1">//</span>
<span class="k">let</span> <span class="nv">labeledTupleB</span><span class="p">:</span> <span class="p">(</span><span class="kt">Int</span><span class="p">,</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">fun</span><span class="p">:</span> <span class="p">()</span> <span class="o">-></span> <span class="kt">Void</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"string"</span><span class="p">,</span> <span class="p">{</span> <span class="p">()</span> <span class="o">-></span> <span class="kt">Void</span> <span class="k">in</span>
<span class="nf">println</span><span class="p">(</span><span class="s">"hi"</span><span class="p">)</span>
<span class="p">})</span>
<span class="n">labeledTupleB</span><span class="o">.</span><span class="mi">1</span>
<span class="n">labeledTupleB</span><span class="o">.</span><span class="nf">fun</span><span class="p">()</span>
<span class="c1">//labeledTupleB.0 = 10 // this tuple is a constant, so all of its members are constant</span>
<span class="c1">//</span>
<span class="c1">// Tuples with members of the same type, but differet labels are not of the same type</span>
<span class="c1">//</span>
<span class="k">var</span> <span class="nv">labeledTupleC</span><span class="p">:</span> <span class="p">(</span><span class="nv">c</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">d</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="nv">c</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nv">d</span><span class="p">:</span> <span class="s">"fail"</span><span class="p">)</span>
<span class="c1">//labeledTupleC = labeledTupleA</span>
<span class="c1">//labeledTupleC = labeledTupleB</span>
<span class="c1">//</span>
<span class="c1">// Tuples with anonymous members matching the type pattern of a labeled member tuple are of equivalent type</span>
<span class="c1">//</span>
<span class="k">var</span> <span class="nv">unlabeledTuple</span><span class="p">:</span> <span class="p">(</span><span class="kt">Int</span><span class="p">,</span> <span class="kt">String</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"good"</span><span class="p">)</span>
<span class="n">unlabeledTuple</span> <span class="o">=</span> <span class="n">labeledTupleA</span>
<span class="n">unlabeledTuple</span> <span class="o">=</span> <span class="n">labeledTupleC</span>
<span class="c1">//</span>
<span class="c1">// Tuples with closures may not refer to sibling members</span>
<span class="c1">//</span>
<span class="k">var</span> <span class="nv">labeledTupleD</span><span class="p">:</span> <span class="p">(</span><span class="nv">de</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">df</span><span class="p">:</span> <span class="p">(</span><span class="kt">Int</span><span class="p">)</span> <span class="o">-></span> <span class="kt">Void</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="nv">de</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">df</span><span class="p">:</span> <span class="p">{</span> <span class="p">(</span><span class="nv">num</span><span class="p">:</span> <span class="kt">Int</span><span class="p">)</span> <span class="o">-></span> <span class="kt">Void</span> <span class="k">in</span>
<span class="c1">//de += num</span>
<span class="c1">//self.de += num</span>
<span class="nf">println</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<span class="p">})</span>
<span class="n">labeledTupleD</span><span class="o">.</span><span class="n">de</span>
<span class="n">labeledTupleD</span><span class="o">.</span><span class="nf">df</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="c1">//</span>
<span class="c1">// Tuples allow pattern matching, Structs do not</span>
<span class="c1">//</span>
<span class="c1">//switch structureA {</span>
<span class="c1">//case (let i, let s):</span>
<span class="c1">// print(i, s)</span>
<span class="c1">//default:</span>
<span class="c1">// break</span>
<span class="c1">//}</span>
<span class="k">switch</span> <span class="n">labeledTupleD</span> <span class="p">{</span>
<span class="k">case</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="k">let</span> <span class="nv">closure</span><span class="p">):</span>
<span class="nf">closure</span><span class="p">(</span><span class="mi">123</span><span class="p">)</span>
<span class="k">default</span><span class="p">:</span>
<span class="k">break</span>
<span class="p">}</span>
</code></pre>
</div>James WrightAnswer to a StackOverflow question concerning the differences between tuples and structs.Swift Logging Library2014-11-06T00:00:00-05:002014-11-06T00:00:00-05:00https://james919.github.io/swift-logging<p>From the README:
> Go from this:
>
> <code class="highlighter-rouge">Simple message</code>
>
> to this:
>
> <code class="highlighter-rouge">2014-06-09 06:44:43.600 [Debug] [AppDelegate.swift:40] application(_:didFinishLaunchingWithOptions:): Simple message</code></p>
<p><a href="https://github.com/DaveWoodCom/XCGLogger">GitHub Repo</a></p>
<p><a href="http://www.cerebralgardens.com/blog/entry/2014/06/09/the-first-essential-swift-3rd-party-library-to-include-in-your-project">Author’s Introduction</a></p>James WrightFrom the README:
> Go from this:
>
> Simple message
>
> to this:
>
> 2014-06-09 06:44:43.600 [Debug] [AppDelegate.swift:40] application(_:didFinishLaunchingWithOptions:): Simple messagePreview any plain text file using OS X QuickLook2014-10-29T00:00:00-04:002014-10-29T00:00:00-04:00https://james919.github.io/plain-text-quicklook<p>Use QuickLook to view any plain text, with or without an extension.</p>
<h3 id="qlstephen-plugin">QLStephen Plugin</h3>
<ul>
<li>
<p>Download the QLStephen plugin: <a href="https://github.com/whomwah/qlstephen/releases">Latest Release</a></p>
</li>
<li>
<p>Copy QLStephen.qlgenerator to <code class="highlighter-rouge">/Library/QuickLook/</code></p>
</li>
</ul>
<h3 id="enable-selection-in-finder">Enable Selection in Finder</h3>
<p><code class="highlighter-rouge">defaults write com.apple.finder QLEnableTextSelection -bool TRUE; qlmanage -r</code></p>
<h3 id="enable-selection-in-all-apps">Enable Selection in All Apps</h3>
<p><code class="highlighter-rouge">defaults write -g QLEnableTextSelection -bool TRUE; qlmanage -r</code></p>
<h3 id="quicklook-keyboard-shortcut">QuickLook keyboard shortcut</h3>
<p><code class="highlighter-rouge">⌘Y</code></p>
<p><br />
<em>Known to work on OS X Yosemite</em></p>
<p>Sources: <a href="https://coderwall.com/p/dlithw">QuickLook</a>, <a href="http://www.macworld.com/article/1164668/select_and_copy_text_within_quick_look_previews.html">Selection</a></p>James WrightUse QuickLook to view any plain text, with or without an extension.Native OS X Rest Client2014-10-29T00:00:00-04:002014-10-29T00:00:00-04:00https://james919.github.io/native-osx-rest-client<p>From the README:
> CocoaRestClient is a Mac OS X app for testing HTTP/Restful endpoints.</p>
<p><a href="https://github.com/mmattozzi/cocoa-rest-client">GitHub Repo</a></p>
<p><a href="https://github.com/mmattozzi/cocoa-rest-client/releases">Latest Release</a></p>
<p><a href="http://stackoverflow.com/a/14913780/919790">Source</a></p>James WrightFrom the README:
> CocoaRestClient is a Mac OS X app for testing HTTP/Restful endpoints.