Purely a naming-convention change per user request, not a format
change - the output is still a real ELF shared object (-shared -fPIC),
still dlopen()-able exactly as before. .jtc ("jet compiled") marks it as
an APIServer-loadable content module rather than a generic library.
build-shared.sh: usage text and STEM derivation
(basename "$OUTPUT" .so -> .jtc) both updated - the STEM change is the
one functional piece here, everything else in this commit is comments/
usage strings. Doc comments in jetc.cpp/JetCodegen.h/host_test.cpp/
api_test.cpp updated to match.
Verified live: rebuilt jetc and all five demo*.jtc modules, reran
api_test/host_test against demo3.jtc (still resolves jetc_api_demo3/
jetc_render_demo3 and renders correctly) - the extension is purely
cosmetic to dlopen(), as expected.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
40 lines
1.3 KiB
C++
40 lines
1.3 KiB
C++
// Minimal dlsym() check for the jetc_api_<name> route-metadata export added
|
|
// alongside jetc_render_<name> in --shared mode (see JetCodegen.cpp). Proves
|
|
// a host can discover a compiled module's declared routes purely from the
|
|
// .jtc itself, with no separate manifest file - the actual point of putting
|
|
// routing metadata in an exported symbol instead of a sidecar file.
|
|
#include <dlfcn.h>
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
|
|
struct JetApiRoute { const char *method; const char *path; };
|
|
typedef const JetApiRoute *(*ApiFn)(int *count);
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc < 3) {
|
|
std::cerr << "usage: api_test <module.jtc> <api-symbol>" << std::endl;
|
|
return 1;
|
|
}
|
|
void *handle = dlopen(argv[1], RTLD_NOW);
|
|
if (!handle) {
|
|
std::cerr << "dlopen failed: " << dlerror() << std::endl;
|
|
return 1;
|
|
}
|
|
dlerror();
|
|
ApiFn api = (ApiFn)dlsym(handle, argv[2]);
|
|
const char *err = dlerror();
|
|
if (err) {
|
|
std::cerr << "dlsym failed: " << err << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
int count = -1;
|
|
const JetApiRoute *routes = api(&count);
|
|
std::cout << count << " route(s):" << std::endl;
|
|
for (int i = 0; i < count; ++i)
|
|
std::cout << " " << routes[i].method << " " << routes[i].path << std::endl;
|
|
|
|
dlclose(handle);
|
|
return 0;
|
|
}
|