11# -*- coding: utf-8 -*-
2- from conans import ConanFile
32from conans import tools
43from conans .errors import ConanException
54from common import commonrecipe
65import os
76
7+
88class PythonPackageRecipe (commonrecipe .CommonRecipe ):
99 generators = "pkg_config"
1010 parallel_make = True
1111 strip_patch = 0
1212 generate_cmake = False # Python add-ons usually don't need a cmake file
1313
1414 def relative_site_package_folder (self ):
15- if not "python" in self .deps_cpp_info .deps :
15+ if "python" not in self .deps_cpp_info .deps :
1616 raise ConanException ("Python dependency not found. Does this recipe depend on python?" )
1717
1818 pv = tools .Version (self .deps_cpp_info ["python" ].version )
@@ -22,22 +22,24 @@ def relative_site_package_folder(self):
2222
2323 return f"lib/python{ pv .major } .{ pv .minor } /site-packages"
2424
25+ @property
26+ def prefer_setup_py (self ):
27+ """Returns if setup.py is used even if pyproject.toml exists."""
28+ return False
2529
2630 def requirements (self ):
2731 self .default_requirements ()
2832
29-
3033 def default_requirements (self ):
3134 channel = "@{0}/{1}" .format (self .user , self .channel )
3235 self .requires ("python/[>=3.9.7]" + channel )
3336
34-
3537 def build (self ):
3638 self .default_build ()
3739
38-
39- def default_build ( self , args = None , env_vars = {}):
40- py = tools .get_env ("MEVIS_PYTHON_CMD" , None )
40+ def default_build ( self , args = None , env_vars = None ):
41+ env_vars = env_vars or {}
42+ py = tools .get_env ("MEVIS_PYTHON_CMD" )
4143 if not py :
4244 raise ConanException ("environment variable MEVIS_PYTHON_CMD not set." )
4345
@@ -46,30 +48,42 @@ def default_build(self, args=None, env_vars={}):
4648 tools .mkdir (sitepackage )
4749
4850 cpucount = tools .cpu_count () if self .parallel_make else 1
49- build_args = "-j %s" % cpucount
51+ build_args = [ f "-j { cpucount } " ]
5052 if self .settings .build_type == "Debug" :
51- build_args = "-g " + build_args
53+ build_args += [ "-g" ]
5254
5355 if args :
54- if isinstance (args , list ):
55- build_args += " " + ' ' .join (args )
56- else :
57- build_args += " " + str (args )
56+ build_args += args
5857
59- sitepackage += (os .pathsep + tools .get_env ("PYTHONPATH" )) if tools .get_env ("PYTHONPATH" ) else ""
58+ python_path = sitepackage
59+ if tools .get_env ("PYTHONPATH" ):
60+ python_path += (os .pathsep + tools .get_env ("PYTHONPATH" ))
6061 env_vars .update ({
61- "SETUPTOOLS_SCM_PRETEND_VERSION" : self .version , # prevent setuptools_scm from trying to determine the version itself, which fails
62+ "SETUPTOOLS_SCM_PRETEND_VERSION" : self .version ,
63+ # prevent setuptools_scm from trying to determine the version itself, which fails
6264 "PKG_CONFIG_PATH" : self .build_folder ,
6365 "MAKEFLAGS" : ("-j%d" % cpucount ),
6466 "MAKEOPTS" : ("-j%d" % cpucount ),
65- "PYTHONPATH" : sitepackage
67+ "PYTHONPATH" : python_path
6668 })
69+ if self .settings .build_type == 'Debug' :
70+ # This utilizes a patch we do to setuptools to work around
71+ # a shortcoming of pyproject.toml support:
72+ env_vars ["SETUPTOOLS_BUILD_DEBUG" ] = "1"
6773
6874 with tools .environment_append (env_vars ):
6975 with tools .chdir ('sources' ):
70- self .run ("%s setup.py build %s" % (py , build_args ), run_environment = True )
71- self .run ('%s setup.py install --verbose --optimize=1 --skip-build --root=%s --prefix="%s"' % (py , '\\ ' if tools .os_info .is_windows else '/' , self .package_folder ), run_environment = True )
72-
76+ if not self .prefer_setup_py and os .path .exists ("pyproject.toml" ):
77+ build_args = [f'--install-option="{ arg } "' for arg in build_args ]
78+ cmd = (f"{ py } -m pip install --no-index -v --no-deps --no-build-isolation "
79+ f"{ ' ' .join (build_args )} --target { sitepackage } "
80+ f" { os .path .join (self .build_folder , 'sources' )} " )
81+ self .run (cmd , run_environment = True )
82+ else :
83+ self .run (f"{ py } setup.py build { ' ' .join (build_args )} " , run_environment = True )
84+ self .run (f'{ py } setup.py install --verbose --optimize=1 '
85+ f'--skip-build --root={ os .sep } --prefix="{ self .package_folder } "' ,
86+ run_environment = True )
7387
7488 def default_package_info (self ):
7589 super ().default_package_info ()
@@ -85,11 +99,12 @@ def default_package_info(self):
8599 self .env_info .PATH .append (script_dir )
86100
87101 # MEVIS_PYTHON_SITE_PACKAGES_FOLDER
88- self .output .info ('Creating MEVIS_PYTHON_SITE_PACKAGES_FOLDER environment variable: %s' % self .relative_site_package_folder ())
102+ self .output .info (
103+ 'Creating MEVIS_PYTHON_SITE_PACKAGES_FOLDER environment variable: %s' % self .relative_site_package_folder ())
89104 self .env_info .MEVIS_PYTHON_SITE_PACKAGES_FOLDER = self .relative_site_package_folder ()
90105
91106 # extend PYTHONPATH with site-package folder of this recipe
92- sp_dir = os .path .join (self .package_folder , self .relative_site_package_folder ())
107+ sp_dir = os .path .join (self .package_folder , self .relative_site_package_folder ())
93108 if os .path .exists (sp_dir ):
94- self .output .info ("Appending PYTHONPATH env var with: " + sp_dir )
95- self .env_info .PYTHONPATH .append (sp_dir )
109+ self .output .info ("Appending PYTHONPATH env var with: " + sp_dir )
110+ self .env_info .PYTHONPATH .append (sp_dir )
0 commit comments