From 683687b153f88a07fed8fa0f66c4c93ec67a18b0 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura <leonardo@microsoft.com> Date: Wed, 31 Oct 2012 10:54:59 -0700 Subject: [PATCH 1/5] more cleanup Signed-off-by: Leonardo de Moura <leonardo@microsoft.com> --- scripts/mk_project.py | 3 +- src/ast/ast_dag_pp.cpp | 353 --------------------- src/ast/ast_dag_pp.h | 31 -- src/ast/expr2dot.cpp | 84 ----- src/ast/expr2dot.h | 27 -- src/{util => math/interval}/interval.h | 0 src/{util => math/interval}/interval_def.h | 0 src/{util => muz_qe}/imdd.cpp | 0 src/{util => muz_qe}/imdd.h | 0 src/{util => muz_qe}/interval_skip_list.h | 0 src/{util => muz_qe}/skip_list_base.h | 0 src/{util => smt}/diff_logic.h | 0 src/{util => smt}/old_interval.cpp | 0 src/{util => smt}/old_interval.h | 0 src/tactic/sls/sls_tactic.cpp | 12 - 15 files changed, 2 insertions(+), 508 deletions(-) delete mode 100644 src/ast/ast_dag_pp.cpp delete mode 100644 src/ast/ast_dag_pp.h delete mode 100644 src/ast/expr2dot.cpp delete mode 100644 src/ast/expr2dot.h rename src/{util => math/interval}/interval.h (100%) rename src/{util => math/interval}/interval_def.h (100%) rename src/{util => muz_qe}/imdd.cpp (100%) rename src/{util => muz_qe}/imdd.h (100%) rename src/{util => muz_qe}/interval_skip_list.h (100%) rename src/{util => muz_qe}/skip_list_base.h (100%) rename src/{util => smt}/diff_logic.h (100%) rename src/{util => smt}/old_interval.cpp (100%) rename src/{util => smt}/old_interval.h (100%) diff --git a/scripts/mk_project.py b/scripts/mk_project.py index 3c7d6e70a..d6c97c8ac 100644 --- a/scripts/mk_project.py +++ b/scripts/mk_project.py @@ -14,7 +14,8 @@ def init_project_def(): add_lib('polynomial', ['util'], 'math/polynomial') add_lib('sat', ['util']) add_lib('nlsat', ['polynomial', 'sat']) - add_lib('subpaving', ['util'], 'math/subpaving') + add_lib('interval', ['util'], 'math/interval') + add_lib('subpaving', ['interval'], 'math/subpaving') add_lib('ast', ['util', 'polynomial']) add_lib('rewriter', ['ast', 'polynomial'], 'ast/rewriter') add_lib('model', ['rewriter']) diff --git a/src/ast/ast_dag_pp.cpp b/src/ast/ast_dag_pp.cpp deleted file mode 100644 index 893ef09b6..000000000 --- a/src/ast/ast_dag_pp.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/*++ -Copyright (c) 2007 Microsoft Corporation - -Module Name: - - ast_dag_pp.cpp - -Abstract: - - AST low level pretty printer. - -Author: - - Leonardo de Moura (leonardo) 2006-10-19. - Nikolaj Bjorner (nbjorner) 2007-07-17 - -Revision History: - ---*/ - -#include<iostream> -#include"for_each_ast.h" -#include"arith_decl_plugin.h" -#include"bv_decl_plugin.h" -#include"ast_pp.h" - -class dag_printer { - ast_manager& m_manager; - std::ostream & m_out; - ast_mark& m_mark; - bool m_initialized; - svector<symbol> m_names; - family_id m_basic_fid; - family_id m_bv_fid; - family_id m_arith_fid; - family_id m_array_fid; - arith_util m_arith; - bv_util m_bv; - bool m_enable_shortcut; - - void process_ast(ast* a) { - for_each_ast(*this, m_mark, a); - } - - void process_info(decl_info* info) { - if (!info) { - return; - } - unsigned num_params = info->get_num_parameters(); - for (unsigned i = 0; i < num_params; ++i) { - parameter const& p = info->get_parameter(i); - - if (p.is_ast() && !m_mark.is_marked(p.get_ast())) { - process_ast(p.get_ast()); - } - } - } - - template<typename T> - void display_children(unsigned num_children, T * const * children) { - for (unsigned i = 0; i < num_children; i++) { - display_node_id(children[i]); - } - } - - void display_node_id(ast* n) { - unsigned id = n->get_id(); - switch(n->get_kind()) { - case AST_FUNC_DECL: - case AST_SORT: - m_out << "$d" << (id - (1 << 31)) << " "; - break; - default: - m_out << "$" << id << " "; - break; - } - } - - void display_parameter(parameter const& p) - { - if (p.is_int()) { - m_out << p.get_int() << " "; - } - else if (p.is_ast()) { - SASSERT(p.is_ast()); - display_node_id(p.get_ast()); - } - else if (p.is_rational()) { - m_out << p.get_rational() << " "; - } - else if (p.is_symbol()) { - display_symbol(p.get_symbol()); - } - else { - UNREACHABLE(); - } - } - - // Display: - // App name [ parameters] arguments - // - void display_builtin(app* n) { - func_decl* d = n->get_decl(); - unsigned num_params = d->get_num_parameters(); - - m_out << "App "; - display_node_id(n); - display_symbol(d->get_name()); - if (num_params > 0) { - m_out << "[ "; - for (unsigned i = 0; i < num_params; ++i) { - display_parameter(d->get_parameter(i)); - } - m_out << "] "; - } - display_children(n->get_num_args(), n->get_args()); - m_out << "\n"; - } - - void display_info(func_decl_info* info) { - if (!info) { - return; - } - m_out << "BUILTIN " << get_family_name(info->get_family_id()) << " " << info->get_decl_kind() << " "; - - if (info->is_associative()) { - m_out << ":assoc "; - } - if (info->is_commutative()) { - m_out << ":comm "; - } - if (info->is_injective()) { - m_out << ":inj "; - } - for (unsigned i = 0; i < info->get_num_parameters(); ++i) { - display_parameter(info->get_parameter(i)); - } - } - - void display_info(sort_info* info) { - if (!info) { - return; - } - m_out << "BUILTIN " << get_family_name(info->get_family_id()) << " " << info->get_decl_kind() << " "; - // TODO: remove this if... it doesn't make sense... - if (!info->is_infinite() && !info->is_very_big()) { - m_out << "Size " << info->get_num_elements().size() << " "; - } - for (unsigned i = 0; i < info->get_num_parameters(); ++i) { - display_parameter(info->get_parameter(i)); - } - } - - symbol get_family_name(family_id id) { - if (id == null_family_id) { - return symbol("null"); - } - if (!m_initialized) { - svector<symbol> names; - svector<family_id> range; - m_manager.get_dom(names); - m_manager.get_range(range); - m_names.resize(range.size()); - for (unsigned i = 0; i < range.size(); ++i) { - SASSERT(range[i] < static_cast<family_id>(range.size())); - m_names[range[i]] = names[i]; - } - m_initialized = true; - } - SASSERT(id < static_cast<family_id>(m_names.size())); - return m_names[id]; - } - - bool has_special_char(char const* s) { - while (s && *s) { - if (*s == ' ') { - return true; - } - ++s; - } - return false; - } - - void display_symbol(symbol const& s) { - if (s.is_numerical()) { - m_out << s << " "; - } - else if (!(s.bare_str()[0])) { - m_out << "\"null\" "; - } - else if (!has_special_char(s.bare_str())) { - m_out << s << " "; - } - else { - char const* r = s.bare_str(); - m_out << "\""; - while (*r) { - if (*r == ' ' || *r == '\n' || - *r == '\t' || *r == '\r') { - m_out << "\\" << ((unsigned)(*r)); - } - else { - m_out << *r; - } - ++r; - } - m_out << "\" "; - } - } - -public: - - dag_printer(ast_manager& mgr, std::ostream & out, ast_mark& mark): - m_manager(mgr), - m_out(out), - m_mark(mark), - m_initialized(false), - m_basic_fid(mgr.get_basic_family_id()), - m_bv_fid(mgr.get_family_id("bv")), - m_arith_fid(mgr.get_family_id("arith")), - m_array_fid(mgr.get_family_id("array")), - m_arith(mgr), - m_bv(mgr), - m_enable_shortcut(true) - { - } - - void operator()(sort * n) { - process_info(n->get_info()); - m_out << "Ty "; - display_node_id(n); - display_symbol(n->get_name()); - display_info(n->get_info()); - m_out << "\n"; - } - - void pp_num(app* n, rational const& r) { - m_out << "Num "; - display_node_id(n); - m_out << r << " "; - display_node_id(m_manager.get_sort(n)); - m_out << "\n"; - } - - void operator()(var * n) { - process_ast(n->get_sort()); - m_out << "Var "; - display_node_id(n); - m_out << n->get_idx() << " "; - display_node_id(n->get_sort()); - m_out << "\n"; - } - - void operator()(func_decl * n) { - - process_info(n->get_info()); - - family_id fid = n->get_family_id(); - if (m_arith_fid == fid && - n->get_info()->get_decl_kind() == OP_NUM) { - return; - } - - if (m_bv_fid == fid && - n->get_info()->get_decl_kind() == OP_BV_NUM) { - return; - } - - m_out << "Dec "; - display_node_id(n); - display_symbol(n->get_name()); - unsigned dom_size = n->get_arity(); - for (unsigned i = 0; i < dom_size; ++i) { - display_node_id(n->get_domain(i)); - } - display_node_id(n->get_range()); - display_info(n->get_info()); - m_out << "\n"; - } - - void operator()(app * n) { - process_ast(n->get_decl()); - family_id fid = n->get_family_id(); - unsigned bv_size; - rational val; - if (m_arith.is_numeral(n, val)) { - pp_num(n, val); - } - else if (m_bv.is_numeral(n, val, bv_size)) { - pp_num(n, val); - } - else if (m_enable_shortcut && - fid != null_family_id && - (fid == m_basic_fid || fid == m_bv_fid || fid == m_array_fid || fid == m_arith_fid)) { - display_builtin(n); - } - else if (n->get_num_args() == 0 && fid == null_family_id) { - func_decl* d = n->get_decl(); - m_out << "Const "; - display_node_id(n); - display_symbol(d->get_name()); - display_node_id(d->get_range()); - m_out << "\n"; - } - else { - m_out << "Fun "; - display_node_id(n); - display_node_id(n->get_decl()); - display_children(n->get_num_args(), n->get_args()); - m_out << "\n"; - } - } - - void operator()(quantifier * n) { - m_out << "Qua "; - display_node_id(n); - m_out << (n->is_forall() ? "FORALL" : "EXISTS") << " "; - m_out << n->get_weight() << " "; - if (symbol::null != n->get_skid()) { - m_out << "\"" << n->get_skid() << "\" "; - } - else { - m_out << "\"null\" "; - } - if (symbol::null != n->get_qid()) { - m_out << "\"" << n->get_qid() << "\" "; - } - else { - m_out << "\"null\" "; - } - unsigned num_decls = n->get_num_decls(); - m_out << num_decls << " "; - for (unsigned i = 0; i < num_decls; i++) { - m_out << n->get_decl_name(i) << " "; - display_node_id(n->get_decl_sort(i)); - } - m_out << n->get_num_patterns() << " "; - display_children(n->get_num_patterns(), n->get_patterns()); - display_node_id(n->get_expr()); - m_out << "\n"; - } -}; - -void ast_dag_pp(std::ostream & out, ast_manager& mgr, ast_mark& mark, ast * n) { - dag_printer p(mgr, out, mark); - for_each_ast(p, mark, n, true); -} - -void ast_dag_pp(std::ostream & out, ast_manager& mgr, ast * n) { - ast_mark mark; - ast_dag_pp(out, mgr, mark, n); -} - diff --git a/src/ast/ast_dag_pp.h b/src/ast/ast_dag_pp.h deleted file mode 100644 index fa933e22f..000000000 --- a/src/ast/ast_dag_pp.h +++ /dev/null @@ -1,31 +0,0 @@ -/*++ -Copyright (c) 2006 Microsoft Corporation - -Module Name: - - ast_dag_pp.h - -Abstract: - - AST low level pretty printer. - -Author: - - Leonardo de Moura (leonardo) 2006-10-19. - -Revision History: - ---*/ -#ifndef _AST_DAG_PP_H_ -#define _AST_DAG_PP_H_ - -#include<iostream> - -class ast; - -void ast_dag_pp(std::ostream & out, ast_manager& mgr, ast * n); - -void ast_dag_pp(std::ostream & out, ast_manager& mgr, ast_mark& mark, ast * n); - -#endif /* _AST_DAG_PP_H_ */ - diff --git a/src/ast/expr2dot.cpp b/src/ast/expr2dot.cpp deleted file mode 100644 index b0fef27d0..000000000 --- a/src/ast/expr2dot.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*++ -Copyright (c) 2006 Microsoft Corporation - -Module Name: - - expr2dot.cpp - -Abstract: - - <abstract> - -Author: - - Leonardo de Moura (leonardo) 2008-03-07. - -Revision History: - ---*/ -#include"expr2dot.h" -#include"for_each_expr.h" - -class dot_printer { - std::ostream & m_out; - ast_manager & m_manager; - bool m_proofs_only; -public: - dot_printer(std::ostream & out, ast_manager & m, bool proofs): - m_out(out), - m_manager(m), - m_proofs_only(proofs) { - } - - char const * get_color(app * n) { - if (m_manager.is_unit_resolution(n)) - return "blue"; - else if (m_manager.is_lemma(n)) - return "gold"; - else if (m_manager.is_transitivity(n)) - return "red"; - else if (m_manager.is_monotonicity(n)) - return "green"; - else - return "black"; - } - - void operator()(var * n) { - if (!m_proofs_only) { - m_out << n->get_id() << "[label=\"\",shape=circle];\n"; - } - } - - void operator()(quantifier * n) { - if (!m_proofs_only) { - m_out << n->get_id() << "[label=\"\",shape=circle,color=gray];\n"; - m_out << n->get_expr()->get_id() << " -> " << n->get_id() << ";\n"; - } - } - - void operator()(app * n) { - if (!m_proofs_only || m_manager.is_proof(n)) { - char const * c = get_color(n); - m_out << n->get_id() << "[label=\"\",shape=circle,color=" << c << "];\n"; - if (m_proofs_only) { - unsigned num = m_manager.get_num_parents(n); - for (unsigned i = 0; i < num; i++) - m_out << m_manager.get_parent(n, i)->get_id() << " -> " << n->get_id() << " [color=" << c << "];\n"; - } - else { - unsigned num = n->get_num_args(); - for (unsigned i = 0; i < num; i++) - m_out << n->get_arg(i)->get_id() << " -> " << n->get_id() << " [color=" << c << "];\n"; - } - } - } -}; - -void expr2dot(std::ostream & out, expr * n, ast_manager & m, bool proofs) { - out << "digraph \"ast\" {\n"; - dot_printer p(out, m, proofs); - for_each_expr(p, n); - out << "}\n"; -} - - diff --git a/src/ast/expr2dot.h b/src/ast/expr2dot.h deleted file mode 100644 index 54c65b034..000000000 --- a/src/ast/expr2dot.h +++ /dev/null @@ -1,27 +0,0 @@ -/*++ -Copyright (c) 2006 Microsoft Corporation - -Module Name: - - expr2dot.h - -Abstract: - - Convert expressions into a .DOT file - -Author: - - Leonardo de Moura (leonardo) 2008-03-07. - -Revision History: - ---*/ -#ifndef _EXPR2DOT_H_ -#define _EXPR2DOT_H_ - -#include"ast.h" - -void expr2dot(std::ostream & out, expr * a, ast_manager & m, bool proofs = false); - -#endif /* _AST2DOT_H_ */ - diff --git a/src/util/interval.h b/src/math/interval/interval.h similarity index 100% rename from src/util/interval.h rename to src/math/interval/interval.h diff --git a/src/util/interval_def.h b/src/math/interval/interval_def.h similarity index 100% rename from src/util/interval_def.h rename to src/math/interval/interval_def.h diff --git a/src/util/imdd.cpp b/src/muz_qe/imdd.cpp similarity index 100% rename from src/util/imdd.cpp rename to src/muz_qe/imdd.cpp diff --git a/src/util/imdd.h b/src/muz_qe/imdd.h similarity index 100% rename from src/util/imdd.h rename to src/muz_qe/imdd.h diff --git a/src/util/interval_skip_list.h b/src/muz_qe/interval_skip_list.h similarity index 100% rename from src/util/interval_skip_list.h rename to src/muz_qe/interval_skip_list.h diff --git a/src/util/skip_list_base.h b/src/muz_qe/skip_list_base.h similarity index 100% rename from src/util/skip_list_base.h rename to src/muz_qe/skip_list_base.h diff --git a/src/util/diff_logic.h b/src/smt/diff_logic.h similarity index 100% rename from src/util/diff_logic.h rename to src/smt/diff_logic.h diff --git a/src/util/old_interval.cpp b/src/smt/old_interval.cpp similarity index 100% rename from src/util/old_interval.cpp rename to src/smt/old_interval.cpp diff --git a/src/util/old_interval.h b/src/smt/old_interval.h similarity index 100% rename from src/util/old_interval.h rename to src/smt/old_interval.h diff --git a/src/tactic/sls/sls_tactic.cpp b/src/tactic/sls/sls_tactic.cpp index 1b95cb1ed..0ad845095 100644 --- a/src/tactic/sls/sls_tactic.cpp +++ b/src/tactic/sls/sls_tactic.cpp @@ -31,7 +31,6 @@ Notes: #include"max_bv_sharing_tactic.h" #include"simplify_tactic.h" #include"stopwatch.h" -#include"expr2dot.h" #include"propagate_values_tactic.h" #include"sls_tactic.h" #include"nnf_tactic.h" @@ -1727,17 +1726,6 @@ class sls_tactic : public tactic { } void operator()(goal_ref const & g, model_converter_ref & mc) { - //#ifdef _DEBUG - //ptr_vector<expr> es; - //for (unsigned i = 0; i < g->size(); i++) - // es.push_back(g->form(i)); - //expr_ref a(m_manager); - //a = m_manager.mk_and(g->size(), es.c_ptr()); - //std::ofstream dot_out("top.dot", std::ios::out); - //expr2dot(dot_out, a, m_manager); - //dot_out.close(); - //#endif - if (g->inconsistent()) { mc = 0; return; From 92eb2ec8026833afe2c7e38e2ddc43b47c9d6a13 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura <leonardo@microsoft.com> Date: Wed, 31 Oct 2012 11:02:14 -0700 Subject: [PATCH 2/5] missing update Signed-off-by: Leonardo de Moura <leonardo@microsoft.com> --- src/muz_qe/pdr_interpolant_provider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/muz_qe/pdr_interpolant_provider.cpp b/src/muz_qe/pdr_interpolant_provider.cpp index a243ed899..85655c737 100644 --- a/src/muz_qe/pdr_interpolant_provider.cpp +++ b/src/muz_qe/pdr_interpolant_provider.cpp @@ -307,7 +307,7 @@ lbool interpolant_provider_impl::get_interpolant(expr * f1, expr * f2, expr_ref& } front_end_params dummy_params; - cmd_context cctx(dummy_params, false, &m); + cmd_context cctx(&dummy_params, false, &m); for_each_expr(used_symbol_inserter(cctx), f1); parse_smt2_commands(cctx, std::istringstream(res_text), false); From 81193fd550b419ce517776cc3dd6865efa119fb9 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura <leonardo@microsoft.com> Date: Wed, 31 Oct 2012 11:16:43 -0700 Subject: [PATCH 3/5] add default template instance Signed-off-by: Leonardo de Moura <leonardo@microsoft.com> --- src/math/interval/interval_mpq.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/math/interval/interval_mpq.cpp diff --git a/src/math/interval/interval_mpq.cpp b/src/math/interval/interval_mpq.cpp new file mode 100644 index 000000000..fa7cec853 --- /dev/null +++ b/src/math/interval/interval_mpq.cpp @@ -0,0 +1,21 @@ +/*++ +Copyright (c) 2012 Microsoft Corporation + +Module Name: + + interval_mpq.cpp + +Abstract: + + Instantiate template using defaults. + +Author: + + Leonardo de Moura (leonardo) 2012-10-31. + +Revision History: + +--*/ +#include"interval_def.h" + +template class interval_manager<im_default_config>; From 7cea9cdefef12fa36b3029f47743aab0fc2fed10 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura <leonardo@microsoft.com> Date: Wed, 31 Oct 2012 13:09:05 -0700 Subject: [PATCH 4/5] enable pdb for release mode 32bit Signed-off-by: Leonardo de Moura <leonardo@microsoft.com> --- scripts/config-vs-release.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/config-vs-release.mk b/scripts/config-vs-release.mk index 16c9b0d37..d2c44f704 100644 --- a/scripts/config-vs-release.mk +++ b/scripts/config-vs-release.mk @@ -1,6 +1,6 @@ CC=cl CXX=cl -CXXFLAGS=/nologo /c /W3 /WX- /O2 /Oy- /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDOWS /D ASYNC_COMMANDS /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc:forScope /openmp /Gd /analyze- /arch:SSE2 +CXXFLAGS=/nologo /c /Zi /W3 /WX- /O2 /Oy- /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDOWS /D ASYNC_COMMANDS /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /openmp /Gd /analyze- /arch:SSE2 CXX_OUT_FLAG=/Fo OBJ_EXT=.obj LIB_EXT=.lib @@ -10,13 +10,13 @@ AR_OUTFLAG=/OUT: EXE_EXT=.exe LINK=cl LINK_FLAGS=/nologo /MD -LINK_EXTRA_FLAGS=/link /MACHINE:X86 /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /STACK:8388608 /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE /NXCOMPAT +LINK_EXTRA_FLAGS=/link /DEBUG /MACHINE:X86 /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /STACK:8388608 /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE /NXCOMPAT LINK_OUT_FLAG=/Fe SO_EXT=.dll SLINK=cl SLINK_FLAGS=/nologo /LD -SLINK_EXTRA_FLAGS=/link /MACHINE:X86 /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /STACK:8388608 /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE:NO +SLINK_EXTRA_FLAGS=/link /DEBUG /MACHINE:X86 /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /STACK:8388608 /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE:NO SLINK_OUT_FLAG=/Fe From ccdb253b4799371a6821a13d35095d8b97ede44b Mon Sep 17 00:00:00 2001 From: Leonardo de Moura <leonardo@microsoft.com> Date: Wed, 31 Oct 2012 13:14:37 -0700 Subject: [PATCH 5/5] added add_extra_exe command to build framework Signed-off-by: Leonardo de Moura <leonardo@microsoft.com> --- scripts/mk_util.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/mk_util.py b/scripts/mk_util.py index 7db1b5f21..82865a4ac 100644 --- a/scripts/mk_util.py +++ b/scripts/mk_util.py @@ -503,6 +503,13 @@ class ExeComponent(Component): '%s/bin/%s.exe' % (dist_path, self.exe_name)) +class ExtraExeComponent(ExeComponent): + def __init__(self, name, exe_name, path, deps, install): + ExeComponent.__init__(self, name, exe_name, path, deps, install) + + def main_component(self): + return False + class DLLComponent(Component): def __init__(self, name, dll_name, path, deps, export_files, reexports, install): Component.__init__(self, name, path, deps) @@ -752,6 +759,10 @@ def add_exe(name, deps=[], path=None, exe_name=None, install=True): c = ExeComponent(name, exe_name, path, deps, install) reg_component(name, c) +def add_extra_exe(name, deps=[], path=None, exe_name=None, install=True): + c = ExtraExeComponent(name, exe_name, path, deps, install) + reg_component(name, c) + def add_dll(name, deps=[], path=None, dll_name=None, export_files=[], reexports=[], install=True): c = DLLComponent(name, dll_name, path, deps, export_files, reexports, install) reg_component(name, c)