commit: 63895749c0448ecc12c36b3aeec0df367d91a1b4 Author: Christoph Junghans <ottxor <AT> gentoo <DOT> org> AuthorDate: Fri Feb 13 21:46:14 2015 +0000 Commit: Christoph Junghans <ottxor <AT> gentoo <DOT> org> CommitDate: Fri Feb 13 21:46:31 2015 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/sci.git;a=commit;h=63895749
version bump Package-Manager: portage-2.2.14 --- app-shells/mpibash/ChangeLog | 11 +- .../files/bash-4.3-append-process-segfault.patch | 18 - app-shells/mpibash/files/bash-4.3-compat-lvl.patch | 13 - .../files/bash-4.3-parse-time-keyword.patch | 30 - .../mpibash/files/bash-4.3-term-cleanup.patch | 47 - app-shells/mpibash/files/mpibash-4.3.patch | 1565 -------------------- app-shells/mpibash/metadata.xml | 13 +- app-shells/mpibash/mpibash-1.1.ebuild | 28 + app-shells/mpibash/mpibash-4.3_p30-r1.ebuild | 277 ---- 9 files changed, 39 insertions(+), 1963 deletions(-) diff --git a/app-shells/mpibash/ChangeLog b/app-shells/mpibash/ChangeLog index bbc69c9..6e2905c 100644 --- a/app-shells/mpibash/ChangeLog +++ b/app-shells/mpibash/ChangeLog @@ -1,7 +1,16 @@ # ChangeLog for app-shells/mpibash -# Copyright 1999-2014 Gentoo Foundation; Distributed under the GPL v2 +# Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2 # $Header: $ +*mpibash-1.1 (13 Feb 2015) + + 13 Feb 2015; Christoph Junghans <ott...@gentoo.org> +mpibash-1.1.ebuild, + -files/bash-4.3-append-process-segfault.patch, + -files/bash-4.3-compat-lvl.patch, -files/bash-4.3-parse-time-keyword.patch, + -files/bash-4.3-term-cleanup.patch, -files/mpibash-4.3.patch, + -mpibash-4.3_p30-r1.ebuild, metadata.xml: + version bump + 05 Dec 2014; Christoph Junghans <ott...@gentoo.org> mpibash-4.3_p30-r1.ebuild: added prefix support diff --git a/app-shells/mpibash/files/bash-4.3-append-process-segfault.patch b/app-shells/mpibash/files/bash-4.3-append-process-segfault.patch deleted file mode 100644 index 6c9b2e8..0000000 --- a/app-shells/mpibash/files/bash-4.3-append-process-segfault.patch +++ /dev/null @@ -1,18 +0,0 @@ -https://lists.gnu.org/archive/html/bug-bash/2014-08/msg00048.html - -*** ../bash-4.3-patched/execute_cmd.c 2014-07-30 10:26:52.000000000 -0400 ---- execute_cmd.c 2014-08-11 16:55:57.000000000 -0400 -*************** -*** 2406,2410 **** - { - #if defined (JOB_CONTROL) -! append_process (savestring (the_printed_command), dollar_dollar_pid, exec_result, lastpipe_jid); - #endif - lstdin = wait_for (lastpid); ---- 2433,2438 ---- - { - #if defined (JOB_CONTROL) -! if (INVALID_JOB (lastpipe_jid) == 0) -! append_process (savestring (the_printed_command_except_trap), dollar_dollar_pid, exec_result, lastpipe_jid); - #endif - lstdin = wait_for (lastpid); diff --git a/app-shells/mpibash/files/bash-4.3-compat-lvl.patch b/app-shells/mpibash/files/bash-4.3-compat-lvl.patch deleted file mode 100644 index 5734687..0000000 --- a/app-shells/mpibash/files/bash-4.3-compat-lvl.patch +++ /dev/null @@ -1,13 +0,0 @@ -https://lists.gnu.org/archive/html/bug-bash/2014-06/msg00046.html - ---- a/builtins/shopt.def -+++ b/builtins/shopt.def -@@ -160,7 +160,7 @@ static struct { - { "compat32", &shopt_compat32, set_compatibility_level }, - { "compat40", &shopt_compat40, set_compatibility_level }, - { "compat41", &shopt_compat41, set_compatibility_level }, -- { "compat42", &shopt_compat41, set_compatibility_level }, -+ { "compat42", &shopt_compat42, set_compatibility_level }, - #if defined (READLINE) - { "complete_fullquote", &complete_fullquote, (shopt_set_func_t *)NULL}, - { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand }, diff --git a/app-shells/mpibash/files/bash-4.3-parse-time-keyword.patch b/app-shells/mpibash/files/bash-4.3-parse-time-keyword.patch deleted file mode 100644 index cd516e5..0000000 --- a/app-shells/mpibash/files/bash-4.3-parse-time-keyword.patch +++ /dev/null @@ -1,30 +0,0 @@ -https://lists.gnu.org/archive/html/bug-bash/2014-06/msg00034.html - -*** ../bash-4.3-patched/parse.y 2014-04-07 11:56:12.000000000 -0400 ---- parse.y 2014-06-11 10:25:53.000000000 -0400 -*************** -*** 2789,2797 **** - case OR_OR: - case '&': - case DO: - case THEN: - case ELSE: - case '{': /* } */ -! case '(': /* ) */ - case BANG: /* ! time pipeline */ - case TIME: /* time time pipeline */ ---- 2789,2802 ---- - case OR_OR: - case '&': -+ case WHILE: - case DO: -+ case UNTIL: -+ case IF: - case THEN: -+ case ELIF: - case ELSE: - case '{': /* } */ -! case '(': /* )( */ -! case ')': /* only valid in case statement */ - case BANG: /* ! time pipeline */ - case TIME: /* time time pipeline */ diff --git a/app-shells/mpibash/files/bash-4.3-term-cleanup.patch b/app-shells/mpibash/files/bash-4.3-term-cleanup.patch deleted file mode 100644 index be7a5de..0000000 --- a/app-shells/mpibash/files/bash-4.3-term-cleanup.patch +++ /dev/null @@ -1,47 +0,0 @@ -http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00031.html - -*** ../bash-4.3-patched/bashline.c 2014-05-14 09:22:39.000000000 -0400 ---- bashline.c 2014-09-08 11:28:56.000000000 -0400 -*************** -*** 203,206 **** ---- 203,207 ---- - extern int array_needs_making; - extern int posixly_correct, no_symbolic_links; -+ extern int sigalrm_seen; - extern char *current_prompt_string, *ps1_prompt; - extern STRING_INT_ALIST word_token_alist[]; -*************** -*** 4209,4214 **** - /* If we're going to longjmp to top_level, make sure we clean up readline. - check_signals will call QUIT, which will eventually longjmp to top_level, -! calling run_interrupt_trap along the way. */ -! if (interrupt_state) - rl_cleanup_after_signal (); - bashline_reset_event_hook (); ---- 4262,4268 ---- - /* If we're going to longjmp to top_level, make sure we clean up readline. - check_signals will call QUIT, which will eventually longjmp to top_level, -! calling run_interrupt_trap along the way. The check for sigalrm_seen is -! to clean up the read builtin's state. */ -! if (terminating_signal || interrupt_state || sigalrm_seen) - rl_cleanup_after_signal (); - bashline_reset_event_hook (); -*** ../bash-4.3-patched/sig.c 2014-01-10 15:06:06.000000000 -0500 ---- sig.c 2014-09-08 11:26:33.000000000 -0400 -*************** -*** 533,538 **** - /* Set the event hook so readline will call it after the signal handlers - finish executing, so if this interrupted character input we can get -! quick response. */ -! if (interactive_shell && interactive && no_line_editing == 0) - bashline_set_event_hook (); - #endif ---- 533,540 ---- - /* Set the event hook so readline will call it after the signal handlers - finish executing, so if this interrupted character input we can get -! quick response. If readline is active or has modified the terminal we -! need to set this no matter what the signal is, though the check for -! RL_STATE_TERMPREPPED is possibly redundant. */ -! if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE (RL_STATE_TERMPREPPED)) - bashline_set_event_hook (); - #endif diff --git a/app-shells/mpibash/files/mpibash-4.3.patch b/app-shells/mpibash/files/mpibash-4.3.patch deleted file mode 100644 index 20d4787..0000000 --- a/app-shells/mpibash/files/mpibash-4.3.patch +++ /dev/null @@ -1,1565 +0,0 @@ -diff -Naur bash-4.3/builtins/circle.def mpibash-4.3/builtins/circle.def ---- bash-4.3/builtins/circle.def 1969-12-31 17:00:00.000000000 -0700 -+++ mpibash-4.3/builtins/circle.def 2014-05-13 11:27:37.314100671 -0600 -@@ -0,0 +1,620 @@ -+This file is circle.def, from which is created circle.c. -+It implements all of the "circle_*" builtins in Bash. -+ -+$PRODUCES circle.c -+ -+#include <config.h> -+ -+#include <stdio.h> -+#if defined (HAVE_UNISTD_H) -+# ifdef _MINIX -+# include <sys/types.h> -+# endif -+# include <unistd.h> -+#endif -+ -+#include "../bashintl.h" -+#include "../shell.h" -+#include "common.h" -+#include "bashgetopt.h" -+#include <libcircle.h> -+ -+extern int running_trap, trap_saved_exit_value; -+ -+static int circle_rank; /* Rank in the Libcircle job */ -+static SHELL_VAR *create_func = NULL; /* User-defined callback function for CIRCLE_cb_create. */ -+static SHELL_VAR *process_func = NULL; /* User-defined callback function for CIRCLE_cb_process. */ -+static SHELL_VAR *reduce_init_func = NULL; /* User-defined callback function for CIRCLE_cb_reduce_init. */ -+static SHELL_VAR *reduce_fini_func = NULL; /* User-defined callback function for CIRCLE_cb_reduce_fini. */ -+static SHELL_VAR *reduce_op_func = NULL; /* User-defined callback function for CIRCLE_cb_reduce_op. */ -+static CIRCLE_handle *current_handle = NULL; /* Active handle within a callback or NULL if not within a callback */ -+static int within_reduction = 0; /* 1=within a reduction callback; 0=not */ -+ -+/* Return with a usage message if no arguments remain. */ -+#define YES_ARGS(LIST) \ -+ if ((LIST) == 0) \ -+ { \ -+ builtin_usage (); \ -+ return (EX_USAGE); \ -+ } -+ -+/* Perform the same operation as bind_variable, but with VALUE being a -+ * number, not a string. */ -+static SHELL_VAR * -+bind_variable_number (name, value, flags) -+ const char *name; -+ long value; -+ int flags; -+{ -+ char numstr[25]; /* String version of VALUE */ -+ -+ sprintf (numstr, "%ld", value); -+ return bind_variable (name, numstr, flags); -+} -+ -+/* Invoke the user-defined creation-callback function (create_func). */ -+static void -+internal_create_func (handle) -+ CIRCLE_handle *handle; -+{ -+ WORD_LIST *funcargs; -+ -+ if (create_func == NULL) -+ return; -+ current_handle = handle; -+ funcargs = make_word_list (make_word ("cb_create"), NULL); -+ execute_shell_function (create_func, funcargs); -+ dispose_words (funcargs); -+ current_handle = NULL; -+} -+ -+/* Invoke the user-defined process-callback function (process_func). */ -+static void -+internal_process_func (handle) -+ CIRCLE_handle *handle; -+{ -+ WORD_LIST *funcargs; -+ -+ if (process_func == NULL) -+ return; -+ current_handle = handle; -+ funcargs = make_word_list (make_word ("cb_process"), NULL); -+ execute_shell_function (process_func, funcargs); -+ dispose_words (funcargs); -+ current_handle = NULL; -+} -+ -+/* Invoke the user-defined reduction-initiation callback function -+ * (reduce_init_func). */ -+static void -+internal_reduce_init_func (void) -+{ -+ WORD_LIST *funcargs; -+ -+ if (reduce_init_func == NULL) -+ return; -+ within_reduction = 1; -+ funcargs = make_word_list (make_word ("cb_reduce_init"), NULL); -+ execute_shell_function (reduce_init_func, funcargs); -+ dispose_words (funcargs); -+ within_reduction = 0; -+} -+ -+/* Invoke the user-defined reduction callback function -+ * (reduce_op_func). */ -+static void -+internal_reduce_op_func (buf1, size1, buf2, size2) -+ const void* buf1; -+ size_t size1; -+ const void* buf2; -+ size_t size2; -+{ -+ WORD_LIST *funcargs; -+ -+ if (reduce_op_func == NULL) -+ return; -+ within_reduction = 1; -+ funcargs = make_word_list (make_word (buf2), NULL); -+ funcargs = make_word_list (make_word (buf1), funcargs); -+ funcargs = make_word_list (make_word ("cb_reduce_op"), funcargs); -+ execute_shell_function (reduce_op_func, funcargs); -+ dispose_words (funcargs); -+ within_reduction = 0; -+} -+ -+/* Invoke the user-defined reduction-finalization callback function -+ * (reduce_fini_func). */ -+static void -+internal_reduce_fini_func (buf, size) -+ const void* buf; -+ size_t size; -+{ -+ WORD_LIST *funcargs; -+ -+ if (reduce_fini_func == NULL) -+ return; -+ funcargs = make_word_list (make_word (buf), NULL); -+ funcargs = make_word_list (make_word ("cb_reduce_fini"), funcargs); -+ execute_shell_function (reduce_fini_func, funcargs); -+ dispose_words (funcargs); -+} -+ -+/* Look up a user-provided callback function. */ -+static int -+find_callback_function (list, user_func) -+ WORD_LIST *list; -+ SHELL_VAR **user_func; -+{ -+ char *funcname; /* Name of the user-defined function. */ -+ -+ /* If no argument was provided, nullify the callback function. */ -+ if (list == NULL) -+ { -+ *user_func = NULL; -+ return EXECUTION_SUCCESS; -+ } -+ -+ /* Get the callback function. */ -+ funcname = list->word->word; -+ list = list->next; -+ no_args (list); -+ *user_func = find_function (funcname); -+ if (*user_func == NULL) -+ { -+ builtin_error (_("function %s not found"), funcname); -+ return EXECUTION_FAILURE; -+ } -+ return EXECUTION_SUCCESS; -+} -+ -+/* Initialize Libcircle. */ -+void -+initialize_libcircle (argc, argv) -+ int argc; -+ char **argv; -+{ -+ circle_rank = CIRCLE_init (argc, argv, CIRCLE_DEFAULT_FLAGS); -+ bind_variable_number ("circle_rank", circle_rank, 0); -+ CIRCLE_enable_logging (CIRCLE_LOG_WARN); -+ CIRCLE_cb_create (internal_create_func); -+ CIRCLE_cb_process (internal_process_func); -+ CIRCLE_cb_reduce_init (internal_reduce_init_func); -+ CIRCLE_cb_reduce_op (internal_reduce_op_func); -+ CIRCLE_cb_reduce_fini (internal_reduce_fini_func); -+} -+ -+/* Finalize Libcircle. */ -+void -+finalize_libcircle (void) -+{ -+ CIRCLE_finalize (); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+$BUILTIN circle_set_options -+$FUNCTION circle_set_options_builtin -+$SHORT_DOC circle_set_options [flag]... -+Change Libcircle's run-time behavior. -+ -+Arguments: -+ FLAG "split_random", "split_equal", or "create_global" -+ -+Multiple flags can be provided. If no flags are provided, Libcircle -+reverts to its default options. -+ -+Exit Status: -+Returns 0 unless an invalid option is given. -+$END -+/*'*/ -+ -+/* Here is the circle_set_options builtin. */ -+int -+circle_set_options_builtin (list) -+ WORD_LIST *list; -+{ -+ char *word; /* One argument */ -+ int flags = 0; /* Flags to pass to CIRCLE_set_options */ -+ -+ if (list == NULL) -+ flags = CIRCLE_DEFAULT_FLAGS; -+ else -+ while (list != NULL) -+ { -+ word = list->word->word; -+ if (!strcmp (word, "split_random")) -+ flags |= CIRCLE_SPLIT_RANDOM; -+ else if (!strcmp (word, "split_equal")) -+ flags |= CIRCLE_SPLIT_EQUAL; -+ else if (!strcmp (word, "create_global")) -+ flags |= CIRCLE_CREATE_GLOBAL; -+ else -+ { -+ builtin_error (_("invalid flag \"%s\""), word); -+ return (EXECUTION_FAILURE); -+ } -+ list = list->next; -+ } -+ CIRCLE_set_options (flags); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_cb_create -+$FUNCTION circle_cb_create_builtin -+$SHORT_DOC circle_cb_create [func] -+Register a function that will create work when asked. -+ -+Arguments: -+ FUNC User-defined callback function that will invoke -+ circle_enqueue when called -+ -+If FUNC is omitted, no function will be associated with work creation. -+This can be used to nullify a previous circle_cb_create invocation. -+ -+Exit Status: -+Returns 0 unless an invalid function is given or an error occurs. -+$END -+ -+/* Here is the circle_cb_create builtin. */ -+int -+circle_cb_create_builtin (list) -+ WORD_LIST *list; -+{ -+ return find_callback_function (list, &create_func); -+} -+ -+$BUILTIN circle_cb_process -+$FUNCTION circle_cb_process_builtin -+$SHORT_DOC circle_cb_process [func] -+Register a function that will process work when asked. -+ -+Arguments: -+ FUNC User-defined callback function that will invoke -+ circle_enqueue when called -+ -+If FUNC is omitted, no function will be associated with work processing. -+This can be used to nullify a previous circle_cb_process invocation. -+ -+Exit Status: -+Returns 0 unless an invalid function is given or an error occurs. -+$END -+ -+/* Here is the circle_cb_process builtin. */ -+int -+circle_cb_process_builtin (list) -+ WORD_LIST *list; -+{ -+ return find_callback_function (list, &process_func); -+} -+ -+$BUILTIN circle_begin -+$FUNCTION circle_begin_builtin -+$SHORT_DOC circle_begin -+Begin creation and processing of the distributed work queue. -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+ -+/* Here is the circle_begin builtin. */ -+int -+circle_begin_builtin (list) -+ WORD_LIST *list; -+{ -+ no_args (list); -+ CIRCLE_begin (); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_enqueue -+$FUNCTION circle_enqueue_builtin -+$SHORT_DOC circle_enqueue work -+Enqueue work onto the distributed queue. -+ -+Arguments: -+ WORK "Work" as represented by an arbitrary string of limited -+ size (generally around 4KB) -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+ -+/* Here is the circle_enqueue builtin. */ -+int -+circle_enqueue_builtin (list) -+ WORD_LIST *list; -+{ -+ char *work; /* Work to perform */ -+ -+ /* Extract the work argument. */ -+ YES_ARGS (list); -+ work = list->word->word; -+ list = list->next; -+ no_args (list); -+ -+ /* Complain if we're not within a proper callback function. */ -+ if (current_handle == NULL) -+ { -+ builtin_error (_("not within a Libcircle \"create\" or \"process\" callback function")); -+ return EXECUTION_FAILURE; -+ } -+ -+ /* Enqueue the work. */ -+ if (current_handle->enqueue (work) == -1) -+ return EXECUTION_FAILURE; -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_dequeue -+$FUNCTION circle_dequeue_builtin -+$SHORT_DOC circle_dequeue var -+Dequeue work from the distributed queue into a variable. -+ -+Arguments: -+ VAR Variable in which to receive previously enqueued "work" -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+ -+/* Here is the circle_dequeue builtin. */ -+int -+circle_dequeue_builtin (list) -+ WORD_LIST *list; -+{ -+ char *varname; /* Variable in which to store the work string */ -+ char work[CIRCLE_MAX_STRING_LEN+1]; /* Work to perform */ -+ -+ /* Extract the variable-name argument. */ -+ YES_ARGS (list); -+ varname = list->word->word; -+ list = list->next; -+ no_args (list); -+ -+ /* Complain if we're not within a callback function. */ -+ if (current_handle == NULL) -+ { -+ builtin_error (_("not within a Libcircle callback function")); -+ return EXECUTION_FAILURE; -+ } -+ -+ /* Dequeue the work and bind it to the given variable. */ -+ if (current_handle->dequeue (work) == -1) -+ return EXECUTION_FAILURE; -+ bind_variable (varname, work, 0); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_enable_logging -+$FUNCTION circle_enable_logging_builtin -+$SHORT_DOC circle_enable_logging log_level -+Change Libcircle's logging verbosity -+ -+Arguments: -+ LOG_LEVEL "fatal", "error", "warning", "info", or "debug" -+ -+Exit Status: -+Returns 0 unless an invalid option is given. -+$END -+/*'*/ -+ -+/* Here is the circle_enable_logging builtin. */ -+int -+circle_enable_logging_builtin (list) -+ WORD_LIST *list; -+{ -+ char *word; /* One argument */ -+ CIRCLE_loglevel loglevel; /* Level to set */ -+ -+ /* Parse the log level. */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (!strcmp (word, "fatal")) -+ loglevel = CIRCLE_LOG_FATAL; -+ else if (!strcmp (word, "error")) -+ loglevel = CIRCLE_LOG_ERR; -+ else if (!strcmp (word, "warning")) -+ loglevel = CIRCLE_LOG_WARN; -+ else if (!strcmp (word, "info")) -+ loglevel = CIRCLE_LOG_INFO; -+ else if (!strcmp (word, "debug")) -+ loglevel = CIRCLE_LOG_DBG; -+ else -+ { -+ builtin_error (_("invalid log level \"%s\""), word); -+ return (EXECUTION_FAILURE); -+ } -+ -+ /* Set the log level. */ -+ CIRCLE_enable_logging (loglevel); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_abort -+$FUNCTION circle_abort_builtin -+$SHORT_DOC circle_abort -+Terminate queue processing. -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+ -+/* Here is the circle_abort builtin. */ -+int -+circle_abort_builtin (list) -+ WORD_LIST *list; -+{ -+ no_args (list); -+ CIRCLE_abort (); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_checkpoint -+$FUNCTION circle_checkpoint_builtin -+$SHORT_DOC circle_checkpoint -+Checkpoint a work queue to disk. -+ -+Write a file called circle${circle_rank}.txt containing the current -+queue state of rank ${circle_rank}. On a later run, a worker can -+invoke circle_read_restarts to repopulate its queue from such a -+checkpoint file. -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+/*'*/ -+ -+/* Here is the circle_checkpoint builtin. */ -+int -+circle_checkpoint_builtin (list) -+ WORD_LIST *list; -+{ -+ no_args (list); -+ CIRCLE_checkpoint (); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_read_restarts -+$FUNCTION circle_read_restarts_builtin -+$SHORT_DOC circle_read_restarts -+Repopulate a work queue from a disk checkpoint. -+ -+Read queue contents from a file called circle${circle_rank}.txt, which -+was previously produced by circle_checkpoint. -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+/*'*/ -+ -+/* Here is the circle_read_restarts builtin. */ -+int -+circle_read_restarts_builtin (list) -+ WORD_LIST *list; -+{ -+ no_args (list); -+ CIRCLE_read_restarts (); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN circle_cb_reduce_init -+$FUNCTION circle_cb_reduce_init_builtin -+$SHORT_DOC circle_cb_reduce_init [func] -+Register a function that will initiate a reduction operation. -+ -+Arguments: -+ FUNC User-defined callback function that will invoke -+ circle_reduce when called -+ -+FUNC will be invoked on all ranks. -+ -+If FUNC is omitted, no function will be associated with reduction -+initialization. This can be used to nullify a previous -+circle_cb_reduce_init invocation. -+ -+Exit Status: -+Returns 0 unless an invalid function is given or an error occurs. -+$END -+ -+/* Here is the circle_cb_reduce_init builtin. */ -+int -+circle_cb_reduce_init_builtin (list) -+ WORD_LIST *list; -+{ -+ return find_callback_function (list, &reduce_init_func); -+} -+ -+$BUILTIN circle_cb_reduce_op -+$FUNCTION circle_cb_reduce_op_builtin -+$SHORT_DOC circle_cb_reduce_op [func] -+Register a function that will complete a reduction operation. -+ -+Arguments: -+ FUNC User-defined callback function that will receive -+ two items to reduce and invoke circle_reduce on -+ the reduced value -+ -+If FUNC is omitted, no function will be associated with reduction -+execution. This can be used to nullify a previous circle_cb_reduce_op -+invocation. -+ -+Exit Status: -+Returns 0 unless an invalid function is given or an error occurs. -+$END -+ -+/* Here is the circle_cb_reduce_op builtin. */ -+int -+circle_cb_reduce_op_builtin (list) -+ WORD_LIST *list; -+{ -+ return find_callback_function (list, &reduce_op_func); -+} -+ -+$BUILTIN circle_cb_reduce_fini -+$FUNCTION circle_cb_reduce_fini_builtin -+$SHORT_DOC circle_cb_reduce_fini [func] -+Register a function that will complete a reduction operation. -+ -+Arguments: -+ FUNC User-defined callback function that will receive -+ the final reduced data -+ -+If FUNC is omitted, no function will be associated with reduction -+completion. This can be used to nullify a previous -+circle_cb_reduce_fini invocation. -+ -+Libcircle guarantees that FUNC will be invoked only on rank 0. -+ -+Exit Status: -+Returns 0 unless an invalid function is given or an error occurs. -+$END -+ -+/* Here is the circle_cb_reduce_fini builtin. */ -+int -+circle_cb_reduce_fini_builtin (list) -+ WORD_LIST *list; -+{ -+ return find_callback_function (list, &reduce_fini_func); -+} -+ -+$BUILTIN circle_reduce -+$FUNCTION circle_reduce_builtin -+$SHORT_DOC circle_reduce work -+Seed the next phase of a reduction operation -+ -+Arguments: -+ WORK "Work" as represented by an arbitrary string of limited -+ size (generally around 4KB) -+ -+This function should be called both by the callback function -+registered with circle_reduce_init and the callback function -+registered with circle_reduce_op. -+ -+Exit Status: -+Returns 0 unless an error occurs. -+$END -+ -+/* Here is the circle_reduce builtin. */ -+int -+circle_reduce_builtin (list) -+ WORD_LIST *list; -+{ -+ char *work; /* Work to perform */ -+ -+ /* Extract the work argument. */ -+ YES_ARGS (list); -+ work = list->word->word; -+ list = list->next; -+ no_args (list); -+ -+ /* Complain if we're not within a proper callback function. */ -+ if (!within_reduction) -+ { -+ builtin_error (_("not within a Libcircle \"reduce_init\" or \"reduce_op\" callback function")); -+ return EXECUTION_FAILURE; -+ } -+ -+ /* Reduce the work. */ -+ CIRCLE_reduce (work, strlen (work)); -+ return EXECUTION_SUCCESS; -+} -diff -Naur bash-4.3/builtins/Makefile.in mpibash-4.3/builtins/Makefile.in ---- bash-4.3/builtins/Makefile.in 2012-05-25 07:29:19.000000000 -0600 -+++ mpibash-4.3/builtins/Makefile.in 2014-05-13 11:27:37.314100671 -0600 -@@ -141,7 +141,9 @@ - $(srcdir)/times.def $(srcdir)/trap.def $(srcdir)/type.def \ - $(srcdir)/ulimit.def $(srcdir)/umask.def $(srcdir)/wait.def \ - $(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def \ -- $(srcdir)/printf.def $(srcdir)/complete.def $(srcdir)/mapfile.def -+ $(srcdir)/printf.def $(srcdir)/complete.def $(srcdir)/mapfile.def \ -+ $(srcdir)/mpi.def \ -+@CIRCLE@ $(srcdir)/circle.def - - STATIC_SOURCE = common.c evalstring.c evalfile.c getopt.c bashgetopt.c \ - getopt.h -@@ -153,7 +155,9 @@ - jobs.o kill.o let.o mapfile.o \ - pushd.o read.o return.o set.o setattr.o shift.o source.o \ - suspend.o test.o times.o trap.o type.o ulimit.o umask.o \ -- wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o complete.o -+ wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o complete.o \ -+ mpi.o \ -+@CIRCLE@ circle.o - - CREATED_FILES = builtext.h builtins.c psize.aux pipesize.h tmpbuiltins.c \ - tmpbuiltins.h -@@ -317,6 +321,8 @@ - getopts.o: getopts.def - reserved.o: reserved.def - complete.o: complete.def -+@CIRCLE@ circle.o: circle.def -+mpi.o: mpi.def - - # C files - bashgetopt.o: ../config.h $(topdir)/bashansi.h $(BASHINCDIR)/ansi_stdlib.h -@@ -644,6 +650,19 @@ - mapfile.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h - mapfile.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/variables.h $(topdir)/conftypes.h - mapfile.o: $(topdir)/arrayfunc.h ../pathnames.h -+@CIRCLE@ circle.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h -+@CIRCLE@ circle.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h -+@CIRCLE@ circle.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h -+@CIRCLE@ circle.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h -+@CIRCLE@ circle.o: $(BASHINCDIR)/maxpath.h ../pathnames.h -+mpi.o: ../config.h ../config-top.h ../config-bot.h ../bashintl.h -+mpi.o: ../include/gettext.h ../shell.h ../config.h ../bashjmp.h -+mpi.o: ../include/posixjmp.h ../command.h ../syntax.h ../general.h -+mpi.o: ../bashtypes.h ../include/chartypes.h ../xmalloc.h ../bashansi.h -+mpi.o: ../error.h ../variables.h ../array.h ../assoc.h ../hashlib.h -+mpi.o: ../conftypes.h ../arrayfunc.h ../quit.h ../sig.h ../include/maxpath.h -+mpi.o: ../unwind_prot.h ../dispose_cmd.h ../make_cmd.h ../include/ocache.h -+mpi.o: ../subst.h ../pathnames.h ../externs.h common.h bashgetopt.h - - #bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h - -diff -Naur bash-4.3/builtins/mpi.def mpibash-4.3/builtins/mpi.def ---- bash-4.3/builtins/mpi.def 1969-12-31 17:00:00.000000000 -0700 -+++ mpibash-4.3/builtins/mpi.def 2014-05-13 11:27:37.314100671 -0600 -@@ -0,0 +1,744 @@ -+This file is mpi.def, from which is created mpi.c. -+It implements all of the "mpi_*" builtins in Bash. -+ -+$PRODUCES mpi.c -+ -+#include <config.h> -+ -+#include <stdio.h> -+#if defined (HAVE_UNISTD_H) -+# ifdef _MINIX -+# include <sys/types.h> -+# endif -+# include <unistd.h> -+#endif -+ -+#include "../bashintl.h" -+#include "../shell.h" -+#include "common.h" -+#include "bashgetopt.h" -+#include <mpi.h> -+ -+extern int running_trap, trap_saved_exit_value; -+ -+/* Keep track of who we are within MPI_COMM_WORLD. */ -+static int mpi_rank; -+static int mpi_num_ranks; -+ -+/* Try an MPI operation. Return with an error message on failure. */ -+#define MPI_TRY(STMT) \ -+ do \ -+ { \ -+ int mpierr; \ -+ mpierr = STMT; \ -+ if (mpierr != MPI_SUCCESS) \ -+ return report_mpi_error (mpierr); \ -+ } \ -+ while (0) -+ -+/* Return with a usage message if no arguments remain. */ -+#define YES_ARGS(LIST) \ -+ if ((LIST) == 0) \ -+ { \ -+ builtin_usage (); \ -+ return (EX_USAGE); \ -+ } -+ -+/* Return with an error message if a given variable is read-only or if -+ * we can't write to it for any other reason (e.g., it's defined as a -+ * function). */ -+#define REQUIRE_WRITABLE(NAME) \ -+ do \ -+ { \ -+ SHELL_VAR *bindvar = find_shell_variable (NAME); \ -+ if (bindvar) \ -+ { \ -+ if (readonly_p (bindvar)) \ -+ { \ -+ err_readonly (NAME); \ -+ return (EXECUTION_FAILURE); \ -+ } \ -+ if (unbind_variable (NAME) == -1) \ -+ { \ -+ builtin_error ("Failed to write to variable %s", NAME); \ -+ return (EXECUTION_FAILURE); \ -+ } \ -+ } \ -+ } \ -+ while (0) -+ -+/* Initialize MPI. */ -+void -+initialize_mpi (argc, argv) -+ int argc; -+ char **argv; -+{ -+ int init_done; -+ -+ MPI_Initialized (&init_done); -+ if (!init_done) -+ MPI_Init (&argc, &argv); -+ MPI_Errhandler_set (MPI_COMM_WORLD, MPI_ERRORS_RETURN); -+ MPI_Comm_rank (MPI_COMM_WORLD, &mpi_rank); -+ MPI_Comm_size (MPI_COMM_WORLD, &mpi_num_ranks); -+} -+ -+/* Finalize MPI. */ -+void -+finalize_mpi () -+{ -+ MPI_Finalize (); -+} -+ -+/* Parse an operation name into an MPI_Op. Return 1 on success, 0 on -+ * failure. */ -+static int -+parse_operation (char *name, MPI_Op *op) -+{ -+ /* Define a mapping from operator names to MPI_Op values. */ -+ typedef struct { -+ char *name; /* Operation name (e.g., "sum") */ -+ MPI_Op value; /* Operation value (e.g., MPI_SUM) */ -+ } opname2value_t; -+ static opname2value_t oplist[] = { -+ {"max", MPI_MAX}, -+ {"min", MPI_MIN}, -+ {"sum", MPI_SUM}, -+ {"prod", MPI_PROD}, -+ {"land", MPI_LAND}, -+ {"band", MPI_BAND}, -+ {"lor", MPI_LOR}, -+ {"bor", MPI_BOR}, -+ {"lxor", MPI_LXOR}, -+ {"bxor", MPI_BXOR}, -+ {"maxloc", MPI_MAXLOC}, -+ {"minloc", MPI_MINLOC} -+ }; -+ size_t i; -+ -+ for (i = 0; i < sizeof(oplist)/sizeof(opname2value_t); i++) -+ if (!strcmp(name, oplist[i].name)) -+ { -+ *op = oplist[i].value; -+ if (i > 0) -+ { -+ /* As a performance optimization, bubble up the value we -+ * just found. */ -+ opname2value_t prev = oplist[i - 1]; -+ oplist[i - 1] = oplist[i]; -+ oplist[i] = prev; -+ } -+ return 1; -+ } -+ return 0; -+} -+ -+/* Report an error to the user and return EXECUTION_FAILURE. */ -+static int -+report_mpi_error (mpierr) -+ int mpierr; -+{ -+ char errstr[MPI_MAX_ERROR_STRING]; -+ int errstrlen; -+ -+ MPI_Error_string (mpierr, errstr, &errstrlen); -+ builtin_error ("%s", errstr); -+ return EXECUTION_FAILURE; -+} -+ -+/* Perform the same operation as bind_variable, but with VALUE being a -+ * number, not a string. */ -+static SHELL_VAR * -+bind_variable_number (name, value, flags) -+ const char *name; -+ long value; -+ int flags; -+{ -+ char numstr[25]; /* String version of VALUE */ -+ -+ sprintf (numstr, "%ld", value); -+ return bind_variable (name, numstr, flags); -+} -+ -+/* Perform the same operation as bind_array_variable, but with VALUE -+ * being a number, not a string. */ -+static SHELL_VAR * -+bind_array_variable_number (name, ind, value, flags) -+ char *name; -+ arrayind_t ind; -+ long value; -+ int flags; -+{ -+ char numstr[25]; /* String version of VALUE */ -+ -+ sprintf (numstr, "%ld", value); -+ return bind_array_variable (name, ind, numstr, flags); -+} -+ -+/* Define a reduction-type function (allreduce, scan, exscan, etc.). */ -+typedef int (*reduction_func_t)(void *, void *, int, MPI_Datatype, MPI_Op, MPI_Comm); -+ -+/* Perform any reduction-type operation (allreduce, scan, exscan, etc.). */ -+static int -+reduction_like (list, funcname, func) -+ WORD_LIST *list; -+ char *funcname; -+ reduction_func_t func; -+{ -+ char *word; /* One argument */ -+ struct { -+ long int value; /* Reduced value */ -+ int rank; /* Rank associated with the above */ -+ } number, result; -+ MPI_Op operation = MPI_SUM; /* Operation to perform */ -+ char *varname; /* Name of the variable to bind the results to */ -+ intmax_t n; -+ int i; -+ -+ /* Parse "-O OPERATION" (optional), where OPERATION is a reduction -+ * operation. */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (ISOPTION (word, 'O')) -+ { -+ list = list->next; -+ if (list == 0) -+ { -+ sh_needarg (funcname); -+ return (EX_USAGE); -+ } -+ word = list->word->word; -+ if (!parse_operation (word, &operation)) -+ { -+ sh_invalidopt ("-O"); -+ return (EX_USAGE); -+ } -+ list = list->next; -+ } -+ -+ /* Parse the argument, which must be a number. */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (!legal_number (word, &n)) -+ { -+ sh_neednumarg (funcname); -+ return (EX_USAGE); -+ } -+ number.value = (long int) n; -+ number.rank = mpi_rank; -+ list = list->next; -+ -+ /* Parse the target variable, which must not be read-only. */ -+ YES_ARGS (list); -+ varname = list->word->word; -+ if (mpi_rank != 0 || func != MPI_Exscan) -+ REQUIRE_WRITABLE (varname); -+ list = list->next; -+ no_args (list); -+ -+ /* Perform the reduction operation. Bind the given array variable -+ * to the result and, for minloc/maxloc, the associated rank. */ -+ if (mpi_rank != 0 || func != MPI_Exscan) { -+ bind_array_variable (varname, 0, "", 0); -+ bind_array_variable (varname, 1, "", 0); -+ } -+ if (operation == MPI_MINLOC || operation == MPI_MAXLOC) -+ { -+ MPI_TRY (func (&number, &result, 1, MPI_LONG_INT, operation, MPI_COMM_WORLD)); -+ if (mpi_rank != 0 || func != MPI_Exscan) -+ bind_array_variable_number (varname, 1, result.rank, 0); -+ } -+ else -+ MPI_TRY (func (&number.value, &result.value, 1, MPI_LONG, operation, MPI_COMM_WORLD)); -+ if (mpi_rank != 0 || func != MPI_Exscan) -+ bind_array_variable_number (varname, 0, result.value, 0); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_comm_rank -+$FUNCTION mpi_comm_rank_builtin -+$SHORT_DOC mpi_comm_rank name -+Return the process's rank in the MPI job. -+ -+Arguments: -+ NAME Scalar variable in which to receive the rank -+ -+Exit Status: -+Returns 0 unless an invalid option is given. -+$END -+/*'*/ -+ -+/* Here is the mpi_comm_rank builtin. */ -+int -+mpi_comm_rank_builtin (list) -+ WORD_LIST *list; -+{ -+ char *varname; /* Name of the variable to bind the results to */ -+ -+ YES_ARGS (list); -+ varname = list->word->word; -+ REQUIRE_WRITABLE (varname); -+ list = list->next; -+ no_args (list); -+ bind_variable_number (varname, mpi_rank, 0); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_comm_size -+$FUNCTION mpi_comm_size_builtin -+$SHORT_DOC mpi_comm_size name -+Return the total number of ranks in the MPI job. -+ -+Arguments: -+ NAME Scalar variable in which to receive the number of ranks -+ -+Exit Status: -+Returns 0 unless an invalid option is given. -+$END -+ -+/* Here is the mpi_comm_size builtin. */ -+int -+mpi_comm_size_builtin (list) -+ WORD_LIST *list; -+{ -+ char *varname; /* Name of the variable to bind the results to */ -+ -+ YES_ARGS (list); -+ varname = list->word->word; -+ REQUIRE_WRITABLE (varname); -+ list = list->next; -+ no_args (list); -+ bind_variable_number (varname, mpi_num_ranks, 0); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_abort -+$FUNCTION mpi_abort_builtin -+$SHORT_DOC mpi_abort [n] -+Abort all processes in the MPI job and exit the shell. -+ -+Exits not only the caller's shell (with a status of N) but also all -+remote shells that are part of the same MPI job. If N is omitted, the -+exit status is that of the last command executed. -+ -+This command should be used only in extreme circumstances. It is -+better for each process to exit normally on its own. -+$END -+/*'*/ -+ -+/* Here is the mpi_abort builtin. */ -+int -+mpi_abort_builtin (list) -+ WORD_LIST *list; -+{ -+ int exit_value; -+ -+ exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list); /* Copied from exit.def */ -+ MPI_TRY (MPI_Abort (MPI_COMM_WORLD, exit_value)); -+ return EXECUTION_FAILURE; -+} -+ -+$BUILTIN mpi_send -+$FUNCTION mpi_send_builtin -+$SHORT_DOC mpi_send [-t tag] rank message -+Send a message to a remote process in the same MPI job. -+ -+Options: -+ -t TAG Send the message using tag TAG (default: 0). TAG must -+ be a nonnegative integer. -+ -+Arguments: -+ RANK Whom to send the message to. RANK must be an integer in -+ the range [0, $(mpi_comm_size)-1]. -+ -+ MESSAGE String to send to rank RANK. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_send builtin. */ -+int -+mpi_send_builtin (list) -+ WORD_LIST *list; -+{ -+ char *word; /* One argument */ -+ intmax_t target_rank; /* MPI target rank */ -+ char *message; /* Message to send to rank target_rank */ -+ intmax_t tag = 0; /* Message tag to use */ -+ -+ /* Parse "-t TAG" (optional), where TAG is a number or "any". */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (ISOPTION (word, 't')) -+ { -+ list = list->next; -+ if (list == 0) -+ { -+ sh_needarg ("mpi_recv"); -+ return (EX_USAGE); -+ } -+ word = list->word->word; -+ if (!legal_number (word, &tag)) -+ { -+ sh_neednumarg ("-t"); -+ return (EX_USAGE); -+ } -+ list = list->next; -+ } -+ else if (*word == '-') -+ { -+ sh_invalidopt (word); -+ builtin_usage (); -+ return (EX_USAGE); -+ } -+ -+ /* Parse the target rank, which must be a number. */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (!legal_number (word, &target_rank)) -+ { -+ builtin_error (_("mpi_send: numeric rank required")); -+ return (EX_USAGE); -+ } -+ list = list->next; -+ -+ /* Parse the message to send. */ -+ YES_ARGS (list); -+ message = list->word->word; -+ list = list->next; -+ no_args (list); -+ -+ /* Send the message. */ -+ MPI_TRY (MPI_Send (message, strlen(message)+1, MPI_BYTE, (int)target_rank, (int)tag, MPI_COMM_WORLD)); -+ return EXECUTION_SUCCESS; -+} -+ -+ -+$BUILTIN mpi_recv -+$FUNCTION mpi_recv_builtin -+$SHORT_DOC mpi_recv [-t tag] rank name -+Receive a message from a remote process in the same MPI job. -+ -+Options: -+ -t TAG Receive only messages sent using tag TAG (default: 0). -+ TAG must be either a nonnegative integer or the string -+ "any" to receive messages sent using any tag. -+ -+Arguments: -+ RANK Receive only messages sent from sender RANK. RANK -+ must either be in the range [0, $(mpi_comm_size)-1] or -+ be the string "any" to receive messages from any sender. -+ -+ NAME Array variable in which to receive the message, sender -+ rank, and tag. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_recv builtin. */ -+int -+mpi_recv_builtin (list) -+ WORD_LIST *list; -+{ -+ char *word; /* One argument */ -+ intmax_t source_rank; /* MPI source rank */ -+ char *endptr; /* Used for parsing strings into numbers */ -+ MPI_Status status; /* Status of an MPI operation */ -+ int count; /* Message length in bytes */ -+ intmax_t tag = 0; /* Message tag to use */ -+ char *varname; /* Name of the variable to bind the results to */ -+ static char *message = NULL; /* Message received from MPI */ -+ static size_t alloced = 0; /* Number of bytes allocated for the above */ -+ int opt; /* Parsed option */ -+ -+ /* Parse any options provided. */ -+ reset_internal_getopt (); -+ while ((opt = internal_getopt (list, "t:")) != -1) -+ { -+ switch (opt) -+ { -+ case 't': -+ if (!strcmp (list_optarg, "any")) -+ tag = MPI_ANY_TAG; -+ else if (!legal_number (list_optarg, &tag)) -+ { -+ builtin_error (_("-t: numeric argument or \"any\" required")); -+ return (EX_USAGE); -+ } -+ break; -+ -+ default: -+ sh_invalidopt (word); -+ builtin_usage (); -+ return (EX_USAGE); -+ } -+ } -+ list = loptend; -+ -+ /* Parse the source rank, which must be a number or "any". */ -+ YES_ARGS (list); -+ word = list->word->word; -+ if (!legal_number (word, &source_rank)) -+ { -+ if (!strcmp (word, "any")) -+ source_rank = MPI_ANY_SOURCE; -+ else -+ { -+ builtin_error (_("mpi_recv: numeric rank or \"any\" required")); -+ return (EX_USAGE); -+ } -+ } -+ list = list->next; -+ -+ /* Parse the target variable, which must not be read-only. */ -+ YES_ARGS (list); -+ varname = list->word->word; -+ REQUIRE_WRITABLE (varname); -+ list = list->next; -+ no_args (list); -+ -+ /* Receive a message. Because we don't know long the message will -+ * be, we first probe to get the length. */ -+ MPI_TRY (MPI_Probe ((int)source_rank, (int)tag, MPI_COMM_WORLD, &status)); -+ MPI_TRY (MPI_Get_count (&status, MPI_BYTE, &count)); -+ if (alloced < count) -+ { -+ message = xrealloc (message, count); -+ alloced = count; -+ } -+ MPI_TRY (MPI_Recv (message, count, MPI_BYTE, status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &status)); -+ bind_array_variable (varname, 0, message, 0); -+ bind_array_variable_number (varname, 1, status.MPI_SOURCE, 0); -+ bind_array_variable_number (varname, 2, status.MPI_TAG, 0); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_barrier -+$FUNCTION mpi_barrier_builtin -+$SHORT_DOC mpi_barrier -+Synchronizes all of the processes in the MPI job. -+ -+No process will return from mpi_barrier until all processes have -+called mpi_barrier. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_barrier builtin. */ -+int -+mpi_barrier_builtin (list) -+ WORD_LIST *list; -+{ -+ no_args (list); -+ MPI_TRY (MPI_Barrier (MPI_COMM_WORLD)); -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_bcast -+$FUNCTION mpi_bcast_builtin -+$SHORT_DOC mpi_bcast [message] name -+Broadcast a message to all processes in the same MPI job. -+ -+Arguments: -+ MESSAGE String to broadcast from one process to all the others. -+ -+ NAME Scalar variable in which to receive the broadcast message. -+ -+Exactly one process in the MPI job must specify a message to -+broadcast. No process will return from mpi_bcast until all processes -+have called mpi_bcast. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_bcast builtin. */ -+int -+mpi_bcast_builtin (list) -+ WORD_LIST *list; -+{ -+ char *word; /* One argument */ -+ int root; /* MPI root rank */ -+ char *root_message; /* Message to broadcast */ -+ int msglen; /* Length in bytes of the above (including the NULL byte) */ -+ char *varname; /* Name of the variable to bind the results to */ -+ static int *all_lengths = NULL; /* List of every rank's msglen */ -+ static char *message = NULL; /* Message received from the root */ -+ static int alloced = 0; /* Bytes allocated for the above */ -+ int i; -+ -+ /* Parse the optional message and target variable, which must not be -+ * read-only. */ -+ YES_ARGS (list); -+ if (list->next == NULL) -+ { -+ /* Non-root */ -+ root_message = NULL; -+ msglen = -1; -+ } -+ else -+ { -+ /* Root */ -+ root_message = list->word->word; -+ msglen = (int) strlen(root_message) + 1; -+ list = list->next; -+ } -+ varname = list->word->word; -+ REQUIRE_WRITABLE (varname); -+ list = list->next; -+ no_args (list); -+ -+ /* Acquire global agreement on the root and the message size. */ -+ if (all_lengths == NULL) -+ all_lengths = xmalloc (mpi_num_ranks*sizeof(int)); -+ MPI_TRY (MPI_Allgather (&msglen, 1, MPI_INT, all_lengths, 1, MPI_INT, MPI_COMM_WORLD)); -+ root = -1; -+ for (i = 0; i < mpi_num_ranks; i++) -+ { -+ if (all_lengths[i] == -1) -+ continue; -+ if (root != -1) -+ { -+ builtin_error (_("mpi_bcast: more than one process specified a message")); -+ return (EXECUTION_FAILURE); -+ } -+ root = i; -+ msglen = all_lengths[i]; -+ } -+ if (root == -1) -+ { -+ builtin_error (_("mpi_bcast: no process specified a message")); -+ return (EXECUTION_FAILURE); -+ } -+ -+ /* Broadcast the message. */ -+ if (mpi_rank == root) -+ { -+ MPI_TRY (MPI_Bcast (root_message, msglen, MPI_BYTE, root, MPI_COMM_WORLD)); -+ bind_variable (varname, root_message, 0); -+ } -+ else -+ { -+ if (alloced < msglen) -+ { -+ message = xrealloc (message, msglen); -+ alloced = msglen; -+ } -+ MPI_TRY (MPI_Bcast (message, msglen, MPI_BYTE, root, MPI_COMM_WORLD)); -+ bind_variable (varname, message, 0); -+ } -+ return EXECUTION_SUCCESS; -+} -+ -+$BUILTIN mpi_scan -+$FUNCTION mpi_scan_builtin -+$SHORT_DOC mpi_scan number name -+Perform an inclusive scan across all processes in the same MPI job. -+ -+ -O OPERATION Operation to perform. Must be one of "max", "min", -+ "sum", "prod", "land", "band", "lor", "bor", "lxor", -+ "bxor", "maxloc", or "minloc" (default: "sum"). -+ -+Arguments: -+ NUMBER Integer to use in the scan operation. -+ -+ NAME Array variable in which to receive the result and, in -+ the case of maxloc and minloc, the associated rank. -+ -+In an inclusive-scan operation, each process i presents a number, -+a[i]. Once all processes in the MPI job have presented their number, -+the command returns a[0] to rank 0, a[0]+a[1] to rank 1, -+a[0]+a[1]+a[2] to rank 2, and so forth. The -O option enables "+" to -+be replaced with other operations. -+ -+Inclusive scans can be useful for assigning a unique index to each -+process in the MPI job. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_scan builtin. */ -+int -+mpi_scan_builtin (list) -+ WORD_LIST *list; -+{ -+ return reduction_like (list, "mpi_scan", MPI_Scan); -+} -+ -+$BUILTIN mpi_exscan -+$FUNCTION mpi_exscan_builtin -+$SHORT_DOC mpi_exscan number name -+Perform an exclusive scan across all processes in the same MPI job. -+ -+ -O OPERATION Operation to perform. Must be one of "max", "min", -+ "sum", "prod", "land", "band", "lor", "bor", "lxor", -+ "bxor", "maxloc", or "minloc" (default: "sum"). -+ -+Arguments: -+ NUMBER Integer to use in the scan operation. -+ -+ NAME Array variable in which to receive the result and, in -+ the case of maxloc and minloc, the associated rank. -+ -+In a exclusive-scan operation, each process i presents a number, a[i]. -+Once all processes in the MPI job have presented their number, the -+command assigns a[0] to NAME on rank 1, a[0]+a[1] to NAME on rank 2, -+a[0]+a[1]+a[2] to NAME on rank 3, and so forth. No assignment is -+performed on rank 0. The -O option enables "+" to be replaced with -+other operations. -+ -+Exclusive scans can be useful for assigning a unique index to each -+process in the MPI job. -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_exscan builtin. */ -+int -+mpi_exscan_builtin (list) -+ WORD_LIST *list; -+{ -+ return reduction_like (list, "mpi_exscan", MPI_Exscan); -+} -+ -+$BUILTIN mpi_allreduce -+$FUNCTION mpi_allreduce_builtin -+$SHORT_DOC mpi_allreduce number name -+Reduce numbers from all processes in an MPI job to a single number. -+ -+Options: -+ -+ -O OPERATION Operation to perform. Must be one of "max", "min", -+ "sum", "prod", "land", "band", "lor", "bor", "lxor", -+ "bxor", "maxloc", or "minloc" (default: "sum"). -+ -+Arguments: -+ NUMBER Integer to use in the allreduce operation. -+ -+ NAME Array variable in which to receive the result and, in -+ the case of maxloc and minloc, the associated rank. -+ -+In an all-reduce operation, each process i presents a number, a[i]. -+Once all processes in the MPI job have presented their number, the -+command returns a[0]+a[1]+...+a[n-1] to all ranks. The -O option -+enables "+" to be replaced with other operations. -+ -+All-reduces can be useful for reaching global agreement (e.g., of a -+termination condition). -+ -+Exit Status: -+Returns 0 unless an invalid option is given or an error occurs. -+$END -+ -+/* Here is the mpi_allreduce builtin. */ -+int -+mpi_allreduce_builtin (list) -+ WORD_LIST *list; -+{ -+ return reduction_like (list, "mpi_allreduce", MPI_Allreduce); -+} -diff -Naur bash-4.3/config.h.in mpibash-4.3/config.h.in ---- bash-4.3/config.h.in 2013-06-29 15:35:33.000000000 -0600 -+++ mpibash-4.3/config.h.in 2014-05-13 11:27:37.314100671 -0600 -@@ -1147,6 +1147,12 @@ - /* Define if you have the `__argz_stringify' function. */ - #undef HAVE___ARGZ_STRINGIFY - -+/* Define if you have both the <libcircle.h> header file and the libcircle library. */ -+#undef HAVE_LIBCIRCLE -+ -+/* Define if you have the `CIRCLE_cb_reduce_op' function. */ -+#undef HAVE_CIRCLE_CB_REDUCE_OP -+ - /* End additions for lib/intl */ - - #include "config-bot.h" -diff -Naur bash-4.3/configure.ac mpibash-4.3/configure.ac ---- bash-4.3/configure.ac 2014-02-11 08:37:53.000000000 -0700 -+++ mpibash-4.3/configure.ac 2014-05-13 11:27:37.302100179 -0600 -@@ -24,7 +24,7 @@ - AC_REVISION([for Bash 4.3, version 4.063])dnl - - define(bashvers, 4.3) --define(relstatus, release) -+define(relstatus, MPI) - - AC_INIT([bash], bashvers-relstatus, [bug-b...@gnu.org]) - -@@ -813,6 +813,21 @@ - fi - ]) - -+dnl Ensure that we can find an MPI library. -+AC_CHECK_FUNCS([MPI_Init], [], [ -+ AC_MSG_ERROR([Cannot continue without MPI. Consider specifying CC=mpicc.])]) -+ -+dnl If we have Libcircle, use it, too. -+AC_SEARCH_LIBS([CIRCLE_cb_create], [circle], [AC_CHECK_HEADERS([libcircle.h])]) -+if test "x$ac_cv_header_libcircle_h" = xyes; then -+ libcircle_make_prefix="" -+ AC_DEFINE([HAVE_LIBCIRCLE], [1], [Define if you have the Libcircle header and library.]) -+ AC_CHECK_FUNCS([CIRCLE_cb_reduce_op]) -+else -+ libcircle_make_prefix="#" -+fi -+AC_SUBST([CIRCLE], [$libcircle_make_prefix]) -+ - BASH_CHECK_DECL(strtoimax) - BASH_CHECK_DECL(strtol) - BASH_CHECK_DECL(strtoll) -diff -Naur bash-4.3/Makefile.in mpibash-4.3/Makefile.in ---- bash-4.3/Makefile.in 2014-01-25 14:27:30.000000000 -0700 -+++ mpibash-4.3/Makefile.in 2014-05-13 11:27:37.314100671 -0600 -@@ -104,7 +104,7 @@ - VERSPROG = bashversion$(EXEEXT) - VERSOBJ = bashversion.$(OBJEXT) - --Program = bash$(EXEEXT) -+Program = mpibash$(EXEEXT) - Version = @BASHVERS@ - PatchLevel = `$(BUILD_DIR)/$(VERSPROG) -p` - RELSTATUS = @RELSTATUS@ -diff -Naur bash-4.3/shell.c mpibash-4.3/shell.c ---- bash-4.3/shell.c 2014-01-14 06:04:32.000000000 -0700 -+++ mpibash-4.3/shell.c 2014-05-13 11:27:37.314100671 -0600 -@@ -107,6 +107,13 @@ - extern char *primary_prompt, *secondary_prompt; - extern char *this_command_name; - -+extern void initialize_mpi __P((int, char **)); -+extern void finalize_mpi __P((void)); -+#ifdef HAVE_LIBCIRCLE -+extern void initialize_libcircle __P((int, char **)); -+extern void finalize_libcircle __P((void)); -+#endif -+ - /* Non-zero means that this shell has already been run; i.e. you should - call shell_reinitialize () if you need to start afresh. */ - int shell_initialized = 0; -@@ -324,7 +331,7 @@ - static void init_interactive_script __P((void)); - - static void set_shell_name __P((char *)); --static void shell_initialize __P((void)); -+static void shell_initialize __P((int, char **)); - static void shell_reinitialize __P((void)); - - static void show_shell_usage __P((FILE *, int)); -@@ -561,7 +568,7 @@ - - /* From here on in, the shell must be a normal functioning shell. - Variables from the environment are expected to be set, etc. */ -- shell_initialize (); -+ shell_initialize (argc, argv); - - set_default_lang (); - set_default_locale_vars (); -@@ -941,6 +948,12 @@ - end_job_control (); - #endif /* JOB_CONTROL */ - -+#ifdef HAVE_LIBCIRCLE -+ finalize_libcircle (); -+#else -+ finalize_mpi (); -+#endif -+ - /* Always return the exit status of the last command to our parent. */ - sh_exit (s); - } -@@ -1691,7 +1704,9 @@ - /* Do whatever is necessary to initialize the shell. - Put new initializations in here. */ - static void --shell_initialize () -+shell_initialize (argc, argv) -+ int argc; -+ char **argv; - { - char hostname[256]; - -@@ -1760,6 +1775,17 @@ - initialize_shell_options (privileged_mode||running_setuid); - initialize_bashopts (privileged_mode||running_setuid); - #endif -+ -+ /* Initialize Libcircle and MPI. */ -+#ifdef HAVE_LIBCIRCLE -+ initialize_libcircle (argc, argv); -+ initialize_mpi (argc, argv); -+ bind_variable ("libcircle", "yes", 0); -+#else -+ initialize_mpi (argc, argv); -+ bind_variable ("libcircle", "no", 0); -+#endif -+ bind_variable ("mpibash", "yes", 0); - } - - /* Function called by main () when it appears that the shell has already diff --git a/app-shells/mpibash/metadata.xml b/app-shells/mpibash/metadata.xml index 372a889..897aa2e 100644 --- a/app-shells/mpibash/metadata.xml +++ b/app-shells/mpibash/metadata.xml @@ -1,16 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> <pkgmetadata> - <herd>base-system</herd> - <use> - <flag name="bashlogger">Log ALL commands typed into bash; should ONLY be - used in restricted environments such as honeypots</flag> - <flag name="mem-scramble">Build with custom malloc/free overwriting allocated/freed memory</flag> - <flag name="net">Enable /dev/tcp/host/port redirection</flag> - <flag name="plugins">Add support for loading builtins at runtime via - 'enable'</flag> - </use> - <upstream> - <remote-id type="cpe">cpe:/a:gnu:bash</remote-id> - </upstream> + <herd>sci</herd> </pkgmetadata> diff --git a/app-shells/mpibash/mpibash-1.1.ebuild b/app-shells/mpibash/mpibash-1.1.ebuild new file mode 100644 index 0000000..538e32f --- /dev/null +++ b/app-shells/mpibash/mpibash-1.1.ebuild @@ -0,0 +1,28 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI=5 + +DESCRIPTION="Parallel scripting right from the Bourne-Again Shell (Bash)" +HOMEPAGE="http://www.ccs3.lanl.gov/~pakin/software/mpibash-4.3.html" +SRC_URI="https://github.com/losalamos/MPI-Bash/releases/download/v${PV}/${P}.tar.gz" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~amd64" +IUSE="examples" + +DEPEND="virtual/mpi + app-shells/bash[plugins] + sys-cluster/libcircle" +RDEPEND="${DEPEND}" + +src_configure() { + econf --with-bashdir="${EPREFIX}"/usr/include/bash-plugins +} + +src_install() { + default + use examples || rm -r "${ED}/usr/share/doc/${PF}/examples" || die +} diff --git a/app-shells/mpibash/mpibash-4.3_p30-r1.ebuild b/app-shells/mpibash/mpibash-4.3_p30-r1.ebuild deleted file mode 100644 index 0328448..0000000 --- a/app-shells/mpibash/mpibash-4.3_p30-r1.ebuild +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright 1999-2014 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/app-shells/bash/bash-4.3_p30-r1.ebuild,v 1.1 2014/11/09 20:41:28 mgorny Exp $ - -EAPI=5 - -inherit autotools eutils flag-o-matic toolchain-funcs multilib - -# Official patchlevel -# See ftp://ftp.cwru.edu/pub/bash/bash-4.3-patches/ -PLEVEL=${PV##*_p} -MY_PV=${PV/_p*} -MY_PV=${MY_PV/_/-} -MY_P=${PN#mpi}-${MY_PV} -[[ ${PV} != *_p* ]] && PLEVEL=0 -patches() { - local opt=$1 plevel=${2:-${PLEVEL}} pn=${3:-${PN#mpi}} pv=${4:-${MY_PV}} - [[ ${plevel} -eq 0 ]] && return 1 - eval set -- {1..${plevel}} - set -- $(printf "${pn}${pv/\.}-%03d " "$@") - if [[ ${opt} == -s ]] ; then - echo "${@/#/${DISTDIR}/}" - else - local u - for u in ftp://ftp.cwru.edu/pub/bash mirror://gnu/${pn} ; do - printf "${u}/${pn}-${pv}-patches/%s " "$@" - done - fi -} - -# The version of readline this bash normally ships with. -READLINE_VER="6.3" - -DESCRIPTION="Parallel scripting right from the Bourne-Again Shell (Bash)" -HOMEPAGE="http://www.ccs3.lanl.gov/~pakin/software/mpibash-4.3.html" -SRC_URI="mirror://gnu/bash/${MY_P}.tar.gz $(patches)" -[[ ${PV} == *_rc* ]] && SRC_URI+=" ftp://ftp.cwru.edu/pub/bash/${MY_P}.tar.gz" - -LICENSE="GPL-3" -SLOT="0" -KEYWORDS="~amd64 ~amd64-linux" -IUSE="afs bashlogger examples mem-scramble +net nls plugins +readline vanilla" - -DEPEND=">=sys-libs/ncurses-5.2-r2 - readline? ( >=sys-libs/readline-${READLINE_VER} ) - nls? ( virtual/libintl )" -RDEPEND="${DEPEND} - virtual/mpi - sys-cluster/libcircle - !<sys-apps/portage-2.1.6.7_p1 - !<sys-apps/paludis-0.26.0_alpha5" -# we only need yacc when the .y files get patched (bash42-005) -DEPEND+=" virtual/yacc" - -S=${WORKDIR}/${MY_P} - -pkg_setup() { - if is-flag -malign-double ; then #7332 - eerror "Detected bad CFLAGS '-malign-double'. Do not use this" - eerror "as it breaks LFS (struct stat64) on x86." - die "remove -malign-double from your CFLAGS mr ricer" - fi - if use bashlogger ; then - ewarn "The logging patch should ONLY be used in restricted (i.e. honeypot) envs." - ewarn "This will log ALL output you enter into the shell, you have been warned." - fi -} - -src_unpack() { - unpack ${MY_P}.tar.gz -} - -src_prepare() { - # Include official patches - [[ ${PLEVEL} -gt 0 ]] && epatch $(patches -s) - - # Clean out local libs so we know we use system ones w/releases. - if [[ ${PV} != *_rc* ]] ; then - rm -rf lib/{readline,termcap}/* - touch lib/{readline,termcap}/Makefile.in # for config.status - sed -ri -e 's:\$[(](RL|HIST)_LIBSRC[)]/[[:alpha:]]*.h::g' Makefile.in || die - fi - - # Avoid regenerating docs after patches #407985 - sed -i -r '/^(HS|RL)USER/s:=.*:=:' doc/Makefile.in || die - touch -r . doc/* - - epatch "${FILESDIR}"/${PN#mpi}-4.3-compat-lvl.patch - epatch "${FILESDIR}"/${PN#mpi}-4.3-parse-time-keyword.patch - epatch "${FILESDIR}"/${PN#mpi}-4.3-append-process-segfault.patch - epatch "${FILESDIR}"/${PN#mpi}-4.3-term-cleanup.patch - epatch "${FILESDIR}"/${PN}-4.3.patch - - epatch_user - - eautoconf -} - -src_configure() { - local myconf=() - - # For descriptions of these, see config-top.h - # bashrc/#26952 bash_logout/#90488 ssh/#24762 - if use prefix ; then - append-cppflags \ - -DDEFAULT_PATH_VALUE=\'\"${EPREFIX}/usr/sbin:${EPREFIX}/usr/bin:${EPREFIX}/sbin:${EPREFIX}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\' \ - -DSTANDARD_UTILS_PATH=\'\"${EPREFIX}/bin:${EPREFIX}/usr/bin:${EPREFIX}/sbin:${EPREFIX}/usr/sbin:/bin:/usr/bin:/sbin:/usr/sbin\"\' \ - -DSYS_BASHRC=\'\"${EPREFIX}/etc/bash/bashrc\"\' \ - -DSYS_BASH_LOGOUT=\'\"${EPREFIX}/etc/bash/bash_logout\"\' \ - -DNON_INTERACTIVE_LOGIN_SHELLS \ - -DSSH_SOURCE_BASHRC \ - $($(tc-getPKG_CONFIG) --cflags libcircle) \ - $(use bashlogger && echo -DSYSLOG_HISTORY) - else - append-cppflags \ - -DDEFAULT_PATH_VALUE=\'\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\' \ - -DSTANDARD_UTILS_PATH=\'\"/bin:/usr/bin:/sbin:/usr/sbin\"\' \ - -DSYS_BASHRC=\'\"/etc/bash/bashrc\"\' \ - -DSYS_BASH_LOGOUT=\'\"/etc/bash/bash_logout\"\' \ - -DNON_INTERACTIVE_LOGIN_SHELLS \ - -DSSH_SOURCE_BASHRC \ - $($(tc-getPKG_CONFIG) --cflags libcircle) \ - $(use bashlogger && echo -DSYSLOG_HISTORY) - fi - - # Don't even think about building this statically without - # reading Bug 7714 first. If you still build it statically, - # don't come crying to us with bugs ;). - #use static && export LDFLAGS="${LDFLAGS} -static" - use nls || myconf+=( --disable-nls ) - - # Historically, we always used the builtin readline, but since - # our handling of SONAME upgrades has gotten much more stable - # in the PM (and the readline ebuild itself preserves the old - # libs during upgrades), linking against the system copy should - # be safe. - # Exact cached version here doesn't really matter as long as it - # is at least what's in the DEPEND up above. - export ac_cv_rl_version=${READLINE_VER} - - # Force linking with system curses ... the bundled termcap lib - # sucks bad compared to ncurses. For the most part, ncurses - # is here because readline needs it. But bash itself calls - # ncurses in one or two small places :(. - - if [[ ${PV} != *_rc* ]] ; then - # Use system readline only with released versions. - myconf+=( --with-installed-readline=. ) - fi - - if use plugins; then - append-ldflags -Wl,-rpath,/usr/$(get_libdir)/bash - else - # Disable the plugins logic by hand since bash doesn't - # provide a way of doing it. - export ac_cv_func_dl{close,open,sym}=no \ - ac_cv_lib_dl_dlopen=no ac_cv_header_dlfcn_h=no - sed -i \ - -e '/LOCAL_LDFLAGS=/s:-rdynamic::' \ - configure || die - fi - tc-export AR #444070 - LIBS="-lcircle" CC=mpicc \ - econf \ - --docdir='$(datarootdir)'/doc/${PF} \ - --htmldir='$(docdir)/html' \ - --with-curses \ - $(use_with afs) \ - $(use_enable net net-redirections) \ - --disable-profiling \ - $(use_enable mem-scramble) \ - $(use_with mem-scramble bash-malloc) \ - $(use_enable readline) \ - $(use_enable readline history) \ - $(use_enable readline bang-history) \ - "${myconf[@]}" -} - -src_compile() { - emake - - if use plugins ; then - emake -C examples/loadables all others - fi -} - -src_install() { - emake install DESTDIR="${D}" - - find "${ED}" -name "bashbug*" -delete || die - rm -rf "${ED}"/usr/share/locale - mv "${ED}"/usr/share/man/man1/{,mpi}bash.1 || die - mv "${ED}"/usr/share/info/{,mpi}bash.info || die - return 0 - - local d f - - default - - dodir /bin - mv "${ED}"/usr/bin/bash "${ED}"/bin/ || die - dosym bash /bin/rbash - - insinto /etc/bash - doins "${FILESDIR}"/bash_logout - newins "${FILESDIR}"/bashrc-r1 bashrc - keepdir /etc/bash/bashrc.d - insinto /etc/skel - for f in bash{_logout,_profile,rc} ; do - newins "${FILESDIR}"/dot-${f} .${f} - done - - local sed_args=( - -e "s:#${USERLAND}#@::" - -e '/#@/d' - ) - if ! use readline ; then - sed_args+=( #432338 - -e '/^shopt -s histappend/s:^:#:' - -e 's:use_color=true:use_color=false:' - ) - fi - sed -i \ - "${sed_args[@]}" \ - "${ED}"/etc/skel/.bashrc \ - "${ED}"/etc/bash/bashrc || die - - if use plugins ; then - exeinto /usr/$(get_libdir)/bash - doexe $(echo examples/loadables/*.o | sed 's:\.o::g') - insinto /usr/include/bash-plugins - doins *.h builtins/*.h include/*.h lib/{glob/glob.h,tilde/tilde.h} - fi - - if use examples ; then - for d in examples/{functions,misc,scripts,startup-files} ; do - exeinto /usr/share/doc/${PF}/${d} - insinto /usr/share/doc/${PF}/${d} - for f in ${d}/* ; do - if [[ ${f##*/} != PERMISSION ]] && [[ ${f##*/} != *README ]] ; then - doexe ${f} - else - doins ${f} - fi - done - done - fi - - doman doc/*.1 - newdoc CWRU/changelog ChangeLog - dosym bash.info /usr/share/info/bashref.info -} - -pkg_preinst() { - return 0 - if [[ -e ${EROOT}/etc/bashrc ]] && [[ ! -d ${EROOT}/etc/bash ]] ; then - mkdir -p "${EROOT}"/etc/bash - mv -f "${EROOT}"/etc/bashrc "${EROOT}"/etc/bash/ - fi - - if [[ -L ${EROOT}/bin/sh ]] ; then - # rewrite the symlink to ensure that its mtime changes. having /bin/sh - # missing even temporarily causes a fatal error with paludis. - local target=$(readlink "${EROOT}"/bin/sh) - local tmp=$(emktemp "${EROOT}"/bin) - ln -sf "${target}" "${tmp}" - mv -f "${tmp}" "${EROOT}"/bin/sh - fi -} - -pkg_postinst() { - return 0 - # If /bin/sh does not exist, provide it - if [[ ! -e ${EROOT}/bin/sh ]] ; then - ln -sf bash "${EROOT}"/bin/sh - fi -}