Add command line argument parsing to the Windows packaging script.
authorCarlos Alberto Enciso <carlos.alberto.enciso@gmail.com>
Fri, 9 Sep 2022 13:36:40 +0000 (14:36 +0100)
committerCarlos Alberto Enciso <carlos.alberto.enciso@gmail.com>
Fri, 9 Sep 2022 13:36:40 +0000 (14:36 +0100)
As discussed here:
https://discourse.llvm.org/t/build-llvm-release-bat-script-options

Add a function to parse command line arguments: `parse_args`.

The format for the arguments is:
  Boolean: --option
  Value:   --option<separator>value
    with `<separator>` being: space, colon, semicolon or equal sign

Command line usage example:
  my-batch-file.bat --build --type=release --version 123

It will create 3 variables:
  `build` with the value `true`
  `type` with the value `release`
  `version` with the value `123`

Usage:
  set "build="
  set "type="
  set "version="

  REM Parse arguments.
  call :parse_args %*

  if defined build (
    ...
  )
  if %type%=='release' (
    ...
  )
  if %version%=='123' (
    ...
  )

llvm/utils/release/build_llvm_release.bat

index ce94222..d0e3256 100755 (executable)
@@ -251,3 +251,63 @@ cd ..
 \r
 exit /b 0\r
 ::==============================================================================\r
+\r
+::=============================================================================\r
+:: Parse command line arguments.\r
+:: The format for the arguments is:\r
+::   Boolean: --option\r
+::   Value:   --option<separator>value\r
+::     with <separator> being: space, colon, semicolon or equal sign\r
+::\r
+:: Command line usage example:\r
+::   my-batch-file.bat --build --type=release --version 123\r
+:: It will create 3 variables:\r
+::   'build' with the value 'true'\r
+::   'type' with the value 'release'\r
+::   'version' with the value '123'\r
+::\r
+:: Usage:\r
+::   set "build="\r
+::   set "type="\r
+::   set "version="\r
+::\r
+::   REM Parse arguments.\r
+::   call :parse_args %*\r
+::\r
+::   if defined build (\r
+::     ...\r
+::   )\r
+::   if %type%=='release' (\r
+::     ...\r
+::   )\r
+::   if %version%=='123' (\r
+::     ...\r
+::   )\r
+::=============================================================================\r
+:parse_args\r
+  set "arg_name="\r
+  :parse_args_start\r
+  if "%1" == "" (\r
+    :: Set a seen boolean argument.\r
+    if "%arg_name%" neq "" (\r
+      set "%arg_name%=true"\r
+    )\r
+    goto :parse_args_done\r
+  )\r
+  set aux=%1\r
+  if "%aux:~0,2%" == "--" (\r
+    :: Set a seen boolean argument.\r
+    if "%arg_name%" neq "" (\r
+      set "%arg_name%=true"\r
+    )\r
+    set "arg_name=%aux:~2,250%"\r
+  ) else (\r
+    set "%arg_name%=%1"\r
+    set "arg_name="\r
+  )\r
+  shift\r
+  goto :parse_args_start\r
+\r
+:parse_args_done\r
+exit /b 0\r
+::==============================================================================\r