• Make 的使用方法 at 2008年07月02日

    ★.SUFFIXES 该目标的依赖被认为是一个后缀列表,在检查后缀规则时使用 ★.DEFAULT 该目标的规则被使用在没有规则(显式的或隐含的)的目标上。如果’DEFAULT’ 命令定义了,则对所有不是规则目标的依赖文件都会执行该组命令 ★.PRECIOUS 该目标的依赖文件会受到特别对待:如果 make 被 kill 或命令的执行被中止,这些目标并不删除;而且如果该目标是中间文件,在不需要时不会被删除。可以将隐含规则的目标模式(如%.o)做为’.PRECIOUS’ 的依赖文件,这样可以保存这些规则产生的中间文件。 ★.INTERMEDIATE 该目标的依赖文件被当作中间文件;如果该目标没有依赖文件,则 makefile 中所有的目标文件均被认为是中间文件。 ★.IGNORE 在执行该目标的依赖规则的命令时,make 会忽略错误,此规则本身的命令没有意义。如果该规则没有依赖关系,表示忽略所有命令执行的错误,这种用法只是为了向后兼容;由于会影响到所有的命令,所以不是特别有用,推荐使用其它更有选择性忽略错误的方法。 ★.SILENT 在执行该目标的依赖规则的命令时,make 并不打印命令本身。该规则的命令没有意义。在’.SILIENT’ 没有依赖关系时,表示执行 makefile 中的所有命令都不会打印,该规则只是为了向后兼容提供的。 ★.EXPORT_ALL_VARIABLES 只是作为一个目标存在,指示 make 将所有变量输出到子进程中。 定义的隐含规则的后缀作为目标时,也认为它是特殊目标;两个后缀的连接也是一样,比如’.c.o’。这些目标是后缀规则,一中定义隐式规则的过时方法(但仍然广泛使用)。后缀通常以’.’ 开始,所以特殊目标也以’.’ 开始。

    3.9 一个规则多个目标 一条有多个目标的规则和写多条规则,每条一个目标作用是等同的。同样的命令应用于所有目标,但其效用会因将实际目标以’$@’ 代替而不同。规则中所有目标的依赖关系是一样的。 这在两种情况下有用: ★只有依赖关系,不需要命令。例如: kbd.o command.o files.o: command.h ★所有的目标同样的命令。命令不需要完全相同,因为在命令中可以使用’$@’: bigoutput littleoutput : text.g generate text.g -$(subst output,,$@) > $@ 和 bigoutput : text.g generate text.g -big > bigoutput littleoutput : text.g generate text.g -little > littleoutput 等同。这里假设程序’generate’ 产生两种输出:一种使用’-big’ 选项,一种使用’-little’ 选项。如果想象使用’$@’ 变化命令那样来变化依赖关系,不能通过多目标的普通规则实现,但是可以通过模式规则来实现。

    3.10 一个目标多条规则 一个文件可以是多条规则的目标,所有规则的依赖关系被合并。如果目标比任一个依赖文件旧,命令被执行。 一个文件只能有一组命令执行。如果多个规则对于同一个文件都给出了命令,make 使用最后一组并打印错误信息(特殊情况:如果文件名以’.’ 开始,并不打印错误信息,这一点是为了和其它 make 兼容)。没有任何理由需要将 makefile 写成这样,这是 make 给出错误信息的理由。 一条只有依赖关系的附加规则可以一次给出许多文件的附加依赖文件。例如’objects’ 变量表示系统中编译器的所有输出.,说明当’config.h’ 更改时所有文件必须重做的简单方法如下: objects = foo.o bar.o foo.o : defs.h bar.o : defs.h test.h $(objects) : config.h 不用改变实际目标文件生成的规则,这条规则可以在需要增删附加的依赖关系时插入或提出。另一个诀窍是附加的依赖关系可以用变量表示,在 make 执行时,可以给变量赋值: extradeps= $(objects) : $(extradeps) 当命令`make extradeps=foo.h'执行时会认为’foo.h’ 是每个目标文件的依赖文件,但简单的’make’ 命令不是这样。

    3.11 静态模式规则 静态模式规则(static pattern rules)可以指定多个目标,并且使用目标名字来建议依赖文件的名字;比普通多目标规则更通用因为不需要依赖关系是相同的:依赖关系必须类似但不需要相同。

    3.11.1 语法 TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ... COMMANDS ... TARGETS 列表指出规则应用的目标,可以包含通配符,于普通规则的目标相同。TARGET-PATTERN 和 DEP-PATTERNS 来表明目标的依赖关系如何计算:匹配 TARGET-PATTERN 的目标从名字中抽出一部分,叫做词干(stem),词干被替换到 DEP-PATTERNS 来形成依赖文件名。 每个模式通常包含一个’%’ 字符。当 TARGET-PATTERN 匹配一个目标时,’%’ 字符可以匹配目标名中的任何部分;这部分即是词干,模式的其余部分必须完全匹配。例如’foo.o’ 匹配’%.o’,’foo’ 是词干;目标’foo.c’ 和’foo.out’ 并不匹配这个模式。 目标的依赖文件名通过将 DEP-PATTERNS 中的’%’ 替换为词干形成:如果依赖模式为’%.c’,在替换词干’foo’ 可以得到’foo.c’。依赖模式中不包含’%’ 也是合法的,此依赖文件对所有的目标均有效。 如果需要在模式规则中使用’%’ 字符,必须在其前面加’\’ 字符,如果’%’ 前的’\’ 字符是有实际意义的,必须在其前面加’\’,其它的’\’ 不必如此处理。如’the\%weird\%pattern\’ 在有效的’%’ 前是’the%weird\’,其后是’pattern\’。最后的’\’ 保持原样是因为其并不影响’%’ 字符。 以下例子从相应的’.c’ 文件编译’foo.o’ 和’bar.o’: objects = foo.o bar.o $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ 每个目标必须匹配目标模式,对于不匹配的目标会给出警告。如果列表中只有部分文件匹配模式,可以使用 filter 函数移去不匹配的文件名: files = foo.elc bar.o lose.o

    $(filter %.o,$(files)): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ $(filter %.elc,$(files)): %.elc: %.el emacs -f batch-byte-compile $< 例子中$(filter %.o,$(files))' 结果是bar.o lose.o’; $(filter %.elc,$(files))' 的结果是foo.elc'。以下例子说明’$’ 的使用: bigoutput littleoutput : %output : text.g generate text.g -$ > $@ 命令`generate'执行时,’$*’ 扩展为词干’big’ 或’little’。

    3.11.2 静态模式规则和隐式规则 静态模式规则和隐式规则在作为模式规则是具有很多共同点,都有目标模式和构造依赖文件名的模式,不同之处在于 make 决定何时应用规则的方法。 隐式规则可应用于匹配其模式的任何目标,但只限于没有指定命令的目标,如果有多条可应用的隐式规则,只有一条被使用,取决于规则的顺序。 反之,静态模式规则适用于规则中明确目标列表,不适用于其它目标且总是适用于指定的每个目标。如果有两条冲突的规则,且都有命令,这是一个错误。 静态模式规则比隐式规则优越之处如下: ★可为一些不能按句法分类,但可以显式列出的文件重载隐式规则 ★不能判定目录中的精确内容,一些无关的文件可能导致 make 适用错误的隐式规则;最终结果可能依赖于隐式规则的次序。适用静态模式规则时,这种不确定性是不存在的:规则适用于明确指定的目标。

    3.12 双冒号规则 双冒号规则(Double-colon rules)的目标后是’::’ 而不是’:’,当一个目标出现在多条规则中时,其处理和普通规则的处理不同。 当一个目标出现在多条规则中时,所有规则必须是相同类型的:都是普通的或者都是双冒号的。如果是双冒号,规则之间相互独立;如果目标需要更新,则规则的命令被执行;结果可能是没有执行,或者执行了其中一些,或者所有的规则都执行了。 同一目标的双冒号规则事实是完全孤立的,每条规则被被单独处理,就象不同目标的规则一样;规则按照在 makefile 中出现的次序被处理,此类规则真正有意义的是那些于命令执行次序无关的。 这种规则有时比较晦涩不是特别有用;它提供了一种机制:通过不同依赖文件的更新来对目标进行不同的处理,这种情形很罕见。每个这种规则应当提供命令,如果没有,适用的隐式规则将使用。

  • Make 的使用方法 at 2008年07月02日

    当使用’-t’ 或’--touch’ 选项时,不希望使用过时的 makefile 来决定那个目标来 touch。所以’-t’ 选项对 makefile 更新不起作用;类似’-q’(or ‘—question’)和’-n’(or ’—just-print’)不阻止 makefile 的更新,因为过时的 makefile 会产生错误的输出。这样’make –f mfile –n foo’ 会更新’mfile’,读入它,打印出更新’foo’ 需要执行的命令但不运行这些命令。与’foo’ 有关的命令是更新过的’mfile’ 中的内容。 但是有时不希望更新 makefile,可以将 makefile 作为命令行的目标,当 makefile 被显式指定为目标时,’-t’ 选项也适用于它们。 这样’make –f mfile –n mfile foo’ 会读入’mfile’,打印出更新执行的命令,’foo’ 的命令是当前的’mfile’ 中的内容。

    2.5 重载 makefile 可以使用’include’ 指令来包含其它 makefile,增加目标的变量定义。然而,make 不允许同一个目标有不同的命令,有其它的途径可以达到目的。 假设有’makefile’ 和’mfile’,’makfile’ 要包含’mfile’,但都有对于目标’foo’ 的规则。这是可以在’makefile’ 中写一条匹配任意模式的规则,指明当 make 在’makefile’ 中未找到目标时,搜索’mfile’: foo: frobnicate > foo %: force @$(MAKE) -f mfile $@ force: ; 当执行’make foo’ 时,make 找到’makefile’,执行命令’ frobnicate > foo’;执行’make bar’ 时,在’makefile’ 中未找到相应的规则,这时模式规则适用,执行命令’make –f mfile bar’,’makefile’ 中未提及的其它目标也是类似的。 这种方法之所有工作是因为模式规则的模式是’%’,可以匹配任何的目标;这条规则的依赖是’force’,保证即使目标存在命令也会执行;’force’ 规则的命令为空防止’make’ 为其搜索隐式规则-这样会导致依赖循环。

    3 规则 makefile 中的规则描述如何生成特定的文件,即规则的目标。规则列出了目标的依赖文件,指定生成或更新目标的命令。 规则的次序是不重要的,除非是确定缺省目标:缺省目标是第一个 makefile 中的第一个规则;如果第一个规则有多个目标,第一个目标是缺省的。有两个例外:以’.’ 开头的目标不是缺省目标;模式规则对缺省目标没有影响。 通常我们所写的地一个规则是编译整个或 makefile 中指定的所有程序。

    3.1 例子 foo.o : foo.c defs.h # module for twiddling the frobs cc -c -g foo.c 它的目标是’foo.o’,依赖于’foo.c’ 和’defs.h’,有一个命令’cc –c –g foo.c’。命令行以 TAB 字符开始标识它是一个命令。 这条规则说明两件事: ?;如何决定’foo.o’ 是旧的:如果它不存在,或者’foo.c’ 或者’defs.h’ 比它新。 ?;如何更新’foo.o’ 文件:通过运行’cc’ 程序。命令未提及’defs.h’,担可以猜想’foo.c’ 包含了它,这是’defs.h’ 被置于依赖关系中的理由。

    3.2 规则的语法 语法如下: TARGETS : DEPENDENCIES COMMAND ... 或者 TARGETS : DEPENDENCIES ; COMMAND COMMAND ... TARGETS 是以空格隔开的文件名,统配符可以使用。通常一个规则只有一个目标,偶尔也有多个。 命令行以 TAB 键开始。第一条命令可在依赖关系的下一行;或者在同一行,在分号后面;两种方式效果相同。 因为’$’ 符号被用做变量引用,如果要在规则中使用’$’ 符号,必须写两个:’$$’。可以用’\’ 符号来分割一个长行,这不是必须的,因为 make 对行的长度没有限制。

    3.3 通配符 规则中的文件名可以包含统配符,如’’,’?’。 文件名前的字符’~’ 有特殊的含义。单独使用,或跟随一个’/’,代表用户的 home 目录,比如’~/bin’ 扩展为/home/you/bin’;如果 ’~’ 跟随一个单词,表示单词指示的那个用户的 home 目录,如’~john/bin’ 扩展为’/home/john/bin’。 通配符在目标,依赖关系,命令中自动扩展,其它情况下,统配符的扩展除非显式使用’wildcard’ 函数。通配符的特殊意义可以使用’\’ 符号关闭。 例子: clean: rm -f *.o 和 print: *.c lpr -p $? touch print 通配符在定义变量时并不扩展,例如: objects = *.o 则 objects 的值是字符串’.o’;但是如果你将 objects 用于目标,依赖或命令中,扩展会进行。要将 objects 设置成扩展过的内容,使用: objects := $(wildcard *.o)

    3.3.1 通配符的缺陷 这是一个使用通配符的例子,但结果不是你所期望的。假设可执行文件’foo’ 是从当前目录中的所有’.o’ 文件生成的: objects = *.o

    foo : $(objects) cc -o foo $(CFLAGS) $(objects) objects 变量的值是字符串’.o’。通配符扩展在规则’foo’ 中进行,于是所有存在的’.o’ 文件成为’foo’ 的依赖而且在需要时重新编译。 但如果删除了所有的’.o’ 文件呢?当通配符不匹配任何文件时,一切都保持原样:则’foo’ 依赖于一个叫做’.o’ 的文件;由于这个文件不大可能存在,’make’ 程序会报告一个无法生成’*.o’ 文件的错误,这不是期待的结果。 实际上可以用通配符获得期望结果,但是需要复杂的技术,包括’wildcard’ 函数和字符串替换函数。

    3.3.2wildcard 函数 通配符自动在规则中进行。但是在变量赋值的和函数的参数中通配符不会扩展,如果在这些情况下需要通配符扩展,必须使用’wildcard’ 函数。语法如下: $(wildcard PATTERN...) 这个在 makefile 任何地方出现的字符串,会被匹配任何一个文件名格式的以空格隔开的现有文件列表替换。如果没有任何文件匹配一个模式,这个模式从’wildcard’ 的输出中忽略,注意,这和上述的通配符的处理是不一样的。 ‘wildcard’ 函数的一个功能是找出目录中所有的’.c’ 文件: $(wildcard *.c) 可以通过替换后缀’.c’ 为’.o’ 从 C 文件列表得到目标文件的列表: $(patsubst %.c,%.o,$(wildcard *.c)) 这样,上节中的 makefile 改写为: objects := $(patsubst %.c,%.o,$(wildcard *.c))

    foo : $(objects) cc -o foo $(objects) 这个 makefile 利用了编译 C 程序的隐含规则,所以不需要对编译写出显式的规则。(’:=’ 是’=’ 的一个变体) 注意:’PATTERN’ 是大小写敏感的。

    3.4 目录搜索 对于大的系统,通常将源文件和目标文件放在不同的目录中。目录搜索功能可以让 make 自动在多个目录中搜寻依赖文件,当你将文件重新分布是,不需要改变规则,更改搜索路径即可。

    3.4.1‘VPATH’ make 变量’VPATH’ 列出 make 应当搜索的目录列表。很多情况下,当前目录不包含依赖文件,’VPATH’ 描述一个对所有文件的搜索列表,包含那些是规则的目标的文件。 如果一个目标或者依赖文件在当前目录没找到的话,’make’ 在’VPATH’ 中列出的目录中查找同名的文件。如果找到的话,那个文件成为依赖文件;规则可以象这些文件在当前目录中一样来使用他们。 在’VPATH’ 变量中,目录名以冒号或空格隔开;目录列出的顺序决定 make 查找的顺序。(注:在 pSOSystem 2.5 移植到 Win32 的 GNU make 目录名必须使用分号隔开,以下均简称 Win32 GNU make)。举例说明:

    VPATH = src:../headers 则规则 foo.o : foo.c 被解释为 foo.o : src/foo.c 假设’foo.c’ 在当前目录不存在,在’src’ 目录中可以找到。

    3.4.2 选择性搜索 与’VPATH’ 变量相似但更具选择性的是’vpath’ 指令(注意是小写),可以指定对于符合特定模式文件的查找路径。这样可以为不同类型的文件指定不同的搜索路径。 ‘vpath’ 指令共有三中形式: ?;‘vpath PATTERN DIRECTORIES’ 为匹配 PATTERN 的文件名指定搜索路径 DIRECTORIES,目录的分隔和’VPATH’ 的相同 ?;‘vpath PATTERN’ 清除为匹配 PATTERN 的文件名指定的搜索路径 ?;‘vpath’ 清除所有以前用’vpath’ 指定的搜索路径 ‘vpath’ 的模式是包含’%’ 的字符串:这个字符串必须匹配需要搜索的依赖文件名,’%’ 字符匹配 0 个或多个任意字符。例如:’%.h’ 匹配任何以’.h’ 结尾的文件(如果没有%,则 PATTERN 必须和依赖文件完全一致,这种用法不太多)。 当当前目录中不存在依赖文件时,如果’vpath’ 中的 PATTERN 匹配依赖文件名,则指令中 DIRECTORIES 列出的目录和’VPATH’ 中同样处理。举例: vpath %.h ../headers 告诉 make 在当前目录中未找到的’.h’ 文件在../headers 目录中查找。 如果多个’vapth’ 的模式匹配依赖文件名,make 将逐一处理,在所有指定的目录中搜索。Make 按照’vapth’ 在 makefile 中的次序;来处理它们,多个相同模式的’vapth’ 是相互独立的。 vpath %.c foo vpath % blish vpath %.c bar 将按照’foo’,‘blish’,’bar’ 的次序查找’.c’ 文件。而 vpath %.c foo:bar vpath % blish 按照’foo’,’bar’,’blish’ 的顺序搜索。

    3.4.3 使用自动变量 目录搜索的结果并不改变规则中的命令:命令按原样被执行。因此,必须写出与目录搜索功相适应的命令。这可以通过使用’$^’ 这样的自动变量来完成。’$^’ 表示规则中的所有依赖文件,包含它们所在的目录名(参见目录搜索);’$@’ 表示目标。例如: foo.o : foo.c cc -c $(CFLAGS) $^ -o $@ 通常情况下,依赖文件也包含头文件,但命令中并不提及这些文件:变量’$<’ 表示第一个依赖文件: VPATH = src:../headers foo.o : foo.c defs.h hack.h cc –c $(CFLAGS) $< -o $@

    3.4.4 目录搜索和隐含规则 使用’VPATH’ 和’vpath’ 指定目录搜索也会影响隐含规则。例如:文件’foo.o’ 没有显式规则,make 会考虑隐式规则:如果’foo.c’ 存在则编译它;如果这个文件不存在,则在相应的目录中查找;如果’foo.c’ 在任一的目录中存在,则 C 编译的隐式规则被应用。 隐式规则的命令使用自动变量通常是必要的,这样无需其它努力即可以使用目录搜索得到的文件名。

    3.5PHONY 目标 Phony 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用 phony 目标:避免和同名文件冲突,改善性能。 如果编写一个规则,并不产生目标文件,则其命令在每次 make 该目标时都执行。例如: clean: rm *.o temp 因为’rm’ 命令并不产生’clean’ 文件,则每次执行’make clean’ 的时候,该命令都会执行。如果目录中出现了’clean’ 文件,则规则失效了:没有依赖文件,文件’clean’ 始终是最新的,命令永远不会执行;为避免这个问题,可使用’.PHONY’ 指明该目标。如: .PHONY : clean 这样执行’make clean’ 会无视’clean’ 文件存在与否。 已知 phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明 phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。完整的例子如下: .PHONY : clean clean : rm *.o temp phony 目标不应是真正目标文件的依赖。如果这样,每次 make 在更新此文件时,命令都会执行。只要 phony 目标不是真正目标的依赖,规则的命令只有在指定此目标时才执行。 Phony 目标可以有依赖关系。当一个目录中有多个程序是,将其放在一个 makefile 中会更方便。因为缺省目标是 makefile 中的第一个目标,通常将这个 phony 目标叫做’all’,其依赖文件为各个程序: all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o 这样,使用’make’ 将可以将三个程序都生成了。 当一个 phony 目标是另一个的依赖,其作用相当于子程序,例如: .PHONY: cleanall cleanobj cleandiff cleanall : cleanobj cleandiff rm program cleanobj : rm *.o cleandiff : rm *.diff

    3.6FORCE 目标 当规则没有依赖关系也没有命令,而且其目标不是存在的文件名,make 认为此规则运行时这个目标总是被更新。这意味着如果规则依赖于此目标,其命令总是被执行。 clean: FORCE rm $(objects) FORCE: 例中目标’FORCE’ 满足这种特殊条件,这样依赖于它的目标’clean’ 被强制执行其命令。名字’FORCE’ 没有特殊含义,只不过通常这样用而已。这种方式使用’FORCE’ 和’.PHONY : clean’ 效果相同。使用’.PHONY’ 更加明确高效,担不是所有的’make’ 都支持;这样许多 makefile 中使用了’FORCE’。

    3.7 空目标 空目标(empty target)是 phony 目标的变种:用来执行显式请求的一个动作。和 phony 目标不同的是:这个目标文件可以真实存在,担文件的内容无关紧要,通常是空的。空目标文件的目的是利用其最后修改时间来记录命令最近一次执行的时间,这是通过使用’touch’ 命令更新目标文件来达到的。 print: foo.c bar.c lpr -p $? touch print 利用这条规则,执行’make print’ 时如果自上次’make print’ 之后任一文件改变了,’lpr’ 命令会执行。自动变量’$?’ 是为了只打印出那些变化了的文件。

    3.8 内建的特殊目标 某些名字作为目标存在时有特殊含义。 ★.PHONY 该目标的依赖被认为是 phony 目标,处理这些目标时,命令无条件被执行,不管文件名是否存在及其最后修改时间

  • zoe 于 2008-7-1 12:58 发表

    :o [/quote]

    :$

  • 人生何处不相逢啊 at 2008年07月01日

    zoe 于 2008-7-1 12:57 发表
    嘎嘎,你也挺 8g 的嘛,对这些了解得这么清楚

    小付我还没看到过啊 隔壁楼上班呢吧,俺中午也不去食堂吃饭,没碰到 [/quote] 刚才经 YYmm 证实了,那个 mm 的确回南京,去 zte 了。跳的频率好快哦

  • 人生何处不相逢啊 at 2008年07月01日

    zoe 于 2008-7-1 12:46 发表
    就是就是 [/quote]

    听说去海南之前人家就名花有草了吧?好象早就在 NJ 买了房子。。。。当时总和她在一起的 SY,我还以为是他 bf 呢,结果不是。。。。人家早就有主了。

    小 F 当时对人家的美貌赞不绝口啊,哈哈哈。他在 SH 还好?

  • zoe 于 2008-7-1 12:27 发表

    他的马甲很多很多 专门拿新号冒充新手骗 MM [/quote]

    你诬蔑站友。。。

  • 人生何处不相逢啊 at 2008年07月01日

    zoe 于 2008-7-1 12:32 发表
    本来找你 msn 八卦滴,结果你不在,看来工作还蛮努力嘛

    小强他们组的美女,还记得不?跟我们一起去海南玩的那个 原来跟我是一个大部门的,就在我们 team 的旁边 可惜在我过来的前几天离职回南京了,擦肩而过啊~~··· 美女就是美女,在 ... [/quote]

    哈哈,那个抱着个大相机拍照片那个?

  • Sky_pele 于 2008-7-1 00:13 发表

    .........................................你自己怎么还是新人? [/quote] 你看我全身上下哪不新?

  • 有关 WinCVS 的使用 at 2008年06月30日

    zoe 于 2008-6-30 21:53 发表
    nnd,我同事跟我说,你 update 的时候必须选上后三个 俺们也没深究,选就选贝,你们用都没事,难道我还出问题啊? 结果呢,我在 commit 之前 update 一下,就把俺辛辛苦苦更新的东东给弄没了 心理还一直骂 wincvs 这么瓜,破烂工具 今天仔细看 ... [/quote]

    有什么经验就多跟我们来交流交流嘛

  • 爪子哦,我是从 worklife 版看到了,自己就保存下来了。。。。

    其实,我一直摸不到鱼的。。。

  • Sky_pele 于 2008-6-30 22:41 发表
    好的。。我来了 [/quote]

    欢迎山东的 mm

  • Sky_pele 于 2008-6-30 22:50 发表
    只能一个用户访问....很尴尬 [/quote]

    木办法啊。。。本来是给管理员用的。。。。有的时候管理员用多个线程去连接都会给 ban 掉几分钟

  • 员工健康指南 at 2008年06月29日

    啊啊啊啊啊啊,,,,,,,今天我就腹泻,发烧了,难受死了。。。。

    为什么每次病了才知道健康的重要哦。。。。

  • Ant 是什么? at 2008年06月27日

    内置属性

    如果你使用了 task 定义了所有的系统属性,Ant 允许你使用这些属性。例如,${os.name}对应操作系统的名字。

    要想得到系统属性的列表可参考 the Javadoc of System.getProperties。

    除了 Java 的系统属性,Ant 还定义了一些自己的内置属性:

    basedir project 基目录的绝对路径 (与的 basedir 属性一样)。

    ant.file buildfile 的绝对路径。

    ant.version Ant 的版本。

    ant.project.name 当前执行的 project 的名字;由的 name 属性设定.

    ant.java.version Ant 检测到的 JVM 的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

    例子

    <!-- set global properties for this build -->

    <!-- Create the time stamp -->

    <!-- Create the build directory structure used by compile -->

    <!-- Compile the java code from ${src} into ${build} -->

    <!-- Create the distribution directory -->

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->

    <!-- Delete the ${build} and ${dist} directory trees -->

    3.5 Path-like Structures

    你可以用":"和";"作为分隔符,指定类似 PATH 和 CLASSPATH 的引用。Ant 会把分隔符转换为当前系统所用的分隔符。

    当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是

    location 属性指定了相对于 project 基目录的一个文件和目录,而 path 属性接受逗号或分号分隔的一个位置列表。path 属性一般用作预定义的路径--其他情况下,应该用多个 location 属性。

    为简洁起见,classpath 标签支持自己的 path 和 location 属性。所以:

    可以被简写作:

    也可通过元素指定路径。构成一个 fileset 的多个文件加入 path-like structure 的顺序是未定的。

    上面的例子构造了一个路径值包括:${classpath}的路径,跟着 lib 目录下的所有 jar 文件,接着是 classes 目录。

    如果你想在多个 task 中使用相同的 path-like structure,你可以用元素定义他们(与 target 同级),然后通过 id 属性引用--参考 Referencs 例子。

    path-like structure 可能包括对另一个 path-like structurede 的引用(通过嵌套元素):

    前面所提的关于的简洁写法对于也是有效的,如:

    可写成:

    命令行变量

    有些 task 可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的 arg 元素。

    Attribute Description Required

    value 一个命令行变量;可包含空格字符。 只能用一个

    line 空格分隔的命令行变量列表。

    file 作为命令行变量的文件名;会被文件的绝对名替代。

    path 一个作为单个命令行变量的 path-like 的字符串;或作为分隔符,Ant 会将其转变为特定平台的分隔符。

    例子

    是一个含有空格的单个的命令行变量。

    是两个空格分隔的命令行变量。

    是一个命令行变量,其值在 DOS 系统上为\dir;\dir2;\dir3;在 Unix 系统上为/dir:/dir2:/dir3 。

    References

    buildfile 元素的 id 属性可用来引用这些元素。如果你需要一遍遍的复制相同的 XML 代码块,这一属性就很有用--如多次使用结构。

    下面的例子:

    可以写成如下形式:

    所有使用 PatternSets, FileSets 或 path-like structures 嵌套元素的 task 也接受这种类型的引用。

  • ClearCase 指南——基础篇 at 2008年06月26日

    本文转载自:scmbbs.com 原文:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ ©本文归 冷冷一刀 和本论坛 (SCMbbs.com)

  • ClearCase 指南——基础篇 at 2008年06月26日

    [table=90%][tr][td=1,1,3%] [/td][td][color=#0000cc] ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.3 签出:Check Out Check Out 出 ClearCase 受控元素,然后修改之,最后 Check In 提交之,其他人员通过 Update View 命令即可获得该元素的最新结果(仅静态视图需要,动态视图不必 Update View)! VS、Rose 中,有相应 ClearCase 集成,功能一样,专题介绍。 Check Out 一个文件,如下图,既可以继续使用一个既存的活动,也可以使用 New 按钮定义一个新的活动(很简单的一个窗体,略): [img]http://51cmm.csai.cn/casepanel/CM/Images/No109-1.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看: [url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=../../../../cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 13:55 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 2 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] Reserved CheckBox:独占式、非多签出,只要你不签入提交,其他人就不能再签出修改该文件、目录。 特别提醒:除非实在有必要,绝对不要 Check Out 出来一个(普通)目录,除非你能记着及时 Check In 之,否则可能导致很多文件、目录的状态异常,很难处理。 5.4 签入:Check In 提交个人成果到服务器。 批量提交:寻找整个视图所有被修改(正常修改及 Hijacked 文件)的文件,以实现批量签入提交。涉及 Find Modified Files、Find Checkouts 右键快捷命令。 选择提交:如果只是想提交个别文件、目录,可选中目标,然后右键执行 Check In……本手册不做详细讲解。 VS、Rose 中,有相应 ClearCase 集成,功能一样,专题介绍。 5.4.1 Hijacked 文件 本节非常重要,所有人必须重视: 文件即未经 CheckOut 即被强制修改,ClearCase 即置其为 Hijacked 状态。Hijacked 文件将影响到 Update View 等操作,具体参随后章节。 文件变成 Hijacked 状态有 2 大类原因: 不正常、非故意、不小心所致:忘记 Check Out,Windows Explore 中直接打开强制修改(通过相应工具如 Word 改文件内容 或是 使用 Copy/Paste 命令覆盖原文件)。 正常、故意所致:如网络断、回家、出差在外,无法访问 CC Server,而修改工作需要继续,又希望未来提交强制修改结果。 对 Hijacked 文件可以有 2 种处理办法:认可强制修改,先转 Check Out 接着再 Check In;放弃该强制修改:Undo Hijacked File。 5.4.2 Find Modified Files 5.4.2.1 Find Modified Files 步骤一:查找 对整个视图寻找所有被修改(正常修改及 Hijacked 文件)的文件(注:必须选中视图名,否则右键菜单中无 “Find Modified Files” 命令!):

    [img]http://se.csai.cn/casepanel/CM/Images/No109-2.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:16 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 3 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.4.2.2 Find Modified Files 步骤二 查找结果如下(我们的结果中有 Hijacked 文件(红线提示部分)): [img]http://se.csai.cn/casepanel/CM/Images/No109-3.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:17 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 4 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.4.2.3 Find Modified Files 步骤三 Close 上图后进入如下界面,提示有 Hijacked 文件,要否先直接 CheckOut 出来。因为不好判断该非法修改(没有 CheckOut 的修改)是否有意义、值得接受,先选择 No(小心,默认是 Yes!!!),此时进入 Find Modified Files 汇总界面(下图后面界面)。左侧 CheckdOut 文件夹指示被 Check Out 出来并被修改过的文件集合(存在于右侧),Hijacked 文件夹指示未经 CheckOut 而被非法修改的文件集合(点该文件夹后,所有 Hijacked 文件将刷新于右侧): [img]http://se.csai.cn/casepanel/CM/Images/No109-4.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:18 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 5 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 因为下节还有 FindCheckouts 操作,二者的 Find 结果的处理方法一样,所以对 Find 结果的具体处理参下下节。 5.4.3 Find Checkouts (Find Modified Files 命令)Find 不到的 CheckOut 文件处理。 有时候还有一些被 Check Out(可能没有修改的)文件通过上述 Find Modified Files 方式竟然找不到(以前 ClearCase 的 Bug???!!!)!为此,必须用其他方式继续查找遗漏的(?)Check Out 文件。查找方法是选中视图的第一级目录(而非视图本身!),然后执行右键 Find Checkouts 命令 –〉Ok –〉进入一个 Find Checkouts 窗口,类同于上 Find Modified Fiels 命令结果窗口,处理手法完全相同,略: [img]http://se.csai.cn/casepanel/CM/Images/No109-5.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:19 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 6 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.4.4 Find 结果处理—有修改 CheckOut 文件 普通 CheckOut 文件有 2 种处理方式,Check In(修改认同、提交)或 Undo CheckOut(放弃该修改版本),2 个命令均可处理单个文件或批量处理: [img]http://se.csai.cn/casepanel/CM/Images/No109-6.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:20 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 7 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.4.5 Find 结果处理—未修改 CheckOut 文件 还有一种 CheckOut 文件比较特殊,就是 Check Out 出来了,但是没有修改,如此有 2 种处理办法:强制性 Check In(增加一个和前版本完全相同的版本,浪费)或是 Undo CheckOut。为此需要先知道它有没有被修改,然后才能作决定,问题是没有直观办法知道它到底有没有被修改!所以,正确做法是如上面的界面一样先 Check In 所有 Check Out 文件,对于没有修改的文件 Clear Case 将在 Check In 的过程中提示你该文件内容同于上一个版本,不能 Check In(下图),则确定之,继续。当所有 Check In 完毕后,上图 Find Modified Files 的结果窗体将刷新,剩下的仍为 Check Out 状态的文件即为无实质修改的文件,全部选中,Undo Check Out 即可! [img]http://se.csai.cn/casepanel/CM/Images/No109-7.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [size=9pt]

    [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:20 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 8 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 如果你足够懒,不想如此麻烦,不管三七二十一所有 Check Out 文件均想 Check In 进去,也可以,方法是 Check In 时(会弹出一个选项设置窗体)选中一个选项,参下图: [img]http://se.csai.cn/casepanel/CM/Images/No109-8.gif/img][ 本文来自 [url]http://www.scmbbs.com/url][ ,完整帖子请看:[url]http://www.scmbbs.com/cn/cctp/2008/3/cctp11.php/url][ [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:22 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 9 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td] [/td][/tr][tr][td] [/td][td][size=9pt] 作者:[url=/cn/showuser.php?action=show&username=%E5%86%B7%E5%86%B7%E4%B8%80%E5%88%80] 冷冷一刀 [/url] 2008-03-04 14:22 [/td][/tr][/table][table=90%][tr][td=1,1,3%][color=#0000cc] 10 [/td][td][color=#0000cc] 回复:ClearCase 指南——基础篇(4)[/td][/tr][tr][td] [/td][td] 5.5 更新视图:Update View 仅限静态视图。对于动态视图,系统会自动定时更新到本地(特殊文件保存),Refresh 一下即可。 更新整个视图:点击 CC Explore 中的文件夹窗格,执行右键菜单 “Update View…” 命令。 更新视图的某个目录树:点击该目录树的根,执行右键菜单 “Update…” 命令。 5.6 文件/目录的删除、移动、重命名 务必重视:对文件、目录的此 3 大操作只能在 CC Explore 中进行,绝对不能在 VS、Windows Explore 中进行,否则肯定出严重问题,切!切! 此 3 大操作不必你自己签出、签入有关,系统会自动执行。 重命名、删除:CC Explore 中有相应右键快捷菜单,直接执行、提示确认即可。 移动:CC Explore 中有相应右键快捷菜单,直接执行、提示确认即可。需要注意的是,移动必须是自右向左拖、自 “浏览器窗格” 拖向 “文件夹窗格”,而无法自 “浏览器窗格” 拖向 “浏览器窗格”,更无法自 “文件夹窗格” 拖向 “文件夹窗格”。 5.7 版本树、版本比较:Version Tree 右键快捷菜单有,高级知识、略。 5.8 版本历史查看、比较:History 右键快捷菜单有,高级知识、略。 5.9 删除视图有关 一个视图的信息存储在 2 个地方:客户端、服务器。欲彻底删除视图,只能在 ClearCase Explore 中选中视图,然后执行右键快捷命令 “Remove View”(而非 “Remove Page”)来达到目的! 务必注意:删除视图后,本机视图副本也将彻底被删除、包括里边的私有文件、目录,务必三思! 绝对禁止通过 Windows Explore 直接删除本机视图副本,否则遗患无穷! 重度提醒:卸载 ClearCase,重装机器、退还机器之前,务必记着先删除机器上有关 ClearCase 视图,否则也是遗患无穷! 再次提醒:删除视图后,本机 View Storage 共享目录下该视图的相应.vws 目录也将一并被 CC 干掉,绝对禁止通过 Windows Explore 直接删除 View Storage 共享目录及其下任何内容,否则后患无穷! 禁止在 CC Explore 中执行 “Remove View Shortcut” 命令,有隐患! 删除视图前必须检查当前视图中是否有处于检出(CHECKOUT)状态的文件(可通过 Find Checkouts 工具实现);如有,则在将这些文件 checkin 或 undo checkout 后方可删除视图。 [/td][/tr][/table]

  • 正在学习 MKS at 2008年06月26日

    我看了下 MKS 的文档。。。。太多了。而且国内用 MKS 的公司并不是很多。如果能把 MKS 用熟了,真的很不错的。以后作 consulting 也很吃香。

    就象一个人曾经打广告,说可以作上海的确的 perforce 培训一样。

  • 正在学习 MKS at 2008年06月26日

    Skylar 于 2008-6-26 15:50 发表
    正好项目里有机会使用 MKS, 正在学习中。。。 [/quote]

    very very warm welcome you~master.

  • 您可以是普普通通的一名潜水员,可以是版面积极的灌水者,也可以是论坛的版务,也可以是网站的美工人员,网站的管理者,。。。。。总之您在这里总可以找到您自己的角色。这里期待您的加入。希望有时间和精力的朋友能加入到站点的建设中来。

    谢谢

  • Wincvs 常用命令 at 2008年06月20日

    zoe 于 2008-6-20 18:35 发表
    以下文章转自 [url]http://www.cnitblog.com/embedder/articles/18061.html/url][

    Wincvs 常用命令:

    安装 Wincvs

    一: 进行设置 CVSROOT 的环境变量

    具体步骤是 点 admin —— log in 在 login settings 中选上 CVSROOT, 比如 ... [/quote] 不知道学习嘛。人生下来又不都是爱因斯坦。我最近也在学习啊。

    看了你转的这篇文章,我也看到了一些 perforce,mks 的影子。CVS 啊,古老的开源配置工具,对后续 SCM tools 的影响还是很大的。

  • 版主啊 at 2008年06月20日

    zoe 于 2008-6-20 18:42 发表
    谢谢谢谢~~~~~~~~~~············· [/quote] 甭客气。

  • 偶来啦~ at 2008年06月20日

    zoe 于 2008-6-20 18:45 发表
    有美女给你捧场,你伤心啥哦 [/quote] 就是好久没看到了,才伤心啊

  • 这个论坛和 [url]www.scmroad.com[/url] 的首页账户信息是不共享的.论坛的账户信息和门户的账户信息是共享的.

    好吧,我写个公告出来,以免再次发生这种情况.

  • 踩一脚 at 2008年06月20日

    hiahia,好说好说,小二,倒酒

  • 偶来啦~ at 2008年06月20日

    就是呀.刚才我伤心的不行.