如何用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)

这样任何一个源文件修改都会重新编译所有文件,可能慢点,但没有模块依赖问题。简陋了点,能用就好。。。。
Global site tag (gtag.js) - Google Analytics