Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

378 rader
9.8 KiB

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