Merge remote-tracking branch 'upstream/master' into stable

This commit is contained in:
Iain Buclaw 2024-01-01 22:18:30 +00:00
commit c580be18e5
8 changed files with 192 additions and 385 deletions

38
.github/workflows/main.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: Main
on:
- pull_request # without merge conflicts
- push # branch or tag
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
main:
strategy:
fail-fast: false
matrix:
os: [ macos-latest, ubuntu-latest, windows-latest ]
dc: [ dmd-latest, ldc-latest ]
name: ${{ matrix.os }}, ${{ matrix.dc }}
runs-on: ${{ matrix.os }}
timeout-minutes: 10
env:
DMD: ${{ startsWith(matrix.dc, 'ldc') && 'ldmd2' || 'dmd' }}
N: ${{ startsWith(matrix.os, 'macos') && '3' || '2' }}
steps:
- uses: actions/checkout@v4
- name: Install D compiler
uses: dlang-community/setup-dlang@v1.3.0
with:
compiler: ${{ matrix.dc }}
- name: Build
shell: bash
run: make -j$N DMD=$DMD
- name: Test
shell: bash
run: make -j$N DMD=$DMD test
- name: 'Windows: Build and test with MODEL=32'
if: runner.os == 'Windows'
shell: bash
run: make -j$N DMD=$DMD MODEL=32 all test

142
Makefile Normal file
View file

@ -0,0 +1,142 @@
DMD_DIR = ../dmd
BUILD = release
DMD = $(DMD_DIR)/generated/$(OS)/$(BUILD)/$(MODEL)/dmd
INSTALL_DIR = ../install
DRUNTIME_PATH = ../dmd/druntime
PHOBOS_PATH = ../phobos
DUB=dub
WITH_DOC = no
DOC = ../dlang.org
# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile from dmd
$(shell [ ! -d $(DMD_DIR) ] && git clone --depth=1 https://github.com/dlang/dmd $(DMD_DIR))
include $(DMD_DIR)/compiler/src/osmodel.mak
ifeq (windows,$(OS))
DOTEXE:=.exe
else
DOTEXE:=
endif
# Build folder for all binaries
GENERATED = generated
ROOT = $(GENERATED)/$(OS)/$(MODEL)
# default to warnings and deprecations as errors, override via e.g. make WARNINGS=-wi
WARNINGS = -w -de
# default flags, override by setting DFLAGS (e.g. make DFLAGS=-O)
DFLAGS = $(MODEL_FLAG) $(if $(findstring windows,$(OS)),,-fPIC) -preview=dip1000
DFLAGS += $(WARNINGS)
# Default DUB flags (DUB uses a different architecture format)
DUBFLAGS = --arch=$(subst 32,x86,$(subst 64,x86_64,$(MODEL)))
TOOLS = \
$(ROOT)/catdoc$(DOTEXE) \
$(ROOT)/checkwhitespace$(DOTEXE) \
$(ROOT)/contributors$(DOTEXE) \
$(ROOT)/ddemangle$(DOTEXE) \
$(ROOT)/detab$(DOTEXE) \
$(ROOT)/rdmd$(DOTEXE) \
$(ROOT)/tolf$(DOTEXE) \
$(ROOT)/updatecopyright$(DOTEXE)
CURL_TOOLS = \
$(ROOT)/changed$(DOTEXE) \
$(ROOT)/dget$(DOTEXE)
DOC_TOOLS = \
$(ROOT)/dman$(DOTEXE)
TEST_TOOLS = \
$(ROOT)/rdmd_test$(DOTEXE)
all: $(TOOLS) $(CURL_TOOLS) $(ROOT)/dustmite$(DOTEXE)
rdmd: $(ROOT)/rdmd$(DOTEXE)
ddemangle: $(ROOT)/ddemangle$(DOTEXE)
catdoc: $(ROOT)/catdoc$(DOTEXE)
detab: $(ROOT)/detab$(DOTEXE)
tolf: $(ROOT)/tolf$(DOTEXE)
dget: $(ROOT)/dget$(DOTEXE)
changed: $(ROOT)/changed$(DOTEXE)
dman: $(ROOT)/dman$(DOTEXE)
dustmite: $(ROOT)/dustmite$(DOTEXE)
$(ROOT)/dustmite$(DOTEXE): DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d
$(DMD) $(DFLAGS) -version=Dlang_Tools DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d -of$(@)
$(TOOLS) $(DOC_TOOLS) $(CURL_TOOLS) $(TEST_TOOLS): $(ROOT)/%$(DOTEXE): %.d
$(DMD) $(DFLAGS) -of$(@) $(<)
d-tags.json:
@echo 'Build d-tags.json and copy it here, e.g. by running:'
@echo " make -C ../dlang.org -f posix.mak d-tags-latest.json && cp ../dlang.org/d-tags-latest.json d-tags.json"
@echo 'or:'
@echo " make -C ../dlang.org -f posix.mak d-tags-prerelease.json && cp ../dlang.org/d-tags-prerelease.json d-tags.json"
@exit 1
$(ROOT)/dman$(DOTEXE): d-tags.json
$(ROOT)/dman$(DOTEXE): override DFLAGS += -J.
install: $(TOOLS) $(CURL_TOOLS) $(ROOT)/dustmite$(DOTEXE)
mkdir -p $(INSTALL_DIR)/bin
cp $^ $(INSTALL_DIR)/bin
clean:
rm -rf $(GENERATED)
$(ROOT)/tests_extractor$(DOTEXE): tests_extractor.d
mkdir -p $(ROOT)
DFLAGS="$(DFLAGS)" $(DUB) build \
--single $< --force --compiler=$(DMD) $(DUBFLAGS) \
&& mv ./tests_extractor$(DOTEXE) $@
################################################################################
# Build & run tests
################################################################################
ifeq (windows,$(OS))
# for some reason, --strip-trailing-cr isn't enough - need to dos2unix stdin
DIFF := dos2unix | diff --strip-trailing-cr
else
DIFF := diff
endif
test_tests_extractor: $(ROOT)/tests_extractor$(DOTEXE)
for file in ascii iteration ; do \
$< -i "./test/tests_extractor/$${file}.d" | $(DIFF) -u -p - "./test/tests_extractor/$${file}.d.ext"; \
done
$< -a betterc -i "./test/tests_extractor/attributes.d" | $(DIFF) -u -p - "./test/tests_extractor/attributes.d.ext";
$< --betterC -i "./test/tests_extractor/betterc.d" | $(DIFF) -u -p - "./test/tests_extractor/betterc.d.ext";
RDMD_TEST_COMPILERS = $(DMD)
RDMD_TEST_EXECUTABLE = $(ROOT)/rdmd$(DOTEXE)
RDMD_TEST_DEFAULT_COMPILER = $(basename $(DMD))
VERBOSE_RDMD_TEST=0
ifeq ($(VERBOSE_RDMD_TEST), 1)
override VERBOSE_RDMD_TEST_FLAGS:=-v
endif
ifeq (osx,$(OS))
# /tmp is a symlink on Mac, and rdmd_test.d doesn't like it
test_rdmd: export TMPDIR=$(shell cd /tmp && pwd -P)
endif
test_rdmd: $(ROOT)/rdmd_test$(DOTEXE) $(RDMD_TEST_EXECUTABLE)
$< $(RDMD_TEST_EXECUTABLE) $(MODEL_FLAG) \
--rdmd-default-compiler=$(RDMD_TEST_DEFAULT_COMPILER) \
--test-compilers=$(RDMD_TEST_COMPILERS) \
$(VERBOSE_RDMD_TEST_FLAGS)
$(DMD) $(DFLAGS) -unittest -main -run rdmd.d
test: test_tests_extractor test_rdmd
ifeq ($(WITH_DOC),yes)
all install: $(DOC_TOOLS)
endif
.PHONY: all install clean
.DELETE_ON_ERROR: # GNU Make directive (delete output files on error)

View file

@ -38,7 +38,7 @@ Building
On a Posix system all tools can be built with: On a Posix system all tools can be built with:
``` ```
make -f posix.mak all make all
``` ```
Using DUB as a build tool Using DUB as a build tool

View file

@ -1,71 +0,0 @@
platform: x64
environment:
matrix:
- DC: dmd
DVersion: nightly
arch: x64
MODEL: 64
- DC: dmd
DVersion: nightly
arch: x86
MODEL: 32
skip_tags: false
build_script:
- ps: >
function ResolveLatestDMD
{
$version = $env:DVersion;
if($version -eq "stable") {
$latest = (Invoke-WebRequest "https://downloads.dlang.org/releases/LATEST").toString();
$url = "https://downloads.dlang.org/releases/2.x/$($latest)/dmd.$($latest).windows.7z";
}elseif($version -eq "beta") {
$latest = (Invoke-WebRequest "https://downloads.dlang.org/pre-releases/LATEST").toString();
$latestVersion = $latest.split("-")[0].split("~")[0];
$url = "https://downloads.dlang.org/pre-releases/2.x/$($latestVersion)/dmd.$($latest).windows.7z";
}elseif($version -eq "nightly") {
$latest = (Invoke-WebRequest "https://downloads.dlang.org/nightlies/dmd-master/LATEST").toString().replace("`n","").replace("`r","");
$url = "https://downloads.dlang.org/nightlies/dmd-$($latest)/dmd.master.windows.7z"
}else {
$url = "https://downloads.dlang.org/releases/2.x/$($version)/dmd.$($version).windows.7z";
}
$env:PATH += ";C:\dmd2\windows\bin;";
return $url;
}
function SetUpDCompiler
{
$env:toolchain = "msvc";
echo "downloading ...";
$url = ResolveLatestDMD;
echo $url;
Invoke-WebRequest $url -OutFile "c:\dmd.7z";
echo "finished.";
pushd c:\\;
7z x dmd.7z > $null;
popd;
}
SetUpDCompiler
if($env:arch -eq "x86"){
$env:compilersetupargs = "x86";
$env:Darch = "x86";
$env:DConf = "m32";
}elseif($env:arch -eq "x64"){
$env:compilersetupargs = "amd64";
$env:Darch = "x86_64";
$env:DConf = "m64";
}
# This needs to be done more generically (currently only works on AppVeyor)
$env:compilersetup = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall";
- call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %compilersetupargs%
test_script:
- echo %PLATFORM%
- echo %Darch%
- echo %DC%
- echo %PATH%
- '%DC% --version'
- make -f win32.mak DFLAGS=-g rdmd dustmite ddemangle changed
- make -f win32.mak DFLAGS=-g test
- make -f win64.mak DFLAGS=-g rdmd dustmite ddemangle changed
- make -f win64.mak DFLAGS=-g test

146
posix.mak
View file

@ -1,141 +1,11 @@
DMD_DIR = ../dmd $(warning ===== DEPRECATION NOTICE ===== )
BUILD = release $(warning ===== DEPRECATION: posix.mak is deprecated. Please use generic Makefile instead.)
DMD = $(DMD_DIR)/generated/$(OS)/$(BUILD)/$(MODEL)/dmd $(warning ============================== )
CC = gcc
INSTALL_DIR = ../install
DRUNTIME_PATH = ../dmd/druntime
PHOBOS_PATH = ../phobos
DUB=dub
WITH_DOC = no # forward everything to Makefile
DOC = ../dlang.org
# Load operating system $(OS) (e.g. linux, osx, ...) and $(MODEL) (e.g. 32, 64) detection Makefile from dmd all:
$(shell [ ! -d $(DMD_DIR) ] && git clone --depth=1 https://github.com/dlang/dmd $(DMD_DIR)) $(MAKE) -f Makefile $@
include $(DMD_DIR)/src/osmodel.mak
# Build folder for all binaries %:
GENERATED = generated $(MAKE) -f Makefile $@
ROOT = $(GENERATED)/$(OS)/$(MODEL)
# Set DRUNTIME name and full path
ifeq (,$(findstring win,$(OS)))
DRUNTIME = $(DRUNTIME_PATH)/lib/libdruntime-$(OS)$(MODEL).a
DRUNTIMESO = $(DRUNTIME_PATH)/lib/libdruntime-$(OS)$(MODEL)so.a
else
DRUNTIME = $(DRUNTIME_PATH)/lib/druntime.lib
endif
# Set PHOBOS name and full path
ifeq (,$(findstring win,$(OS)))
PHOBOS = $(PHOBOS_PATH)/generated/$(OS)/$(BUILD)/$(MODEL)/libphobos2.a
PHOBOSSO = $(PHOBOS_PATH)/generated/$(OS)/$(BUILD)/$(MODEL)/libphobos2.so
endif
# default to warnings and deprecations as errors, override via e.g. make -f posix.mak WARNINGS=-wi
WARNINGS = -w -de
# default include/link paths, override by setting DFLAGS (e.g. make -f posix.mak DFLAGS=-I/foo)
DFLAGS = -I$(DRUNTIME_PATH)/import -I$(PHOBOS_PATH) \
-L-L$(PHOBOS_PATH)/generated/$(OS)/$(BUILD)/$(MODEL) $(MODEL_FLAG) -fPIC -preview=dip1000
DFLAGS += $(WARNINGS)
# Default DUB flags (DUB uses a different architecture format)
DUBFLAGS = --arch=$(subst 32,x86,$(subst 64,x86_64,$(MODEL)))
TOOLS = \
$(ROOT)/catdoc \
$(ROOT)/checkwhitespace \
$(ROOT)/contributors \
$(ROOT)/ddemangle \
$(ROOT)/detab \
$(ROOT)/rdmd \
$(ROOT)/tolf \
$(ROOT)/updatecopyright
CURL_TOOLS = \
$(ROOT)/changed \
$(ROOT)/dget
DOC_TOOLS = \
$(ROOT)/dman
TEST_TOOLS = \
$(ROOT)/rdmd_test
all: $(TOOLS) $(CURL_TOOLS) $(ROOT)/dustmite
rdmd: $(ROOT)/rdmd
ddemangle: $(ROOT)/ddemangle
catdoc: $(ROOT)/catdoc
detab: $(ROOT)/detab
tolf: $(ROOT)/tolf
dget: $(ROOT)/dget
changed: $(ROOT)/changed
dman: $(ROOT)/dman
dustmite: $(ROOT)/dustmite
$(ROOT)/dustmite: DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d
$(DMD) $(DFLAGS) -version=Dlang_Tools DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d -of$(@)
$(TOOLS) $(DOC_TOOLS) $(CURL_TOOLS) $(TEST_TOOLS): $(ROOT)/%: %.d
$(DMD) $(DFLAGS) -of$(@) $(<)
d-tags.json:
@echo 'Build d-tags.json and copy it here, e.g. by running:'
@echo " make -C ../dlang.org -f posix.mak d-tags-latest.json && cp ../dlang.org/d-tags-latest.json d-tags.json"
@echo 'or:'
@echo " make -C ../dlang.org -f posix.mak d-tags-prerelease.json && cp ../dlang.org/d-tags-prerelease.json d-tags.json"
@exit 1
$(ROOT)/dman: d-tags.json
$(ROOT)/dman: override DFLAGS += -J.
install: $(TOOLS) $(CURL_TOOLS) $(ROOT)/dustmite
mkdir -p $(INSTALL_DIR)/bin
cp $^ $(INSTALL_DIR)/bin
clean:
rm -rf $(GENERATED)
$(ROOT)/tests_extractor: tests_extractor.d
mkdir -p $(ROOT)
DFLAGS="$(DFLAGS)" $(DUB) build \
--single $< --force --compiler=$(DMD) $(DUBFLAGS) \
&& mv ./tests_extractor $@
################################################################################
# Build & run tests
################################################################################
test_tests_extractor: $(ROOT)/tests_extractor
for file in ascii iteration ; do \
$< -i "./test/tests_extractor/$${file}.d" | diff -p - "./test/tests_extractor/$${file}.d.ext"; \
done
$< -a betterc -i "./test/tests_extractor/attributes.d" | diff -p - "./test/tests_extractor/attributes.d.ext";
$< --betterC -i "./test/tests_extractor/betterc.d" | diff -p - "./test/tests_extractor/betterc.d.ext";
RDMD_TEST_COMPILERS = $(DMD)
RDMD_TEST_EXECUTABLE = $(ROOT)/rdmd
RDMD_TEST_DEFAULT_COMPILER = $(basename $(DMD))
VERBOSE_RDMD_TEST=0
ifeq ($(VERBOSE_RDMD_TEST), 1)
override VERBOSE_RDMD_TEST_FLAGS:=-v
endif
test_rdmd: $(ROOT)/rdmd_test $(RDMD_TEST_EXECUTABLE)
$< $(RDMD_TEST_EXECUTABLE) -m$(MODEL) \
--rdmd-default-compiler=$(RDMD_TEST_DEFAULT_COMPILER) \
--test-compilers=$(RDMD_TEST_COMPILERS) \
$(VERBOSE_RDMD_TEST_FLAGS)
$(DMD) $(DFLAGS) -unittest -main -run rdmd.d
test: test_tests_extractor test_rdmd
ifeq ($(WITH_DOC),yes)
all install: $(DOC_TOOLS)
endif
.PHONY: all install clean
.DELETE_ON_ERROR: # GNU Make directive (delete output files on error)

View file

@ -431,7 +431,7 @@ void runTests(string rdmdApp, string compiler, string model)
res = execute(rdmdArgs ~ [forceSrc.baseName()]); res = execute(rdmdArgs ~ [forceSrc.baseName()]);
enforce(res.status == 0, res.output); enforce(res.status == 0, res.output);
enforce(!res.output.canFind("compile_force_src")); enforce(!res.output.canFind("compile_force_src"), res.output);
} }
auto conflictDir = forceSrc.setExtension(".dir"); auto conflictDir = forceSrc.setExtension(".dir");
@ -684,11 +684,11 @@ void runFallbackTest(string rdmdApp, string buildCompiler, string model)
if an explicit --compiler flag is not provided, rdmd should if an explicit --compiler flag is not provided, rdmd should
search its own binary path first when looking for the default search its own binary path first when looking for the default
compiler (determined by the compiler used to build it) */ compiler (determined by the compiler used to build it) */
string localDMD = buildPath(tempDir(), baseName(buildCompiler).setExtension(binExt)); string localDMD = buildPath(dirName(rdmdApp), baseName(buildCompiler).setExtension(binExt));
std.file.write(localDMD, ""); // An empty file avoids the "Not a valid 16-bit application" pop-up on Windows std.file.write(localDMD, ""); // An empty file avoids the "Not a valid 16-bit application" pop-up on Windows
scope(exit) std.file.remove(localDMD); scope(exit) std.file.remove(localDMD);
auto res = execute(rdmdApp ~ [modelSwitch(model), "--force", "--chatty", "--eval=writeln(`Compiler found.`);"]); auto res = execute(rdmdApp ~ [modelSwitch(model), "--force", "--chatty", "--eval=writeln(`Compiler found.`);"]);
enforce(res.status == 1, res.output); enforce(res.status == 1, res.output);
enforce(res.output.canFind(format(`spawn [%(%s%),`, localDMD.only)), localDMD ~ " would not have been executed"); enforce(res.output.canFind(format(`spawn [%(%s%),`, localDMD.only)), localDMD ~ " would not have been executed. Output:\n" ~ res.output);
} }

108
win32.mak
View file

@ -1,108 +0,0 @@
# Where scp command copies to
SCPDIR=..\backup
##### Tools
# D compiler
DMD=dmd
# C++ compiler
CC=dmc
# Make program
MAKE=make
# Librarian
LIB=lib
# Delete file(s)
DEL=del
# Make directory
MD=mkdir
# Remove directory
RD=rmdir
# File copy
CP=cp
# De-tabify
DETAB=detab
# Convert line endings to Unix
TOLF=tolf
# Zip
ZIP=zip32
# Copy to another directory
SCP=$(CP)
DFLAGS=-O -release -m$(MODEL)
GENERATED = generated
ROOT = $(GENERATED)\windows\32
TARGETS= $(ROOT)\dman.exe \
$(ROOT)\rdmd.exe \
$(ROOT)\ddemangle.exe \
$(ROOT)\changed.exe \
$(ROOT)\dustmite.exe
MAKEFILES=win32.mak win64.mak posix.mak
SRCS=dman.d rdmd.d ddemangle.d
targets : $(TARGETS)
dman: $(ROOT)\dman.exe
rdmd: $(ROOT)\rdmd.exe
ddemangle: $(ROOT)\ddemangle.exe
changed: $(ROOT)\changed.exe
dustmite: $(ROOT)\dustmite.exe
d-tags.json :
@echo 'Build d-tags.json and copy it here, e.g. by running:'
@echo " make -C ../dlang.org -f win32.mak d-tags.json && copy ../dlang.org/d-tags-latest.json d-tags.json"
@exit
$(ROOT)\dman.exe : dman.d d-tags.json
$(DMD) $(DFLAGS) -of$@ dman.d -J.
$(ROOT)\rdmd.exe : rdmd.d
$(DMD) $(DFLAGS) -of$@ rdmd.d advapi32.lib
$(ROOT)\ddemangle.exe : ddemangle.d
$(DMD) $(DFLAGS) -of$@ ddemangle.d
$(ROOT)\dustmite.exe : DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d
$(DMD) $(DFLAGS) -of$@ -version=Dlang_Tools DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d
$(ROOT)\changed.exe : changed.d
$(DMD) $(DFLAGS) -of$@ changed.d
clean :
rmdir /s /q $(GENERATED)
detab:
$(DETAB) $(SRCS)
tolf:
$(TOLF) $(SRCS) $(MAKEFILES)
zip: detab tolf $(MAKEFILES)
$(DEL) dman.zip
$(ZIP) dman $(MAKEFILES) $(SRCS) $(TAGS)
scp: detab tolf $(MAKEFILES)
$(SCP) $(SRCS) $(MAKEFILES) $(SCPDIR)
################################################################################
# Build and run tests
################################################################################
RDMD_TEST_COMPILERS = $(DMD)
RDMD_TEST_EXECUTABLE = $(ROOT)\rdmd.exe
RDMD_TEST_DEFAULT_COMPILER = $(DMD)
$(ROOT)\rdmd_test.exe : rdmd_test.d
$(DMD) $(DFLAGS) -of$@ rdmd_test.d
test_rdmd : $(ROOT)\rdmd_test.exe $(RDMD_TEST_EXECUTABLE)
$(ROOT)\rdmd_test.exe \
$(RDMD_TEST_EXECUTABLE) -m$(MODEL) -v \
--rdmd-default-compiler=$(RDMD_TEST_DEFAULT_COMPILER) \
--test-compilers=$(RDMD_TEST_COMPILERS)
test : test_rdmd

View file

@ -1,64 +0,0 @@
ROOT = generated\windows\64
TARGETS= $(ROOT)\dman.exe \
$(ROOT)\rdmd.exe \
$(ROOT)\ddemangle.exe \
$(ROOT)\changed.exe \
$(ROOT)\dustmite.exe
targets : $(TARGETS)
dman: $(ROOT)\dman.exe
rdmd: $(ROOT)\rdmd.exe
ddemangle: $(ROOT)\ddemangle.exe
changed: $(ROOT)\changed.exe
dustmite: $(ROOT)\dustmite.exe
d-tags.json :
@echo 'Build d-tags.json and copy it here, e.g. by running:'
@echo " make -C ../dlang.org -f win64.mak d-tags.json && copy ../dlang.org/d-tags-latest.json d-tags.json"
@exit
MAKE_WIN32=make -f win32.mak "ROOT=$(ROOT)" "MODEL=$(MODEL)"
$(ROOT)\dman.exe : dman.d d-tags.json
$(MAKE_WIN32) $@
$(ROOT)\rdmd.exe : rdmd.d
$(MAKE_WIN32) $@
$(ROOT)\ddemangle.exe : ddemangle.d
$(MAKE_WIN32) $@
$(ROOT)\dustmite.exe : DustMite/dustmite.d DustMite/splitter.d DustMite/polyhash.d
$(MAKE_WIN32) $@
$(ROOT)\changed.exe : changed.d
$(MAKE_WIN32) $@
clean :
$(MAKE_WIN32) $@
detab:
$(MAKE_WIN32) $@
tolf:
$(MAKE_WIN32) $@
zip: detab tolf $(MAKEFILES)
$(MAKE_WIN32) $@
scp: detab tolf $(MAKEFILES)
$(MAKE_WIN32) $@
################################################################################
# Build and run tests
################################################################################
$(ROOT)\rdmd_test.exe : rdmd_test.d
$(MAKE_WIN32) $@
test_rdmd : $(ROOT)\rdmd_test.exe $(RDMD_TEST_EXECUTABLE)
$(MAKE_WIN32) $@
test : test_rdmd