What about we define a new target kind:
{
"kind": "packaged", # probably need a better name, please propose new ones
"runtime": "crt", # the "runtime" in the proposal
"executor": { # the codegen target for relay function
# i.e. the "executor" in the proposal
"kind": "vm/aot",
...
},
"target": {
"kind": "cuda", # the target that TIR generates to
"host": {
"kind": "llvm", # the codegen target for the host-side driver code
...
}
},
}
We can provide helpers to sugar the construction of this recursive target:
def tvm.target.packaged(
target="cuda",
executor="aot",
runtime="crt",
): ...
In the common case, user only need to feed with “cuda”, because we could provide a good default. For advanced use cases, users could use the packaged API to specify their own specification for the package