comparison jupyter_c_kernel/kernel.py @ 52:0ef931211f77

Added cflags and ldflags magics
author Ben Spoor <ben.spoor@altran.com>
date Wed, 12 Apr 2017 15:32:07 +0000
parents a98647258349
children 7857f8eea835
comparison
equal deleted inserted replaced
51:9357c3067f20 52:0ef931211f77
109 def create_jupyter_subprocess(self, cmd): 109 def create_jupyter_subprocess(self, cmd):
110 return RealTimeSubprocess(cmd, 110 return RealTimeSubprocess(cmd,
111 lambda contents: self._write_to_stdout(contents.decode()), 111 lambda contents: self._write_to_stdout(contents.decode()),
112 lambda contents: self._write_to_stderr(contents.decode())) 112 lambda contents: self._write_to_stderr(contents.decode()))
113 113
114 def compile_with_gcc(self, source_filename, binary_filename): 114 def compile_with_gcc(self, source_filename, binary_filename, cflags=None, ldflags=None):
115 args = ['gcc', source_filename, '-std=c11', '-fPIC', '-shared', '-rdynamic', '-o', binary_filename] 115 cflags = ['-std=c11', '-fPIC', '-shared', '-rdynamic'] + cflags
116 args = ['gcc', source_filename] + cflags + ['-o', binary_filename] + ldflags
116 return self.create_jupyter_subprocess(args) 117 return self.create_jupyter_subprocess(args)
118
119 def _filter_magics(self, code):
120
121 magics = {'cflags': [], 'ldflags': []}
122
123 for line in code.splitlines():
124 if line.startswith('//%'):
125 key, value = line[3:].split(":", 2)
126 key = key.strip().lower()
127
128 if key in ['ldflags', 'cflags']:
129 for flag in value.split():
130 magics[key] += [flag]
131
132 return magics
117 133
118 def do_execute(self, code, silent, store_history=True, 134 def do_execute(self, code, silent, store_history=True,
119 user_expressions=None, allow_stdin=False): 135 user_expressions=None, allow_stdin=False):
136
137 magics = self._filter_magics(code)
138
120 with self.new_temp_file(suffix='.c') as source_file: 139 with self.new_temp_file(suffix='.c') as source_file:
121 source_file.write(code) 140 source_file.write(code)
122 source_file.flush() 141 source_file.flush()
123 with self.new_temp_file(suffix='.out') as binary_file: 142 with self.new_temp_file(suffix='.out') as binary_file:
124 p = self.compile_with_gcc(source_file.name, binary_file.name) 143 p = self.compile_with_gcc(source_file.name, binary_file.name, magics['cflags'], magics['ldflags'])
125 while p.poll() is None: 144 while p.poll() is None:
126 p.write_contents() 145 p.write_contents()
127 p.write_contents() 146 p.write_contents()
128 if p.returncode != 0: # Compilation failed 147 if p.returncode != 0: # Compilation failed
129 self._write_to_stderr( 148 self._write_to_stderr(