Normally no, because Nim is statically compiled. I found workaround with a macro and compile-time define pragma. Posting for future reference.
Add where the include statement will be generated:
prog.nim nim
# Dynamically generate "include url_<projectname>.nim" via -d: argument on command-line during compile-time
# See: script lx
# https://nim-lang.org/docs/manual.html#implementation-specific-pragmas-compileminustime-define-pragmas
# https://stackoverflow.com/questions/67170501/how-can-i-include-a-file-via-a-variables-value
#
macro generateInclude(arg: static[string]): untyped =
newTree(nnkIncludeStmt, newLit(arg))
const include_urlc {.strdefine.}: string = "url_SKELETON.nim" # default if no project name defined
const include_urlc_path = include_urlc
generateInclude(include_urlc_path)
Compile script lx.awk (extract):
awk
if(length(ARGV[1]) > 0) {
if(checkexists("url_" ARGV[1] ".nim") > 0)
out = "-d:include_urlc=url_" ARGV[1] ".nim --out:prog-" ARGV[1]
else
out = "--out:prog-" ARGV[1]
}
The script is run like ./lx projname with "projname" given on ARGV[1] which will --out: a binary named prog-projname .. it checks for existence of filename url_projname.nim and if found adds a compile option -d:include_urlc=url_projname.nim which is then picked up by prog.nim via a compile-time define pragma to create a statement via the macro generateInclude to include that file.
Thus it is possible to dynamically include during compile.