You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

300 lines
7.4 KiB

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