Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
973feb04
Commit
973feb04
authored
Dec 17, 2009
by
Lisandro Dalcin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove old Pyrex code for calling a C compiler to build extension modules
parent
0c9a42ce
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
3 additions
and
3816 deletions
+3
-3816
Cython/Compiler/CmdLine.py
Cython/Compiler/CmdLine.py
+0
-10
Cython/Compiler/Main.py
Cython/Compiler/Main.py
+3
-36
Cython/Mac/DarwinSystem.py
Cython/Mac/DarwinSystem.py
+0
-97
Cython/Mac/MacSystem.py
Cython/Mac/MacSystem.py
+0
-135
Cython/Mac/MacUtils.py
Cython/Mac/MacUtils.py
+0
-34
Cython/Mac/Makefile
Cython/Mac/Makefile
+0
-19
Cython/Mac/TS_Misc_Suite.py
Cython/Mac/TS_Misc_Suite.py
+0
-64
Cython/Mac/_Filemodule_patched.c
Cython/Mac/_Filemodule_patched.c
+0
-3345
Cython/Mac/__init__.py
Cython/Mac/__init__.py
+0
-0
Cython/Unix/LinuxSystem.py
Cython/Unix/LinuxSystem.py
+0
-74
Cython/Unix/__init__.py
Cython/Unix/__init__.py
+0
-0
setup.py
setup.py
+0
-2
No files found.
Cython/Compiler/CmdLine.py
View file @
973feb04
...
...
@@ -80,11 +80,6 @@ def parse_command_line(args):
options
.
show_version
=
1
elif
option
in
(
"-l"
,
"--create-listing"
):
options
.
use_listing_file
=
1
elif
option
in
(
"-C"
,
"--compile"
):
options
.
c_only
=
0
elif
option
in
(
"--link"
):
options
.
c_only
=
0
options
.
obj_only
=
0
elif
option
in
(
"-+"
,
"--cplus"
):
options
.
cplus
=
1
elif
option
==
"--embed"
:
...
...
@@ -135,14 +130,9 @@ def parse_command_line(args):
elif
arg
.
endswith
(
".py"
):
# maybe do some other stuff, but this should work for now
sources
.
append
(
arg
)
elif
arg
.
endswith
(
".o"
):
options
.
objects
.
append
(
arg
)
else
:
sys
.
stderr
.
write
(
"cython: %s: Unknown filename suffix
\
n
"
%
arg
)
if
options
.
objects
and
len
(
sources
)
>
1
:
sys
.
stderr
.
write
(
"cython: Only one source file allowed together with .o files
\
n
"
)
if
options
.
use_listing_file
and
len
(
sources
)
>
1
:
sys
.
stderr
.
write
(
"cython: Only one source file allowed when using -o
\
n
"
)
...
...
Cython/Compiler/Main.py
View file @
973feb04
...
...
@@ -509,15 +509,6 @@ class Context(object):
except
EnvironmentError
:
pass
result
.
c_file
=
None
if
result
.
c_file
and
not
options
.
c_only
and
c_compile
:
result
.
object_file
=
c_compile
(
result
.
c_file
,
verbose_flag
=
options
.
show_version
,
cplus
=
options
.
cplus
)
if
not
options
.
obj_only
and
c_link
:
result
.
extension_file
=
c_link
(
result
.
object_file
,
extra_objects
=
options
.
objects
,
verbose_flag
=
options
.
show_version
,
cplus
=
options
.
cplus
)
def
create_parse
(
context
):
def
parse
(
compsrc
):
...
...
@@ -605,17 +596,11 @@ class CompilationOptions(object):
compiler_directives dict Overrides for pragma options (see Options.py)
evaluate_tree_assertions boolean Test support: evaluate parse tree assertions
Following options are experimental and only used on MacOSX:
c_only boolean Stop after generating C file (default)
obj_only boolean Stop after compiling to .o file
objects [string] Extra .o files to link with
cplus boolean Compile as c++ code
"""
def
__init__
(
self
,
defaults
=
None
,
c_compile
=
0
,
c_link
=
0
,
**
kw
):
def
__init__
(
self
,
defaults
=
None
,
**
kw
):
self
.
include_path
=
[]
self
.
objects
=
[]
if
defaults
:
if
isinstance
(
defaults
,
CompilationOptions
):
defaults
=
defaults
.
__dict__
...
...
@@ -623,10 +608,6 @@ class CompilationOptions(object):
defaults
=
default_options
self
.
__dict__
.
update
(
defaults
)
self
.
__dict__
.
update
(
kw
)
if
c_compile
:
self
.
c_only
=
0
if
c_link
:
self
.
obj_only
=
0
class
CompilationResult
(
object
):
...
...
@@ -719,8 +700,7 @@ def compile_multiple(sources, options):
"Cannot find .pyx file for cimported module '%s'
\
n
"
%
module_name
)
return
results
def
compile
(
source
,
options
=
None
,
c_compile
=
0
,
c_link
=
0
,
full_module_name
=
None
,
**
kwds
):
def
compile
(
source
,
options
=
None
,
full_module_name
=
None
,
**
kwds
):
"""
compile(source [, options], [, <option> = <value>]...)
...
...
@@ -730,8 +710,7 @@ def compile(source, options = None, c_compile = 0, c_link = 0,
checking is requested, a CompilationResult is returned, otherwise a
CompilationResultSet is returned.
"""
options
=
CompilationOptions
(
defaults
=
options
,
c_compile
=
c_compile
,
c_link
=
c_link
,
**
kwds
)
options
=
CompilationOptions
(
defaults
=
options
,
**
kwds
)
if
isinstance
(
source
,
basestring
)
and
not
options
.
timestamps
\
and
not
options
.
recursive
:
return
compile_single
(
source
,
options
,
full_module_name
)
...
...
@@ -782,8 +761,6 @@ default_options = dict(
show_version
=
0
,
use_listing_file
=
0
,
errors_to_stderr
=
1
,
c_only
=
1
,
obj_only
=
1
,
cplus
=
0
,
output_file
=
None
,
annotate
=
False
,
...
...
@@ -797,13 +774,3 @@ default_options = dict(
evaluate_tree_assertions
=
False
,
emit_linenums
=
False
,
)
if
sys
.
platform
==
"mac"
:
from
Cython.Mac.MacSystem
import
c_compile
,
c_link
,
CCompilerError
default_options
[
'use_listing_file'
]
=
1
elif
sys
.
platform
==
"darwin"
:
from
Cython.Mac.DarwinSystem
import
c_compile
,
c_link
,
CCompilerError
else
:
c_compile
=
None
c_link
=
None
Cython/Mac/DarwinSystem.py
deleted
100644 → 0
View file @
0c9a42ce
#
# Pyrex - Darwin system interface
#
verbose
=
0
gcc_pendantic
=
True
gcc_warnings_are_errors
=
True
gcc_all_warnings
=
True
gcc_optimize
=
False
import
os
,
sys
from
Cython.Utils
import
replace_suffix
from
Cython.Compiler.Errors
import
PyrexError
version_string
=
"%s.%s"
%
sys
.
version_info
[:
2
]
py_include_dirs
=
[
"/Library/Frameworks/Python.framework/Versions/%s/Headers"
%
version_string
]
osx_version
=
os
.
popen
(
'sw_vers | grep ProductVersion'
).
read
().
split
()[
1
]
# MACOSX_DEPLOYMENT_TARGET can be set to 10.3 in most cases.
# But for the built-in Python 2.5.1 on Leopard, it needs to be set for 10.5.
# This looks like a bug that will be fixed in 2.5.2. If Apple updates their
# Python to 2.5.2, this fix should be OK.
import
distutils.sysconfig
as
sc
python_prefix
=
sc
.
get_config_var
(
'prefix'
)
leopard_python_prefix
=
'/System/Library/Frameworks/Python.framework/Versions/2.5'
full_version
=
"%s.%s.%s"
%
sys
.
version_info
[:
3
]
if
python_prefix
==
leopard_python_prefix
and
full_version
==
'2.5.1'
:
os
.
environ
[
"MACOSX_DEPLOYMENT_TARGET"
]
=
"10.5"
elif
osx_version
>=
"10.6"
:
os
.
environ
[
"MACOSX_DEPLOYMENT_TARGET"
]
=
"10.4"
else
:
os
.
environ
[
"MACOSX_DEPLOYMENT_TARGET"
]
=
"10.3"
compilers
=
[
"gcc"
,
"g++"
]
compiler_options
=
\
"-g -c -fno-strict-aliasing -no-cpp-precomp "
\
"-mno-fused-madd -fno-common -dynamic "
\
.
split
()
if
gcc_pendantic
:
compiler_options
.
extend
([
"-pedantic"
,
"-Wno-long-long"
])
if
gcc_warnings_are_errors
:
compiler_options
.
append
(
"-Werror"
)
if
gcc_all_warnings
:
compiler_options
.
append
(
"-Wall"
)
compiler_options
.
append
(
"-Wno-unused-function"
)
if
gcc_optimize
:
compiler_options
.
append
(
"-O"
)
linkers
=
[
"gcc"
,
"g++"
]
linker_options
=
\
"-Wl,-F.,-w -bundle -undefined dynamic_lookup"
\
.
split
()
#linker_options = \
# "-Wl,-F.,-w -bundle -framework Python" \
# .split()
class
CCompilerError
(
PyrexError
):
pass
def
c_compile
(
c_file
,
verbose_flag
=
0
,
cplus
=
0
,
obj_suffix
=
".o"
):
# Compile the given C source file to produce
# an object file. Returns the pathname of the
# resulting file.
c_file
=
os
.
path
.
join
(
os
.
getcwd
(),
c_file
)
o_file
=
replace_suffix
(
c_file
,
obj_suffix
)
include_options
=
[]
for
dir
in
py_include_dirs
:
include_options
.
append
(
"-I%s"
%
dir
)
compiler
=
compilers
[
bool
(
cplus
)]
args
=
[
compiler
]
+
compiler_options
+
include_options
+
[
c_file
,
"-o"
,
o_file
]
if
verbose_flag
or
verbose
:
print
(
" "
.
join
(
args
))
#print compiler, args ###
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
compiler
,
args
)
if
status
!=
0
:
raise
CCompilerError
(
"C compiler returned status %s"
%
status
)
return
o_file
def
c_link
(
obj_file
,
verbose_flag
=
0
,
extra_objects
=
[],
cplus
=
0
):
return
c_link_list
([
obj_file
]
+
extra_objects
,
verbose_flag
,
cplus
)
def
c_link_list
(
obj_files
,
verbose_flag
=
0
,
cplus
=
0
):
# Link the given object files into a dynamically
# loadable extension file. Returns the pathname
# of the resulting file.
out_file
=
replace_suffix
(
obj_files
[
0
],
".so"
)
linker
=
linkers
[
bool
(
cplus
)]
args
=
[
linker
]
+
linker_options
+
obj_files
+
[
"-o"
,
out_file
]
if
verbose_flag
or
verbose
:
print
(
" "
.
join
(
args
))
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
linker
,
args
)
if
status
!=
0
:
raise
CCompilerError
(
"Linker returned status %s"
%
status
)
return
out_file
Cython/Mac/MacSystem.py
deleted
100644 → 0
View file @
0c9a42ce
#
# Pyrex -- Mac system interface
#
import
os
,
sys
import
aetools
from
aetools
import
TalkTo
from
StdSuites.Standard_Suite
import
Standard_Suite_Events
as
Standard_Suite
from
Cython.Utils
import
replace_suffix
from
Cython.Compiler.Errors
import
PyrexError
c_compiler
=
"MWCPPC"
c_optimizations
=
"off"
#c_linker = "PPCLink"
c_linker
=
"MWLinkPPC"
shared_lib_suffix
=
".slb"
#py_home = "Python2.2:Home:"
py_home
=
sys
.
exec_prefix
py_include_dirs
=
(
py_home
+
"Include:"
,
py_home
+
"Mac:Include:"
)
pythoncore
=
py_home
+
"PythonCore"
mwlibdir
=
"MPW:Interfaces&Libraries:Libraries:MWPPCLibraries:"
libraries
=
(
#mwlibdir + "'MSL C.PPC.Lib'",
#mwlibdir + "'MSL RuntimePPC.Lib'",
mwlibdir
+
"'MSL ShLibRuntime.Lib'"
,
mwlibdir
+
"InterfaceLib"
,
#mwlibdir + "MathLib",
)
class
CCompilerError
(
PyrexError
):
pass
#---------------- ToolServer ---------------------------
from
TS_Misc_Suite
import
TS_Misc_Suite
class
ToolServer
(
Standard_Suite
,
TS_Misc_Suite
,
TalkTo
):
pass
def
send_toolserver_command
(
cmd
):
ts
=
ToolServer
(
'MPSX'
,
start
=
1
)
return
ts
.
DoScript
(
cmd
)
def
do_toolserver_command
(
command
):
try
:
result
=
send_toolserver_command
(
command
)
except
aetools
.
Error
,
e
:
raise
CCompilerError
(
"Apple Event error: %s"
%
e
)
errn
,
stat
,
stdout
,
stderr
=
result
if
errn
:
raise
CCompilerError
(
"ToolServer error: %s"
%
errn
)
stdout
=
stdout
.
replace
(
"
\
r
"
,
"
\
n
"
)
stderr
=
stderr
.
replace
(
"
\
r
"
,
"
\
n
"
)
if
stdout
:
#print "<<< Begin ToolServer StdOut >>>"
sys
.
stderr
.
write
(
stdout
)
#print "<<< End ToolServer StdOut >>>"
if
stderr
:
#print "<<< Begin ToolServer StdErr >>>"
sys
.
stderr
.
write
(
stderr
)
#print "<<< End ToolServer StdErr >>>"
return
stat
#-------------------------------------------------------
def
c_compile
(
c_file
):
# Compile the given C source file to produce
# an object file. Returns the pathname of the
# resulting file.
c_file
=
os
.
path
.
join
(
os
.
getcwd
(),
c_file
)
#print "c_compile: c_file =", repr(c_file) ###
c_file_dir
=
os
.
path
.
dirname
(
c_file
)
o_file
=
replace_suffix
(
c_file
,
".o"
)
include_options
=
[
"-i %s"
%
c_file_dir
]
for
dir
in
py_include_dirs
:
include_options
.
append
(
"-i %s"
%
dir
)
command
=
"%s -opt %s -nomapcr -w off -r %s %s -o %s"
%
(
c_compiler
,
c_optimizations
,
' '
.
join
(
include_options
),
c_file
,
o_file
,
#e_file
)
#print "...command =", repr(command) ###
stat
=
do_toolserver_command
(
command
)
if
stat
:
raise
CCompilerError
(
"C compiler returned status %s"
%
stat
)
return
o_file
def
c_link
(
obj_file
):
return
c_link_list
([
obj_file
])
def
c_link_list
(
obj_files
):
# Link the given object files into a dynamically
# loadable extension file. Returns the pathname
# of the resulting file.
out_file
=
replace_suffix
(
obj_files
[
0
],
shared_lib_suffix
)
command
=
"%s -xm s -export all %s %s %s -o %s"
%
(
c_linker
,
' '
.
join
(
obj_files
),
pythoncore
,
' '
.
join
(
libraries
),
out_file
)
stat
=
do_toolserver_command
(
command
)
if
stat
:
raise
CCompilerError
(
"Linker returned status %s"
%
stat
)
return
out_file
def
test_c_compile
(
link
=
0
):
objs
=
[]
for
arg
in
sys
.
argv
[
1
:]:
if
arg
.
endswith
(
".c"
):
try
:
obj
=
c_compile
(
arg
)
except
PyrexError
,
e
:
#print "Caught a PyrexError:" ###
#print repr(e) ###
print
(
"%s.%s: %s"
%
(
e
.
__class__
.
__module__
,
e
.
__class__
.
__name__
,
e
))
sys
.
exit
(
1
)
else
:
obj
=
arg
objs
.
append
(
obj
)
if
link
:
c_link_list
(
objs
)
Cython/Mac/MacUtils.py
deleted
100644 → 0
View file @
0c9a42ce
#
# Pyrex -- Misc Mac-specific things
#
import
os
,
MacOS
,
macfs
def
open_new_file
(
path
):
# On the Mac, try to preserve Finder position
# of previously existing file.
fsspec
=
macfs
.
FSSpec
(
path
)
try
:
old_finfo
=
fsspec
.
GetFInfo
()
except
MacOS
.
Error
,
e
:
#print "MacUtils.open_new_file:", e ###
old_finfo
=
None
try
:
os
.
unlink
(
path
)
except
OSError
:
pass
file
=
open
(
path
,
"w"
)
new_finfo
=
fsspec
.
GetFInfo
()
if
old_finfo
:
#print "MacUtils.open_new_file:", path ###
#print "...old file info =", old_finfo.Creator, old_finfo.Type, old_finfo.Location ###
#print "...new file info =", new_finfo.Creator, new_finfo.Type, new_finfo.Location ###
new_finfo
.
Location
=
old_finfo
.
Location
new_finfo
.
Flags
=
old_finfo
.
Flags
# Make darn sure the type and creator are right. There seems
# to be a bug in MacPython 2.2 that screws them up sometimes.
new_finfo
.
Creator
=
"R*ch"
new_finfo
.
Type
=
"TEXT"
fsspec
.
SetFInfo
(
new_finfo
)
return
file
Cython/Mac/Makefile
deleted
100644 → 0
View file @
0c9a42ce
# Makefile for Darwin
# Change this to your Python source location
PYTHON
:=
/Local/Build/Pythonic/python/2.3
INCLUDE
:=
-I
$(PYTHON)
-I
$(PYTHON)
/Include
-I
$(PYTHON)
/Mac/Include
CCOPTS
:=
-fno-strict-aliasing
-no-cpp-precomp
\
-mno-fused-madd
-fno-common
-dynamic
LDOPTS
:=
-Wl
,-F.,-w
-bundle
-framework
Python
-framework
Carbon
all
:
_File.so
_File.o
:
_Filemodule_patched.c
gcc
-c
$(INCLUDE)
$(OPTS)
$<
-o
$@
_File.so
:
_File.o
gcc
$(LDOPTS)
$<
-o
$@
Cython/Mac/TS_Misc_Suite.py
deleted
100644 → 0
View file @
0c9a42ce
"""Suite Misc Suite: Suite that adds additional features to the Application.
Level 1, version 1
Generated from Macintosh HD:Desktop Folder:ToolServer 3.4.1:ToolServer
AETE/AEUT resource version 1/0, language 0, script 0
"""
import
aetools
import
MacOS
_code
=
'misc'
class
TS_Misc_Suite
(
object
):
def
DoScript
(
self
,
_object
,
_attributes
=
{},
**
_arguments
):
"""DoScript: Execute an MPW command, any command that could be executed from the command line can be sent as a script.
Required argument: The script to execute
Keyword argument _attributes: AppleEvent attribute dictionary
"""
_code
=
'misc'
_subcode
=
'dosc'
if
_arguments
:
raise
TypeError
(
'No optional args expected'
)
_arguments
[
'----'
]
=
_object
_reply
,
_arguments
,
_attributes
=
self
.
send
(
_code
,
_subcode
,
_arguments
,
_attributes
)
#if _arguments.has_key('errn'):
# raise aetools.Error, aetools.decodeerror(_arguments)
# XXXX Optionally decode result
#if _arguments.has_key('----'):
# return _arguments['----']
errn
=
0
stat
=
0
stdout
=
""
stderr
=
""
if
'errn'
in
_arguments
:
errn
=
_arguments
[
'errn'
]
if
errn
:
errn
=
aetools
.
decodeerror
(
_arguments
)
if
'stat'
in
_arguments
:
stat
=
_arguments
[
'stat'
]
if
'----'
in
_arguments
:
stdout
=
_arguments
[
'----'
]
if
'diag'
in
_arguments
:
stderr
=
_arguments
[
'diag'
]
return
(
errn
,
stat
,
stdout
,
stderr
)
#
# Indices of types declared in this module
#
_classdeclarations
=
{
}
_propdeclarations
=
{
}
_compdeclarations
=
{
}
_enumdeclarations
=
{
}
Cython/Mac/_Filemodule_patched.c
deleted
100644 → 0
View file @
0c9a42ce
This diff is collapsed.
Click to expand it.
Cython/Mac/__init__.py
deleted
100644 → 0
View file @
0c9a42ce
Cython/Unix/LinuxSystem.py
deleted
100644 → 0
View file @
0c9a42ce
#
# Pyrex - Linux system interface
#
verbose
=
0
gcc_pendantic
=
True
gcc_warnings_are_errors
=
True
gcc_all_warnings
=
True
import
os
,
sys
from
Cython.Utils
import
replace_suffix
from
Cython.Compiler.Errors
import
PyrexError
version
=
"%s.%s"
%
sys
.
version_info
[:
2
]
py_include_dirs
=
[
"%s/include/python%s"
%
(
sys
.
prefix
,
version
)
]
compilers
=
[
"gcc"
,
"g++"
]
compiler_options
=
\
"-g -c -fno-strict-aliasing -Wno-long-double -no-cpp-precomp "
\
"-mno-fused-madd -fno-common -dynamic "
\
.
split
()
if
gcc_pendantic
:
compiler_options
.
extend
([
"-pedantic"
,
"-Wno-long-long"
])
if
gcc_warnings_are_errors
:
compiler_options
.
append
(
"-Werror"
)
if
gcc_all_warnings
:
compiler_options
.
append
(
"-Wall"
)
compiler_options
.
append
(
"-Wno-unused-function"
)
linkers
=
[
"gcc"
,
"g++"
]
linker_options
=
\
"-shared"
\
.
split
()
class
CCompilerError
(
PyrexError
):
pass
def
c_compile
(
c_file
,
verbose_flag
=
0
,
cplus
=
0
,
obj_suffix
=
".o"
):
# Compile the given C source file to produce
# an object file. Returns the pathname of the
# resulting file.
c_file
=
os
.
path
.
join
(
os
.
getcwd
(),
c_file
)
o_file
=
replace_suffix
(
c_file
,
obj_suffix
)
include_options
=
[]
for
dir
in
py_include_dirs
:
include_options
.
append
(
"-I%s"
%
dir
)
compiler
=
compilers
[
bool
(
cplus
)]
args
=
[
compiler
]
+
compiler_options
+
include_options
+
[
c_file
,
"-o"
,
o_file
]
if
verbose_flag
or
verbose
:
print
(
" "
.
join
(
args
))
#print compiler, args ###
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
compiler
,
args
)
if
status
!=
0
:
raise
CCompilerError
(
"C compiler returned status %s"
%
status
)
return
o_file
def
c_link
(
obj_file
,
verbose_flag
=
0
,
extra_objects
=
[],
cplus
=
0
):
return
c_link_list
([
obj_file
]
+
extra_objects
,
verbose_flag
,
cplus
)
def
c_link_list
(
obj_files
,
verbose_flag
=
0
,
cplus
=
0
):
# Link the given object files into a dynamically
# loadable extension file. Returns the pathname
# of the resulting file.
out_file
=
replace_suffix
(
obj_files
[
0
],
".so"
)
linker
=
linkers
[
bool
(
cplus
)]
args
=
[
linker
]
+
linker_options
+
obj_files
+
[
"-o"
,
out_file
]
if
verbose_flag
or
verbose
:
print
(
" "
.
join
(
args
))
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
linker
,
args
)
if
status
!=
0
:
raise
CCompilerError
(
"Linker returned status %s"
%
status
)
return
out_file
Cython/Unix/__init__.py
deleted
100644 → 0
View file @
0c9a42ce
setup.py
View file @
973feb04
...
...
@@ -172,8 +172,6 @@ setup(
'Cython.Compiler'
,
'Cython.Runtime'
,
'Cython.Distutils'
,
'Cython.Mac'
,
'Cython.Unix'
,
'Cython.Plex'
,
'Cython.Tests'
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment