diff options
author | Thomas White <taw@physics.org> | 2020-08-31 14:37:09 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-08-31 14:37:09 +0200 |
commit | a833b044790f9a81d62863b22a552374ab702834 (patch) | |
tree | becf0adb638bcf68ebdcf47e29aad9292ed2c270 | |
parent | 9d6118d03fbda80d16c3408d275514f463e0ca53 (diff) |
SLURM: Give full path to indexamajig, and set up path
-rw-r--r-- | src/gui_backend_slurm.c | 35 | ||||
-rw-r--r-- | src/gui_index.c | 74 | ||||
-rw-r--r-- | src/gui_index.h | 2 |
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 |