如何用mailfile建立一个D项目
smithfox
2007-03-30
当前DMD的IDE都不是很好用,为了更好的理解D语言,我决定在console下用makefile来实现一个项目的compile & link。
但是没有好的makefile的例子以及D语言的makefile详细的介绍。 能顺利地搭建好一个开发环境是迈入任何语言的第一步, 请各位大侠指点指点。 我的所谓测试项目很简单: 两个文件: main.d 和 PrintWellcomeModule.d main调用PrintWellcomeModule中的一个函数 makefile如下: #_ makefile DHOME=D:\develop\d DMD=$(DHOME)\dmd\bin\dmd PHOBOS=$(DHOME)\dmd\lib\phobos.lib DFLAGS=-O LFLAGS=/noi/exetype:nt/subsystem:windows:4.0 DFILES= PrintWellcomeModule.d main.d OBJS= PrintWellcomeModule.obj main.obj # Makerules: .d.obj : $(DMD) $(DFLAGS) -c $* targets: main.exe main.exe : $(OBJS) main.lnk link @main.lnk main.lnk : makefile echo $(OBJS)+ > $*.lnk echo $(PHOBOS) >> $*.lnk echo main >> $*.lnk PrintWellcomeModule.obj : PrintWellcomeModule.d $(DMD) -c -g PrintWellcomeModule clean: del *.map del *.obj del *.lnk main.obj: main.d PrintWellcomeModule.d 运行make,报错: D:\develop\d\dmd\lib\phobos.lib(ti_delegate) Offset 88EE3H Record Type 0091 Error 1: Previous Definition Different : _D10TypeInfo_D6__initZ D:\develop\d\dmd\lib\phobos.lib(ti_delegate) Offset 88F00H Record Type 0091 ..................... |
|
oldrev
2007-03-30
Makefile 和 C/C++ 的差不多,编译和连接都用 dmd
我采用的构建工具是 scons |
|
ideage
2007-03-30
没有用过Make.我直接用个bat文件,组合命令.
如下,请参考: @echo off @cls set DFILES=base.d application.d @REM set DOBJS=base.obj application.obj set DLIBS=isql.lib dfl.lib cattle.res set DFLAGS=-oft -release -I.. -L/exet:nt/su:windows:4.0 @echo on @echo. @echo Compiling Cattle... dmd %DFLAGS% %DFILES% %DLIBS% @del *.map *.obj *.bak |
|
oldrev
2007-03-31
试一下 Rake:
http://rake.rubyforge.org/ Ruby 写的 make D通用Rakefile:http://oldrev.iteye.com/admin/show/66753 |
|
smithfox
2007-04-04
多谢个位
我尝试了cmaked,最终老是报错,因为文档太少,无从搞定。 不过还是了解到了cmake,一个通用的类似于autotools的工具。 最终还是用bud(build)搞定了。 这里是我简单的翻译了一下简介: Bud 是一个帮助构建用D语言写的应用程序和库的工具。 摘要 Bud是一个很好的代替'make'的工具。和其它的构建工具最大的不同是不用写'makefiles'。 Bud会分析源代码从而决定依赖关系和程序的架构,并且调用编译器,链接器和库管理器(librarian)。 Bud的目标是从源代码产生一个target文件.这个文件通常是可执行文件,但也可以是一个库文件。 两种情况都是一样地将源文件转换成object文件,然后要么link成一个可执行文件要么打包成一个库文件。 如果target是生成一个库文件,但是没有一个object文件被打包的话,这个库文件将不会生成。 这种情况发生在所有的源代码中包含了'pragma(nolink)'的情况或是全都是DDoc文件。 ... 参考: 基于由Helmut Leitner写的'dmake v0.21' |
|
smithfox
2007-04-04
hello.d //============================ module hello; import std.stdio void printWelcome(char[] name) { printf("%.*s,welcome to the D language world!\n",name); } main.d //========================== version(build) { pragma(target,"Hello.exe"); } import hello; import std.stdio; int main(){ char[80] name; writefln("Please enter your name:"); scanf("%s",&name); printWelcome(name); return 0; } |
|
smithfox
2007-04-04
最关键的地方就是
version(build)//这个声明dmd不会处理,bud会处理 { pragma(target,"Hello.exe");//bud的pragma可以参见其文档 } bud的这种不用makefile的思想类似于: J2EE中Spring1.x中 IoC用xml来配置, 而Google的IoC用JDK1.5的annotation,消除了xml配置文件 将IoC的信息和Java代码放在一起 |
|
smithfox
2007-04-04
oldrev 写道 Makefile 和 C/C++ 的差不多,编译和连接都用 dmd
我采用的构建工具是 scons oldrev, dmd的链接用的是dm的link.exe,不是dmd.exe吧 |
|
oldrev
2007-04-04
dmd.exe 会自动调用链接器,-L选项还可以传参数给链接器
现在我已经用 Rant 做建立工具啦,在我的blog上有一个万用 rantfile 和说明 |
|
qiezi
2007-04-04
D编译比较快,所以很多时候都是全部重新编译,可以彩build工具,dsource上有。不过有时DMD链接的程序有问题(比如我前几天测试的BerkeleyDB),需要使用DMD编译,gcc或其它工具来链接,这时可以自己手写Makefile,但对于模块依赖更新则不好自动化。好在编译效率实在是太高,目前最好的办法还是全部编译,Makefile中不写%o:%d的依赖关系,直接加一行编译一行链接就行了。
OBJS = foo.o bar.o SRC = foo.d bar.d PROG = test DMD = /opt/dmd/bin/dmd CXX = g++ $(PROG): $(SRC) $(DMD) -c $(SRC) $(CXX) -o $(PROG) $(OBJS) 这样任何一个源文件修改都会重新编译所有文件,可能慢点,但没有模块依赖问题。简陋了点,能用就好。。。。 |