NMAKE Guide——中文版本(四)


NMAKE Guide
-------------------------------------------------------------copy right------------------------------------------
哥哥原创!
转载请附上哥哥的链接!!!

blog写作缘由:
项目突然需要使用到NMAKE来编译一个工程文件,于是开始找NMAKE相关资料,寻觅良久,仍末见中文版本(GNU的makefile有比较多的中文资料)。所以呢,只好自己开始死磕MSDN相关英文资料。此时刚好找到一英文版的NMAKE Guide,就拿来瞅瞅了。貌似用点心看,磕起来不太累。看到一半,突然想起一个问题,哥哥以后要是再想查相关资料,岂不是还得死嗑英文呢。所以就有了将该英文版本翻译一下的冲动。于是乎,就有了它了。

PS:哥哥英文不太好哦,大学很幸运地将六级“睡”过去了呢。之后就一直没瞅英文了,外加哥哥的语文好像不太好呢,所以大伙看到一些晦涩的地方,笑笑就可以了,因为哥哥实在不知道怎么翻了或是不晓得用啥中文来表述原意。

Guide写完后附上英文版,我这没看懂的可以查英文原版哦!!!
希望写出来可以帮助到一些人哦!!反正哥哥以后是可以看中文版的喽!!

(英文版本大概有59页,大概预计得二周内翻译完。)
-------------------------------------------------------------end-------------------------------------------------

   内联文件
 NMAKE可以在描述块或是推导规则的命令段创建“内联"文件。内联文件由NMAKE创建于磁盘上,
 其中包含了您在makefile中指定的内容。命令中可以使用的内联文件的名字可以和文件名一样。
 NMAKE会在命令执行时创建内联文件。

 响应文件是使用内联文件的一种情形,其他实用工具的响应文件,比如LINK或是LIB。
 响应文件可以避免操作系统对命令行的最大长度的限制,并自动将指定的输入传递到实用工具。
 内联文件不再需要维持一个单独的响应文件。内联文件同样可以用来传递大量的命令给操作系统。

   指定内联文件
 指定内联文件的语法命令如下:

 <<[filename]

 于命令行中您希望使用内联文件的位置指定双尖括号(<<)。
 由于命令行必须是有缩进的,所以双尖括号不能出现在命令行的开始。
 尖括号句型必须使用文本字符,它不是由一个宏展开。

 当NMAKE执行描述块,NMAKE用即将创建的内联文件名来替代内联文件说明。
 效果与直接在命令块中指定文件名一样。

 filename为内联文件提供了文件名。它必须密切跟随在双尖括号之后,中间不允许有空格。
 您也可以指定文件名的完整路径,但后缀名不是必须的。
 如果filename指定的文件名已经存在了,NMAKE将必定该文件。
 如果是临时的内联文件,那么该内联文件将会被删除。
 (临时的内联文件将会在下节中描述。)

 内联文件的文件名是可选的。如果您没有为内联文件指定文件名,那么NMAKE将会为内联文件创建一个独一的文件名。
 如果指定了文件名,那么NMAKE将会在指定的目录生成指定的内联文件,如果目录没有指定,将会生成在当前的目录。
 如果没有指定文件名,那么NMAKE将会在环境变量TMP指定的路径中创建内联文件,如果TMP环境变量没有指定,那么将会创建在当前目录。
 您可以使用之前的内联文件名,NMAKE将会覆盖之前的文件。

     创建内联文件
 创建后的内联文件指令开始于<<[filename]之后的第一行。
 创建内联文件的语法如下:

 <<[filenmae]
 inlinetext
 .
 .
 .
 <<[KEEP|NOKEEP]

 标志着内联文件结束的尖括号必须出现在makefile文件独立一行的开始位置。
 划定的尖括号之间的所有的inlinetext将会出现在内联文件中。
 文件内容可以使用宏扩展和替换。指令和注释不允许出现在内联文件中。
 NMAKE将其当做文本来处理。出现在内联文件中的空格、制表符和换行符都被认为是纯粹的字符。
 内联文件可以是临时文件也可以是永久文件。诺想在NMAKE会话结束后仍保留内联文件,请紧随结束的尖括号之后加上KEEP。
 如果您没有在结束的尖括号后指定后缀或是您指定了一个NOKEEP的后缀(默认情形),那么该内联文件是临时文件。
 KEEP和NOKEEP是不区分大小写的。临时的内联文只在NMAKE会话周期内存在。

 为一个没有命名的内联文件指定KEEP是必要的,那样的话,由NMAKE创建的内联文件将会在NMAKE会话结束之后出现在恰当的位置。

   例子
 下面的makefile使用一个临时内联文件来清除屏幕显示和显示当前目录的内容:

 COMMANDS = cls ^
 dir
 showdir : 
  <<showdir.bat
 $(COMMANDS)
 <<

 在这个例子中,内联文件名作为在描述块中唯一的命令。
 该命令与运行一个名为SHOWDIR.BAT的批处理文件有着同样的效果,如果在SHOWDIR.BAT文件中包含那些在定义中列出的命令。

   内联文件的重用
 当一个内联文件创建之后,您可以多次使用它。
 想要在创建内联文件的命令中再次使用同样的内联文件,您必须在该内联文件定义和第一次使用时为其提供一个文件名。
 然后您可以在同一条命令中再次使用该文件名。

 您也在同一描述块的后续命令中或是makefile文件中其他地方重用同一内联文件。
 确保创建该内联文件的命令将会在其他所有用该内联文件的命令之前首先被执行。
 不管您有没有在内联文件结束标志后添加KEPP或是NOKEEP,NMAKE将会在事件会话周期内保存该内联文件。

   例子
 下面的makefile创建了一个名为LIB.LRF的临时的LIB响应文件:

 OBJECTS = add.obj sub.obj mul.obj div.obj
  math.lib : $(OBJECTS)
  LIB math.lib @<<lib.lrf
  -+$(?: = &^
  -+)
  listing;
  <<
  copy lib.lrf /projinfo/lib.lrf

  生成的响应文件告诉LIB去使用那些库、执行那些命令以及生成清单中的文件:

  -+add.obj &
  -+sub.obj &
  -+mul.obj &
  -+div.obj
  listing;

  描述块中第二条命令让NMAKE将生成的响应文件拷贝到另一个目录。

    多个内联文件的使用
  您可以在一条简单的命令中指定多于一个的内联文件。
  对于每个内联文件的说明,在包含分隔符的紧闭行之后指定一行或多行内联文本。
  在第一个内联文件的划定符之后开始放置第二个文件内容。

    例子
  下面的例子创建了两个内联文件:

  target.abc : depend.xyz
   copy <<file1 + <<file2 both.txt
  I am the contents of file1.
  <<
  I am the contents of file2.
  <<KEEP

  这和指定

  copy file1+file2 both.txt

  来连接两个文件一样,FILE1包含:

  I am the contents of file1.

  FILE2包含:

  I am the contents of file2.

  KEEP关键词告诉NMAKE在NMAKE执行结束后不要删除FILE2文件。文件FILE2和BOTH.TXT存在当前目录中。

    宏
  宏提供一种便捷的方法用来在makefile中用其他字符来替换一段特定的字符串。
  您可以定义您自己的宏或是使用预定义宏。宏对于可变的任务是非常有用的,比如:

    创建一份简单的makefile文件但为不同的项目使用。您可以在makefile中定义一个宏,用特定的文件名替换虚拟的文件名为一个特定的工程。
  
    控制NMAKE传递给编译器或是链接器的选项。一旦您使用宏来指定选项,您可以只用一个小步骤就完成整个makefile文件中选项的修改。
  
    指定推导规则的路径。(请看567页”用户自定义的推导规则“一节的例子3。)
  
  本节描述用户自定义宏,演示如何使用一个宏并且讨论对于NMAKE有特殊意思的宏。本节结束于宏替换、继承宏和优先规则的讨论。

    用户自定义宏
  定义一个宏的语法如下:

  macroname=string

  宏名可是任何由字母、数字和下划线的组合,最大的字符长度为1024。宏名是大小写的敏感的。
  NMAKE认为MyMacro和MYMACRO为两个不同的宏名字。宏名可以包含一个宏调用。
  如果宏名完全由一个宏调用组成,被调用的宏不能为空或是没有定义。

  string可以是任何零或多个字符的序列,最大到64K(65510字节)。没有字符的字串称为空串。
  一个只由空格、制表符组成的字串也同样被称为空串。

  其他语法规则,比如空格的使用,取决于您的宏被指定的位置,详情请参阅552页的”在那定义宏“一节。
  string可以包含宏调用 。

    例子
  下面的文字定义了一个名为DIR的宏,并给该宏赋了一段代表目录的字串。

  DIR=c:/objects

    宏定义中的特殊字符
  某些字符在宏定义中具有特殊的意义。您使用这些字符来执行特定的任务。
  如果您想使用这些字符的文本表示,您必须使用特别的语法来指定它。

    在宏定义中指定一段注释,请在宏定义后放置#字符和注释,就像下面一样:
  
    LINKCMD = link /CO  # Prepare for debugging
  
    NMAKE忽略数字符号#以及其和下一个换行符之间的所有的字符。
    要在宏定义中使用#字符,请用^,就像^#。
  
    为了在新行中扩展宏定义,请在行的结尾加上反斜杠(/)。
    在宏被展开时,跟随在反斜杠后的换行符将会替换成空格,就像下面的例子一样:
  
    LINKCMD = link myapp/
    another, , NUL, mylib, myapp
  
    当宏被展开时,空格取代换行符分隔了myapp和another。
  
    要在行尾指定反斜杠字符,请在字符前添加^,就像:
  
    exepath = c:/bin^/
  
    您同样可以将反斜杠写在注释修饰符#之后来表示一个反斜杠字符。
    NMAKE认为跟随在任意字符之后的反斜杠为文本字符。
  
    要在宏义中插入一个文本换行符,请在行尾使用^字符。
    加字符号告诉NMAKE将换行符当成宏定义的一部分,而不是一行的间断以结束宏定义。
    下面的例子定义了一个用换行隔开的两个系统命令组成的宏:
  
    CMDS = cls^
    dir
  
    该宏的一个使用例子,请看548页的”内联文件“的第一个例子。
  
    想要在宏定义中使用美元字符,请使用两个美元符号。
    NMAKE认为一个单一的美元符号为宏定义调用的修饰符,请查看554页的”宏定义的使用"一节。
  
  更多关于特殊字符的处理,不管其是否出现在宏定义当中,请参阅535页的”使用特殊字符作为文本字符“一节。

    在那里定义宏
  您可以makefile、命令行、命令文件或是TOOLS.INI文件中定义宏。(更多的信息,请参阅563页的”宏定义的优先级“一节。)
  在makefile或是TOOLS.INI中定义的宏必须出现在独立的一行中,且该行不能以空格或是制表符开始。

  当你在makefile或是TOOLS.INI中定义了宏,NMAKE忽略等号两的空格或是制表符。
  字串本身可以包含内嵌空格。您不必将字串包含在引号标志中(如果您那样做了,引号也成了字串的一部分)。
  即将定义的宏名必须出现在行的开始位置。一行中只能定义一个宏。
  举个例子,下面的宏定义可以出现在makefile或是TOOLS.INI文件中:

  LINKCMD = LINK /MAP

  在NMAKE命令行中定义宏的规则和在命令文件中定义略有不同。命令行中将空格或是制表符当成参数分隔符来使用。
  因此,空格不可以在等号前出现或是跟随在等号后面。如果字串中包含内嵌空格或是制表符,不管是字串本身或是整个宏定义
  都必须包含在双引号中(”)。举个例子,下面两种形式的命令行宏定义都是允许的:

  NMAKE "LINKCMD = LINK /MP"
  NMAKE LINKCMD="LINK /MAP"

  但是,该宏的下面形式的定义是不允许的。因为它包含了并没有围在引号之中的空格:

  NMAKE LINKCMD = "LINK /MAP"

    空宏和没定义的宏
  没有定义的宏和定义成空值的宏不是一回事。两种宏都会被扩展成一个空串。
  但是,定义成空值的宏仍然认为是定义的当与预处理指令一块使用时,比如!IFDEF。
  在makefile文件中,使用!UNDEF预处理指令,可以将宏名变成没有定义。(更多关于!IFDEF和!UNDEF指令用法,请查阅572页的“预处理指令”一节。)


  定义一个空宏:

    在makefile或是TOOLS.INI文件中,在等号和行尾之前放置零或多个空格,就像下面一样:
  
    LINKOPTIONS = 
  
    在命令行或是命令文件中,在双引号标志之间指定零或多个空格或是将整个宏定义使用双引号来标志,就像下面任何一种形式:
  
    LINKOPTIONS=""
    "LINKOPTIONS ="
  
    在makefile或是TOOLS.INF文件中取消某个宏定义,可以使用!UNDEF指令,就像下面用到的:
  
    !UNDEF LINKOPTIONS
  
      使用宏定义
    想要引用一个宏定义(定义的或是未定义的),使用括号将宏名括起来并在前面加上美元符号,就像下面的一样:
  
    $(macroname)
  
    中间不允许有空格。你可以用$(LINKCMD)来表示对宏LINKCMD的引用。
  
    LINKCMD = LINK /MAP
  
    NMAKE将用LINK /MAP来替换$(LINKCMD)。
  
    如果您使用的宏名从没有定义过,或是之前定义了但现在是未定义状态,NMAKE将该名字当成空串来处理。不会有错误产生。
  
    如果宏名是单个字符,括号是可选的。举个例子,$L和$(L)是一样的。但是,为了一致性和避免可能的错误,建议都加上括号。
  
      例子
    下面的makefile定义和使用了三个宏:
  
    program = sample
    L = LINK
    OPTIONS =
    $(program).exe : $(program).obj
     $(L) $(OPTIONS) $(program).obj;
   
    NMAKE解释该描述块如下:
  
    sample.exe : sample.obj
     LINK sample.obj;
 
    NMAKE用samplet替换出现的每个$(program),用LINK替换出现的每个$(L),用空串替换出现的每个$(OPTIONS)。

(PS:嘿嘿,已经翻好一半了,下次貌似可以用它给公司内部的同事做个NMAKE的培训呢)

Comments

Popular posts from this blog

How to fix error : no module named sendgrid when try to use sendgrid python lib in PHP.

react-native run-android : sun.security.provider.cert path.SunCertPathBuilderException : unable to find valid certification path to req uested target

react-native run-android : do not build/update modified code(App.js)