diff --git a/juliac/runicc.jl b/juliac/runicc.jl index 169fdd6..101f339 100644 --- a/juliac/runicc.jl +++ b/juliac/runicc.jl @@ -2,10 +2,21 @@ module RunicC using Runic: Runic -# TODO: Why do we need this shim? Wouldn't it be possible to just compile `src/Runic.jl`? -Base.@ccallable function main()::Cint - argv = String[] - return Runic.main(argv) +# Compileable main function corresponding to `int main(int argc, char** argv)` +Base.@ccallable function main(argc::Cint, argv::Ptr{Ptr{UInt8}})::Cint + # Load command line arguments. Note that the first argument is the + # executable name so we skip it. + args = Vector{String}(undef, argc - 1) + for i in 2:argc + argptr = unsafe_load(argv, i) + arg = unsafe_string(argptr) + args[i - 1] = arg + end + # Call Runic's main function + return Runic.main(args) end +# Tell juliac about the main entrypoint +Base.Experimental.entrypoint(main, (Cint, Ptr{Ptr{UInt8}})) + end