Print this page
make: be serial if 'make', parallel if 'dmake', and parallel if '-j' is specified either way

@@ -38,10 +38,11 @@
 
 #include <bsd/bsd.h>            /* bsd_signal() */
 
 
 #include <locale.h>             /* setlocale() */
+#include <libgen.h>
 #include <mk/defs.h>
 #include <mksdmsi18n/mksdmsi18n.h>      /* libmksdmsi18n_init() */
 #include <mksh/macro.h>         /* getvar() */
 #include <mksh/misc.h>          /* getmem(), setup_char_semantics() */
 

@@ -411,17 +412,31 @@
         /*
          * Find the dmake_mode: parallel, or serial.
          */
     if ((!pmake_cap_r_specified) &&
         (!pmake_machinesfile_specified)) {
+        char *s = strdup(argv[0]);    
+            
         MBSTOWCS(wcs_buffer, NOCATGETS("DMAKE_MODE"));
         dmake_name2 = GETNAME(wcs_buffer, FIND_LENGTH);
         prop2 = get_prop(dmake_name2->prop, macro_prop);
-        if (prop2 == NULL) {
-                /* DMAKE_MODE not defined, default to parallel mode */
+        // If we're invoked as 'make' run serially, regardless of DMAKE_MODE
+        // If we're invoked as 'make' but passed -j, run parallel
+        // If we're invoked as 'dmake', without DMAKE_MODE, default parallel
+        // If we're invoked as 'dmake' and DMAKE_MODE is set, honour it.
+        if ((strcmp(basename(s), NOCATGETS("make")) == 0) &&
+            !dmake_max_jobs_specified) {
+                dmake_mode_type = serial_mode;
+                no_parallel = true;
+        } else if (prop2 == NULL) {
+                /* DMAKE_MODE not defined, default based on our name */
+                char *s = strdup(argv[0]);
+
+                if (strcmp(basename(s), NOCATGETS("dmake")) == 0) {
                 dmake_mode_type = parallel_mode;
                 no_parallel = false;
+                }
         } else {
                 dmake_value2 = prop2->body.macro.value;
                 if (IS_EQUAL(dmake_value2->string_mb, NOCATGETS("parallel"))) {
                         dmake_mode_type = parallel_mode;
                         no_parallel = false;

@@ -430,11 +445,11 @@
                         no_parallel = true;
                 } else {
                         fatal(catgets(catd, 1, 307, "Unknown dmake mode argument `%s' after -m flag"), dmake_value2->string_mb);
                 }
         }
-
+        free(s);
     }
 
         parallel_flag = true;
         putenv(strdup(NOCATGETS("DMAKE_CHILD=TRUE")));
 

@@ -1361,10 +1376,12 @@
                 return 0;
         case 'j':                        /* Use alternative DMake max jobs */
                 if (invert_this) {
                         dmake_max_jobs_specified = false;
                 } else {
+                        dmake_mode_type = parallel_mode;
+                        no_parallel = false;
                         dmake_max_jobs_specified = true;
                 }
                 return 8;
         case 'K':                        /* Read alternative .make.state */
                 return 256;