diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2023-11-03 13:31:41 -0400 | 
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2023-11-03 13:31:41 -0400 | 
| commit | dab62227b5338d528af7c8b3202f3b0a6861acae (patch) | |
| tree | 87d2337fc1bc9c76ee1dc324b604062dd0f09772 /include | |
| parent | b24c2e2db23472256d91ee558cad6ae7c7dab7cd (diff) | |
| download | stasis-dab62227b5338d528af7c8b3202f3b0a6861acae.tar.gz | |
Add comments
Diffstat (limited to 'include')
| -rw-r--r-- | include/deliverable.h | 280 | ||||
| -rw-r--r-- | include/ini.h | 185 | 
2 files changed, 367 insertions, 98 deletions
| diff --git a/include/deliverable.h b/include/deliverable.h index 613d0e8..918453a 100644 --- a/include/deliverable.h +++ b/include/deliverable.h @@ -1,6 +1,4 @@ -// -// Created by jhunk on 10/5/23. -// +/// @file deliverable.h  #ifndef OHMYCAL_DELIVERABLE_H  #define OHMYCAL_DELIVERABLE_H @@ -22,116 +20,260 @@  #define DELIVERY_PLATFORM_CONDA_INSTALLER 2  #define DELIVERY_PLATFORM_RELEASE 3 -#define INSTALL_PKG_CONDA 1 << 1 -#define INSTALL_PKG_CONDA_DEFERRED 1 << 2 -#define INSTALL_PKG_PIP 1 << 3 -#define INSTALL_PKG_PIP_DEFERRED 1 << 4 +#define INSTALL_PKG_CONDA 1 << 1            ///< Toggle conda package installation +#define INSTALL_PKG_CONDA_DEFERRED 1 << 2   ///< Toggle deferred conda package installation +#define INSTALL_PKG_PIP 1 << 3              ///< Toggle pip package installation +#define INSTALL_PKG_PIP_DEFERRED 1 << 4     ///< Toggle deferred package installation from source -#define DEFER_CONDA 0 -#define DEFER_PIP 1 +#define DEFER_CONDA 0                       ///< Build conda packages +#define DEFER_PIP 1                         ///< Build python packages +/*! \struct Delivery + *  \brief A structure describing a full delivery object + */  struct Delivery { +    /*! \struct System +     * \brief System information +    */      struct System {          char *arch; +        ///< System CPU architecture ident          char platform[DELIVERY_PLATFORM_MAX][DELIVERY_PLATFORM_MAXLEN]; +        ///< System platform name      } system; +    /*! \struct Storage +     * \brief Storage paths +     */      struct Storage { -        char *delivery_dir; -        char *conda_install_prefix; -        char *conda_artifact_dir; -        char *conda_staging_dir; -        char *conda_staging_url; -        char *wheel_artifact_dir; -        char *wheel_staging_dir; -        char *wheel_staging_url; -        char *build_dir; -        char *build_recipes_dir; -        char *build_sources_dir; -        char *build_testing_dir; +        char *delivery_dir;             ///< Delivery artifact output directory +        char *conda_install_prefix;     ///< Path to install Conda +        char *conda_artifact_dir;       ///< Base path to store compiled conda packages +        char *conda_staging_dir;        ///< Base path to copy compiled conda packages +        char *conda_staging_url;        ///< URL to access compiled conda packages +        char *wheel_artifact_dir;       ///< Base path to store compiled wheel packages (Unused) +        char *wheel_staging_dir;        ///< Base path to copy compiled wheel packages (Unused) +        char *wheel_staging_url;        ///< URL to access compiled wheel packages (Unused) +        char *build_dir;                ///< Base path to store source code and recipes +        char *build_recipes_dir;        ///< Path to store conda recipes +        char *build_sources_dir;        ///< Path to store source code +        char *build_testing_dir;        ///< Path to store test data (Unused)      } storage; + +    /*! \struct Meta +     * \brief Metadata related to the delivery +     */      struct Meta { -        // delivery name -        char *name; -        // delivery version -        char *version; -        // build iteration -        int rc; -        // version of python to use -        char *python; -        // shortened python identifier -        char *python_compact; -        // URL to previous final configuration -        char *based_on; -        // hst, jwst, roman -        char *mission; -        // HST uses codenames -        char *codename; -        // is this a final release? -        bool final; -        // keep going, or don't -        bool continue_on_error; +        char *name;                ///< delivery name +        char *version;             ///< delivery version +        int rc;                    ///< build iteration +        char *python;              ///< version of python to use +        char *python_compact;      ///< shortened python identifier +        char *based_on;            ///< URL to previous final configuration +        char *mission;             ///< hst, jwst, roman +        char *codename;            ///< HST uses codenames +        bool final;                ///< is this a final release? +        bool continue_on_error;    ///< keep going, or don't      } meta; +    /*! \struct Info +     * \brief Release information (name & datetime) +     */      struct Info { -        // The fully combined release string -        char *release_name; +        char *release_name;        ///< The fully combined release string          struct tm *time_info; -        time_t time_now; +        time_t time_now;           ///< Time stamp for when OMC execution started      } info; +    /*! \struct Conda +     * \brief Conda configuration +     * +     * This includes lists describing packages to be delivered +     */      struct Conda { -        char *installer_baseurl; -        char *installer_name; -        char *installer_version; -        char *installer_platform; -        char *installer_arch; -        char *tool_version; -        char *tool_build_version; -        // packages to install -        struct StrList *conda_packages; -        // conda recipes to be built -        struct StrList *conda_packages_defer; -        // packages to install -        struct StrList *pip_packages; -        // packages to be built -        struct StrList *pip_packages_defer; +        char *installer_baseurl;                ///< URL describing where Conda will be downloaded from +        char *installer_name;                   ///< Name of installer (Miniconda3, Miniforge3, etc) +        char *installer_version;                ///< Version of installer +        char *installer_platform;               ///< Platform/OS target of installer +        char *installer_arch;                   ///< CPU architecture target of installer +        char *tool_version;                     ///< Installed version of conda +        char *tool_build_version;               ///< Installed version of "build" package +        struct StrList *conda_packages;         ///< Conda packages to deliver +        struct StrList *conda_packages_defer;   ///< Conda recipes to be built for delivery +        struct StrList *pip_packages;           ///< Python packages to install (pip) +        struct StrList *pip_packages_defer;     ///< Python packages to be built for delivery      } conda; -    // global runtime variables +    /*! \struct Runtime +     *  \brief Global runtime variables +     */      struct Runtime { -        RuntimeEnv *environ; +        RuntimeEnv *environ;        ///< Environment variables      } runtime; +    /*! \struct Test +     * \brief Test information +     */      struct Test { -        char *name; -        char *version; -        char *repository; -        char *script; -        char *build_recipe; -        // test-specific runtime variables -        struct Runtime runtime; -    } tests[1000]; +        char *name;                 ///< Name of package +        char *version;              ///< Version of package +        char *repository;           ///< Git repository of package +        char *script;               ///< Commands to execute +        char *build_recipe;         ///< Conda recipe to build (optional) +        struct Runtime runtime;     ///< Environment variables specific to the test context +    } tests[1000]; ///< An array of tests  }; +/** + * Initializes a Deliver structure + * @param ctx pointer to Delivery context + * @param ini pointer to INIFILE describing a delivery + * @param cfg pointer to INIFILE describing extra configuration data + * @return `0` on success + * @return Non-zero on error + */  int delivery_init(struct Delivery *ctx, struct INIFILE *ini, struct INIFILE *cfg); + +/** + * Free memory allocated by delivery_init() + * @param ctx pointer to Delivery context + */  void delivery_free(struct Delivery *ctx); + +/** + * Print Delivery metadata + * @param ctx pointer to Delivery context + */  void delivery_meta_show(struct Delivery *ctx); + +/** + * Print Delivery conda configuration + * @param ctx pointer to Delivery context + */  void delivery_conda_show(struct Delivery *ctx); + +/** + * Print Delivery tests + * @param ctx pointer to Delivery context + */  void delivery_tests_show(struct Delivery *ctx); + +/** + * Build Conda recipes associated with the Delivery + * @param ctx pointer to Delivery context + * @return 0 on success + * @return Non-zero on error + */  int delivery_build_recipes(struct Delivery *ctx); + +/** + * Produce a list of wheels built for the Delivery (Unused) + * @param ctx pointer to Delivery context + * @return pointer to StrList + * @return NULL on error + */  struct StrList *delivery_build_wheels(struct Delivery *ctx); + +/** + * Copy wheel packages to artifact storage + * @param ctx pointer to Delivery context + * @return 0 on success + * @return Non-zero on error + */  int delivery_index_wheel_artifacts(struct Delivery *ctx); + +/** + * Generate a header block that is applied to delivery artifacts + * @param ctx pointer to Delivery context + * @return header on success + * @return NULL on error + */  char *delivery_get_spec_header(struct Delivery *ctx); + +/** + * Finalizes a delivery artifact for distribution + * @param ctx poitner to Delivery context + * @param filename path to delivery artifact (Conda YAML file) + */  void delivery_rewrite_spec(struct Delivery *ctx, char *filename); + +/** + * Copy compiled wheels to artifact storage + * @param ctx pointer to Delivery context + * @return 0 on success + * @return Non-zero on error + */  int delivery_copy_wheel_artifacts(struct Delivery *ctx); + +/** + * Copy built Conda packages to artifact storage + * @param ctx poitner to Delivery context + * @return 0 on success + * @return Non-zero on error + */  int delivery_copy_conda_artifacts(struct Delivery *ctx); + +/** + * Retrieve Conda installer + * @param installer_url URL to installation script + */  void delivery_get_installer(char *installer_url); + +/** + * Generate URL based on Delivery context + * @param delivery pointer to Delivery context + * @param result pointer to char + * @return in result + */  void delivery_get_installer_url(struct Delivery *delivery, char *result); + +/** + * Install packages based on Delivery context + * @param ctx pointer to Delivery context + * @param conda_install_dir path to install Conda + * @param env_name name of Conda environment to create + * @param type INSTALL_PKG_CONDA + * @param type INSTALL_PKG_CONDA_DEFERRED + * @param type INSTALL_PKG_PIP + * @param type INSTALL_PKG_PIP_DEFERRED + * @param manifest pointer to array of StrList (package list(s)) + */  void delivery_install_packages(struct Delivery *ctx, char *conda_install_dir, char *env_name, int type, struct StrList *manifest[]); + +/** + * Update "conda index" on Conda artifact storage + * @param ctx pointer to Delivery context + * @return 0 on success + * @return Non-zero on error + */  int delivery_index_conda_artifacts(struct Delivery *ctx); + +/** + * Execute Delivery test array + * @param ctx pointer to Delivery context + */  void delivery_tests_run(struct Delivery *ctx); + +/** + * Determine which packages are to be installed directly from conda or pip, + * and which packages need to be built locally + * @param ctx pointer to Delivery context + * @param type DEFER_CONDA (filter conda packages) + * @param type DEFER_PIP (filter python packages) + */  void delivery_defer_packages(struct Delivery *ctx, int type); + +/** + * Configure and activate a Conda installation based on Delivery context + * @param ctx pointer to Delivery context + * @param conda_install_dir path to Conda installation + */  void delivery_conda_enable(struct Delivery *ctx, char *conda_install_dir); + +/** + * Install Conda + * @param install_script path to Conda installation script + * @param conda_install_dir path to install Conda + */  void delivery_install_conda(char *install_script, char *conda_install_dir);  #endif //OHMYCAL_DELIVERABLE_H diff --git a/include/ini.h b/include/ini.h index 06004e3..f16142c 100644 --- a/include/ini.h +++ b/include/ini.h @@ -1,54 +1,181 @@ +/// @file ini.h +  #ifndef OHMYCAL_INI_H  #define OHMYCAL_INI_H  #include <stddef.h>  #include <stdbool.h> -#define INIVAL_TYPE_INT 1 -#define INIVAL_TYPE_UINT 2 -#define INIVAL_TYPE_LONG 3 -#define INIVAL_TYPE_ULONG 4 -#define INIVAL_TYPE_LLONG 5 -#define INIVAL_TYPE_ULLONG 6 -#define INIVAL_TYPE_DOUBLE 7 -#define INIVAL_TYPE_FLOAT 8 -#define INIVAL_TYPE_STR 9 -#define INIVAL_TYPE_STR_ARRAY 10 -#define INIVAL_TYPE_BOOL 11 +#define INIVAL_TYPE_INT 1           ///< Integer +#define INIVAL_TYPE_UINT 2          ///< Unsigned integer +#define INIVAL_TYPE_LONG 3          ///< Long integer +#define INIVAL_TYPE_ULONG 4         ///< Unsigned long integer +#define INIVAL_TYPE_LLONG 5         ///< Long long integer +#define INIVAL_TYPE_ULLONG 6        ///< Unsigned long long integer +#define INIVAL_TYPE_DOUBLE 7        ///< Double precision float +#define INIVAL_TYPE_FLOAT 8         ///< Single precision float +#define INIVAL_TYPE_STR 9           ///< String +#define INIVAL_TYPE_STR_ARRAY 10    ///< String Array +#define INIVAL_TYPE_BOOL 11         ///< Boolean  #define INIVAL_TO_LIST 1 << 1 +/*! \union INIVal + * \brief Consolidation possible value types + */  union INIVal { -    int as_int; -    unsigned as_uint; -    long as_long; -    unsigned long as_ulong; -    long long as_llong; -    unsigned long long as_ullong; -    double as_double; -    float as_float; -    char *as_char_p; -    char **as_char_array_p; -    bool as_bool; +    int as_int;                      ///< Integer +    unsigned as_uint;                ///< Unsigned integer +    long as_long;                    ///< Long integer +    unsigned long as_ulong;          ///< Unsigned long integer +    long long as_llong;              ///< Long long integer +    unsigned long long as_ullong;    ///< Unsigned long long integer +    double as_double;                ///< Double precision float +    float as_float;                  ///< Single precision float +    char *as_char_p;                 ///< String +    char **as_char_array_p;          ///< String Array +    bool as_bool;                    ///< Boolean  }; +/*! \struct INIData + * \brief A structure to describe an INI data record + */  struct INIData { -    char *key; -    char *value; +    char *key;                       ///< INI variable name +    char *value;                     ///< INI variable value  }; + +/*! \struct INISection + * \brief A structure to describe an INI section + */  struct INISection { -    size_t data_count; -    char *key; -    struct INIData **data; +    size_t data_count;               ///< Total INIData records +    char *key;                       ///< INI section name +    struct INIData **data;           ///< Array of INIData records  }; + +/*! \struct INIFILE + * \brief A structure to describe an INI configuration file + */  struct INIFILE { -    size_t section_count; -    struct INISection **section; +    size_t section_count;            ///< Total INISection records +    struct INISection **section;     ///< Array of INISection records  }; +/** + * Open and parse and INI configuration file + * + * ~~~.c + * #include "ini.h" + * int main(int argc, char *argv[]) { + *     const char *filename = "example.ini" + *     struct INIFILE *ini; + *     ini = ini_open(filename); + *     if (!ini) { + *         perror(filename); + *         exit(1); + *     } + * } + * ~~~ + * + * @param filename path to INI file + * @return pointer to INIFILE + */  struct INIFILE *ini_open(const char *filename); + +/** + * Retrieve all data records in an INI section + * + * `example.ini` + * ~~~.ini + * [example] + * key_1 = a string + * key_2 = 100 + * ~~~ + * + * `example.c` + * ~~~.c + * #include "ini.h" + * int main(int argc, char *argv[]) { + *     const char *filename = "example.ini" + *     struct INIData *data; + *     struct INIFILE *ini; + *     ini = ini_open(filename); + *     if (!ini) { + *         perror(filename); + *         exit(1); + *     } + *     // Read all records in "example" section + *     for (size_t i = 0; ((data = ini_getall(&ini, "example") != NULL); i++) { + *         printf("key=%s, value=%s\n", data->key, data->value); + *     } + * } + * ~~~ + * + * @param ini pointer to INIFILE + * @param section_name to read + * @return pointer to INIData + */  struct INIData *ini_getall(struct INIFILE *ini, char *section_name); + +/** + * Retrieve a single record from a section key + * + * `example.ini` + * ~~~.ini + * [example] + * key_1 = a string + * key_2 = 100 + * ~~~ + * + * `example.c` + * ~~~.c + * #include "ini.h" + * int main(int argc, char *argv[]) { + *     const char *filename = "example.ini" + *     union INIVal *data; + *     struct INIFILE *ini; + *     ini = ini_open(filename); + *     if (!ini) { + *         perror(filename); + *         exit(1); + *     } + *     data = ini_getval(&ini, "example", "key_1", INIVAL_TYPE_STR); + *     puts(data.as_char_p); + *     data = ini_getval(&ini, "example", "key_2", INIVAL_TYPE_INT); + *     printf("%d\n", data.as_int); + * } + * ~~~ + * + * @param ini pointer to INIFILE + * @param section_name to read + * @param key to return + * @param type INIVAL_TYPE_INT + * @param type INIVAL_TYPE_UINT + * @param type INIVAL_TYPE_LONG + * @param type INIVAL_TYPE_ULONG + * @param type INIVAL_TYPE_LLONG + * @param type INIVAL_TYPE_ULLONG + * @param type INIVAL_TYPE_DOUBLE + * @param type INIVAL_TYPE_FLOAT + * @param type INIVAL_TYPE_STR + * @param type INIVAL_TYPE_STR_ARRAY + * @param type INIVAL_TYPE_BOOL + * @param result pointer to INIVal + * @return 0 on success + * @return Non-zero on error + */  int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, union INIVal *result); + +/** + * Print INIFILE sections and data + * @param ini pointer to INIFILE + */  void ini_show(struct INIFILE *ini); + +/** + * Free memory allocated by ini_open() + * @param ini + */  void ini_free(struct INIFILE **ini);  #endif //OHMYCAL_INI_H | 
