From ba40290eea4df35ad26b42234c3f1d991ca18452 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 7 Jul 2025 13:56:20 +0100 Subject: [PATCH] meta: add build system and stub tool source code --- CMakeLists.txt | 14 +++ cmake/FindBluelib.cmake | 181 ++++++++++++++++++++++++++++++++ ropam/CMakeLists.txt | 4 + ropam/commands.h | 40 +++++++ ropam/main.c | 32 ++++++ ropam/query.c | 22 ++++ ropam/remove.c | 42 ++++++++ ropam/sync.c | 72 +++++++++++++ ropam/vendor/add.c | 22 ++++ ropam/vendor/list.c | 22 ++++ ropam/vendor/remove.c | 22 ++++ ropam/vendor/vendor.c | 13 +++ ropkg/CMakeLists.txt | 4 + ropkg/build.c | 55 ++++++++++ ropkg/commands.h | 13 +++ ropkg/create.c | 226 ++++++++++++++++++++++++++++++++++++++++ ropkg/extract.c | 55 ++++++++++ ropkg/install.c | 59 +++++++++++ ropkg/main.c | 19 ++++ ropkg/query.c | 38 +++++++ rovem/CMakeLists.txt | 4 + rovem/add-package.c | 0 rovem/commands.h | 12 +++ rovem/create.c | 0 rovem/main.c | 19 ++++ rovem/query.c | 0 rovem/remove-package.c | 0 27 files changed, 990 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/FindBluelib.cmake create mode 100644 ropam/CMakeLists.txt create mode 100644 ropam/commands.h create mode 100644 ropam/main.c create mode 100644 ropam/query.c create mode 100644 ropam/remove.c create mode 100644 ropam/sync.c create mode 100644 ropam/vendor/add.c create mode 100644 ropam/vendor/list.c create mode 100644 ropam/vendor/remove.c create mode 100644 ropam/vendor/vendor.c create mode 100644 ropkg/CMakeLists.txt create mode 100644 ropkg/build.c create mode 100644 ropkg/commands.h create mode 100644 ropkg/create.c create mode 100644 ropkg/extract.c create mode 100644 ropkg/install.c create mode 100644 ropkg/main.c create mode 100644 ropkg/query.c create mode 100644 rovem/CMakeLists.txt create mode 100644 rovem/add-package.c create mode 100644 rovem/commands.h create mode 100644 rovem/create.c create mode 100644 rovem/main.c create mode 100644 rovem/query.c create mode 100644 rovem/remove-package.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0878b81 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.15) +project(ropkg C) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) + +find_package(Bluelib COMPONENTS Core Object Io Term Cmd REQUIRED) + +add_subdirectory(ropkg) +add_subdirectory(ropam) +add_subdirectory(rovem) diff --git a/cmake/FindBluelib.cmake b/cmake/FindBluelib.cmake new file mode 100644 index 0000000..7e7e3f5 --- /dev/null +++ b/cmake/FindBluelib.cmake @@ -0,0 +1,181 @@ +#[=======================================================================[.rst: +FindBluelib +------------ + +Find the Bluelib library and header directories + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :prop_tgt:`IMPORTED` target: + +``Bluelib::Bluelib`` +The Bluelib library, if found + +Result Variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables in your project: + +``Bluelib_FOUND`` +true if the Bluelib C headers and libraries were found +``Bluelib_INCLUDE_DIR`` +directories containing the Bluelib C headers. + +``Bluelib_LIBRARY`` +the C library to link against + +Hints +^^^^^ + +The user may set the environment variable ``Bluelib_PREFIX`` to the root +directory of a Bluelib library installation. +#]=======================================================================] + +set (Bluelib_SEARCH_PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr/local/share + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt + ${Bluelib_PREFIX} + $ENV{Bluelib_PREFIX}) + +if (Bluelib_STATIC) + set(_lib_suffix "-s") +endif () + +set(supported_components Core Object Term Cmd Io Serial) +set(components ${Bluelib_FIND_COMPONENTS}) +string(REPLACE ";" ", " supported_components_string_list "${supported_components}") + +if (NOT components) + set(components ${supported_components}) +endif () + +set(required_vars) + +foreach (component ${components}) + if (NOT "${component}" IN_LIST supported_components) + message(FATAL_ERROR "'${component}' is not a valid Bluelib module.\nSupported modules: ${supported_components_string_list}") + endif () + + string(TOLOWER ${component} header_name) + set(lib_name ${header_name}${_lib_suffix}) + + if (NOT Bluelib_${component}_INCLUDE_DIR) + find_path(Bluelib_${component}_INCLUDE_DIR + NAMES blue/${header_name}.h ${Bluelib_FIND_ARGS} + PATH_SUFFIXES include + PATHS ${Bluelib_SEARCH_PATHS}) + endif () + + if (NOT Bluelib_${component}_LIBRARY) + find_library(Bluelib_${component}_LIBRARY + NAMES blue-${lib_name} ${Bluelib_FIND_ARGS} + PATH_SUFFIXES lib + PATHS ${Bluelib_SEARCH_PATHS}) + else () + # on Windows, ensure paths are in canonical format (forward slahes): + file(TO_CMAKE_PATH "${Bluelib_${component}_LIBRARY}" Bluelib_${component}_LIBRARY) + endif() + + list(APPEND required_vars Bluelib_${component}_INCLUDE_DIR Bluelib_${component}_LIBRARY) +endforeach (component) + +unset(Bluelib_FIND_ARGS) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(Bluelib + REQUIRED_VARS ${required_vars}) + +if (Bluelib_FOUND) + set(created_targets) + foreach (component ${components}) + string(TOLOWER ${component} header_name) + set(lib_name ${header_name}${_lib_suffix}) + + if(NOT TARGET Bluelib::${component}) + add_library(Bluelib::${component} UNKNOWN IMPORTED) + set_target_properties(Bluelib::${component} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Bluelib_${component}_INCLUDE_DIR}") + target_compile_definitions(Bluelib::${component} INTERFACE _CRT_SECURE_NO_WARNINGS=1) + + if (Bluelib_STATIC) + target_compile_definitions(Bluelib::${component} INTERFACE BLUELIB_STATIC=1) + endif () + + set_target_properties(Bluelib::${component} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${Bluelib_${component}_LIBRARY}") + set(created_targets ${created_targets} ${component}) + endif () + endforeach (component) + + foreach (component ${created_targets}) + if ("${component}" STREQUAL "Object") + if (NOT TARGET Bluelib::Core) + message(FATAL_ERROR "Bluelib: Module 'Object' depends on 'Core', which was not specified in find_package()") + endif () + + target_link_libraries(Bluelib::Object INTERFACE Bluelib::Core) + endif () + + if ("${component}" STREQUAL "Term") + if (NOT TARGET Bluelib::Core) + message(FATAL_ERROR "Bluelib: Module 'Term' depends on 'Core', which was not specified in find_package()") + endif () + + if (NOT TARGET Bluelib::Object) + message(FATAL_ERROR "Bluelib: Module 'Term' depends on 'Object', which was not specified in find_package()") + endif () + + target_link_libraries(Bluelib::Term INTERFACE Bluelib::Core Bluelib::Object) + endif () + + if ("${component}" STREQUAL "Serial") + if (NOT TARGET Bluelib::Core) + message(FATAL_ERROR "Bluelib: Module 'Serial' depends on 'Core', which was not specified in find_package()") + endif () + + if (NOT TARGET Bluelib::Object) + message(FATAL_ERROR "Bluelib: Module 'Serial' depends on 'Object', which was not specified in find_package()") + endif () + + target_link_libraries(Bluelib::Serial INTERFACE Bluelib::Core Bluelib::Object) + endif () + + if ("${component}" STREQUAL "Cmd") + if (NOT TARGET Bluelib::Core) + message(FATAL_ERROR "Bluelib: Module 'Cmd' depends on 'Core', which was not specified in find_package()") + endif () + + if (NOT TARGET Bluelib::Object) + message(FATAL_ERROR "Bluelib: Module 'Cmd' depends on 'Object', which was not specified in find_package()") + endif () + + if (NOT TARGET Bluelib::Term) + message(FATAL_ERROR "Bluelib: Module 'Cmd' depends on 'Term', which was not specified in find_package()") + endif () + + target_link_libraries(Bluelib::Cmd INTERFACE Bluelib::Core Bluelib::Object Bluelib::Term) + endif () + + if ("${component}" STREQUAL "Io") + if (NOT TARGET Bluelib::Core) + message(FATAL_ERROR "Bluelib: Module 'Io' depends on 'Core', which was not specified in find_package()") + endif () + + if (NOT TARGET Bluelib::Object) + message(FATAL_ERROR "Bluelib: Module 'Io' depends on 'Object', which was not specified in find_package()") + endif () + + target_link_libraries(Bluelib::Io INTERFACE Bluelib::Core Bluelib::Object) + endif () + endforeach (component) +endif() diff --git a/ropam/CMakeLists.txt b/ropam/CMakeLists.txt new file mode 100644 index 0000000..b8eb512 --- /dev/null +++ b/ropam/CMakeLists.txt @@ -0,0 +1,4 @@ +file(GLOB_RECURSE sources *.c *.h) + +add_executable(ropam ${sources}) +target_link_libraries(ropam Bluelib::Core Bluelib::Object Bluelib::Io Bluelib::Term Bluelib::Cmd) diff --git a/ropam/commands.h b/ropam/commands.h new file mode 100644 index 0000000..d856cd2 --- /dev/null +++ b/ropam/commands.h @@ -0,0 +1,40 @@ +#ifndef COMMANDS_H_ +#define COMMANDS_H_ + +enum { + CMD_ROOT, + CMD_SYNC, + CMD_REMOVE, + CMD_QUERY, + + CMD_VENDOR, + CMD_VENDOR_ADD, + CMD_VENDOR_REMOVE, + CMD_VENDOR_LIST, +}; + +enum { + OPT_SYSROOT = 0x1000, + OPT_SYSROOT_PATH, +}; + +#define SYSROOT_OPTION \ + B_COMMAND_OPTION(OPT_SYSROOT) \ + { \ + B_OPTION_SHORT_NAME('s'); \ + B_OPTION_LONG_NAME("sysroot"); \ + B_OPTION_DESC( \ + "the system directory to use. if no " \ + "sysroot is specified, the root directory is used. " \ + "alternatively, the ROSETTA_SYSROOT environment " \ + "variable can be used to specify the system root " \ + "directory"); \ + \ + B_OPTION_ARG(OPT_SYSROOT_PATH) \ + { \ + B_ARG_NAME("path"); \ + B_ARG_NR_VALUES(1); \ + } \ + } + +#endif diff --git a/ropam/main.c b/ropam/main.c new file mode 100644 index 0000000..ad971db --- /dev/null +++ b/ropam/main.c @@ -0,0 +1,32 @@ +#include "commands.h" + +#include + +B_COMMAND(CMD_ROOT, B_COMMAND_INVALID_ID) +{ + B_COMMAND_NAME("ropam"); + B_COMMAND_DESC( + "Rosetta package manager. This tool is used to (un)install, " + "upgrade, and otherwise manage packages on a system via a set " + "of package vendors."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_HELP_OPTION(); + + SYSROOT_OPTION; + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_COMMAND_PLACEHOLDER(); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_SYSROOT); + B_COMMAND_USAGE_COMMAND_PLACEHOLDER(); + } +} + +int main(int argc, const char **argv) +{ + return b_command_dispatch(CMD_ROOT, argc, argv); +} diff --git a/ropam/query.c b/ropam/query.c new file mode 100644 index 0000000..5149b28 --- /dev/null +++ b/ropam/query.c @@ -0,0 +1,22 @@ +#include "commands.h" + +#include + +static int query( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_QUERY, CMD_ROOT) +{ + B_COMMAND_NAME("query"); + B_COMMAND_SHORT_NAME('Q'); + B_COMMAND_DESC("query information about installed packages."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(query); + + B_COMMAND_HELP_OPTION(); +} diff --git a/ropam/remove.c b/ropam/remove.c new file mode 100644 index 0000000..8844cba --- /dev/null +++ b/ropam/remove.c @@ -0,0 +1,42 @@ +#include "commands.h" + +#include + +enum { + ARG_PACKAGE, +}; + +static int remove( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_REMOVE, CMD_ROOT) +{ + B_COMMAND_NAME("remove"); + B_COMMAND_SHORT_NAME('R'); + B_COMMAND_DESC( + "remove a set of Rosetta packages by name. any " + "automatically installed dependencies will not be removed " + "unless they are explicitly named in the list of packages to " + "remove."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(remove); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_ARG(ARG_PACKAGE) + { + B_ARG_NAME("package-name"); + B_ARG_DESC("the names of the packages to remove."); + B_ARG_NR_VALUES(B_ARG_1_OR_MORE_VALUES); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_ARG(ARG_PACKAGE); + } +} diff --git a/ropam/sync.c b/ropam/sync.c new file mode 100644 index 0000000..28d26e4 --- /dev/null +++ b/ropam/sync.c @@ -0,0 +1,72 @@ +#include "commands.h" + +#include + +enum { + OPT_SYNC_DB, + OPT_SYNC_ALL, + + ARG_PACKAGE, +}; + +static int sync( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_SYNC, CMD_ROOT) +{ + B_COMMAND_NAME("sync"); + B_COMMAND_SHORT_NAME('S'); + B_COMMAND_DESC( + "synchronise your machine with the your registered package " + "vendor(s). this command can be used to synchronise packages, " + "installing them or updating them to the latest available " + "version. all installed packages can be synchronised to update " + "the whole system, or the package database itself can be " + "synchronised to gain access to new and updated packages."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(sync); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_SYNC_DB) + { + B_OPTION_SHORT_NAME('y'); + B_OPTION_LONG_NAME("database"); + B_OPTION_DESC( + "synchronise the package database before synchronising " + "any packages. this option can be specified without " + "any package names to synchronise the package database " + "on its own."); + } + + B_COMMAND_OPTION(OPT_SYNC_ALL) + { + B_OPTION_SHORT_NAME('u'); + B_OPTION_LONG_NAME("synchronise-all"); + B_OPTION_DESC( + "synchronise all packages currently installed on the " + "system, updating them to the latest available " + "version."); + } + + B_COMMAND_ARG(ARG_PACKAGE) + { + B_ARG_NAME("package-name"); + B_ARG_DESC( + "the names of the packages to synchronise. if a named " + "package is not installed, the latest version will be " + "installed. otherwise, the already-installed package " + "will be updated to the latest version."); + B_ARG_NR_VALUES(B_ARG_1_OR_MORE_VALUES); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_ARG(ARG_PACKAGE); + } +} diff --git a/ropam/vendor/add.c b/ropam/vendor/add.c new file mode 100644 index 0000000..f179a6b --- /dev/null +++ b/ropam/vendor/add.c @@ -0,0 +1,22 @@ +#include "../commands.h" + +#include + +static int vendor_add( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_VENDOR_ADD, CMD_VENDOR) +{ + B_COMMAND_NAME("add"); + B_COMMAND_SHORT_NAME('A'); + B_COMMAND_DESC("add a new package vendor to the system."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(vendor_add); + + B_COMMAND_HELP_OPTION(); +} diff --git a/ropam/vendor/list.c b/ropam/vendor/list.c new file mode 100644 index 0000000..2cff95f --- /dev/null +++ b/ropam/vendor/list.c @@ -0,0 +1,22 @@ +#include "../commands.h" + +#include + +static int vendor_list( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_VENDOR_LIST, CMD_VENDOR) +{ + B_COMMAND_NAME("list"); + B_COMMAND_SHORT_NAME('L'); + B_COMMAND_DESC("list all registered package vendors."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(vendor_list); + + B_COMMAND_HELP_OPTION(); +} diff --git a/ropam/vendor/remove.c b/ropam/vendor/remove.c new file mode 100644 index 0000000..fa42a95 --- /dev/null +++ b/ropam/vendor/remove.c @@ -0,0 +1,22 @@ +#include "../commands.h" + +#include + +static int vendor_remove( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_VENDOR_REMOVE, CMD_VENDOR) +{ + B_COMMAND_NAME("remove"); + B_COMMAND_SHORT_NAME('R'); + B_COMMAND_DESC("remove a package vendor from the system."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(vendor_remove); + + B_COMMAND_HELP_OPTION(); +} diff --git a/ropam/vendor/vendor.c b/ropam/vendor/vendor.c new file mode 100644 index 0000000..29d1268 --- /dev/null +++ b/ropam/vendor/vendor.c @@ -0,0 +1,13 @@ +#include "../commands.h" + +#include + +B_COMMAND(CMD_VENDOR, CMD_ROOT) +{ + B_COMMAND_NAME("vendor"); + B_COMMAND_SHORT_NAME('V'); + B_COMMAND_DESC("package vendor management commands."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + + B_COMMAND_HELP_OPTION(); +} diff --git a/ropkg/CMakeLists.txt b/ropkg/CMakeLists.txt new file mode 100644 index 0000000..b7830d6 --- /dev/null +++ b/ropkg/CMakeLists.txt @@ -0,0 +1,4 @@ +file(GLOB sources *.c *.h) + +add_executable(ropkg ${sources}) +target_link_libraries(ropkg Bluelib::Core Bluelib::Object Bluelib::Io Bluelib::Term Bluelib::Cmd) diff --git a/ropkg/build.c b/ropkg/build.c new file mode 100644 index 0000000..6d21f38 --- /dev/null +++ b/ropkg/build.c @@ -0,0 +1,55 @@ +#include "commands.h" + +#include + +enum { + OPT_OUTPATH, + OPT_OUTPATH_PATH, + + ARG_RECIPE, +}; + +static int build( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_BUILD, CMD_ROOT) +{ + B_COMMAND_NAME("build"); + B_COMMAND_SHORT_NAME('B'); + B_COMMAND_DESC("build a Rosetta package from a recipe"); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(build); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_OUTPATH) + { + B_OPTION_SHORT_NAME('o'); + B_OPTION_LONG_NAME("out"); + B_OPTION_DESC("the path to save the new package file to"); + + B_OPTION_ARG(OPT_OUTPATH_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_ARG(ARG_RECIPE) + { + B_ARG_NAME("recipe"); + B_ARG_DESC("the recipe to build the package from."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_RECIPE); + } +} diff --git a/ropkg/commands.h b/ropkg/commands.h new file mode 100644 index 0000000..e6c5644 --- /dev/null +++ b/ropkg/commands.h @@ -0,0 +1,13 @@ +#ifndef COMMANDS_H_ +#define COMMANDS_H_ + +enum { + CMD_ROOT, + CMD_CREATE, + CMD_BUILD, + CMD_QUERY, + CMD_EXTRACT, + CMD_INSTALL, +}; + +#endif diff --git a/ropkg/create.c b/ropkg/create.c new file mode 100644 index 0000000..8ba3a7b --- /dev/null +++ b/ropkg/create.c @@ -0,0 +1,226 @@ +#include "commands.h" + +#include + +enum { + OPT_OUTPATH, + OPT_OUTPATH_PATH, + + OPT_MANIFEST, + OPT_MANIFEST_PATH, + + OPT_PARAMETER, + OPT_PARAMETER_NAME, + OPT_PARAMETER_VALUE, + + ARG_SOURCE_DIR, +}; + +static int create( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_CREATE, CMD_ROOT) +{ + B_COMMAND_NAME("create"); + B_COMMAND_SHORT_NAME('C'); + B_COMMAND_DESC("create a Rosetta package from a directory"); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(create); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_OUTPATH) + { + B_OPTION_SHORT_NAME('o'); + B_OPTION_LONG_NAME("out"); + B_OPTION_DESC("the path to save the new package file to"); + + B_OPTION_ARG(OPT_OUTPATH_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_OPTION(OPT_MANIFEST) + { + B_OPTION_SHORT_NAME('m'); + B_OPTION_LONG_NAME("manifest"); + B_OPTION_DESC( + "the path to a manifest file describing the " + "package to be created. if no manifest is specified, " + "the package binary directory will be searched for a " + "manifest"); + + B_OPTION_ARG(OPT_MANIFEST_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_OPTION(OPT_PARAMETER) + { + B_OPTION_SHORT_NAME('p'); + B_OPTION_LONG_NAME("parameter"); + B_OPTION_DESC( + "a parameter to use when creating the new file. " + "if a parameter EXAMPLE is defined, any variable " + "reference " + "of the form ${EXAMPLE} in the package manifest will " + "be " + "replaced with the specified parameter value."); + + B_OPTION_ARG(OPT_PARAMETER_NAME) + { + B_ARG_NAME("name"); + B_ARG_NR_VALUES(1); + } + + B_OPTION_ARG(OPT_PARAMETER_VALUE) + { + B_ARG_NAME("value"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_ARG(ARG_SOURCE_DIR) + { + B_ARG_NAME("source-dir"); + B_ARG_DESC( + "the directory to package. the specified directory " + "will become the root of the newly created package."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_SOURCE_DIR); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_MANIFEST); + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_SOURCE_DIR); + } +} +#include "commands.h" + +#include + +enum { + OPT_OUTPATH, + OPT_OUTPATH_PATH, + + OPT_MANIFEST, + OPT_MANIFEST_PATH, + + OPT_PARAMETER, + OPT_PARAMETER_NAME, + OPT_PARAMETER_VALUE, + + ARG_SOURCE_DIR, +}; + +static int create( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_CREATE, CMD_ROOT) +{ + B_COMMAND_NAME("create"); + B_COMMAND_SHORT_NAME('C'); + B_COMMAND_DESC("create a Rosetta package from a directory"); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(create); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_OUTPATH) + { + B_OPTION_SHORT_NAME('o'); + B_OPTION_LONG_NAME("out"); + B_OPTION_DESC("the path to save the new package file to"); + + B_OPTION_ARG(OPT_OUTPATH_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_OPTION(OPT_MANIFEST) + { + B_OPTION_SHORT_NAME('m'); + B_OPTION_LONG_NAME("manifest"); + B_OPTION_DESC( + "the path to a manifest file describing the " + "package to be created. if no manifest is specified, " + "the package binary directory will be searched for a " + "manifest"); + + B_OPTION_ARG(OPT_MANIFEST_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_OPTION(OPT_PARAMETER) + { + B_OPTION_SHORT_NAME('p'); + B_OPTION_LONG_NAME("parameter"); + B_OPTION_DESC( + "a parameter to use when creating the new file. " + "if a parameter EXAMPLE is defined, any variable " + "reference " + "of the form ${EXAMPLE} in the package manifest will " + "be " + "replaced with the specified parameter value."); + + B_OPTION_ARG(OPT_PARAMETER_NAME) + { + B_ARG_NAME("name"); + B_ARG_NR_VALUES(1); + } + + B_OPTION_ARG(OPT_PARAMETER_VALUE) + { + B_ARG_NAME("value"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_ARG(ARG_SOURCE_DIR) + { + B_ARG_NAME("source-dir"); + B_ARG_DESC( + "the directory to package. the specified directory " + "will become the root of the newly created package."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_SOURCE_DIR); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_MANIFEST); + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_SOURCE_DIR); + } +} diff --git a/ropkg/extract.c b/ropkg/extract.c new file mode 100644 index 0000000..08d67dd --- /dev/null +++ b/ropkg/extract.c @@ -0,0 +1,55 @@ +#include "commands.h" + +#include + +enum { + OPT_OUTPATH, + OPT_OUTPATH_PATH, + + ARG_PACKAGE, +}; + +static int extract( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_EXTRACT, CMD_ROOT) +{ + B_COMMAND_NAME("extract"); + B_COMMAND_SHORT_NAME('X'); + B_COMMAND_DESC("extract the contents of a Rosetta package"); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(extract); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_OUTPATH) + { + B_OPTION_SHORT_NAME('o'); + B_OPTION_LONG_NAME("out"); + B_OPTION_DESC("the path to extract the package contents to"); + + B_OPTION_ARG(OPT_OUTPATH_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_ARG(ARG_PACKAGE) + { + B_ARG_NAME("package"); + B_ARG_DESC("the package to extract."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT(OPT_OUTPATH); + B_COMMAND_USAGE_ARG(ARG_PACKAGE); + } +} diff --git a/ropkg/install.c b/ropkg/install.c new file mode 100644 index 0000000..628b5cb --- /dev/null +++ b/ropkg/install.c @@ -0,0 +1,59 @@ +#include "commands.h" + +#include + +enum { + OPT_SYSROOT, + OPT_SYSROOT_PATH, + + ARG_PACKAGE, +}; + +static int install( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_INSTALL, CMD_ROOT) +{ + B_COMMAND_NAME("install"); + B_COMMAND_SHORT_NAME('I'); + B_COMMAND_DESC("install a Rosetta package."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(install); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_OPTION(OPT_SYSROOT) + { + B_OPTION_SHORT_NAME('s'); + B_OPTION_LONG_NAME("sysroot"); + B_OPTION_DESC( + "the system directory to install the package to. if no " + "sysroot is specified, the root directory is used. " + "alternatively, the ROSETTA_SYSROOT environment " + "variable can be used to specify the system root " + "directory"); + + B_OPTION_ARG(OPT_SYSROOT_PATH) + { + B_ARG_NAME("path"); + B_ARG_NR_VALUES(1); + } + } + + B_COMMAND_ARG(ARG_PACKAGE) + { + B_ARG_NAME("package-path"); + B_ARG_DESC("the path to the package to install."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_ARG(ARG_PACKAGE); + } +} diff --git a/ropkg/main.c b/ropkg/main.c new file mode 100644 index 0000000..e4924fa --- /dev/null +++ b/ropkg/main.c @@ -0,0 +1,19 @@ +#include "commands.h" + +#include + +B_COMMAND(CMD_ROOT, B_COMMAND_INVALID_ID) +{ + B_COMMAND_NAME("ropkg"); + B_COMMAND_DESC( + "Rosetta package manipulation tool. This tool is used to " + "create, build, and otherwise manipulate individual Rosetta " + "package files."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_HELP_OPTION(); +} + +int main(int argc, const char **argv) +{ + return b_command_dispatch(CMD_ROOT, argc, argv); +} diff --git a/ropkg/query.c b/ropkg/query.c new file mode 100644 index 0000000..3ba863f --- /dev/null +++ b/ropkg/query.c @@ -0,0 +1,38 @@ +#include "commands.h" + +#include + +enum { + ARG_PACKAGE, +}; + +static int query( + const b_command *self, + const b_arglist *opt, + const b_array *args) +{ + return 0; +} + +B_COMMAND(CMD_QUERY, CMD_ROOT) +{ + B_COMMAND_NAME("query"); + B_COMMAND_SHORT_NAME('Q'); + B_COMMAND_DESC("query information about a Rosetta package"); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(query); + + B_COMMAND_HELP_OPTION(); + + B_COMMAND_ARG(ARG_PACKAGE) + { + B_ARG_NAME("package"); + B_ARG_DESC("the package to query."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_ARG(ARG_PACKAGE); + } +} diff --git a/rovem/CMakeLists.txt b/rovem/CMakeLists.txt new file mode 100644 index 0000000..f6ee79d --- /dev/null +++ b/rovem/CMakeLists.txt @@ -0,0 +1,4 @@ +file(GLOB sources *.c *.h) + +add_executable(rovem ${sources}) +target_link_libraries(rovem Bluelib::Core Bluelib::Object Bluelib::Io Bluelib::Term Bluelib::Cmd) diff --git a/rovem/add-package.c b/rovem/add-package.c new file mode 100644 index 0000000..e69de29 diff --git a/rovem/commands.h b/rovem/commands.h new file mode 100644 index 0000000..257de3b --- /dev/null +++ b/rovem/commands.h @@ -0,0 +1,12 @@ +#ifndef COMMANDS_H_ +#define COMMANDS_H_ + +enum { + CMD_ROOT, + CMD_CREATE, + CMD_QUERY, + CMD_ADD_PACKAGE, + CMD_REMOVE_PACKAGE, +}; + +#endif diff --git a/rovem/create.c b/rovem/create.c new file mode 100644 index 0000000..e69de29 diff --git a/rovem/main.c b/rovem/main.c new file mode 100644 index 0000000..77604d9 --- /dev/null +++ b/rovem/main.c @@ -0,0 +1,19 @@ +#include "commands.h" + +#include + +B_COMMAND(CMD_ROOT, B_COMMAND_INVALID_ID) +{ + B_COMMAND_NAME("rovem"); + B_COMMAND_DESC( + "Rosetta package vendor management tool. This tool is used to " + "create and manage a Rosetta package vendor, from which " + "packages can be retrieved and installed by clients."); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_HELP_OPTION(); +} + +int main(int argc, const char **argv) +{ + return b_command_dispatch(CMD_ROOT, argc, argv); +} diff --git a/rovem/query.c b/rovem/query.c new file mode 100644 index 0000000..e69de29 diff --git a/rovem/remove-package.c b/rovem/remove-package.c new file mode 100644 index 0000000..e69de29