No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

330 líneas
8.3 KiB

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