11/* *
2- Copyright (c) 2013 , Philip Deegan.
2+ Copyright (c) 2024 , Philip Deegan.
33All rights reserved.
44
55Redistribution and use in source and binary forms, with or without
@@ -28,60 +28,66 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2828(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2929OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3030*/
31+ #include " maiken/module/init.hpp"
3132#include < cstdint>
3233#include < unordered_set>
33- #include " maiken/module/init.hpp"
3434
3535namespace mkn {
36- namespace lang {
36+ namespace python3 {
3737
38- class PyBind11Module : public maiken ::Module {
39- private:
38+ class ModuleMaker : public maiken ::Module {
39+ private:
4040#if defined(_WIN32)
4141 const bool config_expected = 0 ;
4242#else
4343 const bool config_expected = 1 ;
4444#endif
4545 bool pyconfig_found = 0 ;
4646 std::string HOME, PY = " python3" , PYTHON, PY_CONFIG = " python-config" ,
47- PY3_CONFIG = " python3-config" , PATH = mkn::kul::env::GET(" PATH" );
47+ PY3_CONFIG = " python3-config" ,
48+ PATH = mkn::kul::env::GET(" PATH" );
4849 mkn::kul::Dir bin;
4950 std::shared_ptr<kul::cli::EnvVar> path_var;
5051
51- protected:
52- static void VALIDATE_NODE (YAML::Node const & node) {
52+ protected:
53+ static void VALIDATE_NODE (YAML::Node const & node) {
5354 using namespace mkn ::kul::yaml;
5455 Validator ({NodeValidator (" args" )}).validate (node);
5556 }
5657
57- public:
58- void init (maiken::Application& a, YAML::Node const & node)
58+ public:
59+ void init (maiken::Application & a, YAML::Node const & node)
5960 KTHROW(std::exception) override {
6061 bool finally = 0 ;
61- if (!kul::env::WHICH (PY.c_str ())) PY = " python" ;
62+ if (!kul::env::WHICH (PY.c_str ()))
63+ PY = " python" ;
6264 PYTHON = mkn::kul::env::GET (" PYTHON" );
63- if (!PYTHON.empty ()) PY = PYTHON;
65+ if (!PYTHON.empty ())
66+ PY = PYTHON;
6467#if defined(_WIN32)
65- if (PY.rfind (" .exe" ) == std::string::npos) PY += " .exe" ;
68+ if (PY.rfind (" .exe" ) == std::string::npos)
69+ PY += " .exe" ;
6670#endif
6771 mkn::kul::Process p (PY);
6872 mkn::kul::ProcessCapture pc (p);
6973 HOME = mkn::kul::env::GET (" PYTHON3_HOME" );
7074 if (!HOME.empty ()) {
7175#if defined(_WIN32)
7276 bin = mkn::kul::Dir (HOME);
73- if (!bin) KEXCEPT (kul::Exception, " $PYTHON3_HOME does not exist" );
77+ if (!bin)
78+ KEXCEPT (kul::Exception, " $PYTHON3_HOME does not exist" );
7479#else
7580 bin = mkn::kul::Dir (" bin" , HOME);
76- if (!bin) KEXCEPT (kul::Exception, " $PYTHON3_HOME/bin does not exist" );
81+ if (!bin)
82+ KEXCEPT (kul::Exception, " $PYTHON3_HOME/bin does not exist" );
7783#endif
78- path_var = std::make_shared<kul::cli::EnvVar>(" PATH " , bin. real (),
79- mkn::kul::cli::EnvVarMode::PREP);
84+ path_var = std::make_shared<kul::cli::EnvVar>(
85+ " PATH " , bin. real (), mkn::kul::cli::EnvVarMode::PREP);
8086 mkn::kul::env::SET (path_var->name (), path_var->toString ().c_str ());
8187 p.var (path_var->name (), path_var->toString ());
8288 };
8389#if defined(_WIN32)
84- pyconfig_found = false ; // doesn't exist on windows (generally)
90+ pyconfig_found = false ; // doesn't exist on windows (generally)
8591#else
8692 pyconfig_found = mkn::kul::env::WHICH (PY3_CONFIG.c_str ());
8793#endif
@@ -98,23 +104,25 @@ class PyBind11Module : public maiken::Module {
98104 finally = 1 ;
99105 KEXCEPT (kul::Exception, " python-config does not exist on path" );
100106 }
101- } catch (const mkn::kul::Exception& e) {
107+ } catch (const mkn::kul::Exception & e) {
102108 KERR << e.stack ();
103- } catch (const std::exception& e) {
109+ } catch (const std::exception & e) {
104110 KERR << e.what ();
105111 } catch (...) {
106112 KERR << " UNKNOWN ERROR CAUGHT" ;
107113 }
108- if (finally) exit (2 );
114+ if (finally)
115+ exit (2 );
109116 using namespace mkn ::kul::cli;
110- auto & evs = a.envVars ();
117+ auto & evs = a.envVars ();
111118 std::string extension;
112119 if (pyconfig_found) {
113120 mkn::kul::os::PushDir pushd (a.project ().dir ());
114121 mkn::kul::Process p (PY3_CONFIG);
115122 mkn::kul::ProcessCapture pc (p);
116123 p << " --extension-suffix" ;
117- if (path_var) p.var (path_var->name (), path_var->toString ());
124+ if (path_var)
125+ p.var (path_var->name (), path_var->toString ());
118126 p.start ();
119127 extension = pc.outs ();
120128 } else {
@@ -126,18 +134,18 @@ class PyBind11Module : public maiken::Module {
126134 p.start ();
127135 extension = pc.outs ();
128136 }
129- a.m_cInfo .lib_ext = mkn::kul::String::LINES (extension)[0 ]; // drop EOL
137+ a.m_cInfo .lib_ext = mkn::kul::String::LINES (extension)[0 ]; // drop EOL
130138 a.m_cInfo .lib_prefix = " " ;
131139 a.mode (maiken::compiler::Mode::SHAR);
132140 }
133141};
134- } // namespace lang
135- } // namespace mkn
142+ } // namespace python3
143+ } // namespace mkn
136144
137- extern " C" KUL_PUBLISH maiken::Module* maiken_module_construct () {
138- return new mkn::lang::PyBind11Module ;
145+ extern " C" KUL_PUBLISH maiken::Module * maiken_module_construct () {
146+ return new mkn::python3::ModuleMaker ;
139147}
140148
141- extern " C" KUL_PUBLISH void maiken_module_destruct (maiken::Module* p) {
149+ extern " C" KUL_PUBLISH void maiken_module_destruct (maiken::Module * p) {
142150 delete p;
143151}
0 commit comments