forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 4
/
dcompiler.dd
1088 lines (933 loc) · 33.5 KB
/
dcompiler.dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Ddoc
$(D_S DMD コンパイラ - $(WINDOWS Windows)$(LINUX Linux)$(OSX Mac OS X)$(FREEBSD FreeBSD) 版,
$(UL
$(WINDOWS $(LI dmd $(LINK2 dmd-linux.html, Linux) 版))
$(WINDOWS $(LI dmd $(LINK2 dmd-osx.html, OSX) 版))
$(WINDOWS $(LI dmd $(LINK2 dmd-freebsd.html, FreeBSD) 版))
$(LINUX $(LI dmd $(LINK2 dmd-windows.html, Windows) 版))
$(LINUX $(LI dmd $(LINK2 dmd-osx.html, OSX) 版))
$(LINUX $(LI dmd $(LINK2 dmd-freebsd.html, FreeBSD) 版))
$(OSX $(LI dmd $(LINK2 dmd-windows.html, Windows) 版))
$(OSX $(LI dmd $(LINK2 dmd-linux.html, Linux) 版))
$(OSX $(LI dmd $(LINK2 dmd-freebsd.html, FreeBSD) 版))
$(FREEBSD $(LI dmd $(LINK2 dmd-windows.html, Windows) 版))
$(FREEBSD $(LI dmd $(LINK2 dmd-linux.html, Linux) 版))
$(FREEBSD $(LI dmd $(LINK2 dmd-osx.html, OSX) 版))
$(LI $(LINK2 #requirements, 必要なもの))
$(LI $(LINK2 #files, ファイルリスト))
$(LI $(LINK2 #installation, インストール))
$(WINDOWS $(LI $(LINK2 #example, 例)))
$(LI $(LINK2 #switches, コンパイラの引数とスイッチ))
$(LI $(LINK2 #linking, リンク))
$(LI $(LINK2 #environment, 環境変数))
$(WINDOWS $(LI $(LINK2 #sc_ini, sc.ini 初期設定ファイル)))
$(UNIX $(LI $(DMD_CONF) 初期設定ファイル))
$(WINDOWS $(LI $(LINK2 #problems, 既知のインストール時の問題)))
$(LI $(LINK2 #differences, Windows版とLinux版の違い))
$(LI $(LINK2 #interface_files, D インターフェースファイル))
$(LI $(LINK2 #library, ライブラリのビルド))
$(LI $(LINK2 #compiling_dmd, dmd のコンパイル))
$(LI $(LINK2 #compiling_phobos, Phobos のコンパイル))
)
<h2>$(LNAME2 requirements, 必要なもの)</h2>
$(OL
$(LI $(LINK2 http://www.digitalmars.com/d/download.html, Dコンパイラのダウンロード))
$(WINDOWS
$(LI 32 bit Windows (Win32) OS (Windows XP など))
$(LI Win32用
<a href="http://ftp.digitalmars.com/dmc.zip" title="download dmc.zip">
dmc.zip (C/C++ コンパイラ)</a> のダウンロード
(2.025から必要ではなくなりましたが、いくつかの追加ツールはこちらに含まれています)
)
)
$(LINUX
$(LI 32 bit x86 / 64 bit x86-64 Linux)
$(LI Gnu C compiler (gcc))
)
$(OSX
$(LI 32 bit x86 Mac OSX)
$(LI Gnu C compiler (gcc))
)
$(FREEBSD
$(LI 32 bit x86 FreeBSD 7.1)
$(LI Gnu C compiler (gcc))
)
)
<h2>$(LNAME2 files, ファイルリスト)</h2>
$(DL
$(DT $(D $(DMDDIR)$(SEP)src$(SEP)phobos$(SEP))
$(DD D ランタイムライブラリのソース。)
)
$(DT $(D $(DMDDIR)$(SEP)src$(SEP)dmd$(SEP))
$(DD D コンパイラフロントエンドのソース。GPL もしくは Artistic License のデュアルライセンスです。)
)
$(DT $(D $(DMDDIR)$(SEP)html$(SEP)d$(SEP))
$(DD ドキュメント)
)
$(DT $(D $(DMDDIR)$(SEP)samples$(SEP)d$(SEP))
$(DD サンプル)
)
$(WINDOWS
$(DT $(D $(DMDDIR)\windows\bin\dmd.exe)
$(DD Dコンパイラ実行ファイル)
)
$(DT $(D $(DMDDIR)\windows\bin\$(LINK2 http://www.digitalmars.com/ctg/shell.html, shell.exe))
$(DD 簡単なコマンド型シェル)
)
$(DT $(D $(DMDDIR)\windows\bin\sc.ini)
$(DD コンパイラの設定ファイル)
)
$(DT $(D $(DMDDIR)\windows\lib\$(LIB))
$(DD Dランタイムライブラリ)
)
)
$(LINUX
$(DT $(D $(DMDDIR)/linux/bin/dmd)
$(DD Dコンパイラ実行ファイル)
)
$(DT $(D $(DMDDIR)/linux/bin/$(DUMPOBJ))
$(DD ELF ダンプツール)
)
$(DT $(D $(DMDDIR)/linux/bin/$(OBJ2ASM))
$(DD ELF ディスアセンブラ)
)
$(DT $(D $(DMDDIR)/linux/bin/$(SHELL))
$(DD 簡単なコマンド型シェル)
)
$(DT $(D $(DMDDIR)/linux/bin/$(DMD_CONF))
$(DD コンパイラの設定ファイル (copy to $(D /etc/dmd.conf) にコピーして下さい))
)
$(DT $(D $(DMDDIR)/linux/lib/$(LIB))
$(DD Dランタイムライブラリ (copy to $(D /usr/lib/$(LIB)) にコピーして下さい))
)
)
$(FREEBSD
$(DT $(D $(DMDDIR)/freebsd/bin/dmd)
$(DD Dコンパイラ実行ファイル)
)
$(DT $(D $(DMDDIR)/freebsd/bin/$(DUMPOBJ))
$(DD ELF ダンプツール)
)
$(DT $(D $(DMDDIR)/freebsd/bin/$(OBJ2ASM))
$(DD ELF ディスアセンブラ)
)
$(DT $(D $(DMDDIR)/freebsd/bin/$(SHELL))
$(DD 簡単なコマンド型シェル)
)
$(DT $(D $(DMDDIR)/freebsd/bin/$(DMD_CONF))
$(DD コンパイラの設定ファイル ($(D /etc/dmd.conf) にコピーして下さい))
)
$(DT $(D $(DMDDIR)/freebsd/lib/$(LIB))
$(DD Dランタイムライブラリ ($(D /usr/lib/$(LIB)) にコピーして下さい))
)
)
$(OSX
$(DT $(D $(DMDDIR)/osx/bin/dmd)
$(DD Dコンパイラ実行ファイル)
)
$(DT $(D $(DMDDIR)/osx/bin/$(DUMPOBJ))
$(DD Mach-O ダンプツール)
)
$(DT $(D $(DMDDIR)/osx/bin/$(OBJ2ASM))
$(DD Mach-O ディスアセンブラ)
)
$(DT $(D $(DMDDIR)/osx/bin/$(SHELL))
$(DD 簡単なコマンド型シェル)
)
$(DT $(D $(DMDDIR)/osx/bin/$(DMD_CONF))
$(DD コンパイラの設定ファイル ($(D /etc/dmd.conf) にコピーして下さい))
)
$(DT $(D $(DMDDIR)/osx/lib/$(LIB))
$(DD Dランタイムライブラリ ($(D /usr/lib/$(LIB)) にコピーして下さい))
)
)
)
<h2>$(LNAME2 installation, インストール)</h2>
$(WINDOWS
$(P まず、コンソールウインドウを開きます。(Windows XP なら、
[スタート][コマンドプロンプト] をクリックしてください)。
配布されているツールは全てコマンドラインツールなので、
コンソールから操作する必要があります。
ルートディレクトリに移動し、
ファイルをルートディレクトリにunzipで展開します。
$(D dmd.zip) を展開すると、
$(D $(DMDDIR)) ディレクトリが作られその中に全てのファイルが含まれています。
$(D dmc.zip) を展開すると、
$(D \dm) ディレクトリが作られその中に全てのファイルが含まれています。
)
$(P おおよそこんな感じになるでしょう:)
$(CONSOLE
C:\Documents and Settings\Your Name>cd \
C:\>unzip dmd.zip
C:\>unzip dmc.zip
)
)
$(LINUX
$(LI 書庫をホームディレクトリへunzipで展開します。
$(D ~/dmd)
ディレクトリが作られ、
全てのファイルがその中に入っています。
ツールは全てコンソールから利用するコマンドライン用ツールです。)
$(LI $(D $(DMD_CONF)) を $(D /etc) へコピーします。
$(CONSOLE
cp $(DMDDIR)/linux/bin/$(DMD_CONF) /etc
)
)
$(LI 環境変数 $(B PATH) に $(D $(DMDDIR)/linux/bin) を追加するか、
Linux版の実行ファイルを
$(D /usr/local/bin) にコピーします。)
$(LI ライブラリを $(D /usr/lib) へコピーします:
$(CONSOLE
cp $(DMDDIR)/linux/lib/$(LIB) /usr/lib
)
)
)
$(FREEBSD
$(LI 書庫をホームディレクトリへunzipで展開します。
$(D ~/dmd)
ディレクトリが作られ、
全てのファイルがその中に入っています。
ツールは全てコンソールから利用するコマンドライン用ツールです。)
$(LI $(D $(DMD_CONF)) を $(D /etc) へコピーします。
$(CONSOLE
cp $(DMDDIR)/freebsd/bin/dmd.conf /etc
)
)
$(LI 環境変数 $(B PATH) に $(D $(DMDDIR)/freebsd/bin) を追加するか、
FreeBSD版の実行ファイルを
$(D /usr/local/bin) にコピーします。)
$(LI ライブラリを $(D /usr/lib) へコピーします:
$(CONSOLE
cp $(DMDDIR)/freebsd/lib/$(LIB) /usr/lib
)
)
)
$(OSX
$(LI dmd の zip ファイルをホームディレクトリに置いて、
unzipで展開します。
$(CONSOLE
unzip dmd.$(I VERSION).zip
)
$(I VERSION) にはそのzipファイルのバージョン番号が入ります。
)
$(LI
$(D ~/$(DMDDIR)) ディレクトリが作られ、
全てのファイルがその中に入っています。
ツールは全てコンソールから利用するコマンドライン用ツールです。)
$(LI 動作を確かめるために、以下の内容で $(D hello.d)
というファイルをホームディレクトリに作成して下さい:
---
import std.stdio;
void main() {
writeln("hello world!");
}
---
これを次のようにコンパイルして実行すると
$(CONSOLE
$(DMDDIR)/osx/bin/dmd hello
./hello
)
以下が表示されれば成功です:
$(CONSOLE
hello world!
)
)
$(LI システム全体で使えるようにインストールするには:)
$(LI 実行ファイルを $(D /usr/local/bin):
$(CONSOLE
sudo cp $(DMDDIR)/osx/bin/{dmd,$(DUMPOBJ),$(OBJ2ASM),$(SHELL)$(V2 ,rdmd)} /usr/local/bin
sudo cp $(DMDDIR)/osx/bin/dmdx.conf /usr/local/bin/$(DMD_CONF)
)
)
$(LI 最後に、ライブラリファイルを $(D /usr/lib) へコピーします:
$(CONSOLE
sudo cp $(DMDDIR)/osx/lib/$(LIB) /usr/lib
)
)
)
$(WINDOWS
<h2><h2>$(LNAME2 example, 例)</h2></h2>
$(P $(D $(DMDDIR)$(SEP)samples$(SEP)d) ディレクトリで以下を実行して下さい:)
$(CONSOLE
$(DMDDIR)$(SEP)$(OS)$(SEP)bin$(SEP)$(SHELL) all.sh
)
$(P 小さなサンプルが幾つか実行されます。)
)
<h2>$(LNAME2 switches, コンパイラの引数とスイッチ)</h2>
$(DL
$(DT $(B dmd) $(I files)... -$(I switches)...
$(DD )
)
$(DT $(I files)...
$(DD
$(TABLE2 ファイルの拡張子,
$(TR
$(TH 拡張子)
$(TH ファイルの種類)
)
$(TR
$(TD $(I なし))
$(TD D言語のソース)
)
$(TR
$(TD $(B .d))
$(TD D言語のソース)
)
$(TR
$(TD $(B .dd))
$(TD $(LINK2 ddoc.html, Ddoc) のソース)
)
$(TR
$(TD $(B .di))
$(TD $(LINK2 #interface_files, D インターフェイスファイル))
)
$(TR
$(TD $(B .$(OBJEXT)))
$(TD リンクしたいオブジェクトファイル)
)
$(TR
$(TD $(B .$(LIBEXT)))
$(TD 検索対象にするオブジェクトコードライブラリ)
)
$(WINDOWS
$(TR
$(TD $(B .exe))
$(TD 出力する実行ファイルの名前)
)
$(TR
$(TD $(B .def))
$(TD $(LINK2 http://www.digitalmars.com/ctg/ctgDefFiles.html, 実行モジュール定義ファイル))
)
$(TR
$(TD $(B .res))
$(TD リソースファイル)
)
)
)
)
)
$(SWITCH $(B @)$(I cmdfile),
$(I cmdfile) が環境変数の名前であれば、
その環境変数から、
コンパイラへの引数とスイッチを読み込みます。
それ以外の場合、
テキストファイル $(I cmdfile) から引数とスイッチを読み込みます。
)
$(SWITCH $(B -c),
コンパイルのみ。リンクはしません
)
$(SWITCH $(B -cov),
$(LINK2 code_coverage.html, コードカバレッジ解析) を有効にする
)
$(SWITCH $(B -D),
ソースから $(LINK2 ddoc.html, ドキュメント) を生成
)
$(SWITCH $(B -Dd)$(I docdir),
ドキュメントファイルを $(I docdir) ディレクトリに出力。 $(B -op)
を同時に指定することで、
元の階層構造を保って出力することができます。
)
$(SWITCH $(B -Df)$(I filename),
ドキュメントファイルを $(I filename) に出力
)
$(SWITCH $(B -d),
非推奨(deprecated)な機能を有効化
)
$(SWITCH $(B -debug),
$(LINK2 version.html#debug, デバッグ) 用にコンパイル
)
$(SWITCH $(B -debug=)$(I level),
$(LINK2 version.html#debug, デバッグレベル) <= $(I level) でコンパイル
)
$(SWITCH $(B -debug=)$(I ident),
$(LINK2 version.html#debug, デバッグ識別子) $(I ident) を有効にしてコンパイル
)
$(SWITCH $(B -debuglib=)$(I libname),
デバッグ情報つきのコンパイル時に、$(I libname)
をデフォルトライブラリとして $(B $(LIB)) の代わりにリンク
)
$(SWITCH $(B -defaultlib=)$(I libname),
デバッグ情報なしのコンパイル時に、$(I libname)
をデフォルトライブラリとして $(B $(LIB)) の代わりにリンク
)
$(SWITCH $(B -deps=)$(I filename),
モジュールの依存関係をテキストで $(I filename) に書き込み
)
$(UNIX
$(SWITCH $(B -fPIC),
位置非依存コード
(共有ライブラリのビルドに使われる) を生成。
$(OSX OSXではこのフラグは常に有効です。)
)
)
$(SWITCH $(B -g),
$(WINDOWS
$(LINK2 http://ddbg.mainia.de/releases.html, Ddbg)
等のデバッガ向けに Codeview 4 シンボル情報を
$(LINK2 abi.html#codeview, D extensions)
として
)
$(UNIX
$(LINK2 abi.html#dwarf, D extensions)
として
Dwarf シンボル情報を追加 $(LINUX 例えば
$(LINK2 http://www.zerobugs.org/, ZeroBUGS) が対応)
)
)
$(SWITCH $(B -gc),
$(WINDOWS
$(D $(DMDDIR)\bin\windbg)
等のデバッガ向けに Codeview 4
シンボル情報を追加
)
$(UNIX
$(D gdb) など向けに
C 形式で
Dwarf シンボル情報を追加
)
)
$(SWITCH $(B -gs),
常に標準的なスタックフレームを生成
)
$(SWITCH $(B -H),
$(LINK2 #interface_files, Dインターフェイスファイル) の生成
)
$(SWITCH $(B -Hd)$(I dir),
Dインターフェイスファイルの出力ディレクトリ $(I dir) の指定。 $(B -op)
を同時に指定することで、
元の階層構造を保って出力することができます。
)
$(SWITCH $(B -Hf)$(I filename),
Dインターフェイスファイルのファイル名 $(I filename) の指定
)
$(SWITCH $(B --help),
ヘルプメッセージを出力
)
$(SWITCH $(B -I)$(I path),
$(LINK2 module.html#ImportDeclaration, import)
されたモジュールを検索するパスの指定。
$(I path) は ; で分かち書きしたパスのリストとします。
複数回 $(B -I) を使うことも可能で、
パスは指定された順番に検索されます。
)
$(SWITCH $(B -ignore),
非対応のpragmaを無視
)
$(SWITCH $(B -inline),
関数のインライン展開を有効にします。
これによってパフォーマンスは向上しますが、
デバッグが難しくなります。
)
$(SWITCH $(B -J)$(I path),
$(LINK2 expression.html#ImportExpression, $(I ImportExpression))
で指定したファイルを探すパス。このスイッチは
$(I ImportExpression) を使う際に必須となります。
$(I path) には ; で区切ったパスのリストを指定します。
複数の $(B -J) スイッチを指定することも可能で、
パスは指定された順番に検索されます。
)
$(SWITCH $(B -L)$(I linkerflag),
$(I linkerflag) を
$(WINDOWS $(LINK2 http://www.digitalmars.com/ctg/optlink.html, リンカ))
$(UNIX リンカ) へ渡します。例えば
$(WINDOWS $(D -L/ma/li))$(UNIX $(D -L-M))
)
$(SWITCH $(B -lib),
オブジェクトファイルの代わりにライブラリファイルを出力します。
コンパイルされたソースファイルおよび、
引数で指定されたオブジェクトファイルやライブラリが、
まとめて出力ライブラリに格納されます。
粒度を上げるために、コンパイルされたソースモジュールはライブラリ内で
別々のオブジェクトへと分割して格納されることがあります。
ライブラリの名前は、最初に渡されたソースファイルの名前から取られます。
これは、
$(B -of) スイッチによる上書きが可能です。
)
$(UNIX
$(SWITCH $(B -m32),
32bit実行ファイルにコンパイルします。
これが 32bit dmd ではデフォルトです。
)
$(SWITCH $(B -m64),
32bit実行ファイルにコンパイルします。これが 64bit dmd ではデフォルトです。
)
)
$(SWITCH $(B -man),
$(WINDOWS
このページをデフォルトのブラウザで開きます。
)
$(LINUX
このページを $(B BROWSER)
環境変数のブラウザで開きます。$(B BROWSER)
が未定義なら $(B x-www-browser) を使います。
)
$(FREEBSD
open browser specified by the $(B BROWSER)
environment variable on this page. If $(B BROWSER) is
undefined, $(B x-www-browser) is assumed.
)
$(OSX
このページを $(B BROWSER)
環境変数のブラウザで開きます。$(B BROWSER)
が未定義なら $(B Safari) を使います。
)
)
$(SWITCH $(B -map),
.map ファイルを生成
)
$(V2
$(SWITCH $(B -noboundscheck),
全ての配列境界チェックを(safe関数の中でさえも)無効にします。
)
)
$(WINDOWS
$(SWITCH $(B -nofloat),
浮動小数点演算コードが存在する場合であっても、オブジェクトファイルから
$(B __fltused)
への参照を除去します。ライブラリコードに対して有用です。
)
)
$(SWITCH $(B -O),
生成コードを最適化。
最高速の出力を得るには、$(B -O -release -inline) を使用してください。
)
$(SWITCH $(B -o-),
オブジェクトファイルを生成させないようにします。
$(B -D) や $(B -H) フラグと同時に使うと便利です。
)
$(SWITCH $(B -od)$(I objdir),
$(DD オブジェクトファイルをカレントではなく $(I objdir)
からの相対で出力)。 $(B -op)
を同時に指定することで、
元の階層構造を保って出力することができます。
)
$(SWITCH $(B -of)$(I filename),
出力ファイル名を $(I filename)
に設定。出力ファイルは、
他のスイッチに応じてオブジェクトファイル、実行ファイル、
あるはライブラリファイルのいずれかになります。
)
$(SWITCH $(B -op),
オブジェクトファイルや.diファイル、ddocの出力の名前を決める際、通常は
ソースファイル名のディレクトリ名部分を削りますが、$(B -op)
はこれを残します。
)
$(SWITCH $(B -profile),
生成したコードの実行パフォーマンスを測定する
$(LINK2 http://www.digitalmars.com/ctg/trace.html, プロファイリング)
用の情報を追加
)
$(V2
$(SWITCH $(B -property),
プロパティ関数に対して @property の使用を強制
)
)
$(SWITCH $(B -quiet),
重要でないコンパイラのメッセージを抑制
)
$(SWITCH $(B -release),
$(V1 リース用にコンパイル
つまり、契約やassertや配列境界チェックのコードを生成しなくなります。)
$(V2 リリース用にコンパイル
つまり、契約やassertのコードを生成しなくなります。
システム関数と信頼済み関数については配列境界チェックを行わなくなります。)
)
$(SWITCH $(B -run) $(I srcfile args...),
$(I srcfile) のコンパイル、リンクを行い、
生成されたプログラムに残りのコマンドライン引数
$(I args...) を渡して起動します。
.$(OBJEXT) や実行ファイルを後に残すことはありません。
)
$(COMMENT
$(SWITCH $(B -safe),
Statically checks the modules being compiled to ensure they
conform to the $(LINK2 safed.html, safe memory model).
)
)
$(UNIX
$(SWITCH $(B -shared),
共有ライブラリを生成
)
)
$(SWITCH $(B -unittest),
$(LINK2 unittest.html, unittest) 用コードをコンパイルし、assertを有効にします。
また $(D unittest) $(LINK2 version.html#PredefinedVersions, バージョン識別子) を有効にします。
)
$(SWITCH $(B -v),
メッセージを冗長に出力
)
$(SWITCH $(B -version=)$(I level),
$(LINK2 version.html#version, バージョン番号) が $(I level) 以上のコードを全てコンパイル
)
$(SWITCH $(B -version=)$(I ident),
$(LINK2 version.html#version, バージョン識別子) $(I ident) を指定してコンパイル
)
$(V2
$(SWITCH $(B -vtls),
スレッドローカル記憶域に割り当てられた変数名をコンパイル時に表示します。
デフォルトsharedへの移行のための利便性のためのスイッチです。
)
)
$(SWITCH $(B -w),
$(LINK2 warnings.html, 警告) を有効にします
)
$(SWITCH $(B -wi),
$(LINK2 warnings.html, 情報表示だけの警告
(コンパイルはそのまま続く)) を有効にします
)
$(SWITCH $(B -X),
JSON ファイルを生成
)
$(SWITCH $(B -Xf)$(I filename),
JSON ファイルの書き込み先ファイル $(I filename) を指定
)
)
$(WINDOWS
$(P 空のスイッチ、つまり "" は無視されます。)
)
<h2>$(LNAME2 linking, リンク)</h2>
$(P リンク処理は $(B dmd) コンパイラによって、
コンパイルが成功した後自動的に実行されます。これを止めるには、
$(B -c) スイッチを使用します。
)
$(WINDOWS
$(P プログラムは、Dのランタイムライブラリ $(B phobos.lib) と、
それに続けて Cのランタイムライブラリ $(B snn.lib)
とリンクしなければなりません。この動作は、ライブラリが環境変数
LIB の指すパスに存在すれば自動的に実行されます。LIB
を設定する方法は、例えば次のようになります:
)
$(CONSOLE
set LIB=$(DMDDIR)\lib;\dm\lib
)
$(P If the $(B dmd) コマンドをコンパイルと実行ファイルへのリンクの両方に使う場合、
Windows
の実行ファイルにのみ有効なある種の最適化が行われます。
出力された .obj ファイルを DLL に使うことはできません。
exe と DLL の両方で使える .obj ファイルにコンパイルするには、
$(B -c) オプションでコンパイルします。
)
$(P リンクは
$(LINK2 http://www.digitalmars.com/ctg/optlink.html, optlink) リンカで行われます。
)
)
$(UNIX
$(P リンクは $(B gcc) で行います。
これによって $(B gcc) でコンパイルされたモジュールとの互換性が保証されます。
)
)
<h2>$(LNAME2 environment, 環境変数)</h2>
$(P Dコンパイラ dmd は以下の環境変数を使用します:
)
$(DL
$(WINDOWS
<dt>$(B DFLAGS)
<dd>$(B dmd.exe) は、コマンドラインの最後に $(B DFLAGS)
の内容が追加されたかのように動作します。
<dt>$(B LIB)
<dd>リンカが、ライブラリファイルを探すために環境変数 $(B LIB) を用います。
Dでは通常は、次のように指定されます:
$(CONSOLE
set LIB=$(DMDDIR)\lib;\dm\lib
)
<dt>$(B LINKCMD)
<dd> $(B dmd) は、通常はリンカとして $(B PATH) の通ったところにある
$(B link.exe) を使おうとします。代わりに特定のリンカを使うためには、
$(B LINKCMD) にて指定します。例えば:
$(CONSOLE
set LINKCMD=\dmd\windows\bin\link
)
<dt>$(B PATH)
<dd>リンカが $(B dmd.exe) と同じディレクトリに見つからなければ、
環境変数 $(B PATH) を探します。
$(B 注:) 名前だけ同じ
$(B link.exe) のリンカでは大抵動作しません。
Digital Mars の $(B link.exe) が他の
$(B link.exe) より先に $(B PATH) の中に見つかるように注意してください。
明示的にリンカを指定するのに、$(B LINKCMD)
を使うことも可能です。
)
$(UNIX
<dt>$(B CC)
<dd> $(B dmd) は、通常はリンカとして $(B gcc)
を環境変数 $(B PATH) から探します。特定のリンカを指定したい場合は、
$(B CC) 環境変数を設定します。例:
$(CONSOLE
set CC=gcc
)
$(DT $(B BROWSER)
$(DD $(B -man) スイッチでこのマニュアルページを開く時のブラウザの指定に使用されます。
デフォルトは $(D x-www-browser) です。
)
)
<dt>$(B DFLAGS)
<dd>$(B dmd) は、コマンドラインの最後に $(B DFLAGS)
の内容が追加されたかのように動作します。
)
)
$(WINDOWS
<h2>$(LNAME2 sc_ini, sc.ini Initialization File)</h2>
$(P $(B dmd) は初期設定ファイル $(B sc.ini) を、
以下のディレクトリから順番に探します:
)
$(OL
$(LI カレントディレクトリ)
$(LI $(B HOME) 環境変数で指定されたディレクトリ)
$(LI $(B dmd.exe) のあるディレクトリ)
)
$(P sc.ini が見つかった場合、
このファイルで設定された環境変数が既存の設定を上書きします。
他のプログラムの環境変数による設定との衝突を避け、$(B dmd)
の設定を独立させる簡単な方法となっています。
)
<h3>初期設定ファイルのフォーマット</h3>
$(P $(D ;) で始まる行はコメントとして無視されます。
)
$(P 環境変数は $(D [Environment]) セクションのヘッダの後ろに続けて、
$(I NAME)=$(I value) という組の形で記述します。
$(I NAME) は常に大文字扱いとなります。
という組の形で記述します。コメントは行頭の ;
から始める行です。例としては:
)
$(SCINI
; sc.ini file for dmd
; Names enclosed by %% are searched for in the existing environment
; and inserted. The special name %@P% is replaced with the path
; to this file.
[Environment]
LIB="%@P%\..\lib";\dm\lib
$(V1 DFLAGS="-I%@P%\..\src\phobos")
$(V2 DFLAGS="-I%@P%\..\src\phobos" "-I%@P%\..\src\druntime\import")
LINKCMD="%@P%\..\..\dm\bin"
DDOCFILE=mysettings.ddoc
)
<h3>sc.ini の位置非依存性</h3>
$(P $(B %@P%) は $(D sc.ini) のあるパスに置き換えられます。
従って、$(D sc.ini) のフルパスが
$(D c:$(DMDDIR)\bin\sc.ini) ならば、$(B %@P%) は
$(D c:$(DMDDIR)\bin) になり、上記の $(D sc.ini) will be
は以下のように解釈されます:
)
$(SCINI
[Environment]
LIB="c:$(DMDDIR)\bin\..\lib";\dm\lib
$(V1 DFLAGS="-Ic:$(DMDDIR)\bin\..\src\phobos")
$(V2 DFLAGS="-Ic:$(DMDDIR)\bin\..\src\phobos" "-Ic:$(DMDDIR)\bin\..\src\druntime\import")
LINKCMD="c:$(DMDDIR)\bin\..\..\dm\bin"
DDOCFILE=mysettings.ddoc
)
$(P これによって、
$(D sc.ini) を毎回編集せずとも dmd の配置を変更することが可能です。
)
)
$(UNIX
<h2>$(LNAME2 dmd_conf, dmd.conf 初期設定ファイル)</h2>
$(P 設定ファイル $(D dmd.conf) はWindowsでの $(D sc.ini)
と同じもので、違うのは名前だけです。
WindowsとUnix系システムで同じ設定ファイルを
変更なしで共有することが出来ます。)
$(P $(B dmd) は初期設定ファイル $(D dmd.conf) を、
以下のディレクトリから順番に探します:)
$(OL
$(LI カレントディレクトリ)
$(LI $(B HOME) 環境変数で指定されたディレクトリ)
$(LI $(B dmd) のあるディレクトリ)
$(LI $(D /etc/))
)
$(P dmd.conf が見つかった場合、
このファイルで設定された環境変数が既存の設定を上書きします。
他のプログラムの環境変数による設定との衝突を避け、$(B dmd)
の設定を独立させる簡単な方法となっています。
)
$(P 環境変数は $(D [Environment]) セクションのヘッダの後ろに続けて、
$(I NAME)=$(I value) という組の形で記述します。
$(I NAME)は常に大文字扱いになります。
コメントは行頭の ;
から始める行です。例としては:
)
$(SCINI
; dmd.conf file for dmd
; Names enclosed by %% are searched for in the existing environment
; and inserted. The special name %@P% is replaced with the path
; to this file.
[Environment]
$(V1 DFLAGS=-I%@P%/../src/phobos)
$(V2 DFLAGS=-I%@P%/../src/phobos -I%@P%/../src/druntime/import)
)
)
$(WINDOWS
<h2>$(LNAME2 problems, 既知のインストール時の問題)</h2>
$(UL
$(LI Cygwin の $(B unzip)
を使うと問題が発生するようです。
)
$(LI Cygwin のコマンドシェルからコンパイラを起動する際にも、
問題が起きることが報告されています。Cygwinでの動作を試す前に、
Windowsの通常のシェル $(B cmd.exe) を試してみてください。
)
$(LI $(B dmd) と $(B dmc) をスペースを含む名前のディレクトリ・パスに置くと、
問題が発生します。
)
)
)
<hr>
<h2>$(LNAME2 differences, Windows版とLinux版の違い)</h2>
$(UL
$(LI Linux版では、
文字列リテラルは読取専用です。
書き込もうとするとセグメント違反が発生します。)
)
<hr>
<h2>$(LNAME2 interface_files, D インターフェイスファイル)</h2>
$(P Dのソースコード中の import 宣言が処理される際には、
コンパイラは、その import に対応するDのソースファイルを検索し、
見つかったファイルから import に必要な情報を取り出します。
これとは別に、コンパイラは対応する
$(I D インターフェイスファイル) を探して使うこともできます。
D インターフェイスファイルはそのモジュールの実装全てではなく、
importに必要な情報だけが記述されたファイルです。
)
$(P Dのソースファイルではなくインターフェイスファイルを import
に使用することの利点は:
)
$(UL
$(LI D インターフェイスファイルは多くの場合、対応するD ソースファイルより
ずっと小さく、高速に処理できます。)
$(LI ソースコードの隠蔽にも使用できます。例えば、
ソースコードの代わりに、コンパイル済みのオブジェクトコードと
Dインターフェイスファイルをリリースします。)
)
$(P D インターフェイスファイルは、コンパイラに
$(B -H) スイッチを指定することで、
D ソースファイルから生成します。D インターフェイスファイルの拡張子は $(B .di)> です。
コンパイラが import 宣言を解決する際には、まず
$(B .di) D インターフェイスファイルを検索し、次に
D ソースファイルを探します。
)
$(P D インターフェイスファイルは、ある意味で C++ のヘッダファイルによく似ています。
しかし、C++のヘッダファイルのような意味で必要になるわけでもなければ、
Dという言語の一部でもありません。
これは、コンパイラの機能の一つで、
ビルド処理の最適化のためだけに使用されます。
)
<h2>$(LNAME2 executable, 実行ファイルのビルド)</h2>
$(P $(B dmd) は、コンパイル対象のソースコードを一度にコマンドラインでまとめて指定する方が、
ずっと高速に実行ファイルを生成できます。)
$(P $(B dmd) の一度の起動に複数のソースファイルをまとめて渡すもう一つの利点は、
それによって、モジュールを超えたインライン展開などの最適化を $(B dmd)
が行える可能性があることです。
)
<h2>$(LNAME2 library, ライブラリのビルド)</h2>
$(P ライブラリのビルド方法は3種類あります。例として、
コンパイルするソース $(D foo.d) と $(D bar.d)、
既存のオブジェクトファイル $(D bar.$(OBJEXT))、そして既存のライブラリ
$(D def.$(LIBEXT))を全てまとめて、
$(D foo.$(LIBEXT)) というライブラリをビルドする場合を考えてみましょう:)
$(OL
$(LI それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
$(WINDOWS
$(CONSOLE
dmd -c foo.d
dmd -c bar.d
$(LINK2 http://www.digitalmars.com/ctg/lib.html, lib) -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.obj bar.obj
)
)
$(UNIX
$(CONSOLE
dmd -c foo.d
dmd -c bar.d
rm -f foo.a
ar -r foo.a foo.o bar.o abc.o def.a
rm foo.o bar.o
)
)
この方法は、makefile などを使うことで、
モジュールの余計な再コンパイルを避ける時などに適しています。
)
$(LI 一括でコンパイルを行い、ライブラリ化コマンドを実行:
$(WINDOWS
$(CONSOLE
dmd -c foo.d bar.d
$(LINK2 http://www.digitalmars.com/ctg/lib.html, lib) -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.obj bar.obj