REXM: Support building full example collection and categories

ADDED: Some log info
This commit is contained in:
Ray
2025-10-02 20:04:41 +02:00
parent e7d27e5b80
commit f0ffdb33f4

View File

@@ -56,7 +56,7 @@
#define SUPPORT_LOG_INFO
#if defined(SUPPORT_LOG_INFO) && defined(_DEBUG)
#define LOG(...) printf(__VA_ARGS__)
#define LOG(...) printf("REXM: "__VA_ARGS__)
#else
#define LOG(...)
#endif
@@ -221,10 +221,12 @@ int main(int argc, char *argv[])
char exRecategory[32] = { 0 }; // Example re-name category: shapes
char exRename[64] = { 0 }; // Example re-name, without extension
char exRebuildRequested[16] = { 0 }; // Example category/full rebuild request
int opCode = OP_NONE; // Operation code: 0-None(Help), 1-Create, 2-Add, 3-Rename, 4-Remove
bool verbose = false; // Flag for verbose log info
// Command-line usage mode
// Command-line usage mode: command args processing
//--------------------------------------------------------------------------------------
if (argc > 1)
{
@@ -386,6 +388,14 @@ int main(int argc, char *argv[])
if (argc == 2) LOG("WARNING: No example name provided to build\n");
else if (argc > 3) LOG("WARNING: Too many arguments provided\n");
else
{
// Support building not only individual examples but categories and "ALL"
if ((strcmp(argv[2], "ALL") == 0) || TextInList(argv[2], exCategories, REXM_MAX_EXAMPLE_CATEGORIES))
{
// Category/ALL rebuilt requested
strcpy(exRebuildRequested, argv[2]);
}
else
{
// Verify example exists in collection to be removed
char *exColInfo = LoadFileText(exCollectionFilePath);
@@ -395,10 +405,11 @@ int main(int argc, char *argv[])
strncpy(exCategory, exName, TextFindIndex(exName, "_"));
opCode = OP_BUILD;
}
else LOG("WARNING: BUILD: Example not available in the collection\n");
else LOG("WARNING: BUILD: Example requested not available in the collection\n");
UnloadFileText(exColInfo);
}
}
}
// Check for verbose log mode request
for (int i = 1; i < argc; i++)
@@ -407,10 +418,14 @@ int main(int argc, char *argv[])
}
}
// Command-line usage mode: command execution
switch (opCode)
{
case OP_CREATE: // Create: New example from template
{
LOG("INFO: Command requested: CREATE\n");
LOG("INFO: Example to create: %s\n", exName);
// Create: raylib/examples/<category>/<category>_example_name.c
char *exText = LoadFileText(exTemplateFilePath);
char *exTextUpdated[6] = { 0 };
@@ -430,6 +445,9 @@ int main(int argc, char *argv[])
}
case OP_ADD: // Add: Example from command-line input filename
{
if (opCode != OP_CREATE) LOG("INFO: Command requested: ADD\n");
LOG("INFO: Example file to be added: %s\n", inFileName);
// Add: raylib/examples/<category>/<category>_example_name.c
if (opCode != OP_CREATE) FileCopy(inFileName, TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName));
@@ -629,6 +647,9 @@ int main(int argc, char *argv[])
} break;
case OP_RENAME: // Rename
{
LOG("INFO: Command requested: RENAME\n");
LOG("INFO: Example to be renamed: %s --> %s\n", exName, exRename);
// NOTE: At this point provided values have been validated:
// exName, exCategory, exRename, exRecategory
if (strcmp(exCategory, exRecategory) == 0)
@@ -740,6 +761,9 @@ int main(int argc, char *argv[])
} break;
case OP_REMOVE: // Remove
{
LOG("INFO: Command requested: REMOVE\n");
LOG("INFO: Example to be removed: %s\n", exName);
// Remove example from collection for files update
//------------------------------------------------------------------------------------------------
char *exCollectionList = LoadFileText(exCollectionFilePath);
@@ -818,10 +842,70 @@ int main(int argc, char *argv[])
FileRemove(TextFormat("%s/%s/%s.wasm", exWebPath, exCategory, exName));
FileRemove(TextFormat("%s/%s/%s.js", exWebPath, exCategory, exName));
} break;
case OP_BUILD:
{
LOG("INFO: Command requested: BUILD\n");
LOG("INFO: Example to be built: %s\n", exRebuildRequested);
if ((strcmp(exRebuildRequested, "others") != 0) &&
(strcmp(exCategory, "others") != 0)) // Skipping "others" category for rebuild: Special needs
{
int exRebuildCount = 0;
rlExampleInfo *exRebuildList = LoadExamplesData(exCollectionFilePath, exRebuildRequested, false, &exRebuildCount);
// 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 defined(_WIN32)
// Set required environment variables
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
//putenv("MAKE=mingw32-make");
//ChangeDirectory(exBasePath);
#endif
for (int i = 0; i < exRebuildCount; i++)
{
// Build example for PLATFORM_DESKTOP
#if defined(_WIN32)
system(TextFormat("mingw32-make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
#else
system(TextFormat("make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
#endif
// Build example for PLATFORM_WEB
#if defined(_WIN32)
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
#else
system(TextFormat("make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
#endif
// Update generated .html metadata
UpdateWebMetadata(TextFormat("%s/%s/%s.html", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
TextFormat("%s/%s/%s.c", exBasePath, exRebuildList[i].category, exRebuildList[i].name));
// Copy results to web side
FileCopy(TextFormat("%s/%s/%s.html", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
TextFormat("%s/%s/%s.html", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
FileCopy(TextFormat("%s/%s/%s.data", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
TextFormat("%s/%s/%s.data", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
FileCopy(TextFormat("%s/%s/%s.wasm", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
TextFormat("%s/%s/%s.wasm", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exRebuildList[i].category, exRebuildList[i].name),
TextFormat("%s/%s/%s.js", exWebPath, exRebuildList[i].category, exRebuildList[i].name));
}
UnloadExamplesData(exRebuildList);
}
else LOG("WARNING: [others] category examples should be build manually, they could have specific build requirements\n");
} break;
case OP_VALIDATE: // Validate: report and actions
case OP_UPDATE:
{
LOG("INFO: Command requested: %s\n", (opCode == OP_VALIDATE)? "VALIDATE" : "UPDATE");
LOG("INFO: Example collection is being %s\n", (opCode == OP_VALIDATE)? "validated" : "validated and updated");
/*
// Validation flags available:
VALID_MISSING_C
@@ -1285,48 +1369,6 @@ 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
#if defined(_WIN32)
//putenv(TextFormat("RAYLIB_DIR=%s\\..", exBasePath));
putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
//putenv("MAKE=mingw32-make");
//ChangeDirectory(exBasePath);
system(TextFormat("mingw32-make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
#else
system(TextFormat("make -C %s %s/%s PLATFORM=PLATFORM_DESKTOP -B", exBasePath, exCategory, exName));
#endif
// Build example for PLATFORM_WEB
#if defined(_WIN32)
putenv("PATH=%PATH%;C:\\raylib\\w64devkit\\bin");
system(TextFormat("mingw32-make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exCategory, exName));
#else
system(TextFormat("make -C %s -f Makefile.Web %s/%s PLATFORM=PLATFORM_WEB -B", exBasePath, exCategory, exName));
#endif
// 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: