[Silabs] Add user configurable paths for board configuration files (#28019)

* Add option of user to configure silabs_pre_gen or slc_gen paths

* slc_gen_path can be in efr32_sdk.gni

* Fix pathing issue, use the active python3 installation on any env. Make sure slc has a configured and trusted gsdk set
diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml
index 141033f..59d4d7f 100644
--- a/.github/workflows/examples-efr32.yaml
+++ b/.github/workflows/examples-efr32.yaml
@@ -55,12 +55,12 @@
         with:
           gh-context: ${{ toJson(github) }}
 
-# - name: Test SLC gen
-      #   timeout-minutes: 30
-      #   run: |
-      #     scripts/examples/gn_silabs_example.sh examples/lighting-app/silabs ./out/light-app BRD4187C --slc_generate --docker
-      #     scripts/examples/gn_silabs_example.sh examples/lighting-app/silabs ./out/light-app BRD4164A --slc_generate --docker
-      #     rm -rf ./out/
+      - name: Test SLC gen
+        timeout-minutes: 30
+        run: |
+           scripts/examples/gn_silabs_example.sh examples/lighting-app/silabs ./out/light-app BRD4187C --slc_generate --docker
+           scripts/examples/gn_silabs_example.sh examples/lighting-app/silabs ./out/light-app BRD4164A --slc_generate --docker
+           rm -rf ./out/
       - name: Build some BRD4187C variants
         run: |
           ./scripts/run_in_build_env.sh \
diff --git a/examples/lighting-app/silabs/BUILD.gn b/examples/lighting-app/silabs/BUILD.gn
index ded0e41..63a206e 100644
--- a/examples/lighting-app/silabs/BUILD.gn
+++ b/examples/lighting-app/silabs/BUILD.gn
@@ -60,6 +60,7 @@
                       "${use_wstk_leds}",
                       "${use_external_flash}",
                       "${silabs_mcu}",
+                      rebase_path(slc_gen_path),
                     ],
                     "list lines"))
 }
diff --git a/examples/smoke-co-alarm-app/silabs/BUILD.gn b/examples/smoke-co-alarm-app/silabs/BUILD.gn
index d4ebe73..cafd4b6 100644
--- a/examples/smoke-co-alarm-app/silabs/BUILD.gn
+++ b/examples/smoke-co-alarm-app/silabs/BUILD.gn
@@ -60,6 +60,7 @@
                       "${use_wstk_leds}",
                       "${use_external_flash}",
                       "${silabs_mcu}",
+                      rebase_path(slc_gen_path),
                     ],
                     "list lines"))
 }
diff --git a/scripts/examples/gn_silabs_example.sh b/scripts/examples/gn_silabs_example.sh
index 1f181fc..f966ceb 100755
--- a/scripts/examples/gn_silabs_example.sh
+++ b/scripts/examples/gn_silabs_example.sh
@@ -98,6 +98,12 @@
             Periodic query timeout variable for OTA in seconds
         rs91x_wpa3_transition
             Support for WPA3 transition mode on RS91x
+        slc_gen_path
+            Allow users to define a path where slc generates board files. (requires --slc_generate or --slc_reuse_files)
+            (default: /third_party/silabs/slc_gen/<board>/)
+        sl_pre_gen_path
+            Allow users to define a path to pre-generated board files
+            (default: /third_party/silabs/matter_support/matter/<family>/<board>/)
         sl_matter_version
             Use provided software version at build time
         sl_matter_version_str
@@ -281,7 +287,6 @@
     fi
 
     if [ "$USE_SLC" == true ]; then
-        PYTHON_PATH="/usr/bin/python3"
         if [ "$GN_PATH_PROVIDED" == false ]; then
             GN_PATH=./.environment/cipd/packages/pigweed/gn
         fi
@@ -289,9 +294,9 @@
         # Activation needs to be after SLC generation which is done in gn gen.
         # Zap generation requires activation and is done in the build phase
         source "$CHIP_ROOT/scripts/activate.sh"
-        PYTHON_PATH=$VIRTUAL_ENV"/bin/python3"
     fi
 
+    PYTHON_PATH="$(which python3)"
     BUILD_DIR=$OUTDIR/$SILABS_BOARD
     echo BUILD_DIR="$BUILD_DIR"
 
diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni
index 11aa2d0..3267d87 100644
--- a/third_party/silabs/efr32_sdk.gni
+++ b/third_party/silabs/efr32_sdk.gni
@@ -56,7 +56,6 @@
   # Argument to enable IPv4 for wifi
   # aligning to match chip_inet_config_enable_ipv4 default configuration
   chip_enable_wifi_ipv4 = false
-  silabs_gen_folder = ""
 
   # Calls SLC-CLI at run time
   slc_generate = false
@@ -72,14 +71,20 @@
   sl_ot_efr32_root =
       "${efr32_sdk_root}/protocol/openthread/platform-abstraction/efr32"
   sl_openthread_root = "${efr32_sdk_root}/util/third_party/openthread"
+
+  # board related pre-generated files path (default)
+  sl_pre_gen_path =
+      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/"
+
+  # board related generated files path (used if slc_generate or slc_reuse_files is set)
+  slc_gen_path = "${chip_root}/third_party/silabs/slc_gen/${silabs_board}/"
 }
 
 if (slc_generate || slc_reuse_files) {
-  silabs_gen_folder = "${chip_root}/third_party/silabs/slc_gen/${silabs_board}/"
+  silabs_gen_folder = slc_gen_path
 } else {
   print("Using pre-generate files")
-  silabs_gen_folder =
-      "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/"
+  silabs_gen_folder = sl_pre_gen_path
 }
 
 # Defines an efr32 SDK build target.
diff --git a/third_party/silabs/slc_gen/run_slc.py b/third_party/silabs/slc_gen/run_slc.py
index 87a481e..4ec7f59 100644
--- a/third_party/silabs/slc_gen/run_slc.py
+++ b/third_party/silabs/slc_gen/run_slc.py
@@ -4,7 +4,7 @@
 import subprocess
 import sys
 
-if len(sys.argv) != 8:
+if len(sys.argv) != 9:
     print("wrong number of arguments")
     sys.exit(1)
 
@@ -27,10 +27,10 @@
 use_wstk_leds = asBoolean(sys.argv[5])
 use_external_flash = asBoolean(sys.argv[6])
 silabs_mcu = str(sys.argv[7])
+output_path = str(sys.argv[8])
 
 slcp_file_path = os.path.join(root_path, "examples/platform/silabs/matter-platform.slcp")
 template_path = os.path.join(root_path, "third_party/silabs/slc_gen/")
-output_path = template_path + sys.argv[2] + '/'
 
 slc_arguments = ""
 
@@ -58,6 +58,16 @@
 
 print(slc_arguments)
 
+if "GSDK_ROOT" in os.environ:
+    gsdk_root = os.getenv('GSDK_ROOT')
+else:
+    # If no gsdk path is set in the environment, use the standard path to the submodule
+    gsdk_root = os.path.join(root_path, "third_party/silabs/gecko_sdk/")
+
+# make sure we have a configured and trusted gsdk in slc
+subprocess.run(["slc", "configuration", "--sdk", gsdk_root], check=True)
+subprocess.run(["slc", "signature", "trust", "--sdk", gsdk_root], check=True)
+
 subprocess.run(["slc", "generate", slcp_file_path, "-d", output_path, "--with", slc_arguments], check=True)
 
 # cleanup of unwanted files