​原文​​​​ImportC​​是​​C11​​编译器.关注的是​​标准兼容性​​,而不是实现大量不同的​​扩展​​.
火卫一(​​D​​标准库)包含一份​​zlib​​语言,​​ImportC​​消除了在​​DMD​​构建过程中需要外部​​C编译器​​,即所有​​DMD​​都可以由​​DMD​​构建.实际上,这是​​ImportC​​开发背后的动机之一.

用DMD构建oksh

​oksh​​​不含​​D代码​​​.用​​OpenBSD​​​下类似​​clang​​​的​​CC​​​来配置​​oksh​​​.
​​​DMD​​​使用与​​C编译器​​​不同的​​标志​​​.首先要注意,​​DMD​​​没有​​-o​​​标志,如果要设置​​输出文件名​​​,要使用​​-of(注意,没有空格)​​​.D本身不使用预处理器,因此在使用​​ImportC​​​时,与​​C预处理器​​​标志不同.该标志是​​-P=​​​.如,​​oksh​​​使用​​-DEMACS​​​和​​-DVI​​​接口标志,对​​DMD​​​,这些标志需要转换为​​-P=-DEMACS​​​和​​-P=-DVI​​.

//Makefile
.c.o:
${CC} ${CFLAGS} -of$@ -c $<

结合​​CFLAGS​​产生:

dmd -g -O -P=-DEMACS -P=-DVI -ofalloc.o -c alloc.c
//-P,P为预处理

​OpenBSD​​​使用​​gnu​​​扩展汇编.
​​​DMD​​​虽然理解​​内联汇编​​​,但它不理解​​GNU​​​扩展汇编.
用​​​#ifdef​​​简单去掉.运行​​make​​,

dmd -g -O -P=-DEMACS -P=-DVI -ofc_ksh.o -c c_ksh.c
c_ksh.c(1210): 错误.
//还不支持

用​​clang​​​编译.​​expr.c​​​也不能编译,其他都编译过了.
修改​​​-lcurses​​​链接为​​-L=-lcurses​​​.
会遇到很多​​​链接​​​错误.再加上​​-P=-D_ANSI_LIBRARY​​​预处理指令,就可以编译通过了.
加上​​​-betterC​​​标志,再加上​​-inline/-release​​​,加上​​-L=--as-needed​​​标志,告诉​​lld​​不链接未用库.