Mercurial > flash_v2
diff host/tools/configtool/standalone/common/cdl_exec.cxx @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 6736c52df507 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/standalone/common/cdl_exec.cxx @@ -0,0 +1,504 @@ +//####COPYRIGHTBEGIN#### +// +// ---------------------------------------------------------------------------- +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// +// This program is part of the eCos host tools. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// ---------------------------------------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +// +// cdl_exec.cxx +// +// The implementation of each ecosconfig command +// +//========================================================================== +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jld +// Date: 1999-11-08 +// +//####DESCRIPTIONEND#### +//========================================================================== + +#ifdef _MSC_VER + #include <direct.h> /* for getcwd() */ +#else + #include <unistd.h> /* for getcwd() */ +#endif +#ifdef __CYGWIN__ + #include <sys/cygwin.h> /* for cygwin_conv_to_win32_path() */ +#endif +#include "build.hxx" +#include "cdl_exec.hxx" + +cdl_exec::cdl_exec (const std::string repository_tree, const std::string savefile_name, const std::string install_tree, bool no_resolve) : + pkgdata (NULL), + interp (NULL), + config (NULL) { + repository = repository_tree; + savefile = savefile_name; + install_prefix = install_tree; + CdlTransactionBody::set_inference_callback_fn (&inference_callback); + if (no_resolve) { + CdlTransactionBody::disable_automatic_inference (); + } +} + +bool cdl_exec::cmd_new (const std::string cdl_hardware, const std::string cdl_template /* = "default" */, const std::string cdl_version /* = "" */) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::make ("eCos", pkgdata, interp); + config->set_hardware (resolve_hardware_alias (cdl_hardware), &diagnostic_handler, &diagnostic_handler); + if (pkgdata->is_known_template (cdl_template) && ! cdl_version.empty ()) { + const std::vector<std::string> & versions = pkgdata->get_template_versions (cdl_template); + if (versions.end () == std::find (versions.begin (), versions.end (), cdl_version)) { + throw CdlStringException ("Unknown version " + cdl_version); + } + } + config->set_template (cdl_template, cdl_version, &diagnostic_handler, &diagnostic_handler); + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_target (const std::string cdl_target) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + config->set_hardware (resolve_hardware_alias (cdl_target), &diagnostic_handler, &diagnostic_handler); + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_template (const std::string cdl_template, const std::string cdl_version /* = "" */) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + if (pkgdata->is_known_template (cdl_template) && ! cdl_version.empty ()) { + const std::vector<std::string> & versions = pkgdata->get_template_versions (cdl_template); + if (versions.end () == std::find (versions.begin (), versions.end (), cdl_version)) { + throw CdlStringException ("Unknown version " + cdl_version); + } + } + config->set_template (cdl_template, cdl_version, &diagnostic_handler, &diagnostic_handler); + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_export (const std::string cdl_savefile) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + config->save (cdl_savefile, /* minimal = */ true); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_import (const std::string cdl_savefile) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + config->add (cdl_savefile, &diagnostic_handler, &diagnostic_handler); + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_add (const std::vector<std::string> cdl_packages) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + for (unsigned int n = 0; n < cdl_packages.size (); n++) { + config->load_package (resolve_package_alias (cdl_packages [n]), "", &diagnostic_handler, &diagnostic_handler); + } + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_remove (const std::vector<std::string> cdl_packages) { + unsigned int n; + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + for (n = 0; n < cdl_packages.size (); n++) { + if (! config->lookup (resolve_package_alias (cdl_packages [n]))) { + throw CdlStringException ("Unknown package " + cdl_packages [n]); + } + } + for (n = 0; n < cdl_packages.size (); n++) { + config->unload_package (resolve_package_alias (cdl_packages [n])); + } + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_version (const std::string cdl_version, const std::vector<std::string> cdl_packages) { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + for (unsigned int n = 0; n < cdl_packages.size (); n++) { + config->change_package_version (resolve_package_alias (cdl_packages [n]), cdl_version, &diagnostic_handler, &diagnostic_handler, true); + } + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_tree () { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + char * cwd = getcwd (NULL, 0); +#ifdef __CYGWIN__ + char cwd_win32 [MAXPATHLEN + 1]; + cygwin_conv_to_win32_path (cwd, cwd_win32); + generate_build_tree (config, cwd_win32, install_prefix); +#else + generate_build_tree (config, cwd, install_prefix); +#endif + free (cwd); + config->generate_config_headers (install_prefix.empty () ? "install/include/pkgconf" : install_prefix + "/include/pkgconf"); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_list () { + bool status = false; + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + + // list the installed packages + std::vector<std::string> packages = pkgdata->get_packages (); + std::sort (packages.begin (), packages.end ()); + for (unsigned int package = 0; package < packages.size (); package++) { + const std::vector<std::string> & aliases = pkgdata->get_package_aliases (packages [package]); + printf ("Package %s (%s):\n aliases:", packages [package].c_str (), aliases [0].c_str ()); + for (unsigned int alias = 1; alias < aliases.size (); alias++) { + printf (" %s", aliases [alias].c_str ()); + } + const std::vector<std::string> & versions = pkgdata->get_package_versions (packages [package]); + printf ("\n versions:"); + for (unsigned int version = 0; version < versions.size (); version++) { + printf (" %s", versions [version].c_str ()); + } + printf ("\n"); + } + + // list the available targets + std::vector<std::string> targets = pkgdata->get_targets (); + std::sort (targets.begin (), targets.end ()); + for (unsigned int target = 0; target < targets.size (); target++) { + const std::vector<std::string> & aliases = pkgdata->get_target_aliases (targets [target]); + printf ("Target %s (%s):\n aliases:", targets [target].c_str (), aliases [0].c_str ()); + for (unsigned int alias = 1; alias < aliases.size (); alias++) { + printf (" %s", aliases [alias].c_str ()); + } + printf ("\n"); + } + + // list the available templates + std::vector<std::string> templates = pkgdata->get_templates (); + std::sort (templates.begin (), templates.end ()); + for (unsigned int templ = 0; templ < templates.size (); templ++) { + const std::vector<std::string> & versions = pkgdata->get_template_versions (templates [templ]); + printf ("Template %s:\n versions:", templates [templ].c_str ()); + for (unsigned int version = 0; version < versions.size (); version++) { + printf (" %s", versions [version].c_str ()); + } + printf ("\n"); + } + + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_check () { + bool status = false; + unsigned int n; + + try { + CdlTransactionBody::disable_automatic_inference (); + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + config->save (savefile); // tidy up any manual edits + + // report current target and template + printf ("Target: %s\n", config->get_hardware ().c_str ()); + printf ("Template: %s\n", config->get_template ().c_str ()); + std::vector<std::string> template_packages = pkgdata->get_template_packages (config->get_template ()); + const std::vector<std::string> & hardware_packages = pkgdata->get_target_packages (config->get_hardware ()); + for (n = 0; n < hardware_packages.size (); n++) { + template_packages.push_back (hardware_packages [n]); + } + + // report loaded packages not in the templates + const std::vector<CdlLoadable> & loadables = config->get_loadables (); + std::vector<std::string> added_packages; + std::vector<CdlLoadable>::const_iterator loadable_i; + for (loadable_i = loadables.begin (); loadable_i != loadables.end (); loadable_i++) { + const CdlNode & node = dynamic_cast<CdlNode> (* loadable_i); + if (template_packages.end () == std::find (template_packages.begin (), template_packages.end (), node->get_name ())) { + added_packages.push_back (node->get_name ()); + } + } + if (added_packages.size ()) { + printf ("Added:\n"); + } + for (n = 0; n < added_packages.size (); n++) { + printf (" %s\n", added_packages [n].c_str ()); + } + + // report template packages not in the configuration + std::vector<std::string> removed_packages; + for (n = 0; n < template_packages.size (); n++) { + if (! config->lookup (template_packages [n])) { + removed_packages.push_back (template_packages [n]); + } + } + if (removed_packages.size ()) { + printf ("Removed:\n"); + } + for (n = 0; n < removed_packages.size (); n++) { + printf (" %s\n", removed_packages [n].c_str ()); + } + + // report packages of non-default version + std::vector<CdlValuable> version_packages; + for (loadable_i = loadables.begin (); loadable_i != loadables.end (); loadable_i++) { + const CdlValuable & valuable = dynamic_cast<CdlValuable> (* loadable_i); + if (pkgdata->get_package_versions (valuable->get_name ()) [0] != valuable->get_value ()) { + version_packages.push_back (valuable); + } + } + if (version_packages.size ()) { + printf ("Version(s):\n"); + } + for (n = 0; n < version_packages.size (); n++) { + printf (" %s %s\n", version_packages [n]->get_name ().c_str (), version_packages [n]->get_value ().c_str ()); + } + + // report conflicts + const std::list<CdlConflict> & conflicts = config->get_all_conflicts (); + if (conflicts.size ()) { + printf ("%u conflict(s):\n", conflicts.size ()); + } else { + printf ("No conflicts\n"); + } + std::list<CdlConflict>::const_iterator conf_i; + for (conf_i = conflicts.begin (); conf_i != conflicts.end (); conf_i++) { // for each conflict + report_conflict (* conf_i); + } + + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +bool cdl_exec::cmd_resolve () { + bool status = false; + + try { + pkgdata = CdlPackagesDatabaseBody::make (repository); + interp = CdlInterpreterBody::make (); + config = CdlConfigurationBody::load (savefile, pkgdata, interp, &diagnostic_handler, &diagnostic_handler); + config->resolve_all_conflicts (); + config->save (savefile); + status = true; + } catch (CdlStringException exception) { + exception_handler (exception); + } catch (...) { + exception_handler (); + } + + delete_cdl_data (); + return status; +} + +CdlInferenceCallbackResult cdl_exec::inference_callback (CdlTransaction transaction) { + const std::vector<CdlConflict> & resolved_conflicts = transaction->get_resolved_conflicts (); + + // report resolved conflicts + if (resolved_conflicts.size ()) { + printf ("%u conflict(s) resolved:\n", resolved_conflicts.size ()); + } + for (unsigned int n = 0; n < resolved_conflicts.size (); n++) { + report_conflict (resolved_conflicts [n]); + } + + // accept all changes + return CdlInferenceCallbackResult_Continue; +} + +void cdl_exec::report_conflict (CdlConflict conflict) { + printf (" %s:\n %s\n", conflict->get_node ()->get_name ().c_str (), conflict->get_explanation ().c_str ()); +} + +void cdl_exec::diagnostic_handler (std::string message) { + printf ("%s\n", message.c_str ()); +} + +void cdl_exec::exception_handler (CdlStringException exception) { + printf ("%s\n", exception.get_message ().c_str ()); +} + +void cdl_exec::exception_handler () { + printf ("Unknown error\n"); +} + +void cdl_exec::delete_cdl_data () { + delete config; + config = NULL; + delete interp; + interp = NULL; + delete pkgdata; + pkgdata = NULL; +} + +std::string cdl_exec::resolve_package_alias (const std::string alias) { + std::string package = alias; + + if (! pkgdata->is_known_package (alias)) { // if the alias is not a package name + const std::vector<std::string> & packages = pkgdata->get_packages (); // get packages + for (unsigned int n = 0; n < packages.size (); n++) { // for each package + const std::vector<std::string> & aliases = pkgdata->get_package_aliases (packages [n]); // get package aliases + if (aliases.end () != std::find (aliases.begin (), aliases.end (), alias)) { // if alias is found + package = packages [n]; // note the package + break; + } + } + } + return package; +} + +std::string cdl_exec::resolve_hardware_alias (const std::string alias) { + std::string target = alias; + + if (! pkgdata->is_known_target (alias)) { // if the alias is not a target name + const std::vector<std::string> & targets = pkgdata->get_targets (); // get targets + for (unsigned int n = 0; n < targets.size (); n++) { // for each target + const std::vector<std::string> & aliases = pkgdata->get_target_aliases (targets [n]); // get target aliases + if (aliases.end () != std::find (aliases.begin (), aliases.end (), alias)) { // if alias is found + target = targets [n]; // note the target + break; + } + } + } + return target; +}
