Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

330 righe
8.2 KiB

  1. #!/bin/bash
  2. ScriptFile=$(readlink -f "${BASH_SOURCE[0]}")
  3. ScriptDir=$(dirname "${ScriptFile}")
  4. UseGit=1
  5. Verbose=0
  6. Update=0
  7. CMakeModules=""
  8. CMakeModulesForced=""
  9. Operations=()
  10. function Log()
  11. {
  12. printf "$@\n"
  13. }
  14. function Verbose()
  15. {
  16. if [[ $Verbose -eq 1 ]]; then
  17. Log "$@"
  18. fi
  19. }
  20. function Error()
  21. {
  22. >&2 printf "$@\n"
  23. }
  24. function Panic()
  25. {
  26. Error "$@"
  27. exit 1
  28. }
  29. function PrintHelp()
  30. {
  31. printf "This is a tool to create a new project group or projects inside an exsisting group.
  32. Parameters:
  33. -g|--group <directory>
  34. Create a new project group at the given directory.
  35. -i|--interface <name> <directory>
  36. Create a new interface library project with the given name at the given directory.
  37. -l|--library <name> <directory>
  38. Create a new library project with the given name at the given directory.
  39. -e|--executable <name ><directory>
  40. Create a new executable project with the given name at the given directory.
  41. -m|--modules <remote>
  42. -M|--force-modules <remote>
  43. Add the CMake Modules from the given remote repository as submodule of the new project.
  44. -n|--nogit
  45. Does not initialize a new git repository when creating a new project group.
  46. -u|--update
  47. Update an exsisting project.
  48. -v|--verbose
  49. Print extra debug output.
  50. -?|-h|--help
  51. Print this help.
  52. "
  53. }
  54. function Copy()
  55. {
  56. srcDir="$1"
  57. dstDir="$2"
  58. file="$3"
  59. oldName="$4"
  60. newName="$5"
  61. tmpSrc="$srcDir$file"
  62. tmpDst="$dstDir$file"
  63. if [[ -n "$oldName$newName" ]]; then
  64. tmpDst=${tmpDst//$oldName/$newName}
  65. fi
  66. tmpDir=$(dirname $tmpDst)
  67. Verbose " Copy .$file to $tmpDst"
  68. mkdir -p "$tmpDir" \
  69. || Panic "Unable to create directory: $tmpDir!"
  70. cp "$tmpSrc" "$tmpDst" \
  71. || Panic "Unable to copy file: $tmpSrc > $tmpDst!"
  72. if [[ -n "$oldName$newName" ]]; then
  73. oldUpper=$(echo $oldName | awk -F: '{ print toupper($1) }')
  74. newUpper=$(echo $newName | awk -F: '{ print toupper($1) }')
  75. sed -i -e "s/$oldName/$newName/g" "$tmpDst" \
  76. || Panic "Unable to replace names!"
  77. sed -i -e "s/$oldUpper/$newUpper/g" "$tmpDst" \
  78. || Panic "Unable to replace names!"
  79. fi
  80. }
  81. function CreateGroup()
  82. {
  83. dir="$1"
  84. Log "\nCreate Project Group: $dir"
  85. # Create directory
  86. Log " Create directory: $dir"
  87. mkdir -p "$dir" \
  88. || Panic "Unable to create project group directory: $dir!"
  89. # Create git repository
  90. Log " Create git repository"
  91. if [[ $UseGit -eq 1 ]]; then
  92. git -C $dir init \
  93. || Panic "Git init failed!"
  94. # Add cmake modules
  95. Log " Add git submodule for CMake modules"
  96. if [[ -n "$CMakeModules" ]]; then
  97. git -C $dir submodule add $CMakeModulesForced "$CMakeModules" "cmake/modules" \
  98. || Panic "Git submodule add failed!"
  99. fi
  100. fi
  101. # Copy files
  102. Log " Copy files"
  103. srcDir="$ScriptDir"
  104. for file in $(find $srcDir -type f); do
  105. if [[ $file == $ScriptFile ]] \
  106. || [[ $file == $srcDir/build/* ]] \
  107. || [[ $file == $srcDir/.git/* ]] \
  108. || [[ $file == $srcDir/.gitmodules ]] \
  109. || [[ $file == $srcDir/.vscode/* ]] \
  110. || [[ $file == $srcDir/projects/* ]] \
  111. || [[ $file == $srcDir/cmake/modules/* ]]
  112. then
  113. relFile=.${file/$srcDir/}
  114. Verbose " Ignore $relFile"
  115. elif [[ $UseGit -eq 0 ]] \
  116. && [[ $file == $srcDir/.git* ]]
  117. then
  118. relFile=.${file/$srcDir/}
  119. Verbose " Ignore $relFile"
  120. else
  121. Copy "$srcDir" "$dir" "${file/$srcDir/}"
  122. fi
  123. done
  124. }
  125. function CreateProject()
  126. {
  127. name="$1"
  128. dir="$2"
  129. src="$3"
  130. Log "\nCreate Project $1 in director $2"
  131. # Create directory
  132. Log " Create directory: $dir"
  133. mkdir -p "$dir" \
  134. || Panic "Unable to create directory: $dir!"
  135. # Create git repository
  136. Log " Create git repository"
  137. if [[ $UseGit -eq 1 ]]; then
  138. git -C $dir init \
  139. || Panic "Git init failed!"
  140. # Add cmake modules
  141. Log " Add git submodule for CMake modules"
  142. if [[ -n "$CMakeModules" ]]; then
  143. git -C $dir submodule add $CMakeModulesForced "$CMakeModules" "cmake/modules" \
  144. || Panic "Git submodule add failed!"
  145. fi
  146. fi
  147. # Copy files
  148. Log " Copy files"
  149. srcDir="$ScriptDir/projects/$src"
  150. for file in $(find $srcDir -type f); do
  151. targetFile="${file/$srcDir/}"
  152. targetFile="${dir}${targetFile}"
  153. targetFile="${targetFile//$src/$name}"
  154. # exclude build directory and cmake modules
  155. if [[ $file == $srcDir/build/* ]] \
  156. || [[ $file == $srcDir/cmake/modules/* ]]
  157. then
  158. relFile=.${file/$srcDir/}
  159. Verbose " Ignore $relFile"
  160. # ignore git files
  161. elif [[ $UseGit -eq 0 ]] \
  162. && [[ $file == $srcDir/.git* ]]
  163. then
  164. relFile=.${file/$srcDir/}
  165. Verbose " Ignore $relFile"
  166. # update
  167. elif [[ $Update -eq 1 ]] \
  168. && [[ ! -f ${targetFile} ]]
  169. then
  170. relFile=.${file/$srcDir/}
  171. Verbose " Ignore $relFile"
  172. # copy
  173. else
  174. Copy "$srcDir" "$dir" "${file/$srcDir/}" "$src" "$name"
  175. fi
  176. done
  177. }
  178. # Parse arguments
  179. while [ $# -gt 0 ]; do
  180. case $1 in
  181. "-g" | "--group" )
  182. if [ $# -lt 2 ]; then
  183. Panic "Parameter $1 expects exactly one parameter!"
  184. fi
  185. tmp=$(readlink -m "$2")
  186. Operations+=("grp:$tmp")
  187. shift
  188. ;;
  189. "-i" | "--interface" )
  190. if [ $# -lt 3 ]; then
  191. Panic "Parameter $1 expects exactly two parameter!"
  192. fi
  193. tmp=$(readlink -m "$3")
  194. Operations+=("intf:$2:$tmp")
  195. shift
  196. shift
  197. ;;
  198. "-l" | "--library" )
  199. if [ $# -lt 3 ]; then
  200. Panic "Parameter $1 expects exactly two parameter!"
  201. fi
  202. tmp=$(readlink -m "$3")
  203. Operations+=("lib:$2:$tmp")
  204. shift
  205. shift
  206. ;;
  207. "-e" | "--executable" )
  208. if [ $# -lt 3 ]; then
  209. Panic "Parameter $1 expects exactly two parameter!"
  210. fi
  211. tmp=$(readlink -m "$3")
  212. Operations+=("exe:$2:$tmp")
  213. shift
  214. shift
  215. ;;
  216. "-m" | "--modules" )
  217. if [ $# -lt 2 ]; then
  218. Panic "Parameter $1 expects exactly one parameter!"
  219. fi
  220. CMakeModules="$2"
  221. shift
  222. ;;
  223. "-M" | "--force-modules" )
  224. if [ $# -lt 2 ]; then
  225. Panic "Parameter $1 expects exactly one parameter!"
  226. fi
  227. CMakeModules="$2"
  228. CMakeModulesForced="--force"
  229. shift
  230. ;;
  231. "-u" | "--update")
  232. Update=1
  233. ;;
  234. "-n" | "--nogit" )
  235. UseGit=0
  236. ;;
  237. "-v" | "--verbose" )
  238. Verbose=1
  239. ;;
  240. "-h" | "-?" | "--help" )
  241. PrintHelp
  242. exit 0
  243. ;;
  244. * )
  245. Panic "Invalid or unknown parameter: $1"
  246. ;;
  247. esac
  248. shift
  249. done
  250. # Execute operations
  251. for data in "${Operations[@]}"; do
  252. op=$(echo $data | awk -F: '{ print $1 }')
  253. case $op in
  254. grp)
  255. dir=$(echo $data | awk -F: '{ print $2 }')
  256. CreateGroup "$dir"
  257. ;;
  258. intf)
  259. name=$(echo $data | awk -F: '{ print $2 }')
  260. dir=$(echo $data | awk -F: '{ print $3 }')
  261. CreateProject "$name" "$dir" "libinterface"
  262. ;;
  263. lib)
  264. name=$(echo $data | awk -F: '{ print $2 }')
  265. dir=$(echo $data | awk -F: '{ print $3 }')
  266. CreateProject "$name" "$dir" "libhelloworld"
  267. ;;
  268. exe)
  269. name=$(echo $data | awk -F: '{ print $2 }')
  270. dir=$(echo $data | awk -F: '{ print $3 }')
  271. CreateProject "$name" "$dir" "helloworld"
  272. ;;
  273. *)
  274. Panic "Invalid or unknown operation: $op"
  275. ;;
  276. esac
  277. done