Finalizing dmd support on Windows

Lars Ivar Igesund <[email protected]> Sat, 31 Jan 2004 14:25:45 +0100
Newsgroups gmane.comp.tools.aap.devel
Message-ID <[email protected]>
Hi again

I believe that I now have ruled out most errors
when using AAP to build D stuff on Windows. It
might actually work on Linux, but it hasn't been
tested yet.

The last patch is included. It mainly fixes the
building of static libs.

AAP now successfully builds the currently biggest
D project around.

Another thing I was thinking; when doing a one step
build, the dependency checking can become a major
slowdown. Could some option be added that made it
possible to turn off dependency checking?

Lars Ivar Igesund
dmd.diff (text/plain, 4.3 KB)
Index: dmd.py
===================================================================
RCS file: /cvsroot/a-a-p/Exec/tools/dmd.py,v
retrieving revision 1.5
diff -u -r1.5 dmd.py
--- dmd.py	18 Oct 2003 15:09:50 -0000	1.5
+++ dmd.py	31 Jan 2004 12:51:22 -0000
@@ -19,7 +19,16 @@
     """
     Return TRUE when the DMD toolchain can be found.
     """
-    return program_path("dmd")
+    if program_path("dmd"):
+        if os.name == "nt":
+            if program_path("link"):
+                return program_path("lib")
+            else:
+                return FALSE
+        else:
+            return program_path("gcc")
+    else:
+        return FALSE
 
 
 def define_actions():
@@ -38,10 +47,25 @@
             "@if _no.DEBUG == 'yes':\n"
             "  dbg = -g\n"
             ":sys $DMD $?DFLAGS $?DVERSION $opt $dbg $?DDEBUG $?DIMPORT -of$target -c $source")
-    # Build a program/static lib from object files
+    # Build a program from object files
     rpstack = [ RecPos("build_dmd action") ]
-    action_add(rpstack, rd, str2dictlist(rpstack, "build_dmd object,dllobject,libobject"),
-            ":sys $DMD $?DLINKFLAGS -of$target $source")
+    action_add(rpstack, rd, str2dictlist(rpstack, "build_dmd object"),
+            "cmd = \n"
+            "@if os.name == \"nt\":\n"
+            "   :progsearch LINK link\n"
+            "   @exec \"import tools.dmd\"\n"
+            "   DLINKFLAGS = `tools.dmd.find_phobos()` $?DLINKFLAGS \n"
+            "   :sys $LINK /noi $source,$target,,$DLINKFLAGS\n"
+            "@else:\n"
+            "   :sys $DMD $?DLINKFLAGS -of$target $source")
+    # Build a static lib from object files
+    rpstack = [ RecPos("buildlib_dmd action") ]
+    action_add(rpstack, rd, str2dictlist(rpstack, "buildlib_dmd libobject"),
+            "@if os.name == \"nt\":\n"
+            "   :progsearch LIB lib\n"
+            "   :sys $LIB $?DLINKFLAGS -p512 -c $target $source\n"
+            "@else:\n"
+            "   :sys $DMD $?DLINKFLAGS -of$target $source")
     # Build a dll from object files  
     rpstack = [ RecPos("builddll_dmd action") ]
     action_add(rpstack, rd, str2dictlist(rpstack, "builddll_dmd dllobject"),
@@ -54,7 +78,7 @@
             "   source += aap_dllmain.obj\n"
             ":sys $DMD $?DLINKFLAGS -of$target $source\n"
             ":del {f} {q} aap_dllmain.*")
-    # Build a program/static lib directly from source
+    # Build a program directly from source
     rpstack = [ RecPos("buildonestep_dmd d action") ]
     action_add(rpstack, rd, str2dictlist(rpstack, "buildonestep_dmd d"),
             "opt =\n"
@@ -67,6 +91,23 @@
             ":sys $DMD $?DFLAGS $?DVERSION $opt $dbg $?DDEBUG $?DIMPORT"
             "       $?DLINKFLAGS -of$target $source\n"
             ":del {f} {q} *.obj")
+    # Build a static lib directly from source
+    rpstack = [ RecPos("buildlibonestep_dmd d action") ]
+    action_add(rpstack, rd, str2dictlist(rpstack, "buildlibonestep_dmd d"),
+            "opt =\n"
+            "@if _no.OPTIMIZE and int(_no.OPTIMIZE) > 0:\n"
+            "  opt = -O\n"
+            "dbg =\n"
+            "DEBUG ?=\n"
+            "@if _no.DEBUG == 'yes':\n"
+            "  dbg = -g\n"
+            ":sys $DMD -c $?DFLAGS $?DVERSION $opt $dbg $?DDEBUG $?DIMPORT"
+            "       -op $source\n"
+            ":progsearch LIB lib\n"
+            "BDIR = \n"
+            "objects = `src2obj(source)`\n"
+            ":sys $LIB $?DLINKFLAGS -p512 -c $target $objects\n"
+            ":del {f} {q} *.obj")
     # Build a dll directly from source
     rpstack = [ RecPos("builddllonestep_dmd d action") ]
     action_add(rpstack, rd, str2dictlist(rpstack, "builddllonestep_dmd d"),
@@ -98,11 +139,18 @@
     """
     scope["D_COMPILE_ACTION"] = "compile_dmd"
     scope["D_BUILD_ACTION"] = "build_dmd"
-    scope["D_BUILDLIB_ACTION"] = "build_dmd"
+    scope["D_BUILDLIB_ACTION"] = "buildlib_dmd"
     scope["D_BUILDDLL_ACTION"] = "builddll_dmd"
     scope["D_BUILDONESTEP_ACTION"] = "buildonestep_dmd"
     scope["D_BUILDDLLONESTEP_ACTION"] = "builddllonestep_dmd"
-    scope["D_BUILDLIBONESTEP_ACTION"] = "buildonestep_dmd"
+    scope["D_BUILDLIBONESTEP_ACTION"] = "buildlibonestep_dmd"
+
+def find_phobos():
+    dmd_path = program_path("dmd")
+    import re
+    phobos_path = re.sub('bin', 'lib', dmd_path)
+    return re.sub('dmd.EXE', '', phobos_path)
+
 
 def find_dll_main_source(sourcestr):
     import re