首先从makefile看起。上次BUILD lcc时一共使用过5次nmake命令。
nmake -f makefile.nt TEMPDIR=\\temp HOSTFILE=etc/win32.c lcc
nmake -f makefile.nt all
nmake -f makefile.nt test
nmake -f makefile.nt triple
nmake -f makefile.nt clean
前两次是编译生成目标文件,接着两次是测试生成文件的正确性,最后一次是清理生成过程中产生的中间文件。
那接着来看看makefile.nt里面的内容。
关于生成文件内容可以参考MSDN,这里我们主要关心BUILD需要使用的文件,和这些文件间的依赖关系。
all:: rcc lburg cpp lcc bprint liblcc
rcc: $Brcc$E
lburg: $Blburg$E
cpp: $Bcpp$E
lcc: $Blcc$E
bprint: $Bbprint$E
liblcc: $Bliblcc$A
这里看出主要就是生成 rcc.exe lburg.exe cpp.exe lcc.exe bprint.exe liblcc.exe
这几个文件。当然,我们最关心的是lcc.exe了。那再看看lcc.exe的依赖关系。
$Blcc$E: $Blcc$O $Bhost$O; $(LD) $(LDFLAGS) -Fe$@ $Blcc$O $Bhost$O
$Blcc$O: etc/lcc.c; $(CC) $(CFLAGS) -c -DTEMPDIR=\"$(TEMPDIR)\" -Fo$@ etc/lcc.c
$Bhost$O: $(HOSTFILE); $(CC) $(CFLAGS) -c -Fo$@ $(HOSTFILE)
实际上就是lcc.c和win32.c。好了,从这里开始,其他部分等学习到的时候再说。
-----------------------------
注1:nmake 命令格式:NMAKE [option...] [macros...] [targets...] [@commandfile...]
注2:-f选项:格式:-F filename 将 filename 指定为生成文件。
注3:生成文件包含:
注4:生成文件中可以使用[*,?]通配符,将按依赖扩展。命令中的通配符不扩展,直接传送给命令
注5:生成文件中特殊字符: : ; # ( ) $ ^ \ { } ! @ —
注6:预定义命令宏
产品 |
命令宏 |
定义为 |
选项宏 |
宏汇编 |
AS |
ml |
AFLAGS |
C编译器 |
CC |
cl |
CFLAGS |
C++编译器 |
CPP |
cl |
CPPFLAGS |
C++编译器 |
CXX |
cl |
CXXFLAGS |
资源编译器 |
RC |
rc |
RFLAGS |
注4:一些宏变量定义:B=$(BUILDDIR)^\ E=.exe CC=cl -nologo LD=cl -nologo CFLAGS=-DWIN32 -Zi -MLd -Fd$(BUILDDIR)^\ LDFLAGS=-Zi -MLd -Fd$(BUILDDIR)^\
HOSTFILE 是命令行定义的,我们用的是etc/win32.c