Merge pull request #4445 from Jeff-Ciesielski/jeffc/define_assignments
Add the ability to pass a value with the -d flag
This commit is contained in:
commit
689d3f75cf
11 changed files with 74 additions and 9 deletions
|
|
@ -610,7 +610,7 @@ type
|
||||||
mEqIdent, mEqNimrodNode, mSameNodeType, mGetImpl,
|
mEqIdent, mEqNimrodNode, mSameNodeType, mGetImpl,
|
||||||
mNHint, mNWarning, mNError,
|
mNHint, mNWarning, mNError,
|
||||||
mInstantiationInfo, mGetTypeInfo, mNGenSym,
|
mInstantiationInfo, mGetTypeInfo, mNGenSym,
|
||||||
mNimvm
|
mNimvm, mIntDefine, mStrDefine
|
||||||
|
|
||||||
# things that we can evaluate safely at compile time, even if not asked for it:
|
# things that we can evaluate safely at compile time, even if not asked for it:
|
||||||
const
|
const
|
||||||
|
|
|
||||||
|
|
@ -342,7 +342,11 @@ proc processSwitch(switch, arg: string, pass: TCmdLinePass, info: TLineInfo) =
|
||||||
discard "allow for backwards compatibility, but don't do anything"
|
discard "allow for backwards compatibility, but don't do anything"
|
||||||
of "define", "d":
|
of "define", "d":
|
||||||
expectArg(switch, arg, pass, info)
|
expectArg(switch, arg, pass, info)
|
||||||
defineSymbol(arg)
|
if {':', '='} in arg:
|
||||||
|
splitSwitch(arg, key, val, pass, info)
|
||||||
|
defineSymbol(key, val)
|
||||||
|
else:
|
||||||
|
defineSymbol(arg)
|
||||||
of "undef", "u":
|
of "undef", "u":
|
||||||
expectArg(switch, arg, pass, info)
|
expectArg(switch, arg, pass, info)
|
||||||
undefSymbol(arg)
|
undefSymbol(arg)
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ var gSymbols: StringTableRef
|
||||||
const
|
const
|
||||||
catNone = "false"
|
catNone = "false"
|
||||||
|
|
||||||
proc defineSymbol*(symbol: string) =
|
proc defineSymbol*(symbol: string, value: string = "true") =
|
||||||
gSymbols[symbol] = "true"
|
gSymbols[symbol] = value
|
||||||
|
|
||||||
proc undefSymbol*(symbol: string) =
|
proc undefSymbol*(symbol: string) =
|
||||||
gSymbols[symbol] = catNone
|
gSymbols[symbol] = catNone
|
||||||
|
|
@ -62,6 +62,11 @@ proc isDefined*(symbol: string): bool =
|
||||||
|
|
||||||
proc isDefined*(symbol: PIdent): bool = isDefined(symbol.s)
|
proc isDefined*(symbol: PIdent): bool = isDefined(symbol.s)
|
||||||
|
|
||||||
|
proc lookupSymbol*(symbol: string): string =
|
||||||
|
result = if isDefined(symbol): gSymbols[symbol] else: nil
|
||||||
|
|
||||||
|
proc lookupSymbol*(symbol: PIdent): string = lookupSymbol(symbol.s)
|
||||||
|
|
||||||
iterator definedSymbolNames*: string =
|
iterator definedSymbolNames*: string =
|
||||||
for key, val in pairs(gSymbols):
|
for key, val in pairs(gSymbols):
|
||||||
if val != catNone: yield key
|
if val != catNone: yield key
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,8 @@ const
|
||||||
wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal,
|
wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal,
|
||||||
wGensym, wInject, wCodegenDecl, wGuard, wGoto, wExportNims}
|
wGensym, wInject, wCodegenDecl, wGuard, wGoto, wExportNims}
|
||||||
constPragmas* = {wImportc, wExportc, wHeader, wDeprecated, wMagic, wNodecl,
|
constPragmas* = {wImportc, wExportc, wHeader, wDeprecated, wMagic, wNodecl,
|
||||||
wExtern, wImportCpp, wImportObjC, wError, wGensym, wInject, wExportNims}
|
wExtern, wImportCpp, wImportObjC, wError, wGensym, wInject, wExportNims,
|
||||||
|
wIntDefine, wStrDefine}
|
||||||
letPragmas* = varPragmas
|
letPragmas* = varPragmas
|
||||||
procTypePragmas* = {FirstCallConv..LastCallConv, wVarargs, wNosideeffect,
|
procTypePragmas* = {FirstCallConv..LastCallConv, wVarargs, wNosideeffect,
|
||||||
wThread, wRaises, wLocks, wTags, wGcSafe}
|
wThread, wRaises, wLocks, wTags, wGcSafe}
|
||||||
|
|
@ -898,6 +899,10 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int,
|
||||||
of wBase:
|
of wBase:
|
||||||
noVal(it)
|
noVal(it)
|
||||||
sym.flags.incl sfBase
|
sym.flags.incl sfBase
|
||||||
|
of wIntDefine:
|
||||||
|
sym.magic = mIntDefine
|
||||||
|
of wStrDefine:
|
||||||
|
sym.magic = mStrDefine
|
||||||
else: invalidPragma(it)
|
else: invalidPragma(it)
|
||||||
else: invalidPragma(it)
|
else: invalidPragma(it)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -640,6 +640,12 @@ proc getConstExpr(m: PSym, n: PNode): PNode =
|
||||||
of mNaN: result = newFloatNodeT(NaN, n)
|
of mNaN: result = newFloatNodeT(NaN, n)
|
||||||
of mInf: result = newFloatNodeT(Inf, n)
|
of mInf: result = newFloatNodeT(Inf, n)
|
||||||
of mNegInf: result = newFloatNodeT(NegInf, n)
|
of mNegInf: result = newFloatNodeT(NegInf, n)
|
||||||
|
of mIntDefine:
|
||||||
|
if isDefined(s.name):
|
||||||
|
result = newIntNodeT(lookupSymbol(s.name).parseInt, n)
|
||||||
|
of mStrDefine:
|
||||||
|
if isDefined(s.name):
|
||||||
|
result = newStrNodeT(lookupSymbol(s.name), n)
|
||||||
else:
|
else:
|
||||||
if sfFakeConst notin s.flags: result = copyTree(s.ast)
|
if sfFakeConst notin s.flags: result = copyTree(s.ast)
|
||||||
of {skProc, skMethod}:
|
of {skProc, skMethod}:
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ type
|
||||||
wColon, wColonColon, wEquals, wDot, wDotDot,
|
wColon, wColonColon, wEquals, wDot, wDotDot,
|
||||||
wStar, wMinus,
|
wStar, wMinus,
|
||||||
wMagic, wThread, wFinal, wProfiler, wObjChecks,
|
wMagic, wThread, wFinal, wProfiler, wObjChecks,
|
||||||
|
wIntDefine, wStrDefine,
|
||||||
|
|
||||||
wDestroy,
|
wDestroy,
|
||||||
|
|
||||||
|
|
@ -121,7 +122,7 @@ const
|
||||||
|
|
||||||
":", "::", "=", ".", "..",
|
":", "::", "=", ".", "..",
|
||||||
"*", "-",
|
"*", "-",
|
||||||
"magic", "thread", "final", "profiler", "objchecks",
|
"magic", "thread", "final", "profiler", "objchecks", "intdefine", "strdefine",
|
||||||
|
|
||||||
"destroy",
|
"destroy",
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,9 @@ Arguments:
|
||||||
arguments are passed to the program being run (if --run option is selected)
|
arguments are passed to the program being run (if --run option is selected)
|
||||||
Options:
|
Options:
|
||||||
-p, --path:PATH add path to search paths
|
-p, --path:PATH add path to search paths
|
||||||
-d, --define:SYMBOL define a conditional symbol
|
-d, --define:SYMBOL(:VAL)
|
||||||
|
define a conditional symbol
|
||||||
|
(Optionally: Define the value for that symbol)
|
||||||
-u, --undef:SYMBOL undefine a conditional symbol
|
-u, --undef:SYMBOL undefine a conditional symbol
|
||||||
-f, --forceBuild force rebuilding of all modules
|
-f, --forceBuild force rebuilding of all modules
|
||||||
--stackTrace:on|off turn stack tracing on|off
|
--stackTrace:on|off turn stack tracing on|off
|
||||||
|
|
|
||||||
|
|
@ -1011,3 +1011,30 @@ debugging:
|
||||||
|
|
||||||
# ... complex code here that produces crashes ...
|
# ... complex code here that produces crashes ...
|
||||||
|
|
||||||
|
compile time define pragmas
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
The pragmas listed here can be used to optionally accept values from
|
||||||
|
the -d/--define option at compile time.
|
||||||
|
|
||||||
|
The implementation currently provides the following possible options (various
|
||||||
|
others may be added later).
|
||||||
|
|
||||||
|
=============== ============================================
|
||||||
|
pragma description
|
||||||
|
=============== ============================================
|
||||||
|
intdefine Reads in a build-time define as an integer
|
||||||
|
strdefine Reads in a build-time define as a string
|
||||||
|
=============== ============================================
|
||||||
|
|
||||||
|
.. code-block:: nim
|
||||||
|
const FooBar {.intdefine.}: int = 5
|
||||||
|
echo FooBar
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
nim c -d:FooBar=42 foobar.c
|
||||||
|
|
||||||
|
In the above example, providing the -d flag causes the symbol
|
||||||
|
``FooBar`` to be overwritten at compile time, printing out 42. If the
|
||||||
|
``-d:FooBar=42`` were to be omitted, the default value of 5 would be
|
||||||
|
used.
|
||||||
|
|
|
||||||
10
doc/nimc.rst
10
doc/nimc.rst
|
|
@ -98,6 +98,11 @@ enable builds in release mode (``-d:release``) where certain safety checks are
|
||||||
omitted for better performance. Another common use is the ``-d:ssl`` switch to
|
omitted for better performance. Another common use is the ``-d:ssl`` switch to
|
||||||
activate `SSL sockets <sockets.html>`_.
|
activate `SSL sockets <sockets.html>`_.
|
||||||
|
|
||||||
|
Additionally, you may pass a value along with the symbol: ``-d:x=y``
|
||||||
|
which may be used in conjunction with the `compile time define
|
||||||
|
pragmas<manual.html#implementation-specific-pragmas-compile-time-define-pragmas>`_
|
||||||
|
to override symbols during build time.
|
||||||
|
|
||||||
|
|
||||||
Configuration files
|
Configuration files
|
||||||
-------------------
|
-------------------
|
||||||
|
|
@ -370,7 +375,10 @@ For example, to generate code for an `AVR`:idx: processor use this command::
|
||||||
For the ``standalone`` target one needs to provide
|
For the ``standalone`` target one needs to provide
|
||||||
a file ``panicoverride.nim``.
|
a file ``panicoverride.nim``.
|
||||||
See ``tests/manyloc/standalone/panicoverride.nim`` for an example
|
See ``tests/manyloc/standalone/panicoverride.nim`` for an example
|
||||||
implementation.
|
implementation. Additionally, users should specify the
|
||||||
|
amount of heap space to use with the ``-d:StandaloneHeapSize=<size>``
|
||||||
|
command line switch. Note that the total heap size will be
|
||||||
|
``<size> * sizeof(float64)``.
|
||||||
|
|
||||||
|
|
||||||
Nim for realtime systems
|
Nim for realtime systems
|
||||||
|
|
|
||||||
|
|
@ -150,8 +150,9 @@ elif defined(windows):
|
||||||
#VirtualFree(p, size, MEM_DECOMMIT)
|
#VirtualFree(p, size, MEM_DECOMMIT)
|
||||||
|
|
||||||
elif hostOS == "standalone":
|
elif hostOS == "standalone":
|
||||||
|
const StandaloneHeapSize {.intdefine.}: int = 1024 * PageSize
|
||||||
var
|
var
|
||||||
theHeap: array[1024*PageSize, float64] # 'float64' for alignment
|
theHeap: array[StandaloneHeapSize, float64] # 'float64' for alignment
|
||||||
bumpPointer = cast[int](addr theHeap)
|
bumpPointer = cast[int](addr theHeap)
|
||||||
|
|
||||||
proc osAllocPages(size: int): pointer {.inline.} =
|
proc osAllocPages(size: int): pointer {.inline.} =
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,14 @@ Library Additions
|
||||||
Compiler Additions
|
Compiler Additions
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
- The ``-d/--define`` flag can now optionally take a value to be used
|
||||||
|
by code at compile time.
|
||||||
|
|
||||||
Language Additions
|
Language Additions
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
- Added ``{.intdefine.}`` and ``{.strdefine.}`` macros to make use of
|
||||||
|
(optional) compile time defines.
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue