Преглед изворни кода

fbt: add `fap_deploy` target to build and copy all .fap apps to flipper (#2146)

* fbt: add `faps_copy` target to build and copy all .fap apps to flipper
* fbt: restore default runfap.py invocation behavior, use -n for copy only
* fbt: proper implementation of fap_deploy target

Co-authored-by: hedger <hedger@nanode.su>
Stephen Kent пре 3 година
родитељ
комит
d2df35a35b
4 измењених фајлова са 39 додато и 7 уклоњено
  1. 14 2
      .vscode/example/tasks.json
  2. 8 0
      SConstruct
  3. 2 0
      scripts/fbt_tools/fbt_help.py
  4. 15 5
      scripts/runfap.py

+ 14 - 2
.vscode/example/tasks.json

@@ -138,6 +138,18 @@
                 "Serial Console"
             ]
         },
+        {
+            "label": "[Debug] Build and upload all FAPs to Flipper over USB",
+            "group": "build",
+            "type": "shell",
+            "command": "./fbt fap_deploy"
+        },
+        {
+            "label": "[Release] Build and upload all FAPs to Flipper over USB",
+            "group": "build",
+            "type": "shell",
+            "command": "./fbt COMPACT=1 DEBUG=0 fap_deploy"
+        },
         {
             // Press Ctrl+] to quit
             "label": "Serial Console",
@@ -145,7 +157,7 @@
             "command": "./fbt cli",
             "group": "none",
             "isBackground": true,
-			"options": {
+            "options": {
                 "env": {
                     "FBT_NO_SYNC": "0"
                 }
@@ -162,4 +174,4 @@
             }
         }
     ]
-}
+}

+ 8 - 0
SConstruct

@@ -165,6 +165,14 @@ Alias("fap_dist", fap_dist)
 
 distenv.Depends(firmware_env["FW_RESOURCES"], firmware_env["FW_EXTAPPS"].resources_dist)
 
+# Copy all faps to device
+
+fap_deploy = distenv.PhonyTarget(
+    "fap_deploy",
+    "${PYTHON3} ${ROOT_DIR}/scripts/storage.py send ${SOURCE} /ext/apps",
+    source=Dir("#/assets/resources/apps"),
+)
+
 
 # Target for bundling core2 package for qFlipper
 copro_dist = distenv.CoproBuilder(

+ 2 - 0
scripts/fbt_tools/fbt_help.py

@@ -11,6 +11,8 @@ Building:
         Build all FAP apps
     fap_{APPID}, launch_app APPSRC={APPID}:
         Build FAP app with appid={APPID}; upload & start it over USB
+    fap_deploy:
+        Build and upload all FAP apps over USB
 
 Flashing & debugging:
     flash, flash_blackmagic, jflash:

+ 15 - 5
scripts/runfap.py

@@ -15,6 +15,13 @@ import serial.tools.list_ports as list_ports
 class Main(App):
     def init(self):
         self.parser.add_argument("-p", "--port", help="CDC Port", default="auto")
+        self.parser.add_argument(
+            "-n",
+            "--no-launch",
+            dest="launch_app",
+            action="store_false",
+            help="Don't launch app",
+        )
 
         self.parser.add_argument("fap_src_path", help="App file to upload")
         self.parser.add_argument(
@@ -84,11 +91,14 @@ class Main(App):
                 self.logger.error(f"Error: upload failed: {storage.last_error}")
                 return -3
 
-            storage.send_and_wait_eol(f'loader open "Applications" {fap_dst_path}\r')
-            result = storage.read.until(storage.CLI_EOL)
-            if len(result):
-                self.logger.error(f"Unexpected response: {result.decode('ascii')}")
-                return -4
+            if self.args.launch_app:
+                storage.send_and_wait_eol(
+                    f'loader open "Applications" {fap_dst_path}\r'
+                )
+                result = storage.read.until(storage.CLI_EOL)
+                if len(result):
+                    self.logger.error(f"Unexpected response: {result.decode('ascii')}")
+                    return -4
 
             return 0
         finally: