⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jambase

📁 C++的一个好库。。。现在很流行
💻
📖 第 1 页 / 共 4 页
字号:
#
# /+\
# +\    Copyright 1993, 2000 Christopher Seiwald.
# \+/
#
# This file is part of Jam - see jam.c for Copyright information.
#

# This file is ALSO:
# Copyright 2001-2004 David Abrahams.
# Copyright 2002-2004 Rene Rivera.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

if $(NT)
{
    SLASH ?= \\ ;
}
SLASH ?= / ;

# Glob for patterns in the directories starting from the given
# start directory, up to and including the root of the file-system.
# We stop globbing as soon as we find at least one match.
#
rule find-to-root ( dir : patterns + )
{
    local globs = [ GLOB $(dir) : $(patterns) ] ;
    while ! $(globs) && $(dir:P) != $(dir)
    {
        dir = $(dir:P) ;
        globs = [ GLOB $(dir) : $(patterns) ] ;
    }
    return $(globs) ;
}

# This global will hold the location of the user's boost-build.jam file.
.boost-build-file = ;

# This global will hold the location of the build system bootstrap file.
.bootstrap-file = ;

# Remember the value of $(BOOST_BUILD_PATH) supplied to us by the user.
BOOST_BUILD_PATH.user-value = $(BOOST_BUILD_PATH) ;

# On Unix only, when BOOST_BUILD_PATH is not supplied by user, put
# sensible default value. This allowes Boost.Build to work without
# any environment variables, which is good in itself and also
# required by Debian Policy.
if ! $(BOOST_BUILD_PATH) && $(UNIX)
{
    BOOST_BUILD_PATH = /usr/share/boost-build ;
}

    
rule _poke ( module-name ? : variables + : value * )
{
    module $(<)
    {
        $(>) = $(3) ;
    }
}

# This rule can be invoked from an optional user's boost-build.jam
# file to both indicate where to find the build system files, and to
# load them. The path indicated is relative to the location of the
# boost-build.jam file. 
#
rule boost-build ( dir ? )
{
    if $(.bootstrap-file)
    {
        EXIT "Error: Illegal attempt to re-bootstrap the build system by invoking" ;
        ECHO ;
        ECHO "   'boost-build" $(dir) ";'" ;
        ECHO ;
        EXIT "Please consult the documentation at 'http://www.boost.org'." ;
    }
    
    # Add the given directory to the path so we can find the build
    # system. If dir is empty, has no effect.
    #
    BOOST_BUILD_PATH = $(dir:R=$(.boost-build-file:D)) $(BOOST_BUILD_PATH) ;
    
    # We might have just modified the *global* value of BOOST_BUILD_PATH.
    # The code that loads the rest of Boost.Build, in particular the 
    # site-config.jam and user-config.jam files uses os.environ, so we need to
    # update the value there.    
    _poke .ENVIRON : BOOST_BUILD_PATH : $(BOOST_BUILD_PATH) ;
            
    # Try to find the build system bootstrap file 'bootstrap.jam'.
    #
    local bootstrap-file =
        [ GLOB $(BOOST_BUILD_PATH) : bootstrap.jam ] ;
    .bootstrap-file = $(bootstrap-file[1]) ;
            
    # There is no boost-build.jam we can find, exit with an error
    #
    if ! $(.bootstrap-file)
    {
        ECHO "Unable to load Boost.Build: could not find build system." ;
        ECHO --------------------------------------------------------- ;
        ECHO "$(.boost-build-file) attempted to load the build system by invoking" ;
        ECHO ;
        ECHO "   'boost-build" $(dir) ";'" ;
        ECHO ;
        ECHO "but we were unable to find \"bootstrap.jam\" in the specified directory" ;
        ECHO "or in BOOST_BUILD_PATH (searching "$(BOOST_BUILD_PATH:J=", ")")." ;
        ECHO ;
        EXIT "Please consult the documentation at 'http://www.boost.org'." ;
    }
    
    if [ MATCH .*(--debug-configuration).* : $(ARGV) ]
    {
        ECHO "notice: loading Boost.Build from" 
          [ NORMALIZE_PATH $(.bootstrap-file:D) ] ;
    }
           
    # Load the build system, now that we know where to start from.
    #
    include $(.bootstrap-file) ;
}


if [ MATCH .*(bjam).* : $(ARGV[1]:BL) ]
  || $(BOOST_ROOT)    # A temporary measure so Jam works with Boost.Build v1
{
    # We attempt to load "boost-build.jam" by searching from the current invocation directory
    # up to the root of the file-system.
    #
    # boost-build.jam is expected to invoke the "boost-build" rule to
    # load the Boost.Build files.
    
    local search-path = $(BOOST_BUILD_PATH) $(BOOST_ROOT) ;
    
    local boost-build-files =
        [ find-to-root [ PWD ] : boost-build.jam ]
        # Another temporary measure so Jam works with Boost.Build v1
        [ GLOB $(search-path) : boost-build.jam ] ;
    
    .boost-build-file = $(boost-build-files[1]) ;
            
    # There is no boost-build.jam we can find, exit with an error, and information.
    #
    if ! $(.boost-build-file)
    {
        ECHO "Unable to load Boost.Build: could not find \"boost-build.jam\"" ;
        ECHO --------------------------------------------------------------- ;
        
        if ! [ MATCH .*(bjam).* : $(ARGV[1]:BL) ]
        {
            ECHO "BOOST_ROOT must be set, either in the environment, or " ;
            ECHO "on the command-line with -sBOOST_ROOT=..., to the root" ;
            ECHO "of the boost installation." ;
            ECHO ;
        }

        ECHO "Attempted search from" [ PWD ] "up to the root" ;
        ECHO "and in these directories from BOOST_BUILD_PATH and BOOST_ROOT: "$(search-path:J=", ")"." ;
        EXIT "Please consult the documentation at 'http://www.boost.org'." ;
    }
    
    if [ MATCH .*(--debug-configuration).* : $(ARGV) ]      
    {
        ECHO "notice: found boost-build.jam at" 
             [ NORMALIZE_PATH $(.boost-build-file) ] ;
    }
    
    # Now load the boost-build.jam to get the build system loaded. This
    # incidentaly loads the users jamfile and attempts to build targets.
    #
    # We also set it up so we can tell wether we are loading the new V2
    # system or the the old V1 system.
    #
    include $(.boost-build-file) ;
    
    # Check that, at minimum, the bootstrap file was found.
    #
    if ! $(.bootstrap-file)
    {
        ECHO "Unable to load Boost.Build" ;
        ECHO -------------------------- ;
        ECHO "\"$(.boost-build-file)\" was found by searching from" [ PWD ] "up to the root" ;
        ECHO "and in these directories from BOOST_BUILD_PATH and BOOST_ROOT: "$(search-path:J=", ")"." ;
        ECHO ;
        ECHO "However, it failed to call the \"boost-build\" rule to indicate" ;
        ECHO "the location of the build system." ;
        ECHO ;
        EXIT "Please consult the documentation at 'http://www.boost.org'." ;
    }
}
else
{

#
# JAMBASE - jam 2.3 ruleset providing make(1)-like functionality
#
# Supports UNIX, NT, and VMS.
#
# 12/27/93 (seiwald) - purturb library sources with SOURCE_GRIST
# 04/18/94 (seiwald) - use '?=' when setting OS specific vars
# 04/21/94 (seiwald) - do RmTemps together
# 05/05/94 (seiwald) - all supported C compilers support -o: relegate
#              RELOCATE as an option; set Ranlib to "" to disable it
# 06/01/94 (seiwald) - new 'actions existing' to do existing sources
# 08/25/94 (seiwald) - new ObjectCcFlags rule to append to per-target CCFLAGS
# 08/29/94 (seiwald) - new ObjectHdrs rule to append to per-target HDRS
# 09/19/94 (seiwald) - LinkLibraries and Undefs now append
#            - Rule names downshifted.
# 10/06/94 (seiwald) - Dumb yyacc stuff moved into Jamfile.
# 10/14/94 (seiwald) - (Crude) support for .s, .C, .cc, .cpp, and .f files.
# 01/08/95 (seiwald) - Shell now handled with awk, not sed
# 01/09/95 (seiwald) - Install* now take dest directory as target
# 01/10/95 (seiwald) - All entries sorted.
# 01/10/95 (seiwald) - NT support moved in, with LauraW's help.  
# 01/10/95 (seiwald) - VMS support moved in.
# 02/06/95 (seiwald) - ObjectC++Flags and SubDirC++Flags added.
# 02/07/95 (seiwald) - Iron out when HDRSEARCH uses "" or SEARCH_SOURCE.
# 02/08/95 (seiwald) - SubDir works on VMS.
# 02/14/95 (seiwald) - MkDir and entourage.
# 04/30/95 (seiwald) - Use install -c flag so that it copies, not moves.
# 07/10/95 (taylor) - Support for Microsoft C++.
# 11/21/96 (peterk) - Support for BeOS
# 07/19/99 (sickel) - Support for Mac OS X Server (and maybe client)
# 02/18/00 (belmonte)- Support for Cygwin.

# Special targets defined in this file:
#
# all       - parent of first, shell, files, lib, exe
# first     - first dependent of 'all', for potential initialization
# shell     - parent of all Shell targets 
# files     - parent of all File targets
# lib       - parent of all Library targets
# exe       - parent of all Main targets
# dirs      - parent of all MkDir targets
# clean     - removes all Shell, File, Library, and Main targets
# uninstall - removes all Install targets
#   

# Rules defined by this file:
#
# as obj.o : source.s ;         .s -> .o
# Bulk dir : files ;            populate directory with many files
# Cc obj.o : source.c ;         .c -> .o
# C++ obj.o : source.cc ;       .cc -> .o
# Clean clean : sources ;       remove sources with 'jam clean'
# File dest : source ;          copy file
# Fortran obj.o : source.f ;        .f -> .o
# GenFile source.c : program args ; make custom file
# Hardlink target : source ;        make link from source to target
# HdrRule source : headers ;        handle #includes
# InstallInto dir : sources ;       install any files
# InstallBin dir : sources ;        install binaries
# InstallLib dir : sources ;        install files
# InstallFile dir : sources ;       install files
# InstallMan dir : sources ;        install man pages
# InstallShell dir : sources ;      install shell scripts
# Lex source.c : source.l ;     .l -> .c
# Library lib : source ;        archive library from compiled sources
# LibraryFromObjects lib : objects ;    archive library from objects
# LinkLibraries images : libraries ;    bag libraries onto Mains
# Main image : source ;         link executable from compiled sources
# MainFromObjects image : objects ; link executable from objects
# MkDir dir ;               make a directory, if not there
# Object object : source ;      compile object from source
# ObjectCcFlags source : flags ;    add compiler flags for object
# ObjectC++Flags source : flags ;   add compiler flags for object
# ObjectHdrs source : dirs ;        add include directories for object
# Objects sources ;         compile sources
# RmTemps target : sources ;        remove temp sources after target made
# Setuid images ;           mark executables Setuid
# SubDir TOP d1 d2 ... ;        start a subdirectory Jamfile
# SubDirCcFlags flags ;         add compiler flags until next SubDir
# SubDirC++Flags flags ;        add compiler flags until next SubDir
# SubDirHdrs dirs ;         add include dirs until next SubDir
# SubInclude TOP d1 d2 ... ;        include a subdirectory Jamfile
# Shell exe : source ;          make a shell executable
# Undefines images : symbols ;      save undef's for linking
# UserObject object : source ;      handle unknown suffixes for Object
# Yacc source.c : source.y ;        .y -> .c
#
# Utility rules that have no side effects (not supported):
#
# FAppendSuffix f1 f2 ... : $(SUF) ;    return $(<) with suffixes
# FConcat value ... ;               return contatenated values
# FDirName d1 d2 ... ;          return path from root to dir
# FGrist d1 d2 ... ;            return d1!d2!...
# FGristFiles value ;           return $(value:G=$(SOURCE_GRIST))
# FGristSourceFiles value ;     return $(value:G=$(SOURCE_GRIST))
# FRelPath d1 : d2 ;            return rel path from d1 to d2
# FSubDir d1 d2 ... ;           return path to root
#


# Brief review of the jam language:
#
# Statements:
#   rule RULE - statements to process a rule
#   actions RULE - system commands to carry out target update
#
# Modifiers on actions:
#   together - multiple instances of same rule on target get executed
#          once with their sources ($(>)) concatenated
#   updated - refers to updated sources ($(>)) only
#   ignore - ignore return status of command
#   quietly - don't trace its execution unless verbose
#   piecemeal - iterate command each time with a small subset of $(>)
#   existing - refers to currently existing sources ($(>)) only
#   bind vars - subject to binding before expanding in actions
#
# Special rules:
#   ALWAYS - always build a target
#   DEPENDS - builds the dependency graph
#   ECHO - blurt out targets on stdout
#   EXIT - blurt out targets and exit
#   INCLUDES - marks sources as headers for target (a codependency)
#   NOCARE - don't panic if the target can't be built
#   NOUPDATE - create the target if needed but never update it 
#   NOTFILE - ignore the timestamp of the target (it's not a file)
#   TEMPORARY - target need not be present if sources haven't changed
#
# Special variables set by jam:
#   $(<) - targets of a rule (to the left of the :)
#   $(>) - sources of a rule (to the right of the :)
#   $(xxx) - true on xxx (UNIX, VMS, NT, OS2, MAC)
#   $(OS) - name of OS - varies wildly
#   $(JAMVERSION) - version number (2.3)
#
# Special variables used by jam:
#   SEARCH - where to find something (used during binding and actions)
#   LOCATE - where to plop something not found with SEARCH
#   HDRRULE - rule to call to handle include files
#   HDRSCAN - egrep regex to extract include files
#
# Special targets:
#   all - default if none given on command line
#

# Initialize variables
#

#
# OS specific variable settings
#
if $(NT)
{
    # the list of supported toolsets on Windows NT and Windows 95/98
    #
    local SUPPORTED_TOOLSETS = "BORLANDC" "VC7" "VISUALC" "VISUALC16" "INTELC" "WATCOM"
                               "MINGW" "LCC" ;
  
    # this variable holds the current toolset
    #
    TOOLSET = "" ;
    
    # if the JAM_TOOLSET environment variable is defined, check that it is
    # one of our supported values
    #
    if $(JAM_TOOLSET)
    {
      local t ;
      
      for t in $(SUPPORTED_TOOLSETS)
      {
        $(t) = $($(t):J=" ") ; # reconstitute paths with spaces in them
        if $(t) = $(JAM_TOOLSET) { TOOLSET = $(t) ; }
      }
      
      if ! $(TOOLSET)
      {
        ECHO  "The JAM_TOOLSET environment variable is defined but its value" ;
        ECHO  "is invalid, please use one of the following:" ;
        ECHO  ;
        
        for t in $(SUPPORTED_TOOLSETS) { ECHO "  " $(t) ; }
        EXIT ;
      }
    }
    
    # if TOOLSET is empty, we'll try to detect the toolset from other
    # environment variables to remain backwards compatible with Jam 2.3
    #
    if ! $(TOOLSET)
    {
      if $(BCCROOT)
      {
        TOOLSET  = BORLANDC ;
        BORLANDC = $(BCCROOT:J=" ") ;
      }
      else if $(MSVC)
      {
        TOOLSET   = VISUALC16 ;
        VISUALC16 = $(MSVC:J=" ") ;
      }
      else if $(MSVCNT)
      {
        TOOLSET = VISUALC ;
        VISUALC = $(MSVCNT:J=" ") ;
      }
      else if $(MSVCDir)
      {
        TOOLSET = VISUALC ;
        VISUALC = $(MSVCDir:J=" ") ;
      }
      else if $(MINGW)
      {
        TOOLSET = MINGW ;
      }
      else
      {
        ECHO  "Jam cannot be run because, either:" ;
        ECHO  "   a. You didn't set BOOST_ROOT to indicate the root of your" ;
        ECHO  "      Boost installation." ;
        ECHO  "   b. You are trying to use stock Jam but didn't indicate which" ;
        ECHO  "      compilation toolset to use. To do so, follow these simple" ;
        ECHO  "      instructions:" ;
        ECHO  ;
        ECHO  "  - define one of the following environment variable, with the" ;
        ECHO  "    appropriate value according to this list:" ;
        ECHO  ;
        ECHO  "   Variable    Toolset                      Description" ;
        ECHO  ;
        ECHO  "   BORLANDC    Borland C++                  BC++ install path" ;
        ECHO  "   VISUALC     Microsoft Visual C++         VC++ install path" ;
        ECHO  "   VISUALC16   Microsoft Visual C++ 16 bit  VC++ 16 bit install" ;
        ECHO  "   INTELC      Intel C/C++                  IC++ install path" ;
        ECHO  "   WATCOM      Watcom C/C++                 Watcom install path" ;
        ECHO  "   MINGW       MinGW (gcc)                  MinGW install path" ;
        ECHO  "   LCC         Win32-LCC                    LCC-Win32 install path" ;
        ECHO  ;
        ECHO  "  - define the JAM_TOOLSET environment variable with the *name*" ;
        ECHO  "    of the toolset variable you want to use." ;
        ECHO  ;
        ECHO  "  e.g.:  set VISUALC=C:\\Visual6" ;
        ECHO  "         set JAM_TOOLSET=VISUALC" ;
        EXIT  ;
      }
    }

    CP          ?= copy ;
    RM          ?= del /f/q ;
    SLASH       ?= \\ ;
    SUFLIB      ?= .lib ;
    SUFOBJ      ?= .obj ;
    SUFEXE      ?= .exe ;

    if $(TOOLSET) = BORLANDC
    {
    ECHO "Compiler is Borland C++" ;

    AR          ?= tlib /C /P64 ;
    CC          ?= bcc32 ;
    CCFLAGS     ?= -q -y -d -v -w-par -w-ccc -w-rch -w-pro -w-aus ;
    C++         ?= bcc32 ;
    C++FLAGS    ?= -q -y -d -v -w-par -w-ccc -w-rch -w-pro -w-aus -P ;
    LINK        ?= $(CC) ;
    LINKFLAGS   ?= $(CCFLAGS) ;
    STDLIBPATH  ?= $(BORLANDC)\\lib ;
    STDHDRS     ?= $(BORLANDC)\\include ;
    NOARSCAN    ?= true ;
    }
    else if $(TOOLSET) = VISUALC16
    {
    ECHO "Compiler is Microsoft Visual C++ 16 bit" ;

    AR          ?= lib /nologo ;
    CC          ?= cl /nologo ;
    CCFLAGS     ?= /D \"WIN\" ;
    C++         ?= $(CC) ;
    C++FLAGS    ?= $(CCFLAGS) ;
    LINK        ?= $(CC) ;
    LINKFLAGS   ?= $(CCFLAGS) ;
    LINKLIBS    ?= 
                \"$(VISUALC16)\\lib\\mlibce.lib\"
                \"$(VISUALC16)\\lib\\oldnames.lib\"
                ;
    LINKLIBS    ?= ;
    NOARSCAN    ?= true ;
    OPTIM       ?= "" ;
    STDHDRS     ?= $(VISUALC16)\\include ;
    UNDEFFLAG   ?= "/u _" ;
    }
    else if $(TOOLSET) = VISUALC
    {
    ECHO "Compiler is Microsoft Visual C++" ;

    AR          ?= lib ;
    AS          ?= masm386 ;
    CC          ?= cl /nologo ;
    CCFLAGS     ?= "" ;
    C++         ?= $(CC) ;
    C++FLAGS    ?= $(CCFLAGS) ;
    LINK        ?= link /nologo ;
    LINKFLAGS   ?= "" ;
    LINKLIBS    ?= \"$(VISUALC)\\lib\\advapi32.lib\"
                   # $(VISUALC)\\lib\\libc.lib
                   # $(VISUALC)\\lib\\oldnames.lib
                   \"$(VISUALC)\\lib\\gdi32.lib\"
                   \"$(VISUALC)\\lib\\user32.lib\"
                   \"$(VISUALC)\\lib\\kernel32.lib\" ;
    OPTIM       ?= "" ;
    STDHDRS     ?= $(VISUALC)\\include ;
    UNDEFFLAG   ?= "/u _" ;
    }
    else if $(TOOLSET) = VC7
    {
    ECHO "Compiler is Microsoft Visual C++ .NET" ;

    AR          ?= lib ;
    AS          ?= masm386 ;
    CC          ?= cl /nologo ;
    CCFLAGS     ?= "" ;
    C++         ?= $(CC) ;
    C++FLAGS    ?= $(CCFLAGS) ;
    LINK        ?= link /nologo ;
    LINKFLAGS   ?= "" ;
    LINKLIBS    ?= \"$(VISUALC)\\PlatformSDK\\lib\\advapi32.lib\"
                   # $(VISUALC)\\lib\\libc.lib
                   # $(VISUALC)\\lib\\oldnames.lib
                   \"$(VISUALC)\\PlatformSDK\\lib\\gdi32.lib\"
                   \"$(VISUALC)\\PlatformSDK\\lib\\user32.lib\"
                   \"$(VISUALC)\\PlatformSDK\\lib\\kernel32.lib\" ;
    OPTIM       ?= "" ;
    STDHDRS     ?= \"$(VISUALC)\\include\"
									 \"$(VISUALC)\\PlatformSDK\\include\" ;
    UNDEFFLAG   ?= "/u _" ;
    }
    else if $(TOOLSET) = INTELC
    {
    ECHO "Compiler is Intel C/C++" ;

        if ! $(VISUALC)
        {
          ECHO "As a special exception, when using the Intel C++ compiler, you need" ;
          ECHO "to define the VISUALC environment variable to indicate the location" ;
          ECHO "of your Visual C++ installation. Aborting.." ;
          EXIT ;
        }

    AR          ?= lib ;
    AS          ?= masm386 ;
    CC          ?= icl /nologo ;
    CCFLAGS     ?= "" ;
    C++         ?= $(CC) ;
    C++FLAGS    ?= $(CCFLAGS) ;
    LINK        ?= link /nologo ;
    LINKFLAGS   ?= "" ;
    LINKLIBS    ?= $(VISUALC)\\lib\\advapi32.lib
                   # $(VISUALC)\\lib\\libc.lib
                   # $(VISUALC)\\lib\\oldnames.lib
                   $(VISUALC)\\lib\\kernel32.lib
                   ;
    OPTIM       ?= "" ;
    STDHDRS     ?= $(INTELC)\include $(VISUALC)\\include ;
    UNDEFFLAG   ?= "/u _" ;
    }
    else if $(TOOLSET) = WATCOM
    {
        ECHO "Compiler is Watcom C/C++" ;

    AR          ?= wlib ;
    CC          ?= wcc386 ;
    CCFLAGS     ?= /zq /DWIN32 /I$(WATCOM)\\h ; # zq=quiet
    C++         ?= wpp386 ;
    C++FLAGS    ?= $(CCFLAGS) ;
    CP          ?= copy ;
    DOT         ?= . ;
    DOTDOT      ?= .. ;
    LINK        ?= wcl386 ;
    LINKFLAGS   ?= /zq ; # zq=quiet
    LINKLIBS    ?= ;
    MV          ?= move ;
    NOARSCAN    ?= true ;
    OPTIM       ?= ;
    RM          ?= del /f ;
    SLASH       ?= \\ ;
    STDHDRS     ?= $(WATCOM)\\h $(WATCOM)\\h\\nt ;
    SUFEXE      ?= .exe ;
    SUFLIB      ?= .lib ;
    SUFOBJ      ?= .obj ;
    UNDEFFLAG   ?= "/u _" ;
    }
    else if $(TOOLSET) = MINGW
    {
        ECHO "Compiler is GCC with Mingw" ;
        
        AR              ?= ar -ru ;
        CC              ?= gcc ;
        CCFLAGS         ?= "" ;
        C++             ?= $(CC) ;
        C++FLAGS        ?= $(CCFLAGS) ;
        LINK            ?= $(CC) ;
        LINKFLAGS       ?= "" ;
        LINKLIBS        ?= "" ;
        OPTIM           ?= ;
        SUFOBJ           = .o ;
        SUFLIB           = .a ;
        SLASH            = / ;
#       NOARSCAN        ?= true ;
    }
    else if $(TOOLSET) = LCC
    {
        ECHO "Compiler is Win32-LCC" ;
        
        AR              ?= lcclib ;
        CC              ?= lcc ;
        CCFLAGS         ?= "" ;
        C++             ?= $(CC) ;
        C++FLAGS        ?= $(CCFLAGS) ;
        LINK            ?= lcclnk ;
        LINKFLAGS       ?= "" ;
        LINKLIBS        ?= "" ;
        OPTIM           ?= ;
        NOARSCAN         = true ;
    }
    else
    {
#
# XXX: We need better comments here !!
#    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -