aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2020-08-31 14:37:09 +0200
committerThomas White <taw@physics.org>2020-08-31 14:37:09 +0200
commita833b044790f9a81d62863b22a552374ab702834 (patch)
treebecf0adb638bcf68ebdcf47e29aad9292ed2c270
parent9d6118d03fbda80d16c3408d275514f463e0ca53 (diff)
SLURM: Give full path to indexamajig, and set up path
-rw-r--r--src/gui_backend_slurm.c35
-rw-r--r--src/gui_index.c74
-rw-r--r--src/gui_index.h2
3 files changed, 107 insertions, 4 deletions
diff --git a/src/gui_backend_slurm.c b/src/gui_backend_slurm.c
index c5cc130c..4db8d7d6 100644
--- a/src/gui_backend_slurm.c
+++ b/src/gui_backend_slurm.c
@@ -73,14 +73,42 @@ static void cancel_task(void *job_priv)
}
-static char **create_env(uint32_t *psize)
+static char **create_env(uint32_t *psize, char *path_add)
{
char **env;
+ const char *base_path = "PATH=/bin:/usr/bin";
+ char *crystfel_path;
+ size_t path_len;
env = malloc(10*sizeof(char *));
if ( env == NULL ) return NULL;
- env[0] = strdup("PATH=/path/to/indexamajig");
+ crystfel_path = get_crystfel_path_str();
+
+ path_len = 4 + strlen(base_path);
+
+ if ( path_add != NULL ) {
+ path_len += strlen(path_add);
+ }
+
+ if ( crystfel_path != NULL ) {
+ path_len += strlen(crystfel_path);
+ }
+
+ env[0] = malloc(path_len);
+ if ( env[0] == NULL ) return NULL;
+
+ strcpy(env[0], base_path);
+ if ( crystfel_path != NULL ) {
+ strcat(env[0], ":");
+ strcat(env[0], crystfel_path);
+ g_free(crystfel_path);
+ }
+ if ( path_add != NULL ) {
+ strcat(env[0], ":");
+ strcat(env[0], path_add);
+ }
+
*psize = 1;
return env;
@@ -173,7 +201,8 @@ static void *run_indexing(const char *job_title,
job_desc_msg.std_out = strdup("job.out");
job_desc_msg.work_dir = g_file_get_path(workdir_file);
job_desc_msg.script = script;
- job_desc_msg.environment = create_env(&job_desc_msg.env_size);
+ job_desc_msg.environment = create_env(&job_desc_msg.env_size,
+ opts->path_add);
g_object_unref(workdir_file);
diff --git a/src/gui_index.c b/src/gui_index.c
index f989b538..a5655a8c 100644
--- a/src/gui_index.c
+++ b/src/gui_index.c
@@ -554,6 +554,69 @@ static void add_arg_int(char **args, int pos, const char *label,
}
+GFile *get_crystfel_path_gfile()
+{
+ GFile *self;
+ GFileInfo *self_info;
+ const char *self_target;
+ GFile *tar;
+ GFile *parent_dir;
+ GError *error = NULL;
+
+ self = g_file_new_for_path("/proc/self/exe");
+ self_info = g_file_query_info(self, "standard",
+ G_FILE_QUERY_INFO_NONE,
+ NULL, &error);
+ if ( self_info == NULL ) return NULL;
+
+ self_target = g_file_info_get_symlink_target(self_info);
+ if ( self_target == NULL ) return NULL;
+
+ tar = g_file_new_for_path(self_target);
+ if ( tar == NULL ) return NULL;
+
+ parent_dir = g_file_get_parent(tar);
+ if ( parent_dir == NULL ) return NULL;
+
+ g_object_unref(self);
+ g_object_unref(self_info);
+ g_object_unref(tar);
+
+ return parent_dir;
+}
+
+
+char *get_crystfel_path_str()
+{
+ char *path;
+ GFile *crystfel_path = get_crystfel_path_gfile();
+ if ( crystfel_path == NULL ) return NULL;
+ path = g_file_get_path(crystfel_path);
+ g_object_unref(crystfel_path);
+ return path;
+}
+
+
+static char *get_indexamajig_exe()
+{
+ GFile *crystfel_path;
+ char *indexamajig_path;
+ GFile *indexamajig;
+
+ crystfel_path = get_crystfel_path_gfile();
+ if ( crystfel_path == NULL ) return NULL;
+
+ indexamajig = g_file_get_child(crystfel_path, "indexamajig");
+ if ( indexamajig == NULL ) return NULL;
+
+ indexamajig_path = g_file_get_path(indexamajig);
+ g_object_unref(indexamajig);
+ g_object_unref(crystfel_path);
+
+ return indexamajig_path;
+}
+
+
char **indexamajig_command_line(const char *geom_filename,
const char *n_thread_str,
struct peak_params *peak_search_params,
@@ -561,13 +624,22 @@ char **indexamajig_command_line(const char *geom_filename,
{
char **args;
char tols[2048];
+ char *indexamajig_path;
int n_args = 0;
args = malloc(64*sizeof(char *));
if ( args == NULL ) return NULL;
+ indexamajig_path = get_indexamajig_exe();
+ if ( indexamajig_path == NULL ) {
+ ERROR("Couldn't determine indexamajig path. "
+ "This is OK provided the executable path is set "
+ "correctly.\n");
+ indexamajig_path = strdup("indexamajig");
+ }
+
/* The basics */
- add_arg(args, n_args++, "indexamajig");
+ add_arg(args, n_args++, indexamajig_path);
add_arg(args, n_args++, "-i");
add_arg(args, n_args++, "files.lst");
add_arg(args, n_args++, "-g");
diff --git a/src/gui_index.h b/src/gui_index.h
index 89b6a7e3..f0454271 100644
--- a/src/gui_index.h
+++ b/src/gui_index.h
@@ -46,4 +46,6 @@ extern char **indexamajig_command_line(const char *geom_filename,
struct peak_params *peak_search_params,
struct index_params *indexing_params);
+extern char *get_crystfel_path_str(void);
+
#endif