gen_pack.sh 8.0 KB

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