Add cmake functions for adding binaries and tests.

Change-Id: Ib93cd5d087d4018d8c7d947d3d10e1f031d8e590
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c4b0d6a..cd80428 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,13 @@
 
-cmake_minimum_required (VERSION 3.1)
+cmake_minimum_required (VERSION 3.10)
 
 set(CMAKE_C_ABI_COMPILED ON)
 set(CMAKE_CXX_ABI_COMPILED ON)
 
 set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/riscv_baremetal.cmake")
+list(APPEND CMAKE_MODULE_PATH
+  ${CMAKE_CURRENT_LIST_DIR}/cmake/
+)
 
 project(springbok_project)
 
@@ -19,13 +22,18 @@
 
 set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/springbok/matcha.ld")
 
+include(vec_cc_binary)
+include(vec_cc_test)
+
 add_subdirectory(springbok)
 add_subdirectory(hello_vec)
+
 add_subdirectory(vector_tests)
-add_subdirectory(vector_load_tests)
+add_subdirectory(vector_load_store_tests)
 add_subdirectory(vector_vadd_vsub_tests)
 add_subdirectory(vector_executive)
 add_subdirectory(vector_vset_tests)
+
 add_subdirectory(pw_unit_test_demo)
 
 add_subdirectory(test_vsetvl)
diff --git a/cmake/riscv_baremetal.cmake b/cmake/riscv_baremetal.cmake
index 62e6c5a..9c8b93b 100644
--- a/cmake/riscv_baremetal.cmake
+++ b/cmake/riscv_baremetal.cmake
@@ -40,3 +40,16 @@
 set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" )
 set( CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" )
 set( CMAKE_EXE_LINKER_FLAGS   "${CMAKE_EXE_LINKER_FLAGS}  -nostartfiles   " )
+set( VEC_DEFAULT_COPTS
+    "-Wall"
+    "-Werror"
+    "-O0"
+    "-g3"
+    "-ggdb"
+    "-ffreestanding"
+    "-ffunction-sections"
+    "-fstack-usage"
+    "-mstrict-align"
+)
+
+set( VEC_DEFAULT_LINKOPTS -specs=nano.specs -Wl,--gc-sections -Wl,--print-memory-usage -Wl,-Map=${PROJECT_NAME}.map)
\ No newline at end of file
diff --git a/cmake/vec_cc_binary.cmake b/cmake/vec_cc_binary.cmake
new file mode 100644
index 0000000..97fd63c
--- /dev/null
+++ b/cmake/vec_cc_binary.cmake
@@ -0,0 +1,40 @@
+function(vec_cc_binary)
+  cmake_parse_arguments(
+    _RULE
+    ""
+    "NAME"
+    "SRCS;COPTS;DEFINES;LINKOPTS;DATA;DEPS;LABELS"
+    ${ARGN}
+  )
+
+set(_NAME "${_RULE_NAME}")
+project(${_RULE_NAME})
+set (CMAKE_CXX_STANDARD 17)
+
+set(_ELF_NAME "${_RULE_NAME}.elf")
+add_executable(${_ELF_NAME})
+target_include_directories(${_ELF_NAME} PUBLIC include)
+set_target_properties(${_ELF_NAME} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
+
+target_sources(${_ELF_NAME}
+    PRIVATE
+      ${_RULE_SRCS}
+)
+
+target_link_libraries(${_ELF_NAME}
+    PUBLIC
+      ${_RULE_DEPS}
+)
+
+target_compile_options(${_ELF_NAME}
+    PUBLIC
+        ${VEC_DEFAULT_COPTS}
+        ${_RULE_COPTS}
+)
+
+target_link_options(${_ELF_NAME}
+    PUBLIC
+      ${_RULE_LINKOPTS}
+      ${VEC_DEFAULT_LINKOPTS}
+)
+endfunction()
diff --git a/cmake/vec_cc_test.cmake b/cmake/vec_cc_test.cmake
new file mode 100644
index 0000000..ff355ba
--- /dev/null
+++ b/cmake/vec_cc_test.cmake
@@ -0,0 +1,28 @@
+function(vec_cc_test)
+  cmake_parse_arguments(
+    _RULE
+    ""
+    "NAME"
+    "SRCS;COPTS;DEFINES;LINKOPTS;DATA;DEPS;LABELS"
+    ${ARGN}
+  )
+
+set(_NAME "${_RULE_NAME}")
+project(${_RULE_NAME})
+set (CMAKE_CXX_STANDARD 17)
+
+vec_cc_binary(
+  NAME
+    ${_RULE_NAME}
+  SRCS
+    ${_RULE_SRCS}
+  DEPS
+      pw_unit_test
+      pw_unit_test.main
+      pw_assert_basic
+      ${_RULE_DEPS}
+  LINKOPTS
+    ${_RULE_LINKOPTS}
+)
+
+endfunction()
diff --git a/hello_vec/CMakeLists.txt b/hello_vec/CMakeLists.txt
index 59efb80..4f84c45 100644
--- a/hello_vec/CMakeLists.txt
+++ b/hello_vec/CMakeLists.txt
@@ -1,35 +1,10 @@
-cmake_minimum_required(VERSION 3.10)
-
-project(hello_vec)
-
-set(TARGET hello_vec)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} main.cpp)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-target_link_libraries(${ELF} springbok)
-
-set_target_properties(
-	${ELF}
-	PROPERTIES
-	LINK_FLAGS
-     "-specs=nano.specs \
-    -Wl,--gc-sections \
-    -Wl,--print-memory-usage \
-    -Wl,-Map=${PROJECT_NAME}.map \
-    -T${LINKER_SCRIPT}")
-
-target_compile_options(${ELF} PUBLIC
-    -Wall
-    -Werror
-    -O3
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+vec_cc_binary(
+    NAME
+      hello_vec
+    SRCS
+      main.cpp
+  DEPS
+    springbok
+  LINKOPTS
+    -T${LINKER_SCRIPT}
+)
\ No newline at end of file
diff --git a/pw_unit_test_demo/CMakeLists.txt b/pw_unit_test_demo/CMakeLists.txt
index 3bfaee0..b690644 100644
--- a/pw_unit_test_demo/CMakeLists.txt
+++ b/pw_unit_test_demo/CMakeLists.txt
@@ -1,42 +1,12 @@
-cmake_minimum_required(VERSION 3.10)
 
-project(pw_unit_test_demo)
-set (CMAKE_CXX_STANDARD 17)
-
-set(TARGET pw_unit_test_demo)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} ${TARGET}.cpp)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-
-target_link_libraries(${ELF} springbok)
-target_link_libraries(${ELF} pw_unit_test)
-target_link_libraries(${ELF} pw_unit_test.main)
-target_link_libraries(${ELF} pw_assert_basic)
-
-
-set_target_properties(
-    ${ELF}
-    PROPERTIES
-    LINK_FLAGS
-     "-specs=nano.specs \
-    -Wl,--gc-sections \
-    -Wl,--print-memory-usage \
-    -Wl,-Map=${PROJECT_NAME}.map \
-    -T${LINKER_SCRIPT} \
-    -Xlinker --defsym=__itcm_length__=256K")
-
-target_compile_options(${ELF} PUBLIC
-    -Wall
-    -Werror
-    -O3
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+vec_cc_test(
+  NAME
+    pw_unit_test_demo
+  SRCS
+    pw_unit_test_demo.cpp
+  DEPS
+    springbok
+  LINKOPTS
+   -T${LINKER_SCRIPT}
+   -Xlinker --defsym=__itcm_length__=128K
+)
diff --git a/springbok/CMakeLists.txt b/springbok/CMakeLists.txt
index 41acb68..0ba73f6 100644
--- a/springbok/CMakeLists.txt
+++ b/springbok/CMakeLists.txt
@@ -1,34 +1,29 @@
-cmake_minimum_required(VERSION 3.1)
 
 enable_language(ASM)
 
 add_library(springbok INTERFACE)
 add_library(springbok_intrinsic STATIC)
-target_sources(springbok_intrinsic PRIVATE
-    crt0.s
-    springbok_gloss.cpp)
+target_sources(springbok_intrinsic
+    PRIVATE
+      crt0.s
+      springbok_gloss.cpp
+)
 
 target_include_directories(springbok_intrinsic PUBLIC include)
 
 target_link_libraries(springbok
 INTERFACE
-    springbok_intrinsic
+  springbok_intrinsic
 )
 
 target_include_directories(springbok INTERFACE include)
 
-target_compile_options(springbok_intrinsic PUBLIC
-    -Wall
-    -Werror
-    -Os
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+target_compile_options(springbok_intrinsic
+    PUBLIC
+      ${VEC_DEFAULT_COPTS}
+)
 
 target_link_options(springbok
-INTERFACE
--Wl,--whole-archive ${CMAKE_CURRENT_BINARY_DIR}/libspringbok_intrinsic.a -Wl,--no-whole-archive
+    INTERFACE
+      -Wl,--whole-archive ${CMAKE_CURRENT_BINARY_DIR}/libspringbok_intrinsic.a -Wl,--no-whole-archive
 )
diff --git a/test_vsetvl/CMakeLists.txt b/test_vsetvl/CMakeLists.txt
index cd7a075..3e062f7 100644
--- a/test_vsetvl/CMakeLists.txt
+++ b/test_vsetvl/CMakeLists.txt
@@ -1,42 +1,12 @@
-cmake_minimum_required(VERSION 3.10)
 
-project(test_vsetvl)
-set (CMAKE_CXX_STANDARD 17)
-
-set(TARGET test_vsetvl)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} ${TARGET}.cpp)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-
-target_link_libraries(${ELF} springbok)
-target_link_libraries(${ELF} pw_unit_test)
-target_link_libraries(${ELF} pw_unit_test.main)
-target_link_libraries(${ELF} pw_assert_basic)
-
-
-set_target_properties(
-    ${ELF}
-    PROPERTIES
-    LINK_FLAGS
-     "-specs=nano.specs \
-    -Wl,--gc-sections \
-    -Wl,--print-memory-usage \
-    -Wl,-Map=${PROJECT_NAME}.map \
-    -T${LINKER_SCRIPT} \
-    -Xlinker --defsym=__itcm_length__=256K")
-
-target_compile_options(${ELF} PUBLIC
-    -Wall
-    -Werror
-    -O3
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+vec_cc_test(
+  NAME
+    test_vsetvl
+  SRCS
+    test_vsetvl.cpp
+  DEPS
+    springbok
+  LINKOPTS
+   -T${LINKER_SCRIPT}
+   -Xlinker --defsym=__itcm_length__=256K
+)
diff --git a/test_vsetvl/test_vsetvl.cpp b/test_vsetvl/test_vsetvl.cpp
index 8eb5912..ad5911e 100644
--- a/test_vsetvl/test_vsetvl.cpp
+++ b/test_vsetvl/test_vsetvl.cpp
@@ -1,5 +1,5 @@
 #include <riscv_vector.h>
-#include <springbok_intrinsics.h>
+#include <springbok.h>
 #include <stdio.h>
 #include <stdlib.h>
 
diff --git a/vector_executive/CMakeLists.txt b/vector_executive/CMakeLists.txt
index 1f762cc..4c9d003 100644
--- a/vector_executive/CMakeLists.txt
+++ b/vector_executive/CMakeLists.txt
@@ -1,33 +1,12 @@
-cmake_minimum_required(VERSION 3.10)
 
-project(vector_executive)
-
-set(TARGET vector_executive)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} ${TARGET}.c)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-target_link_libraries(${ELF} springbok)
-
-set_target_properties(
-	${ELF}
-	PROPERTIES
-	LINK_FLAGS
-     "-specs=nano.specs \
-    -Wl,--gc-sections \
-    -Wl,--print-memory-usage \
-    -Wl,-Map=${PROJECT_NAME}.map \
-    -T${LINKER_SCRIPT}")
-
-target_compile_options(${ELF} PUBLIC
-    -Wall
-    -Werror
-    -O3
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+vec_cc_binary(
+    NAME
+      vector_executive
+    SRCS
+      vector_executive.c
+  DEPS
+    springbok
+  LINKOPTS
+    -T${LINKER_SCRIPT}
+    -Xlinker --defsym=__itcm_length__=128K
+)
\ No newline at end of file
diff --git a/vector_load_store_tests/CMakeLists.txt b/vector_load_store_tests/CMakeLists.txt
new file mode 100644
index 0000000..359d042
--- /dev/null
+++ b/vector_load_store_tests/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+vec_cc_binary(
+    NAME
+      vector_load_store_tests
+    SRCS
+      vector_load_store_tests.c
+  DEPS
+    springbok
+    vector_tests
+  LINKOPTS
+    -T${LINKER_SCRIPT}
+    -Xlinker --defsym=__itcm_length__=128K
+)
diff --git a/vector_load_tests/include/vector_load_store_tests.h b/vector_load_store_tests/include/vector_load_store_tests.h
similarity index 100%
rename from vector_load_tests/include/vector_load_store_tests.h
rename to vector_load_store_tests/include/vector_load_store_tests.h
diff --git a/vector_load_tests/vector_load_store_tests.c b/vector_load_store_tests/vector_load_store_tests.c
similarity index 100%
rename from vector_load_tests/vector_load_store_tests.c
rename to vector_load_store_tests/vector_load_store_tests.c
diff --git a/vector_load_tests/CMakeLists.txt b/vector_load_tests/CMakeLists.txt
deleted file mode 100644
index 7d13871..0000000
--- a/vector_load_tests/CMakeLists.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-cmake_minimum_required(VERSION 3.10)
-
-project(vector_load_tests)
-
-
-set(TARGET vector_load_tests)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} vector_load_store_tests.c)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-target_link_libraries(${ELF} vector_tests)
-
-set_target_properties(
-	${ELF}
-	PROPERTIES
-	LINK_FLAGS
-	"-T${LINKER_SCRIPT} \
-	 -specs=nano.specs \
-	 -Wl,--gc-sections \
-	 -Wl,--print-memory-usage \
-	 -Wl,-Map=${PROJECT_NAME}.map")
-
-target_compile_options(${ELF} PUBLIC
-	-nostdlib
-	-ffreestanding
-	-ffunction-sections
-	-Wall
-	-Werror
-	-O3
-	-g)
-
diff --git a/vector_tests/CMakeLists.txt b/vector_tests/CMakeLists.txt
index d7f6bc1..e939871 100644
--- a/vector_tests/CMakeLists.txt
+++ b/vector_tests/CMakeLists.txt
@@ -1,4 +1,3 @@
-cmake_minimum_required(VERSION 3.1)
 
 enable_language(ASM)
 add_library(vector_tests
@@ -10,12 +9,5 @@
 target_link_libraries(vector_tests springbok)
 
 target_compile_options(vector_tests PUBLIC
-    -Wall
-    -Werror
-    -O3
-    -g3
-    -ggdb
-    -ffreestanding
-    -ffunction-sections
-    -fstack-usage
-    -mstrict-align)
+      ${VEC_DEFAULT_COPTS}
+)
diff --git a/vector_vadd_vsub_tests/CMakeLists.txt b/vector_vadd_vsub_tests/CMakeLists.txt
index 008773a..dc52f7a 100644
--- a/vector_vadd_vsub_tests/CMakeLists.txt
+++ b/vector_vadd_vsub_tests/CMakeLists.txt
@@ -1,42 +1,20 @@
-cmake_minimum_required(VERSION 3.10)
 
 set (OPERAND_TYPES VV VX VI)
 
 foreach(OPERAND_TYPE ${OPERAND_TYPES})
-project(vector_vadd_vsub_tests_${OPERAND_TYPE})
-
-string(TOLOWER ${OPERAND_TYPE} OP_SUFFIX)
-
-set(TARGET vector_vadd_vsub_tests_${OP_SUFFIX})
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} vector_vadd_vsub_tests.c)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-target_link_libraries(${ELF} vector_tests)
-
-set_target_properties(
-	${ELF}
-	PROPERTIES
-	LINK_FLAGS
-	"-T${LINKER_SCRIPT} \
-	 -specs=nano.specs \
-	 -Wl,--gc-sections \
-	 -Wl,--print-memory-usage \
-	 -Wl,-Map=${PROJECT_NAME}.map")
-
-target_compile_options(${ELF} PUBLIC
-	-nostdlib
-	-ffreestanding
-	-ffunction-sections
-	-Wall
-	-Werror
-    -Wno-unused-value
-	-O3
-	-g
-    -D=TEST_${OPERAND_TYPE})
-
+vec_cc_binary(
+    NAME
+      vector_vadd_vsub_${OPERAND_TYPE}_tests
+    SRCS
+      vector_vadd_vsub_tests.c
+  DEPS
+    springbok
+    vector_tests
+  COPTS
+   -Wno-unused-value
+   -D=TEST_${OPERAND_TYPE}
+  LINKOPTS
+    -T${LINKER_SCRIPT}
+    -Xlinker --defsym=__itcm_length__=128K
+)
 endforeach()
diff --git a/vector_vset_tests/CMakeLists.txt b/vector_vset_tests/CMakeLists.txt
index ba64c6b..1fa1776 100644
--- a/vector_vset_tests/CMakeLists.txt
+++ b/vector_vset_tests/CMakeLists.txt
@@ -1,35 +1,13 @@
-cmake_minimum_required(VERSION 3.10)
 
-project(vector_vset_tests)
-
-
-set(TARGET vector_vset_tests)
-set(ELF ${TARGET}.elf)
-
-add_executable(${ELF} vector_vset_tests.c)
-
-target_include_directories(${ELF} PUBLIC include)
-
-set_target_properties(${ELF} PROPERTIES LINK_DEPENDS "${LINKER_SCRIPT}")
-
-target_link_libraries(${ELF} vector_tests)
-
-set_target_properties(
-	${ELF}
-	PROPERTIES
-	LINK_FLAGS
-	"-T${LINKER_SCRIPT} \
-	 -specs=nano.specs \
-	 -Wl,--gc-sections \
-	 -Wl,--print-memory-usage \
-	 -Wl,-Map=${PROJECT_NAME}.map")
-
-target_compile_options(${ELF} PUBLIC
-	-nostdlib
-	-ffreestanding
-	-ffunction-sections
-	-Wall
-	-Werror
-	-O3
-	-g)
-
+vec_cc_binary(
+    NAME
+      vector_vset_tests
+    SRCS
+      vector_vset_tests.c
+  DEPS
+    springbok
+    vector_tests
+  LINKOPTS
+    -T${LINKER_SCRIPT}
+    -Xlinker --defsym=__itcm_length__=128K
+)