mirror of
https://github.com/dlang/dmd.git
synced 2025-04-25 20:50:41 +03:00
137 lines
3.4 KiB
D
137 lines
3.4 KiB
D
#!/usr/bin/env rdmd
|
|
/**
|
|
Generate the DMD man page automatically.
|
|
|
|
Copyright: D Language Foundation 2017.
|
|
|
|
License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
|
|
*/
|
|
|
|
const header =
|
|
`.TH DMD 1 "%s" "The D Language Foundation" "The D Language Foundation"
|
|
.SH NAME
|
|
dmd \- Digital Mars D2.x Compiler
|
|
.SH SYNOPSIS
|
|
.B dmd \fIfiles\fR ... [ \fI-switch\fR ... ]
|
|
.SH DESCRIPTION
|
|
.B dmd
|
|
Compiles source code written in the D programming language.
|
|
.SH OPTIONS
|
|
.IP "file, file.d, file.htm, file.html"
|
|
D source files to compile
|
|
.IP file.di
|
|
D interface files
|
|
.IP file.o
|
|
Object files to link in
|
|
.IP file.a
|
|
Library files to link in
|
|
.IP @cmdfile
|
|
A file to read more command-line arguments from,
|
|
which may contain # single-line comments`;
|
|
|
|
const footer =
|
|
`.SH LINKING
|
|
Linking is done directly by the
|
|
.B dmd
|
|
compiler after a successful compile. To prevent
|
|
.B dmd
|
|
from running the linker, use the
|
|
.B -c
|
|
switch.
|
|
.PP
|
|
The actual linking is done by running \fBgcc\fR.
|
|
This ensures compatibility with modules compiled with
|
|
\fBgcc\fR.
|
|
.SH FILES
|
|
.TP
|
|
.I /etc/dmd.conf
|
|
System wide \fBdmd\fR config file. See
|
|
.BR dmd.conf(5)
|
|
for details.
|
|
.SH ENVIRONMENT
|
|
The D compiler dmd uses the following environment
|
|
variables:
|
|
.IP DFLAGS 10
|
|
The value of
|
|
.B DFLAGS
|
|
is treated as if it were appended on the command line to
|
|
\fBdmd\fR.
|
|
.SH AUTHOR
|
|
Copyright (c) 1999-%s by The D Language Foundation written by Walter Bright
|
|
.SH "ONLINE DOCUMENTATION"
|
|
.UR https://dlang.org/dmd.html
|
|
https://dlang.org/dmd.html
|
|
.UE
|
|
.SH "SEE ALSO"
|
|
.BR dmd.conf (5)
|
|
.BR rdmd (1)
|
|
.BR dumpobj (1)
|
|
.BR obj2asm (1)
|
|
.BR gcc (1)`;
|
|
|
|
|
|
string bold(string w)
|
|
{
|
|
return `\fI` ~ w ~ `\fR`;
|
|
}
|
|
|
|
// capitalize the first letter
|
|
auto capitalize(string w)
|
|
{
|
|
import std.range, std.uni;
|
|
return w.take(1).asUpperCase.chain(w.dropOne);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
import std.algorithm, std.array, std.conv, std.datetime, std.range, std.stdio, std.uni;
|
|
import std.process : environment;
|
|
import dmd.cli;
|
|
|
|
auto now = Clock.currTime;
|
|
auto diffable = environment.get("DIFFABLE", "0");
|
|
if (diffable == "1")
|
|
now = SysTime(DateTime(2018, 1, 1));
|
|
|
|
writefln(header, now.toISOExtString.take(10));
|
|
|
|
foreach (option; Usage.options)
|
|
{
|
|
if (option.os.isCurrentTargetOS)
|
|
{
|
|
auto flag = option.flag.dup;
|
|
string help = option.helpText.dup;
|
|
if (flag.canFind("<") && flag.canFind(">"))
|
|
{
|
|
// detect special words in <...> and highlight them
|
|
auto specialWord = flag.findSplit("<")[2].until(">").to!string;
|
|
flag = flag.replace("<" ~ specialWord ~ ">", specialWord.bold);
|
|
|
|
// highlight individual words in the description
|
|
help = help.splitter(" ")
|
|
.map!((w){
|
|
auto wPlain = w.filter!(c => !c.among('<', '>', '`', '\'')).to!string;
|
|
return wPlain == specialWord ? wPlain.bold : w;
|
|
})
|
|
.joiner(" ")
|
|
.to!string;
|
|
}
|
|
writefln(".IP -%s", flag);
|
|
// Capitalize the first letter
|
|
writeln(help.capitalize);
|
|
}
|
|
}
|
|
|
|
writeln(`.SH TRANSITIONS
|
|
Language changes listed by \fB-transition=id\fR:`);
|
|
foreach (transition; Usage.transitions)
|
|
{
|
|
if (!transition.documented)
|
|
continue;
|
|
string additionalOptions;
|
|
writefln(".IP %s", transition.name.bold);
|
|
writeln(transition.helpText.capitalize);
|
|
}
|
|
|
|
writefln(footer, now.year);
|
|
}
|