To drive a Julia application from C, your embedding script must:
- Initialize the Julia runtime using
julia_init. - Manually set
Base.ARGS and Base.PROGRAM_FILE to match the command-line arguments passed to the executable. - Call the
@ccallable entry point. - Perform cleanup using
jl_atexit_hook.
#include "uv.h"
#include "julia.h"
JULIA_DEFINE_FAST_TLS()
int julia_main();
int main(int argc, char *argv[])
{
uv_setup_args(argc, argv);
jl_options.image_file = JULIAC_PROGRAM_LIBNAME;
julia_init(JL_IMAGE_JULIA_HOME);
jl_set_ARGS(argc, argv);
// Set PROGRAM_FILE
jl_sym_t *var = jl_symbol("PROGRAM_FILE");
jl_value_t *val = jl_cstr_to_string(argv[0]);
#if JULIA_VERSION_MAJOR == 1 && JULIA_VERSION_MINOR >= 10
jl_binding_t *bp = jl_get_binding_wr(jl_base_module, var);
jl_checked_assignment(bp, jl_base_module, var, val);
#elif JULIA_VERSION_MAJOR == 1 && JULIA_VERSION_MINOR >= 9
jl_binding_t *bp = jl_get_binding_wr(jl_base_module, var, 1);
jl_checked_assignment(bp, val);
#else
jl_set_global(jl_base_module, var, val);
#endif
// Set Base.ARGS
jl_array_t *ARGS = (jl_array_t*)jl_get_global(jl_base_module, jl_symbol("ARGS"));
jl_array_grow_end(ARGS, argc - 1);
for (int i = 1; i < argc; i++) {
jl_value_t *s = (jl_value_t*)jl_cstr_to_string(argv[i]);
jl_arrayset(ARGS, s, i - 1);
}
int ret = julia_main();
jl_atexit_hook(ret);
return ret;
}