summary refs log blame commit diff stats
path: root/compiler/condsyms.nim
blob: 17bb5db55ac18df596c687a957d8bad64d677cc9 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12


                               
                                         







                                                   
                                     
 


                                                                             
 
                                     
                           
 
                                    
                            
 
                                        



                                                           
 
                                      

                                  
 
                                   
            

                                  
 
                      
                                                 
                                                     
                                            





                                 
                          
                              
                                     

                                  
                


                                     
               
               
            
                         
                

                             
                                                                           
             
                               

                         
                


                         
                                     


                         
              
                             
               

                             
                         
               


                                                             
                                          
                                                              
                                      
#
#
#           The Nimrod Compiler
#        (c) Copyright 2014 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

# This module handles the conditional symbols.

import 
  strtabs, platform, strutils, idents

# We need to use a PStringTable here as defined symbols are always guaranteed
# to be style insensitive. Otherwise hell would break lose.
var gSymbols: PStringTable

proc defineSymbol*(symbol: string) = 
  gSymbols[symbol] = "true"

proc undefSymbol*(symbol: string) = 
  gSymbols[symbol] = "false"

proc isDefined*(symbol: string): bool = 
  if gSymbols.hasKey(symbol):
    result = gSymbols[symbol] == "true"
  
proc isDefined*(symbol: PIdent): bool = isDefined(symbol.s)

iterator definedSymbolNames*: string =
  for key, val in pairs(gSymbols):
    if val == "true": yield key

proc countDefinedSymbols*(): int = 
  result = 0
  for key, val in pairs(gSymbols):
    if val == "true": inc(result)

proc initDefines*() = 
  gSymbols = newStringTable(modeStyleInsensitive)
  defineSymbol("nimrod") # 'nimrod' is always defined
  # for bootstrapping purposes and old code:
  defineSymbol("nimhygiene")
  defineSymbol("niminheritable")
  defineSymbol("nimmixin")
  defineSymbol("nimeffects")
  defineSymbol("nimbabel")
  defineSymbol("nimcomputedgoto")
  defineSymbol("nimunion")
  defineSymbol("nimnewshared")
  defineSymbol("nimrequiresnimframe")
  
  # add platform specific symbols:
  case targetCPU
  of cpuI386: defineSymbol("x86")
  of cpuIa64: defineSymbol("itanium")
  of cpuAmd64: defineSymbol("x8664")
  else: discard
  case targetOS
  of osDos: 
    defineSymbol("msdos")
  of osWindows: 
    defineSymbol("mswindows")
    defineSymbol("win32")
  of osLinux, osMorphos, osSkyos, osIrix, osPalmos, osQnx, osAtari, osAix, 
     osHaiku:
    # these are all 'unix-like'
    defineSymbol("unix")
    defineSymbol("posix")
  of osSolaris: 
    defineSymbol("sunos")
    defineSymbol("unix")
    defineSymbol("posix")
  of osNetbsd, osFreebsd, osOpenbsd: 
    defineSymbol("unix")
    defineSymbol("bsd")
    defineSymbol("posix")
  of osMacos: 
    defineSymbol("macintosh")
  of osMacosx: 
    defineSymbol("macintosh")
    defineSymbol("unix")
    defineSymbol("posix")
  else: discard
  defineSymbol("cpu" & $CPU[targetCPU].bit)
  defineSymbol(normalize(EndianToStr[CPU[targetCPU].endian]))
  defineSymbol(CPU[targetCPU].name)
  defineSymbol(platform.OS[targetOS].name)
  if platform.OS[targetOS].props.contains(ospLacksThreadVars):
    defineSymbol("emulatedthreadvars")