/* * Copyright (c) 2006-2012 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2010 Sandia National Laboratories. All rights reserved. * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2016-2020 Intel, Inc. All rights reserved. * Copyright (c) 2021-2022 Nanook Consulting. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ * */ #include "src/include/pmix_config.h" #include "pmix_common.h" #include "src/mca/mca.h" #include "src/mca/pinstalldirs/base/base.h" #include "src/mca/pinstalldirs/base/static-components.h" #include "src/mca/pinstalldirs/pinstalldirs.h" pmix_pinstall_dirs_t pmix_pinstall_dirs = { .prefix = NULL, .exec_prefix = NULL, .bindir = NULL, .sbindir = NULL, .libexecdir = NULL, .datarootdir = NULL, .datadir = NULL, .sysconfdir = NULL, .sharedstatedir = NULL, .localstatedir = NULL, .libdir = NULL, .includedir = NULL, .infodir = NULL, .mandir = NULL, .pmixdatadir = NULL, .pmixlibdir = NULL, .pmixincludedir = NULL }; #define CONDITIONAL_COPY(target, origin, field) \ do { \ if (origin.field != NULL && target.field == NULL) { \ target.field = origin.field; \ } \ } while (0) static int pmix_pinstalldirs_base_open(pmix_mca_base_open_flag_t flags) { return pmix_mca_base_framework_components_open(&pmix_pinstalldirs_base_framework, flags); } int pmix_pinstall_dirs_base_init(pmix_info_t info[], size_t ninfo) { pmix_mca_base_component_list_item_t *component_item; PMIX_LIST_FOREACH (component_item, &pmix_pinstalldirs_base_framework.framework_components, pmix_mca_base_component_list_item_t) { const pmix_pinstalldirs_base_component_t *component = (const pmix_pinstalldirs_base_component_t *) component_item->cli_component; if (NULL != component->init) { component->init(info, ninfo); } /* copy over the data, if something isn't already there */ CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, prefix); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, exec_prefix); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, bindir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, sbindir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, libexecdir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, datarootdir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, datadir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, sysconfdir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, sharedstatedir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, localstatedir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, libdir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, includedir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, infodir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, mandir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, pmixdatadir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, pmixlibdir); CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data, pmixincludedir); } /* expand out all the fields */ pmix_pinstall_dirs.prefix = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.prefix); pmix_pinstall_dirs.exec_prefix = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.exec_prefix); pmix_pinstall_dirs.bindir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.bindir); pmix_pinstall_dirs.sbindir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sbindir); pmix_pinstall_dirs.libexecdir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libexecdir); pmix_pinstall_dirs.datarootdir = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.datarootdir); pmix_pinstall_dirs.datadir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.datadir); pmix_pinstall_dirs.sysconfdir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sysconfdir); pmix_pinstall_dirs.sharedstatedir = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.sharedstatedir); pmix_pinstall_dirs.localstatedir = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.localstatedir); pmix_pinstall_dirs.libdir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libdir); pmix_pinstall_dirs.includedir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.includedir); pmix_pinstall_dirs.infodir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.infodir); pmix_pinstall_dirs.mandir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.mandir); pmix_pinstall_dirs.pmixdatadir = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.pmixdatadir); pmix_pinstall_dirs.pmixlibdir = pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixlibdir); pmix_pinstall_dirs.pmixincludedir = pmix_pinstall_dirs_expand_setup( pmix_pinstall_dirs.pmixincludedir); #if 0 fprintf(stderr, "prefix: %s\n", pmix_pinstall_dirs.prefix); fprintf(stderr, "exec_prefix: %s\n", pmix_pinstall_dirs.exec_prefix); fprintf(stderr, "bindir: %s\n", pmix_pinstall_dirs.bindir); fprintf(stderr, "sbindir: %s\n", pmix_pinstall_dirs.sbindir); fprintf(stderr, "libexecdir: %s\n", pmix_pinstall_dirs.libexecdir); fprintf(stderr, "datarootdir: %s\n", pmix_pinstall_dirs.datarootdir); fprintf(stderr, "datadir: %s\n", pmix_pinstall_dirs.datadir); fprintf(stderr, "sysconfdir: %s\n", pmix_pinstall_dirs.sysconfdir); fprintf(stderr, "sharedstatedir: %s\n", pmix_pinstall_dirs.sharedstatedir); fprintf(stderr, "localstatedir: %s\n", pmix_pinstall_dirs.localstatedir); fprintf(stderr, "libdir: %s\n", pmix_pinstall_dirs.libdir); fprintf(stderr, "includedir: %s\n", pmix_pinstall_dirs.includedir); fprintf(stderr, "infodir: %s\n", pmix_pinstall_dirs.infodir); fprintf(stderr, "mandir: %s\n", pmix_pinstall_dirs.mandir); fprintf(stderr, "pkgdatadir: %s\n", pmix_pinstall_dirs.pkgdatadir); fprintf(stderr, "pkglibdir: %s\n", pmix_pinstall_dirs.pkglibdir); fprintf(stderr, "pkgincludedir: %s\n", pmix_pinstall_dirs.pkgincludedir); #endif /* NTH: Is it ok not to close the components? If not we can add a flag to mca_base_framework_components_close to indicate not to deregister variable groups */ return PMIX_SUCCESS; } static int pmix_pinstalldirs_base_close(void) { free(pmix_pinstall_dirs.prefix); free(pmix_pinstall_dirs.exec_prefix); free(pmix_pinstall_dirs.bindir); free(pmix_pinstall_dirs.sbindir); free(pmix_pinstall_dirs.libexecdir); free(pmix_pinstall_dirs.datarootdir); free(pmix_pinstall_dirs.datadir); free(pmix_pinstall_dirs.sysconfdir); free(pmix_pinstall_dirs.sharedstatedir); free(pmix_pinstall_dirs.localstatedir); free(pmix_pinstall_dirs.libdir); free(pmix_pinstall_dirs.includedir); free(pmix_pinstall_dirs.infodir); free(pmix_pinstall_dirs.mandir); free(pmix_pinstall_dirs.pmixdatadir); free(pmix_pinstall_dirs.pmixlibdir); free(pmix_pinstall_dirs.pmixincludedir); memset(&pmix_pinstall_dirs, 0, sizeof(pmix_pinstall_dirs)); return pmix_mca_base_framework_components_close(&pmix_pinstalldirs_base_framework, NULL); } /* Declare the pinstalldirs framework */ PMIX_MCA_BASE_FRAMEWORK_DECLARE(pmix, pinstalldirs, NULL, NULL, pmix_pinstalldirs_base_open, pmix_pinstalldirs_base_close, pmix_mca_pinstalldirs_base_static_components, PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER | PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO);