gen_pack.sh 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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. "
  101. # Specify file names to be deleted from pack build directory
  102. PACK_DELETE_FILES=""
  103. # Specify patches to be applied
  104. PACK_PATCH_FILES=""
  105. ############ DO NOT EDIT BELOW ###########
  106. echo Starting CMSIS-Pack Generation: `date`
  107. # Zip utility check
  108. ZIP=7z
  109. if ! type -a "${ZIP}"; then
  110. echo "Error: No 7zip Utility found"
  111. echo "Action: Add 7zip to your path"
  112. echo " "
  113. exit 1
  114. fi
  115. # Pack checking utility check
  116. PACKCHK=packchk
  117. if ! type -a ${PACKCHK}; then
  118. echo "Error: No PackChk Utility found"
  119. echo "Action: Add PackChk to your path"
  120. echo "Hint: Included in CMSIS Pack:"
  121. echo "$CMSIS_PACK_ROOT/ARM/CMSIS/<version>/CMSIS/Utilities/<os>/"
  122. echo " "
  123. exit 1
  124. fi
  125. echo " "
  126. # Locate Package Description file
  127. # check whether there is more than one pdsc file
  128. NUM_PDSCS=$(ls -1 *.pdsc | wc -l)
  129. PACK_DESCRIPTION_FILE=$(ls *.pdsc)
  130. if [[ -n $1 && -f $1 ]]; then
  131. PACK_DESCRIPTION_FILE=$1
  132. elif [ ${NUM_PDSCS} -lt 1 ]; then
  133. echo "Error: No *.pdsc file found in current directory"
  134. echo " "
  135. exit 1
  136. elif [ ${NUM_PDSCS} -gt 1 ]; then
  137. echo "Error: Only one PDSC file allowed in directory structure:"
  138. echo "Found:"
  139. echo "$PACK_DESCRIPTION_FILE"
  140. echo "Action: Provide PDSC file explicitly!"
  141. echo " "
  142. usage
  143. exit 1
  144. fi
  145. SAVEIFS=$IFS
  146. IFS=.
  147. set ${PACK_DESCRIPTION_FILE}
  148. # Pack Vendor
  149. PACK_VENDOR=$1
  150. # Pack Name
  151. PACK_NAME=$2
  152. echo "Generating Pack: for $PACK_VENDOR.$PACK_NAME"
  153. echo " "
  154. IFS=$SAVEIFS
  155. #if $PACK_BUILD directory does not exist, create it.
  156. if [ ! -d "$PACK_BUILD" ]; then
  157. mkdir -p "$PACK_BUILD"
  158. fi
  159. # Copy files into build base directory: $PACK_BUILD
  160. # pdsc file is mandatory in base directory:
  161. first=$(grep -n "<releases>" ${PACK_VENDOR}.${PACK_NAME}.pdsc | cut -d: -f1)
  162. last=$(grep -n "</releases>" ${PACK_VENDOR}.${PACK_NAME}.pdsc | cut -d: -f1)
  163. let first-=1
  164. let last+=1
  165. head -n ${first} "./${PACK_VENDOR}.${PACK_NAME}.pdsc" > "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc"
  166. /bin/bash "${CHANGELOG}" -f pdsc 2>/dev/null | sed "s/^/ /" >> "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc"
  167. tail -n +${last} "./${PACK_VENDOR}.${PACK_NAME}.pdsc" | \
  168. sed -e "s/Cversion=\"[^\"]*\"/Cversion=\"${VERSION}\"/" >> "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc"
  169. # Add directories
  170. echo Adding directories to pack:
  171. echo "${PACK_DIRS}"
  172. echo " "
  173. for d in ${PACK_DIRS}; do
  174. cp -r --parents "$d" "${PACK_BUILD}"
  175. done
  176. # Add files
  177. echo Adding files to pack:
  178. echo "${PACK_BASE_FILES}"
  179. echo " "
  180. if [ ! -x ${PACK_BASE_FILES+x} ]; then
  181. for f in ${PACK_BASE_FILES}; do
  182. cp -f --parents "$f" $PACK_BUILD/
  183. done
  184. fi
  185. # Delete files
  186. echo Deleting files from pack:
  187. echo "${PACK_DELETE_FILES}"
  188. echo " "
  189. if [ ! -x ${PACK_DELETE_FILES+x} ]; then
  190. for f in ${PACK_DELETE_FILES}; do
  191. find $PACK_BUILD/$(dirname "$f") -name $(basename "$f") -delete
  192. done
  193. fi
  194. # Apply patches
  195. echo Applying patches to pack:
  196. echo "${PACK_PATCH_FILES}"
  197. echo " "
  198. if [ ! -x ${PACK_PATCH_FILES+x} ]; then
  199. CWD=$(pwd)
  200. pushd $PACK_BUILD > /dev/null
  201. for f in ${PACK_PATCH_FILES}; do
  202. patch -p0 -t -i "${CWD}/${f}"
  203. done
  204. popd > /dev/null
  205. fi
  206. # Run Schema Check (for Linux only):
  207. # sudo apt-get install libxml2-utils
  208. if type -a xmllint; then
  209. echo "Running schema check for ${PACK_VENDOR}.${PACK_NAME}.pdsc"
  210. SCHEMA=$(realpath -m ${CMSIS_TOOLSDIR}/../PACK.xsd)
  211. if [ ! -f $SCHEMA ]; then
  212. SCHEMAURL=$(grep -Pio "xs:noNamespaceSchemaLocation=\"\K[^\"]+" ${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc)
  213. curl -L $SCHEMAURL --output PACK.xsd
  214. SCHEMA="PACK.xsd"
  215. fi
  216. xmllint --noout --schema ${SCHEMA} "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc"
  217. errorlevel=$?
  218. if [ $errorlevel -ne 0 ]; then
  219. echo "build aborted: Schema check of $PACK_VENDOR.$PACK_NAME.pdsc against PACK.xsd failed"
  220. echo " "
  221. exit 1
  222. fi
  223. else
  224. echo "Use MDK PackInstaller to run schema validation for $PACK_VENDOR.$PACK_NAME.pdsc"
  225. fi
  226. # Run Pack Check and generate PackName file with version
  227. "${PACKCHK}" "${PACK_BUILD}/${PACK_VENDOR}.${PACK_NAME}.pdsc" \
  228. -i "${CMSIS_PACK_ROOT}/.Web/ARM.CMSIS.pdsc" \
  229. -n PackName.txt
  230. errorlevel=$?
  231. if [ $errorlevel -ne 0 ]; then
  232. echo "build aborted: pack check failed"
  233. echo " "
  234. exit 1
  235. fi
  236. PACKNAME=$(cat PackName.txt)
  237. rm -rf PackName.txt
  238. # Create checksum file
  239. echo Creating checksum file:
  240. pushd $PACK_BUILD > /dev/null
  241. find . -type f -exec sha1sum -b {} + > ../${PACK_VENDOR}.${PACK_NAME}.sha1
  242. mv ../${PACK_VENDOR}.${PACK_NAME}.sha1 .
  243. popd > /dev/null
  244. # Archiving
  245. # $ZIP a $PACKNAME
  246. echo "creating pack file $PACKNAME"
  247. #if $PACK_WAREHOUSE directory does not exist create it
  248. if [ ! -d "$PACK_WAREHOUSE" ]; then
  249. mkdir -p "$PACK_WAREHOUSE"
  250. fi
  251. pushd "$PACK_WAREHOUSE" > /dev/null
  252. PACK_WAREHOUSE=$(pwd)
  253. popd > /dev/null
  254. pushd "$PACK_BUILD" > /dev/null
  255. PACK_BUILD=$(pwd)
  256. "$ZIP" a "$PACK_WAREHOUSE/$PACKNAME" -tzip
  257. popd > /dev/null
  258. errorlevel=$?
  259. if [ $errorlevel -ne 0 ]; then
  260. echo "build aborted: archiving failed"
  261. exit 1
  262. fi
  263. echo "build of pack succeeded"
  264. # Clean up
  265. echo "cleaning up ..."
  266. if [[ $KEEP == 0 ]]; then
  267. rm -rf "$PACK_BUILD"
  268. fi
  269. echo " "
  270. echo Completed CMSIS-Pack Generation: $(date)