gen_pack.sh 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. #!/bin/bash
  2. # Version: 1.3
  3. # Date: 2021-04-27
  4. # This bash script generates a CMSIS Software Pack:
  5. #
  6. # Pre-requisites:
  7. # - bash shell (for Windows: install git for Windows)
  8. # - git in path (for Windows: install git for Windows)
  9. # - 7z in path (zip archiving utility)
  10. # e.g. Ubuntu: sudo apt-get install p7zip-full p7zip-rar)
  11. # - PackChk is taken from latest install CMSIS Pack installed in $CMSIS_PACK_ROOT
  12. # - xmllint in path (XML schema validation; available only for Linux)
  13. ############### EDIT BELOW ###############
  14. # Extend Path environment variable locally
  15. #
  16. set -o pipefail
  17. function usage {
  18. echo "$(basename $0) [-h|--help] [<pdsc>]"
  19. echo ""
  20. echo "Arguments:"
  21. echo " -h|--help Print this usage message and exit."
  22. echo " pdsc The pack description to generate the pack for."
  23. echo ""
  24. echo "Environment:"
  25. echo " 7z"
  26. echo " PackChk"
  27. if [ $(uname -s) = "Linux" ]; then
  28. echo " xmllint"
  29. fi
  30. echo ""
  31. }
  32. function pack_version()
  33. {
  34. local version=$(grep -Pzo "(?s)<releases>\s+<release version=\"([^\"]+)\"" "$1" | tr -d '\0' | tail -n 1 | sed -r -e 's/.*version="([^"]+)"/\1/g')
  35. echo "PDSC version: '$version'" >&2
  36. echo $version
  37. }
  38. function git_describe()
  39. {
  40. local gitversion=$(git describe --match $1* --abbrev=9 || echo "$1-dirty-0-g$(git describe --match $1* --always --abbrev=9)")
  41. local version=$(echo $gitversion | sed -r -e 's/-([0-9]+)-(g[0-9a-f]{9})/\1+\2/')
  42. if [[ $version != $1 ]] && [[ $version == $gitversion ]]; then
  43. version+=0
  44. fi
  45. echo "Git version: '$version'" >&2
  46. echo $version
  47. }
  48. function patch_pdsc()
  49. {
  50. if [[ "$2" != "$3" ]]; then
  51. echo "Updating latest release tag with version '$3'"
  52. sed -r -i -e "s/<release version=\"$2\"/<release version=\"$3\"/" $1
  53. fi
  54. }
  55. POSITIONAL=()
  56. while [[ $# -gt 0 ]]
  57. do
  58. key="$1"
  59. case $key in
  60. '-h'|'--help')
  61. usage
  62. exit 1
  63. ;;
  64. *) # unknown option
  65. POSITIONAL+=("$1") # save it in an array for later
  66. shift # past argument
  67. ;;
  68. esac
  69. done
  70. set -- "${POSITIONAL[@]}" # restore positional parameters
  71. OS=$(uname -s)
  72. case $OS in
  73. 'Linux')
  74. CMSIS_TOOLSDIR="./CMSIS/Utilities/Linux64"
  75. ;;
  76. 'WindowsNT'|MINGW*|CYGWIN*)
  77. CMSIS_TOOLSDIR="./CMSIS/Utilities/Win32"
  78. ;;
  79. 'Darwin')
  80. echo "Error: CMSIS Tools not available for Mac at present."
  81. exit 1
  82. ;;
  83. *)
  84. echo "Error: unrecognized OS $OS"
  85. exit 1
  86. ;;
  87. esac
  88. PATH_TO_ADD="$CMSIS_TOOLSDIR"
  89. [[ ":$PATH:" != *":${PATH_TO_ADD}:"* ]] && PATH="${PATH}:${PATH_TO_ADD}"
  90. echo $PATH_TO_ADD appended to PATH
  91. echo " "
  92. # Pack warehouse directory - destination
  93. PACK_WAREHOUSE=./output
  94. # Temporary pack build directory
  95. PACK_BUILD=./build
  96. # Specify directory names to be added to pack base directory
  97. PACK_DIRS="
  98. Device
  99. CMSIS/Core/Include
  100. CMSIS/Core/Template
  101. CMSIS/Core_A
  102. CMSIS/DAP
  103. CMSIS/Driver
  104. CMSIS/DSP/ComputeLibrary
  105. CMSIS/DSP/Include
  106. CMSIS/DSP/Source
  107. CMSIS/DSP/Projects
  108. CMSIS/DSP/Examples
  109. CMSIS/DSP/Include
  110. CMSIS/DSP/PrivateInclude
  111. CMSIS/NN
  112. CMSIS/RTOS
  113. CMSIS/RTOS2
  114. CMSIS/Utilities/Win32
  115. CMSIS/Utilities/Linux64
  116. CMSIS/Documentation
  117. "
  118. # Specify file names to be added to pack base directory
  119. PACK_BASE_FILES="
  120. LICENSE.txt
  121. CMSIS/Utilities/ARM_Example.*
  122. CMSIS/Utilities/*.xsd
  123. "
  124. # Specify file names to be deleted from pack build directory
  125. PACK_DELETE_FILES="
  126. CMSIS/RTOS/CMSIS_RTOS_Tutorial.pdf
  127. CMSIS/RTOS/RTX/LIB/fetch_libs.sh
  128. CMSIS/RTOS/RTX/LIB/*.zip
  129. CMSIS/RTOS2/RTX/Library/fetch_libs.sh
  130. CMSIS/RTOS2/RTX/Library/*.zip
  131. CMSIS/RTOS2/RTX/Library/build.py
  132. "
  133. # Specify patches to be applied
  134. PACK_PATCH_FILES=""
  135. ############ DO NOT EDIT BELOW ###########
  136. echo Starting CMSIS-Pack Generation: `date`
  137. # Zip utility check
  138. ZIP=7z
  139. type -a "${ZIP}"
  140. errorlevel=$?
  141. if [ $errorlevel -gt 0 ]
  142. then
  143. echo "Error: No 7zip Utility found"
  144. echo "Action: Add 7zip to your path"
  145. echo " "
  146. exit 1
  147. fi
  148. # Pack checking utility check
  149. PACKCHK=PackChk
  150. type -a ${PACKCHK}
  151. errorlevel=$?
  152. if [ $errorlevel != 0 ]; then
  153. echo "Error: No PackChk Utility found"
  154. echo "Action: Add PackChk to your path"
  155. echo "Hint: Included in CMSIS Pack:"
  156. echo "$CMSIS_PACK_ROOT/ARM/CMSIS/<version>/CMSIS/Utilities/<os>/"
  157. echo " "
  158. exit 1
  159. fi
  160. echo " "
  161. # Locate Package Description file
  162. # check whether there is more than one pdsc file
  163. NUM_PDSCS=$(ls -1 *.pdsc | wc -l)
  164. PACK_DESCRIPTION_FILE=$(ls *.pdsc)
  165. if [[ -n $1 && -f $1 ]]; then
  166. PACK_DESCRIPTION_FILE=$1
  167. elif [ ${NUM_PDSCS} -lt 1 ]; then
  168. echo "Error: No *.pdsc file found in current directory"
  169. echo " "
  170. exit 1
  171. elif [ ${NUM_PDSCS} -gt 1 ]; then
  172. echo "Error: Only one PDSC file allowed in directory structure:"
  173. echo "Found:"
  174. echo "$PACK_DESCRIPTION_FILE"
  175. echo "Action: Provide PDSC file explicitly!"
  176. echo " "
  177. usage
  178. exit 1
  179. fi
  180. SAVEIFS=$IFS
  181. IFS=.
  182. set ${PACK_DESCRIPTION_FILE}
  183. # Pack Vendor
  184. PACK_VENDOR=$1
  185. # Pack Name
  186. PACK_NAME=$2
  187. echo "Generating Pack: for $PACK_VENDOR.$PACK_NAME"
  188. echo " "
  189. IFS=$SAVEIFS
  190. #if $PACK_BUILD directory does not exist, create it.
  191. if [ ! -d "$PACK_BUILD" ]; then
  192. mkdir -p "$PACK_BUILD"
  193. fi
  194. # Copy files into build base directory: $PACK_BUILD
  195. # pdsc file is mandatory in base directory:
  196. cp -f "./${PACK_VENDOR}.${PACK_NAME}.pdsc" "${PACK_BUILD}"
  197. # Add directories
  198. echo Adding directories to pack:
  199. echo "${PACK_DIRS}"
  200. echo " "
  201. for d in ${PACK_DIRS}; do
  202. cp -r --parents "$d" "${PACK_BUILD}"
  203. done
  204. # Add files
  205. echo Adding files to pack:
  206. echo "${PACK_BASE_FILES}"
  207. echo " "
  208. if [ ! -x ${PACK_BASE_FILES+x} ]; then
  209. for f in ${PACK_BASE_FILES}; do
  210. cp -f --parents "$f" $PACK_BUILD/
  211. done
  212. fi
  213. # Delete files
  214. echo Deleting files from pack:
  215. echo "${PACK_DELETE_FILES}"
  216. echo " "
  217. if [ ! -x ${PACK_DELETE_FILES+x} ]; then
  218. for f in ${PACK_DELETE_FILES}; do
  219. find $PACK_BUILD/$(dirname "$f") -name $(basename "$f") -delete
  220. done
  221. fi
  222. # Apply patches
  223. echo Applying patches to pack:
  224. echo "${PACK_PATCH_FILES}"
  225. echo " "
  226. if [ ! -x ${PACK_PATCH_FILES+x} ]; then
  227. CWD=$(pwd)
  228. pushd $PACK_BUILD > /dev/null
  229. for f in ${PACK_PATCH_FILES}; do
  230. patch -p0 -t -i "${CWD}/${f}"
  231. done
  232. popd > /dev/null
  233. fi
  234. # Create checksum file
  235. echo Creating checksum file:
  236. pushd $PACK_BUILD > /dev/null
  237. find . -type f -exec sha1sum {} + > ../${PACK_VENDOR}.${PACK_NAME}.sha1
  238. mv ../${PACK_VENDOR}.${PACK_NAME}.sha1 .
  239. popd > /dev/null
  240. # Run Schema Check (for Linux only):
  241. # sudo apt-get install libxml2-utils
  242. if [ $(uname -s) = "Linux" ]; then
  243. echo "Running schema check for ${PACK_VENDOR}.${PACK_NAME}.pdsc"
  244. xmllint --noout --schema "$(realpath -m ./CMSIS/Utilities/PACK.xsd)" "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc"
  245. errorlevel=$?
  246. if [ $errorlevel -ne 0 ]; then
  247. echo "build aborted: Schema check of $PACK_VENDOR.$PACK_NAME.pdsc against PACK.xsd failed"
  248. echo " "
  249. exit 1
  250. fi
  251. else
  252. echo "Use MDK PackInstaller to run schema validation for $PACK_VENDOR.$PACK_NAME.pdsc"
  253. fi
  254. # Patch pack version
  255. echo "Checking PDCS version against Git..."
  256. pdsc_version=$(pack_version "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc")
  257. git_version=$(git_describe ${pdsc_version})
  258. patch_pdsc "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc" ${pdsc_version} ${git_version}
  259. # Run Pack Check and generate PackName file with version
  260. "${PACKCHK}" "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc" \
  261. -n ${PACK_BUILD}/PackName.txt \
  262. -x M353 -x M364 -x M335 -x M336
  263. errorlevel=$?
  264. if [ $errorlevel -ne 0 ]; then
  265. echo "build aborted: pack check failed"
  266. echo " "
  267. exit 1
  268. fi
  269. PACKNAME=$(cat ${PACK_BUILD}/PackName.txt)
  270. rm -rf ${PACK_BUILD}/PackName.txt
  271. # Archiving
  272. # $ZIP a $PACKNAME
  273. echo "creating pack file $PACKNAME"
  274. #if $PACK_WAREHOUSE directory does not exist create it
  275. if [ ! -d "$PACK_WAREHOUSE" ]; then
  276. mkdir -p "$PACK_WAREHOUSE"
  277. fi
  278. pushd "$PACK_WAREHOUSE" > /dev/null
  279. PACK_WAREHOUSE=$(pwd)
  280. popd > /dev/null
  281. pushd "$PACK_BUILD" > /dev/null
  282. PACK_BUILD=$(pwd)
  283. "$ZIP" a "$PACK_WAREHOUSE/$PACKNAME" -tzip
  284. popd > /dev/null
  285. errorlevel=$?
  286. if [ $errorlevel -ne 0 ]; then
  287. echo "build aborted: archiving failed"
  288. exit 1
  289. fi
  290. echo "build of pack succeeded"
  291. # Clean up
  292. echo "cleaning up ..."
  293. rm -rf "$PACK_BUILD"
  294. echo " "
  295. echo Completed CMSIS-Pack Generation: $(date)