1 /*
2 * Copyright (c) 2006-2012 Los Alamos National Security, LLC. All rights
3 * reserved.
4 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
5 * Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
6 * Copyright (c) 2015 Research Organization for Information Science
7 * and Technology (RIST). All rights reserved.
8 * Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
9 * $COPYRIGHT$
10 *
11 * Additional copyrights may follow
12 *
13 * $HEADER$
14 *
15 */
16
17 #include "src/include/pmix_config.h"
18
19 #include "include/pmix_common.h"
20 #include "src/mca/mca.h"
21 #include "src/mca/pinstalldirs/pinstalldirs.h"
22 #include "src/mca/pinstalldirs/base/base.h"
23 #include "src/mca/pinstalldirs/base/static-components.h"
24
25 pmix_pinstall_dirs_t pmix_pinstall_dirs = {0};
26
27 #define CONDITIONAL_COPY(target, origin, field) \
28 do { \
29 if (origin.field != NULL && target.field == NULL) { \
30 target.field = origin.field; \
31 } \
32 } while (0)
33
34 static int
pmix_pinstalldirs_base_open(pmix_mca_base_open_flag_t flags)35 pmix_pinstalldirs_base_open(pmix_mca_base_open_flag_t flags)
36 {
37 return pmix_mca_base_framework_components_open(&pmix_pinstalldirs_base_framework, flags);
38 }
39
pmix_pinstall_dirs_base_init(pmix_info_t info[],size_t ninfo)40 int pmix_pinstall_dirs_base_init(pmix_info_t info[], size_t ninfo)
41 {
42 pmix_mca_base_component_list_item_t *component_item;
43
44 PMIX_LIST_FOREACH(component_item, &pmix_pinstalldirs_base_framework.framework_components, pmix_mca_base_component_list_item_t) {
45 const pmix_pinstalldirs_base_component_t *component =
46 (const pmix_pinstalldirs_base_component_t *) component_item->cli_component;
47
48 if (NULL != component->init) {
49 component->init(info, ninfo);
50 }
51
52 /* copy over the data, if something isn't already there */
53 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
54 prefix);
55 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
56 exec_prefix);
57 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
58 bindir);
59 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
60 sbindir);
61 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
62 libexecdir);
63 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
64 datarootdir);
65 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
66 datadir);
67 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
68 sysconfdir);
69 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
70 sharedstatedir);
71 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
72 localstatedir);
73 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
74 libdir);
75 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
76 includedir);
77 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
78 infodir);
79 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
80 mandir);
81 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
82 pmixdatadir);
83 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
84 pmixlibdir);
85 CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
86 pmixincludedir);
87 }
88
89 /* expand out all the fields */
90 pmix_pinstall_dirs.prefix =
91 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.prefix);
92 pmix_pinstall_dirs.exec_prefix =
93 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.exec_prefix);
94 pmix_pinstall_dirs.bindir =
95 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.bindir);
96 pmix_pinstall_dirs.sbindir =
97 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sbindir);
98 pmix_pinstall_dirs.libexecdir =
99 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libexecdir);
100 pmix_pinstall_dirs.datarootdir =
101 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.datarootdir);
102 pmix_pinstall_dirs.datadir =
103 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.datadir);
104 pmix_pinstall_dirs.sysconfdir =
105 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sysconfdir);
106 pmix_pinstall_dirs.sharedstatedir =
107 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sharedstatedir);
108 pmix_pinstall_dirs.localstatedir =
109 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.localstatedir);
110 pmix_pinstall_dirs.libdir =
111 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libdir);
112 pmix_pinstall_dirs.includedir =
113 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.includedir);
114 pmix_pinstall_dirs.infodir =
115 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.infodir);
116 pmix_pinstall_dirs.mandir =
117 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.mandir);
118 pmix_pinstall_dirs.pmixdatadir =
119 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixdatadir);
120 pmix_pinstall_dirs.pmixlibdir =
121 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixlibdir);
122 pmix_pinstall_dirs.pmixincludedir =
123 pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixincludedir);
124
125 #if 0
126 fprintf(stderr, "prefix: %s\n", pmix_pinstall_dirs.prefix);
127 fprintf(stderr, "exec_prefix: %s\n", pmix_pinstall_dirs.exec_prefix);
128 fprintf(stderr, "bindir: %s\n", pmix_pinstall_dirs.bindir);
129 fprintf(stderr, "sbindir: %s\n", pmix_pinstall_dirs.sbindir);
130 fprintf(stderr, "libexecdir: %s\n", pmix_pinstall_dirs.libexecdir);
131 fprintf(stderr, "datarootdir: %s\n", pmix_pinstall_dirs.datarootdir);
132 fprintf(stderr, "datadir: %s\n", pmix_pinstall_dirs.datadir);
133 fprintf(stderr, "sysconfdir: %s\n", pmix_pinstall_dirs.sysconfdir);
134 fprintf(stderr, "sharedstatedir: %s\n", pmix_pinstall_dirs.sharedstatedir);
135 fprintf(stderr, "localstatedir: %s\n", pmix_pinstall_dirs.localstatedir);
136 fprintf(stderr, "libdir: %s\n", pmix_pinstall_dirs.libdir);
137 fprintf(stderr, "includedir: %s\n", pmix_pinstall_dirs.includedir);
138 fprintf(stderr, "infodir: %s\n", pmix_pinstall_dirs.infodir);
139 fprintf(stderr, "mandir: %s\n", pmix_pinstall_dirs.mandir);
140 fprintf(stderr, "pkgdatadir: %s\n", pmix_pinstall_dirs.pkgdatadir);
141 fprintf(stderr, "pkglibdir: %s\n", pmix_pinstall_dirs.pkglibdir);
142 fprintf(stderr, "pkgincludedir: %s\n", pmix_pinstall_dirs.pkgincludedir);
143 #endif
144
145 /* NTH: Is it ok not to close the components? If not we can add a flag
146 to mca_base_framework_components_close to indicate not to deregister
147 variable groups */
148 return PMIX_SUCCESS;
149 }
150
151
152 static int
pmix_pinstalldirs_base_close(void)153 pmix_pinstalldirs_base_close(void)
154 {
155 free(pmix_pinstall_dirs.prefix);
156 free(pmix_pinstall_dirs.exec_prefix);
157 free(pmix_pinstall_dirs.bindir);
158 free(pmix_pinstall_dirs.sbindir);
159 free(pmix_pinstall_dirs.libexecdir);
160 free(pmix_pinstall_dirs.datarootdir);
161 free(pmix_pinstall_dirs.datadir);
162 free(pmix_pinstall_dirs.sysconfdir);
163 free(pmix_pinstall_dirs.sharedstatedir);
164 free(pmix_pinstall_dirs.localstatedir);
165 free(pmix_pinstall_dirs.libdir);
166 free(pmix_pinstall_dirs.includedir);
167 free(pmix_pinstall_dirs.infodir);
168 free(pmix_pinstall_dirs.mandir);
169 free(pmix_pinstall_dirs.pmixdatadir);
170 free(pmix_pinstall_dirs.pmixlibdir);
171 free(pmix_pinstall_dirs.pmixincludedir);
172 memset (&pmix_pinstall_dirs, 0, sizeof (pmix_pinstall_dirs));
173
174 return pmix_mca_base_framework_components_close (&pmix_pinstalldirs_base_framework, NULL);
175 }
176
177 /* Declare the pinstalldirs framework */
178 PMIX_MCA_BASE_FRAMEWORK_DECLARE(pmix, pinstalldirs, NULL, NULL, pmix_pinstalldirs_base_open,
179 pmix_pinstalldirs_base_close, mca_pinstalldirs_base_static_components,
180 PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER | PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO);
181