diff --git a/tools/rexm/rexm.c b/tools/rexm/rexm.c index 92f938f55..35f5b3dfd 100644 --- a/tools/rexm/rexm.c +++ b/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//_example_name.wasm // Compile to: raylib.com/examples//_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//_example_name.html + // Build: raylib.com/examples//_example_name.data + // Build: raylib.com/examples//_example_name.wasm + // Build: raylib.com/examples//_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: