Print this page
make: ship the Joyent patch to enable parallel make (originally from rm)
@@ -32,16 +32,10 @@
/*
* Included files
*/
#if defined(TEAMWARE_MAKE_CMN)
# include <avo/intl.h>
-# include <avo/libcli.h> /* libcli_init() */
-# include <avo/cli_license.h> /* avo_cli_get_license() */
-# include <avo/find_dir.h> /* avo_find_run_dir() */
-# include <avo/version_string.h>
-# include <avo/util.h> /* avo_init() */
-# include <avo/cleanup.h>
#endif
#include <bsd/bsd.h> /* bsd_signal() */
#ifdef DISTRIBUTED
@@ -88,12 +82,17 @@
/*
* Defined macros
*/
-#define LD_SUPPORT_ENV_VAR NOCATGETS("SGS_SUPPORT")
+#define MAKE_PREFIX NOCATGETS("/usr")
+#define LD_SUPPORT_ENV_VAR NOCATGETS("SGS_SUPPORT_32")
+#define LD_SUPPORT_ENV_VAR_32 NOCATGETS("SGS_SUPPORT_32")
+#define LD_SUPPORT_ENV_VAR_64 NOCATGETS("SGS_SUPPORT_64")
#define LD_SUPPORT_MAKE_LIB NOCATGETS("libmakestate.so.1")
+#define LD_SUPPORT_MAKE_LIB_DIR NOCATGETS("/lib")
+#define LD_SUPPORT_MAKE_LIB_DIR_64 NOCATGETS("/64")
/*
* typedefs & structs
*/
@@ -129,11 +128,10 @@
#if defined(TEAMWARE_MAKE_CMN)
static time_t start_time;
static int g_argc;
static char **g_argv;
- static Avo_cleanup *cleanup = NULL;
#endif
/*
* File table of contents
*/
@@ -172,11 +170,11 @@
extern FILE* dmake_ofp;
extern int rxmPid;
extern XDR xdrs_out;
#endif
#ifdef TEAMWARE_MAKE_CMN
- extern char verstring[];
+ static const char verstring[] = "illumos make";
#endif
jmp_buf jmpbuffer;
extern nl_catd catd;
@@ -227,13 +225,10 @@
int statval;
#endif
struct stat out_stat, err_stat;
hostid = gethostid();
-#ifdef TEAMWARE_MAKE_CMN
- avo_get_user(NULL, NULL); // Initialize user name
-#endif
bsd_signals();
(void) setlocale(LC_ALL, "");
@@ -241,26 +236,12 @@
if (getenv(NOCATGETS("DMAKE_STATISTICS"))) {
getname_stat = true;
}
#endif
-
- /*
- * avo_init() sets the umask to 0. Save it here and restore
- * it after the avo_init() call.
- */
-#if defined(TEAMWARE_MAKE_CMN) || defined(MAKETOOL)
- um = umask(0);
- avo_init(argv[0]);
- umask(um);
-
- cleanup = new Avo_cleanup(NOCATGETS("dmake"), argc, argv);
-#endif
-
#if defined(TEAMWARE_MAKE_CMN)
catd = catopen(AVO_DOMAIN_DMAKE, NL_CAT_LOCALE);
- libcli_init();
#endif
// ---> fprintf(stderr, catgets(catd, 15, 666, "--- SUN make ---\n"));
@@ -530,45 +511,21 @@
no_parallel = false;
}
}
#else
if(dmake_mode_type == distributed_mode) {
- (void) fprintf(stdout, NOCATGETS("dmake: Distributed mode not implemented.\n"));
- (void) fprintf(stdout, NOCATGETS(" Defaulting to parallel mode.\n"));
dmake_mode_type = parallel_mode;
no_parallel = false;
}
#endif /* DISTRIBUTED */
}
}
#endif
#ifdef TEAMWARE_MAKE_CMN
parallel_flag = true;
- /* XXX - This is a major hack for DMake/Licensing. */
- if (getenv(NOCATGETS("DMAKE_CHILD")) == NULL) {
- if (!avo_cli_search_license(argv[0], dmake_exit_callback, TRUE, dmake_message_callback)) {
- /*
- * If the user can not get a TeamWare license,
- * default to serial mode.
- */
- dmake_mode_type = serial_mode;
- no_parallel = true;
- } else {
- putenv(NOCATGETS("DMAKE_CHILD=TRUE"));
- }
- start_time = time(NULL);
- /*
- * XXX - Hack to disable SIGALRM's from licensing library's
- * setitimer().
- */
- value.it_interval.tv_sec = 0;
- value.it_interval.tv_usec = 0;
- value.it_value.tv_sec = 0;
- value.it_value.tv_usec = 0;
- (void) setitimer(ITIMER_REAL, &value, NULL);
- }
+ putenv(strdup(NOCATGETS("DMAKE_CHILD=TRUE")));
//
// If dmake is running with -t option, set dmake_mode_type to serial.
// This is done because doname() calls touch_command() that runs serially.
// If we do not do that, maketool will have problems.
@@ -872,17 +829,10 @@
make_state_lockfile = NULL;
make_state_locked = false;
}
/* Write .make.state */
write_state_file(1, (Boolean) 1);
-
-#ifdef TEAMWARE_MAKE_CMN
- // Deleting the usage tracking object sends the usage mail
- cleanup->set_exit_status(exit_status);
- delete cleanup;
-#endif
-
/*
#ifdef DISTRIBUTED
}
#endif
*/
@@ -1867,50 +1817,84 @@
*
* Add the libmakestate.so.1 lib to the env var SGS_SUPPORT
* if it's not already in there.
* The SGS_SUPPORT env var and libmakestate.so.1 is used by
* the linker ld to report .make.state info back to make.
+ *
+ * In the new world we always will set the 32-bit and 64-bit versions of this
+ * variable explicitly so that we can take into account the correct isa and our
+ * prefix. So say that the prefix was /opt/local. Then we would want to search
+ * /opt/local/lib/libmakestate.so.1:libmakestate.so.1. We still want to search
+ * the original location just as a safety measure.
*/
static void
set_sgs_support()
{
int len;
- char *newpath;
- char *oldpath;
- static char *prev_path;
+ char *newpath, *newpath64;
+ char *oldpath, *oldpath64;
+ static char *prev_path, *prev_path64;
- oldpath = getenv(LD_SUPPORT_ENV_VAR);
+ oldpath = getenv(LD_SUPPORT_ENV_VAR_32);
if (oldpath == NULL) {
- len = strlen(LD_SUPPORT_ENV_VAR) + 1 +
- strlen(LD_SUPPORT_MAKE_LIB) + 1;
+ len = snprintf(NULL, 0, "%s=%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_32,
+ MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR,
+ LD_SUPPORT_MAKE_LIB, LD_SUPPORT_MAKE_LIB) + 1;
newpath = (char *) malloc(len);
- sprintf(newpath, "%s=", LD_SUPPORT_ENV_VAR);
- } else {
- len = strlen(LD_SUPPORT_ENV_VAR) + 1 + strlen(oldpath) + 1 +
- strlen(LD_SUPPORT_MAKE_LIB) + 1;
+ sprintf(newpath, "%s=%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_32,
+ MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR,
+ LD_SUPPORT_MAKE_LIB, LD_SUPPORT_MAKE_LIB);
+ } else {
+ len = snprintf(NULL, 0, "%s=%s:%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_32, oldpath, MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR, LD_SUPPORT_MAKE_LIB,
+ LD_SUPPORT_MAKE_LIB) + 1;
newpath = (char *) malloc(len);
- sprintf(newpath, "%s=%s", LD_SUPPORT_ENV_VAR, oldpath);
+ sprintf(newpath, "%s=%s:%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_32, oldpath, MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR, LD_SUPPORT_MAKE_LIB,
+ LD_SUPPORT_MAKE_LIB);
+ }
+
+ oldpath64 = getenv(LD_SUPPORT_ENV_VAR_64);
+ if (oldpath64 == NULL) {
+ len = snprintf(NULL, 0, "%s=%s/%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_64, MAKE_PREFIX, LD_SUPPORT_MAKE_LIB_DIR,
+ LD_SUPPORT_MAKE_LIB_DIR_64, LD_SUPPORT_MAKE_LIB,
+ LD_SUPPORT_MAKE_LIB) + 1;
+ newpath64 = (char *) malloc(len);
+ sprintf(newpath64, "%s=%s/%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_64, MAKE_PREFIX, LD_SUPPORT_MAKE_LIB_DIR,
+ LD_SUPPORT_MAKE_LIB_DIR_64, LD_SUPPORT_MAKE_LIB,
+ LD_SUPPORT_MAKE_LIB);
+ } else {
+ len = snprintf(NULL, 0, "%s=%s:%s/%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_64, oldpath64, MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR, LD_SUPPORT_MAKE_LIB_DIR_64,
+ LD_SUPPORT_MAKE_LIB, LD_SUPPORT_MAKE_LIB) + 1;
+ newpath64 = (char *) malloc(len);
+ sprintf(newpath64, "%s=%s:%s/%s/%s/%s:%s",
+ LD_SUPPORT_ENV_VAR_64, oldpath64, MAKE_PREFIX,
+ LD_SUPPORT_MAKE_LIB_DIR, LD_SUPPORT_MAKE_LIB_DIR_64,
+ LD_SUPPORT_MAKE_LIB, LD_SUPPORT_MAKE_LIB);
}
-#if defined(TEAMWARE_MAKE_CMN)
-
- /* function maybe_append_str_to_env_var() is defined in avo_util library
- * Serial make should not use this library !!!
- */
- maybe_append_str_to_env_var(newpath, LD_SUPPORT_MAKE_LIB);
-#else
- if (oldpath == NULL) {
- sprintf(newpath, "%s%s", newpath, LD_SUPPORT_MAKE_LIB);
- } else {
- sprintf(newpath, "%s:%s", newpath, LD_SUPPORT_MAKE_LIB);
- }
-#endif
putenv(newpath);
if (prev_path) {
free(prev_path);
}
prev_path = newpath;
+
+ putenv(newpath64);
+ if (prev_path64) {
+ free(prev_path64);
+ }
+ prev_path64 = newpath64;
}
/*
* read_files_and_state(argc, argv)
*