PyXMake Developer Guide 1.0
PyXMake
Loading...
Searching...
No Matches
ssh_f2py.py
1# -*- coding: utf-8 -*-
2# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3# % PyXMake - Build environment for PyXMake %
4# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5"""
6Triple-use minimum working example for PyXMake. This script can be
7executed in three different ways in varying levels of accessibility
8
9@note: Compile Fortran source for PYTHON remotely
10 on the institute cluster. Uses main function.
11
12@version: 1.0
13----------------------------------------------------------------------------------------------
14@requires:
15 - PyXMake
16 - SSH key
17
18@date:
19 - 24.07.2019
20
21@author: garb_ma [DLR-FA,STM Braunschweig]
22----------------------------------------------------------------------------------------------
23"""
24import os, sys
25import argparse
26import posixpath
27
28try:
29 import PyXMake as _
30except ImportError:
31 # Script is executed as a plug-in
32 sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
33finally:
34 from PyXMake.Build import Make as pyx
35 from PyXMake.Tools import Utility
36 from PyXMake import VTL
37
38# Predefined script local variables
39__user = os.getenv("username","")
40__mcd_cluster_dev = posixpath.join(Utility.AsDrive("home",posixpath.sep),__user,"mcodac")
41__mcd_cluster_stable = posixpath.join(Utility.AsDrive("cluster",posixpath.sep),"software","mcodac","stable")
42__mcd_cluster_incpath = posixpath.join(__mcd_cluster_stable,"include")
43
44try:
45 # Import PyCODAC to build library locally during setup.
46 from PyCODAC.Tools.Utility import GetPyCODACPath
47 # Import and set local path to PyCODAC
48 __mcd_core_path = os.path.join(GetPyCODACPath(),"Core")
49except ImportError:
50 # This script is not executed as plug-in
51 __mcd_core_path = ""
52except:
53 # Something else went wrong.
54 from PyXMake.Tools import ErrorHandling
56
57def main(
58 # Mandatory arguments
59 BuildID, user, key,
60 # Build MCODAC by default
61 files=VTL.GetSourceCode(0),
62 command=VTL.GetBuildCommand(4),
63 lib=VTL.GetLinkDependency(0, 4,"x64"),
64 # Resource paths
65 source=os.path.join(__mcd_core_path,"src"),
66 include=[posixpath.join(__mcd_cluster_incpath, x) for x in VTL.GetIncludeDirectory(__mcd_core_path, 0, 4, "x64")],
67 dependency=posixpath.join(__mcd_cluster_stable,"lib"),
68 output=posixpath.join(__mcd_cluster_dev,"bin"),
69 # Bash environment scripts
70 environment = VTL.GetEnvironment(2),
71 # Architecture, verbose and scratch directory (on host)
72 architecture="x64", scratch=VTL.Scratch, verbosity=2,
73 # Activate / deactivate incremental compilation. Does deactivate pre-processing.
74 incremental=False,
75 # Host and port number. Access DLR's institute cluster by default.
76 host="129.247.54.37", port=22, **kwargs):
77 """
78 Main function to execute the script.
79 """
80 envlist = list([]); envlist.append(environment); envlist = list(Utility.ArbitraryFlattening(envlist))
81 # Remote build using SSH connection.
82 SSHBuild = pyx.SSH(BuildID, files, msvsc='vs2015', scratch=scratch, arch=architecture,
83 verbose=verbosity, incremental=incremental)
84 SSHBuild.SourcePath(source)
85 SSHBuild.AddIncludePath(include)
86 SSHBuild.AddDependencyPath(dependency)
87 # Load environments successively (if given)
88 for x in envlist:
89 SSHBuild.Environment(bash=x)
90
91 # Activate / deactivate incremental compilation & linking
92 if not incremental:
93 SSHBuild.Preprocessing('fpp -P -e -DPYD', inend='.for', outend='.f90')
94 else:
95 SSHBuild.Preprocessing(copyfiles=files)
96
97 SSHBuild.OutputPath(libpath=output)
98 SSHBuild.Build(command, run="f2py", lib=lib)
99 SSHBuild.Settings(user, key, host, port, **kwargs)
100 SSHBuild.create()
101
102if __name__ == "__main__":
103# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104# % Access command line inputs %
105# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106 parser = argparse.ArgumentParser(description="Build shared Fortran libraries for Python remotely on the institute cluster.")
107 parser.add_argument("user", metavar="user", nargs=1, help="Current user for SSH connection")
108 parser.add_argument("key", metavar="key", nargs=1, help="Path to private SSH key")
109
110 try:
111 _ = sys.argv[1]
112 args, _ = parser.parse_known_args()
113 except:
114 pass
115
116 try:
117 # SSH key informations
118 user = args.user[0]
119 key = args.key[0]
120 except:
121 user = __user
122 key = os.path.join(Utility.AsDrive("C"),"Users",user,"Keys","Putty","id_rsa")
123
124 # Remotely build BEOS for Python (2.7, 3.5, 3.6) using SSH cluster connection.
125 for i in range(1,4):
126 # Build settings
127 BuildID = "beos"; env = VTL.GetEnvironment(i)
128 files=VTL.GetSourceCode(2); command=VTL.GetBuildCommand(4,"free")
129 lib = []; include = []; dependency = []
130 # Resource paths
131 source=os.path.join(__mcd_core_path,"external","beos")
132 # Execute make function obtained from virtual test lab.
133 main(BuildID, user, key, files, command, lib, source, include, dependency, environment=env, verbosity=0, incremental=True)
134
135 # Remotely build BoxBeam for Python (2.7, 3.5, 3.6) using SSH cluster connection.
136 for i in range(1,4):
137 # Build settings
138 BuildID = "bbeam"; env = VTL.GetEnvironment(i)
139 files=VTL.GetSourceCode(1); command=VTL.GetBuildCommand(4)
140 lib = []; include = []; dependency = []
141 # Resource paths
142 source=os.path.join(__mcd_core_path,"external","boxbeam")
143 # Execute make function obtained from virtual test lab.
144 main(BuildID, user, key, files, command, lib, source, include, dependency, environment=env, verbosity=0)
145
146 # Remotely build MCODAC for Python (2.7, 3.5, 3.6) using SSH cluster connection (default settings).
147 for i in range(1,4):
148 # Build settings
149 BuildID = "mcd_core"; env = VTL.GetEnvironment(i)
150 # Execute make function obtained from virtual test lab with default settings (builds MCODAC).
151 main(BuildID, user, key, environment=env)
152
153 else:
154 # This is not implemented yet.
155 raise NotImplementedError
156
157 # Finish
158 print("==================================")
159 print("Finished build for Python")
160 print("==================================")
161 sys.exit()
Base class for all input errors.
Module containing all relevant modules and scripts associated with the building process.
Definition __init__.py:1
Module containing basic functionalities defined for convenience.
Definition __init__.py:1
main(BuildID, user, key, files=VTL.GetSourceCode(0), command=VTL.GetBuildCommand(4), lib=VTL.GetLinkDependency(0, 4,"x64"), source=os.path.join(__mcd_core_path,"src"), include=[posixpath.join(__mcd_cluster_incpath, x) for x in VTL.GetIncludeDirectory(__mcd_core_path, 0, 4, "x64")], dependency=posixpath.join(__mcd_cluster_stable,"lib"), output=posixpath.join(__mcd_cluster_dev,"bin"), environment=VTL.GetEnvironment(2), architecture="x64", scratch=VTL.Scratch, verbosity=2, incremental=False, host="129.247.54.37", port=22, **kwargs)
Definition ssh_f2py.py:76