]> git.donarmstrong.com Git - kiibohd-controller.git/blobdiff - Lib/CMake/modules.cmake
Updating setup.cmake files to use Module hierarchy implicitly
[kiibohd-controller.git] / Lib / CMake / modules.cmake
index b73b3b694dfab66d08728afa979cbcb96507a767..02ecbe8e4c69c59ca7a4aad5e2ce3393cc44be77 100644 (file)
@@ -24,6 +24,7 @@ endif ()
 
 
 
+
 ###
 # Path Setup
 #
@@ -41,36 +42,16 @@ set( HEAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
 # Module Check Function
 #
 
-#| Usage:
-#|  PathPrepend( ModulePath <ListOfFamiliesSupported> )
-#| Uses the ${COMPILER_FAMILY} variable
-function( ModuleCompatibility ModulePath )
-       foreach( mod_var ${ARGN} )
+function ( ModuleCompatibility ModulePath )
+       foreach ( mod_var ${ARGN} )
                if ( ${mod_var} STREQUAL ${COMPILER_FAMILY} )
                        # Module found, no need to scan further
                        return()
                endif ()
-       endforeach()
+       endforeach ()
 
-       message( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
-endfunction()
-
-
-
-###
-# Module Configuration
-#
-
-#| Additional options, usually define settings
-add_definitions()
-
-#| Include path for each of the modules
-add_definitions(
-       -I${HEAD_DIR}/${ScanModulePath}
-       -I${HEAD_DIR}/${MacroModulePath}
-       -I${HEAD_DIR}/${OutputModulePath}
-       -I${HEAD_DIR}/${DebugModulePath}
-)
+       message ( FATAL_ERROR "${ModulePath} does not support the ${COMPILER_FAMILY} family..." )
+endfunction ()
 
 
 
@@ -81,51 +62,86 @@ add_definitions(
 #| Go through lists of sources and append paths
 #| Usage:
 #|  PathPrepend( OutputListOfSources <Prepend Path> <InputListOfSources> )
-macro( PathPrepend Output SourcesPath )
-       unset( tmpSource )
+macro ( PathPrepend Output SourcesPath )
+       unset ( tmpSource )
 
        # Loop through items
-       foreach( item ${ARGN} )
+       foreach ( item ${ARGN} )
                # Set the path
-               set( tmpSource ${tmpSource} "${SourcesPath}/${item}" )
-       endforeach()
+               set ( tmpSource ${tmpSource} "${SourcesPath}/${item}" )
+       endforeach ()
 
        # Finalize by writing the new list back over the old one
-       set( ${Output} ${tmpSource} )
-endmacro()
+       set ( ${Output} ${tmpSource} )
+endmacro ()
+
+
+
+###
+# Add Module Macro
+#
+# Optional Arg 1: Main Module Check, set to True/1 if adding a main module
+
+function ( AddModule ModuleType ModuleName )
+       # Module path
+       set ( ModulePath                 ${ModuleType}/${ModuleName} )
+       set ( ModuleFullPath ${HEAD_DIR}/${ModuleType}/${ModuleName} )
+
+       # Include setup.cmake file
+       include ( ${ModuleFullPath}/setup.cmake )
+
+       # Check if this is a main module add
+       foreach ( extraArg ${ARGN} )
+               # Make sure this isn't a submodule
+               if ( DEFINED SubModule )
+                       message ( FATAL_ERROR
+                       "The '${ModuleName}' module is not a stand-alone module, and requires further setup."
+                       )
+               endif ()
+       endforeach ()
+
+       # PathPrepend to give proper paths to each of the source files
+       PathPrepend ( Module_SRCS ${ModulePath} ${Module_SRCS} )
 
+       # Check the current scope to see if a sub-module added some source files
+       set ( Module_SRCS ${${ModuleType}_SRCS} ${Module_SRCS} )
 
-#| Scan Module
-include    (            "${ScanModulePath}/setup.cmake"  )
-PathPrepend(  SCAN_SRCS  ${ScanModulePath} ${SCAN_SRCS}  )
+       # Append each of the sources to each type of module srcs list
+       set ( ${ModuleType}_SRCS ${Module_SRCS} )
 
-#| Macro Module
-include    (           "${MacroModulePath}/setup.cmake"  )
-PathPrepend( MACRO_SRCS ${MacroModulePath} ${MACRO_SRCS} )
+       # Add .h files
+       add_definitions ( -I${ModuleFullPath} )
 
-#| Output Module
-include    (             "${OutputModulePath}/setup.cmake"   )
-PathPrepend( OUTPUT_SRCS  ${OutputModulePath} ${OUTPUT_SRCS} )
+       # Check module compatibility
+       ModuleCompatibility( ${ModulePath} ${ModuleCompatibility} )
+
+       # Check if this is a main module add
+       foreach ( extraArg ${ARGN} )
+               # Display detected source files
+               if ( NOT DEFINED SubModule )
+                       message ( STATUS "Detected ${ModuleType} Module Source Files:" )
+                       message ( "${${ModuleType}_SRCS}" )
+               endif ()
+       endforeach ()
+
+       # Finally, add the sources to the parent scope (i.e. return)
+       set ( ${ModuleType}_SRCS ${${ModuleType}_SRCS} PARENT_SCOPE )
+endfunction ()
 
-#| Debugging Module
-include    (           "${DebugModulePath}/setup.cmake"  )
-PathPrepend( DEBUG_SRCS ${DebugModulePath} ${DEBUG_SRCS} )
 
+#| Add main modules
+AddModule ( Scan   ${ScanModule}   1 )
+AddModule ( Macro  ${MacroModule}  1 )
+AddModule ( Output ${OutputModule} 1 )
+AddModule ( Debug  ${DebugModule}  1 )
 
-#| Default Map
-# TODO Add support for different defaultMaps
-configure_file( "${ScanModulePath}/defaultMap.h" defaultMap.h )
 
 
-#| Print list of all module sources
-message( STATUS "Detected Scan Module Source Files:" )
-message( "${SCAN_SRCS}" )
-message( STATUS "Detected Macro Module Source Files:" )
-message( "${MACRO_SRCS}" )
-message( STATUS "Detected Output Module Source Files:" )
-message( "${OUTPUT_SRCS}" )
-message( STATUS "Detected Debug Module Source Files:" )
-message( "${DEBUG_SRCS}" )
+###
+# CMake Module Checking
+#
+find_package ( Git REQUIRED )
+find_package ( Ctags ) # Optional
 
 
 
@@ -142,7 +158,7 @@ set( MANUFACTURER "Kiibohd" )
 
 #| Modified
 #| Takes a bit of work to extract the "M " using CMake, and not using it if there are no modifications
-execute_process( COMMAND git status -s -uno --porcelain
+execute_process( COMMAND ${GIT_EXECUTABLE} status -s -uno --porcelain
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Modified_INFO
        ERROR_QUIET
@@ -156,7 +172,7 @@ if ( ${Git_Modified_LENGTH} GREATER 2 )
 endif ()
 
 #| Branch
-execute_process( COMMAND git rev-parse --abbrev-ref HEAD
+execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Branch_INFO
        ERROR_QUIET
@@ -164,7 +180,7 @@ execute_process( COMMAND git rev-parse --abbrev-ref HEAD
 )
 
 #| Date
-execute_process( COMMAND git show -s --format=%ci
+execute_process( COMMAND ${GIT_EXECUTABLE} show -s --format=%ci
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Date_INFO
        ERROR_QUIET
@@ -172,7 +188,7 @@ execute_process( COMMAND git show -s --format=%ci
 )
 
 #| Commit Author and Email
-execute_process( COMMAND git show -s --format="%cn <%ce>"
+execute_process( COMMAND ${GIT_EXECUTABLE} show -s --format="%cn <%ce>"
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Commit_Author
        ERROR_QUIET
@@ -180,7 +196,7 @@ execute_process( COMMAND git show -s --format="%cn <%ce>"
 )
 
 #| Commit Revision
-execute_process( COMMAND git show -s --format=%H
+execute_process( COMMAND ${GIT_EXECUTABLE} show -s --format=%H
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Commit_Revision
        ERROR_QUIET
@@ -188,7 +204,7 @@ execute_process( COMMAND git show -s --format=%H
 )
 
 #| Origin URL
-execute_process( COMMAND git config --get remote.origin.url
+execute_process( COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE Git_Origin_URL
        ERROR_QUIET
@@ -217,10 +233,10 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Lib/_buildvars.h buildvars.h )
 set( SRCS
        ${MAIN_SRCS}
        ${COMPILER_SRCS}
-       ${SCAN_SRCS}
-       ${MACRO_SRCS}
-       ${OUTPUT_SRCS}
-       ${DEBUG_SRCS}
+       ${Scan_SRCS}
+       ${Macro_SRCS}
+       ${Output_SRCS}
+       ${Debug_SRCS}
 )
 
 #| Directories to include by default
@@ -228,25 +244,6 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} )
 
 
 
-###
-# Module Compatibility Check
-#
-
-#| Check for whether the set modules are compatible with the specified compiler family
-ModuleCompatibility( ${ScanModulePath}   ${ScanModuleCompatibility}   )
-ModuleCompatibility( ${MacroModulePath}  ${MacroModuleCompatibility}  )
-ModuleCompatibility( ${OutputModulePath} ${OutputModuleCompatibility} )
-ModuleCompatibility( ${DebugModulePath}  ${DebugModuleCompatibility}  )
-
-
-
-###
-# CMake Module Checking
-#
-find_package( Git REQUIRED )
-find_package( Ctags ) # Optional
-
-
 ###
 # ctag Generation
 #
@@ -268,89 +265,3 @@ if( CTAGS_EXECUTABLE )
        )
 endif()
 
-
-
-###
-# Build Targets
-#
-
-#| Create the .ELF file
-set( TARGET_ELF ${TARGET}.elf )
-add_executable( ${TARGET_ELF} ${SRCS} )
-
-
-#| .ELF Properties
-set_target_properties( ${TARGET_ELF} PROPERTIES
-       LINK_FLAGS ${LINKER_FLAGS}
-       SUFFIX ""                               # XXX Force Windows to keep the .exe off
-)
-
-
-#| Convert the .ELF into a .bin to load onto the McHCK
-set( TARGET_BIN ${TARGET}.dfu.bin )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-       COMMAND ${CMAKE_OBJCOPY} ${BIN_FLAGS} ${TARGET_ELF} ${TARGET_BIN}
-       COMMENT "Creating binary file to load:  ${TARGET_BIN}"
-)
-
-
-#| Convert the .ELF into a .HEX to load onto the Teensy
-set( TARGET_HEX ${TARGET}.teensy.hex )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-       COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX}
-       COMMENT "Creating iHex file to load:    ${TARGET_HEX}"
-)
-
-
-#| Generate the Extended .LSS
-set( TARGET_LSS ${TARGET}.lss )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-       COMMAND ${CMAKE_OBJDUMP} ${LSS_FLAGS} ${TARGET_ELF} > ${TARGET_LSS}
-       COMMENT "Creating Extended Listing:     ${TARGET_LSS}"
-)
-
-
-#| Generate the Symbol Table .SYM
-set( TARGET_SYM ${TARGET}.sym )
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-       COMMAND ${CMAKE_NM} -n ${TARGET_ELF} > ${TARGET_SYM}
-       COMMENT "Creating Symbol Table:         ${TARGET_SYM}"
-)
-
-
-#| Compiler Selection Record
-add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
-       COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/writer compiler ${COMPILER_FAMILY}
-)
-
-
-
-###
-# Size Information
-#
-
-#| After Changes Size Information
-add_custom_target( SizeAfter ALL
-       COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ihex ${TARGET_ELF} ${SIZE_RAM}   " SRAM"
-       COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ihex ${TARGET_HEX} ${SIZE_FLASH} "Flash"
-       DEPENDS ${TARGET_ELF}
-       COMMENT "Chip usage for ${CHIP}"
-)
-
-
-
-###
-# Setup Loader Script and Program
-#
-
-
-#| Provides the user with the correct teensy-loader-cli command for the built .HEX file
-#| Windows
-if( CMAKE_SYSTEM_NAME MATCHES "Windows" )
-       configure_file( LoadFile/winload load NEWLINE_STYLE UNIX )
-#| Default
-else()
-       configure_file( LoadFile/load load NEWLINE_STYLE UNIX )
-endif()
-
-