Kaynağa Gözat

REXM: Add example build option

Ray 3 hafta önce
ebeveyn
işleme
a7aeb2f2b5
1 değiştirilmiş dosya ile 66 ekleme ve 20 silme
  1. 66 20
      tools/rexm/rexm.c

+ 66 - 20
tools/rexm/rexm.c

@@ -112,6 +112,7 @@ typedef enum {
     OP_REMOVE   = 4,        // Remove existing example
     OP_VALIDATE = 5,        // Validate examples, using [examples_list.txt] as main source by default
     OP_UPDATE   = 6,        // Validate and update required examples (as far as possible)
+    OP_BUILD    = 7,        // Build example for desktop and web, copy web output
 } rlExampleOperation;
 
 static const char *exCategories[REXM_MAX_EXAMPLE_CATEGORIES] = { "core", "shapes", "textures", "text", "models", "shaders", "audio", "others" };
@@ -356,6 +357,29 @@ int main(int argc, char *argv[])
 
             opCode = OP_UPDATE;
         }
+        else if (strcmp(argv[1], "build") == 0)
+        {
+            // Build example for PLATFORM_DESKTOP and PLATFORM_WEB
+            // NOTE: Build outputs to default directory, usually where the .c file is located,
+            // to avoid issues with copying resources (at least on Desktop)
+            // Web build files (.html, .wasm, .js, .data) are copied to raylib.com/examples repo
+            // Check for valid upcoming argument
+            if (argc == 2) LOG("WARNING: No example name provided to build\n");
+            else if (argc > 3) LOG("WARNING: Too many arguments provided\n");
+            else
+            {
+                // Verify example exists in collection to be removed
+                char *exColInfo = LoadFileText(exCollectionFilePath);
+                if (TextFindIndex(exColInfo, argv[2]) != -1) // Example in the collection
+                {
+                    strcpy(exName, argv[2]); // Register example name for removal
+                    strncpy(exCategory, exName, TextFindIndex(exName, "_"));
+                    opCode = OP_BUILD;
+                }
+                else LOG("WARNING: REMOVE: Example not available in the collection\n");
+                UnloadFileText(exColInfo);
+            }
+        }
     }
 
     switch (opCode)
@@ -540,25 +564,11 @@ int main(int argc, char *argv[])
             // Compile to: raylib.com/examples/<category>/<category>_example_name.wasm
             // Compile to: raylib.com/examples/<category>/<category>_example_name.js
             //------------------------------------------------------------------------------------------------
-            // TODO: Avoid platform-specific .BAT file
-            /*
-            SET RAYLIB_PATH=C:\GitHub\raylib
-            SET COMPILER_PATH=C:\raylib\w64devkit\bin
-            ENV_SET PATH=$(COMPILER_PATH)
-            SET MAKE=mingw32-make
-            $(MAKE) -f Makefile.Web shaders/shaders_deferred_render PLATFORM=$(PLATFORM) -B
-
-            //int putenv(char *string);   // putenv takes a string of the form NAME=VALUE
-            //int setenv(const char *envname, const char *envval, int overwrite);
-            //int unsetenv(const char *name); //unset variable
-            putenv("RAYLIB_DIR=C:\\GitHub\\raylib");
-            putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
-            setenv("RAYLIB_DIR", "C:\\GitHub\\raylib", 1);
-            unsetenv("RAYLIB_DIR");
-            getenv("RAYLIB_DIR");
+            //putenv("RAYLIB_DIR=C:\\GitHub\\raylib");
+            //putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
+            // WARNING: EMSDK_PATH must be set to proper location when calling from GitHub Actions
             system(TextFormat("make -f Makefile.Web  %s/%s PLATFORM=PLATFORM_WEB -B", exCategory, exName));
-            */
-            system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exCategory, exName));
+            //system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exCategory, exName));
 
             // Copy results to web side
             FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exCategory, exName),
@@ -634,8 +644,9 @@ int main(int argc, char *argv[])
             FileRemove(TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
 
             // Recompile example (on raylib side)
-            // NOTE: Tools requirements: emscripten, w64devkit
-            system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exRecategory, exRename));
+            // WARNING: EMSDK_PATH must be set to proper location when calling from GitHub Actions
+            system(TextFormat("%s/make -f Makefile.Web  %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exRecategory, exRename));
+            //system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exRecategory, exRename));
 
             // Copy results to web side
             FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exRecategory, exRename),
@@ -1133,6 +1144,41 @@ int main(int argc, char *argv[])
             //------------------------------------------------------------------------------------------------
             
         } break;
+        case OP_BUILD:
+        {
+            // Build: raylib.com/examples/<category>/<category>_example_name.html
+            // Build: raylib.com/examples/<category>/<category>_example_name.data
+            // Build: raylib.com/examples/<category>/<category>_example_name.wasm
+            // Build: raylib.com/examples/<category>/<category>_example_name.js
+            if (strcmp(exCategory, "others") != 0) // Skipping "others" category
+            {
+                // Build example for PLATFORM_DESKTOP
+                putenv("RAYLIB_DIR=C:\\GitHub\\raylib");
+                putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
+                putenv("MAKE=mingw32-make");
+
+                ChangeDirectory(exBasePath);
+                system(TextFormat("%s %s/%s PLATFORM=PLATFORM_DESKTOP -B", getenv("MAKE"), exCategory, exName));
+
+                // Build example for PLATFORM_WEB
+                system(TextFormat("%s -f Makefile.Web  %s/%s PLATFORM=PLATFORM_WEB -B", getenv("MAKE"), exCategory, exName));
+                //system(TextFormat("%s/build_example_web.bat %s/%s", exBasePath, exInfo->category, exInfo->name));
+
+                // Update generated .html metadata
+                UpdateWebMetadata(TextFormat("%s/%s/%s.html", exBasePath, exCategory, exName), 
+                    TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
+
+                // Copy results to web side
+                FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exCategory, exName),
+                    TextFormat("%s/%s/%s.html", exWebPath, exCategory, exName));
+                FileCopy(TextFormat("%s/%s/%s.data", exBasePath, exCategory, exName),
+                    TextFormat("%s/%s/%s.data", exWebPath, exCategory, exName));
+                FileCopy(TextFormat("%s/%s/%s.wasm", exBasePath, exCategory, exName),
+                    TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
+                FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exCategory, exName),
+                    TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
+            }
+        } break;
         default:    // Help
         {
             // Supported commands: