Просмотр исходного кода

Merge pull request #4 from mikepurvis/crushed

DEB/RPM generator for cmsis, stdperiph
ObKo 12 лет назад
Родитель
Сommit
19c7d86d2c
4 измененных файлов с 153 добавлено и 6 удалено
  1. 6 2
      cmsis/CMakeLists.txt
  2. 92 0
      packages/CMakeLists.txt
  3. 46 0
      packages/README.md
  4. 9 4
      stdperiph/CMakeLists.txt

+ 6 - 2
cmsis/CMakeLists.txt

@@ -11,6 +11,7 @@ IF(${STM32_FAMILY} STREQUAL "F1")
 
     INCLUDE_DIRECTORIES(
         ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/CoreSupport/
     )
     
     SET(CMSIS_HEADERS 
@@ -58,14 +59,17 @@ INCLUDE_DIRECTORIES(
 )
 
 STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
+ADD_CUSTOM_TARGET(cmsis_${STM32_FAMILY_LOWER})
 
 FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
     STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
     
     LIST(APPEND CMSIS_STARTUP_FILES ${STARTUP_PREFIX}${CHIP_TYPE_LOWER}.s)
     LIST(APPEND CMSIS_LIBRARIES cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
-    ADD_LIBRARY(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CMSIS_SOURCES})
-    STM32_SET_CHIP_DEFINITIONS(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+    SET(TARGET_NAME cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ADD_LIBRARY(${TARGET_NAME} ${CMSIS_SOURCES})
+    STM32_SET_CHIP_DEFINITIONS(${TARGET_NAME} ${CHIP_TYPE})
+    ADD_DEPENDENCIES(cmsis_${STM32_FAMILY_LOWER} ${TARGET_NAME})
 ENDFOREACH()
 
 INSTALL(TARGETS ${CMSIS_LIBRARIES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

+ 92 - 0
packages/CMakeLists.txt

@@ -0,0 +1,92 @@
+cmake_minimum_required(VERSION 2.8.3)
+set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../gcc_stm32.cmake")
+project(stm32_packages)
+
+if (NOT DEFINED TARGET_TRIPLET)
+  set(TARGET_TRIPLET "arm-none-eabi")
+endif()
+set(CMAKE_BUILD_TYPE "Release")
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules")
+
+set(STM_ARCHIVE_BASEURL "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware")
+set(STM_ARCHIVE_F1 "stsw-stm32054.zip")
+set(STM_ARCHIVE_F4 "stm32f4_dsp_stdperiph_lib.zip")
+set(STM_ARCHIVE_VERSION_F1 "3.5.0")
+set(STM_ARCHIVE_VERSION_F4 "1.3.0")
+set(STM_ARCHIVE_DIR_F1 "STM32F10x_StdPeriph_Lib_V${STM_ARCHIVE_VERSION_F1}")
+set(STM_ARCHIVE_DIR_F4 "STM32F4xx_DSP_StdPeriph_Lib_V${STM_ARCHIVE_VERSION_F4}")
+
+set(PACKAGE_TYPE "deb")
+
+if(NOT DEFINED STM32_FAMILY)
+  message(FATAL_ERROR "Please specify STM32_FAMILY, eg cmake -DSTM32_FAMILY=F4")
+endif()
+
+set(STM_ARCHIVE "${STM_ARCHIVE_${STM32_FAMILY}}")
+if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${STM_ARCHIVE}") 
+  message(STATUS "Using already-downloaded archive: ${STM_ARCHIVE}")
+else()
+  message(STATUS "From st.com, downloading ${STM_ARCHIVE}")
+  file(DOWNLOAD "${STM_ARCHIVE_BASEURL}/${STM_ARCHIVE}"
+                "${CMAKE_CURRENT_BINARY_DIR}/${STM_ARCHIVE}" SHOW_PROGRESS)
+endif()
+
+set(STM_ARCHIVE_DIR "${STM_ARCHIVE_DIR_${STM32_FAMILY}}")
+set(STM_ARCHIVE_FULLDIR "${CMAKE_CURRENT_BINARY_DIR}/${STM_ARCHIVE_DIR}")
+if(EXISTS "${STM_ARCHIVE_FULLDIR}")
+  message(STATUS "Using already-extracted path: ${STM_ARCHIVE_DIR}")
+else()
+  execute_process(COMMAND unzip -o ${STM_ARCHIVE})
+endif()
+
+add_custom_target(debs ALL)
+
+# Install everything into a subdirectory so that we can package it from there.
+set(STM32F1_CHIP_TYPES HD HD_VL MD MD_VL LD LD_VL XL)
+set(STM32F4_CHIP_TYPES 401xx 40_41xxx 427_437xx 429_439xx)
+set(STM32_CHIP_TYPES "${STM32${STM32_FAMILY}_CHIP_TYPES}")
+set(STM32${STM32_FAMILY}_StdPeriphLib_DIR "${STM_ARCHIVE_FULLDIR}")
+
+# Add targets for building cmsis libraries
+set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/install/usr/${TARGET_TRIPLET}/")
+add_subdirectory(../cmsis ${CMAKE_CURRENT_BINARY_DIR}/cmsis)
+
+# Add targets for building stdperiph libraries, which need the cmsis headers
+get_property(CMSIS_INCLUDE_DIR DIRECTORY ../cmsis PROPERTY INCLUDE_DIRECTORIES)
+add_subdirectory(../stdperiph ${CMAKE_CURRENT_BINARY_DIR}/stdperiph)
+
+# Ensure all those get built.
+add_custom_target(install_stm32${STM32_FAMILY_LOWER})
+add_dependencies(install_stm32${STM32_FAMILY_LOWER}
+                 cmsis_${STM32_FAMILY_LOWER}
+                 stdperiph_${STM32_FAMILY_LOWER})
+
+set(MODULES_DIR ${CMAKE_CURRENT_BINARY_DIR}/install/usr/share/cmake-2.8/Modules)
+add_custom_command(TARGET install_stm32${STM32_FAMILY_LOWER} POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake
+  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules/FindCMSIS.cmake
+          ${MODULES_DIR}/FindCMSIS.cmake
+  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules/FindStdPeriphLib.cmake
+          ${MODULES_DIR}/FindStdPeriphLib.cmake
+  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../gcc_stm32.cmake
+          ${MODULES_DIR}/gcc_stm32.cmake
+  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../gcc_stm32${STM32_FAMILY_LOWER}.cmake
+          ${MODULES_DIR}/gcc_stm32${STM32_FAMILY_LOWER}.cmake
+)
+
+# Create package.
+set(PACKAGE_NAME "stm32${STM32_FAMILY_LOWER}-stdperiph")
+set(PACKAGE_VERSION "${STM_ARCHIVE_VERSION_${STM32_FAMILY}}")
+set(PACKAGE_FILENAME "${PACKAGE_NAME}_${PACKAGE_VERSION}_all.${PACKAGE_TYPE}")
+
+add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_FILENAME}
+  COMMAND fpm -a all -s dir -t ${PACKAGE_TYPE} -n ${PACKAGE_NAME}
+              -d gcc-arm-none-eabi
+              -v ${PACKAGE_VERSION} -C install usr
+)
+add_custom_target(${PACKAGE_FILENAME}_
+  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_FILENAME}
+)
+add_dependencies(${PACKAGE_FILENAME}_ install_stm32${STM32_FAMILY_LOWER})
+add_dependencies(debs ${PACKAGE_FILENAME}_)

+ 46 - 0
packages/README.md

@@ -0,0 +1,46 @@
+Package Generation
+==================
+
+This directory creates a debian package of the stm32f1 or f4 CMSIS and StdPeriph libraries
+and headers. This is useful for a few reasons:
+
+ - You can use `sudo dpkg -i` to install a deb and avoid manually compiling
+   and installing the library.
+ - You can place the deb on an apt repository, and make it trivially easy to
+   set up a development environment on any Ubuntu or Debian machine---this is
+   great for getting a whole team up and running quickly, or for throwaway
+   environments such as CI builders and virtual machines.
+
+Toolchain
+---------
+
+You need the right GCC compiler, which is `gcc-arm-none-eabi`. Fortunately, if you're on
+Ubuntu, this is really easy to get from Launchpad, thanks to Terry Guo's PPA:
+
+~~~
+sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
+sudo apt-get update
+sudo apt-get install gcc-arm-none-eabi
+~~~
+
+Building the deb
+----------------
+
+You'll need a [fpm](https://github.com/jordansissel/fpm), which is what actually produces
+the deb package from a folder of files. This comes from rubygems:
+
+~~~
+sudo apt-get install rubygems
+gem install fpm
+~~~
+
+Apart from that, it's a regular build:
+
+~~~
+mkdir packages/build
+cd packages/build
+cmake .. -DSTM32_FAMILY=F4
+make
+~~~
+
+Enjoy your deb!

+ 9 - 4
stdperiph/CMakeLists.txt

@@ -3,7 +3,9 @@ PROJECT(stm32stdperiph)
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 ENABLE_LANGUAGE(ASM)
 
-FIND_PACKAGE(CMSIS REQUIRED)
+IF(NOT DEFINED CMSIS_INCLUDE_DIR)
+    FIND_PACKAGE(CMSIS REQUIRED)
+ENDIF()
 
 IF(${STM32_FAMILY} STREQUAL "F1")
     IF(NOT STM32F1_StdPeriphLib_DIR)
@@ -177,15 +179,18 @@ ELSE()
 ENDIF()
 
 STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
+ADD_CUSTOM_TARGET(stdperiph_${STM32_FAMILY_LOWER})
 
 FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
     STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
     
     LIST(APPEND STDPERIPH_LIBRARIES stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
-    ADD_LIBRARY(stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${STDPERIPH_SOURCES} ${STDPERIPH_SOURCES_${CHIP_TYPE}})
-    STM32_SET_CHIP_DEFINITIONS(stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+    SET(TARGET_NAME stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ADD_LIBRARY(${TARGET_NAME} ${STDPERIPH_SOURCES} ${STDPERIPH_SOURCES_${CHIP_TYPE}})
+    STM32_SET_CHIP_DEFINITIONS(${TARGET_NAME} ${CHIP_TYPE})
+    ADD_DEPENDENCIES(stdperiph_${STM32_FAMILY_LOWER} ${TARGET_NAME})
 ENDFOREACH()
 
 INSTALL(TARGETS ${STDPERIPH_LIBRARIES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
 
-INSTALL(FILES ${STDPERIPH_HEADERS} DESTINATION include/stm32${STM32_FAMILY_LOWER})
+INSTALL(FILES ${STDPERIPH_HEADERS} DESTINATION include/stm32${STM32_FAMILY_LOWER})