diff --git a/build.py b/build.py index be0312e97..8673e4234 100755 --- a/build.py +++ b/build.py @@ -46,7 +46,6 @@ getVcsRev, runcmd, textfile_open, getSipFiles, \ getVisCVersion, getToolsPlatformName, updateLicenseFiles, \ TemporaryDirectory -from buildtools.wxpysip import sip_runner import buildtools.version as version @@ -1263,7 +1262,7 @@ def cmd_sip(options, args): base = os.path.basename(os.path.splitext(src_name)[0]) sbf = posixjoin(cfg.SIPOUT, base) + '.sbf' pycode = base[1:] # remove the leading _ - pycode = posixjoin(cfg.PKGDIR, pycode) + '.py' + pycode = opj(cfg.ROOT_DIR, cfg.PKGDIR, pycode) + '.py' # Check if any of the included files are newer than the .sbf file # produced by the previous run of sip. If not then we don't need to @@ -1281,23 +1280,54 @@ def cmd_sip(options, args): # module's .py file pycode = 'pycode'+base+':'+pycode - sip_runner(src_name, - abi_version = cfg.SIP_ABI, # siplib abi version - warnings = True, # enable warning messages - docstrings = True, # enable the automatic generation of docstrings - release_gil = True, # always release and reacquire the GIL - sip_module = 'wx.siplib', # the fully qualified name of the sip module - sbf_file=sbf, # File to write the generated file lists to - exceptions = False, # enable support for exceptions - tracing = cfg.SIP_TRACE, # generate code with tracing enabled - sources_dir = tmpdir, # the name of the code directory - extracts = [pycode], # add to the list of extracts to generate - pyi_extract=pyi_extract, # the name of the .pyi stub file - include_dirs = [ - os.path.join(phoenixDir(), 'src'), - os.path.join(phoenixDir(), 'sip', 'gen'), - ]) - + # Write out a pyproject.toml to configure sip + pyproject_toml = ( + '[build-system]\n' + 'requires = ["sip >=5.5.0, <7"]\n' + 'build-backend = "sipbuild.api"\n' + '\n' + '[tool.sip.metadata]\n' + 'name = "{base}"\n' + '\n' + '[tool.sip.bindings.{base}]\n' + 'docstrings = true\n' + 'release-gil = true\n' + 'exceptions = false\n' + 'tracing = {tracing}\n' + 'protected-is-public = false\n' + 'generate-extracts = [\'{extracts}\']\n' + 'pep484-pyi = false\n' + '\n' + '[tool.sip.project]\n' + 'abi-version = "{abi_version}"\n' + 'sip-files-dir = \'{sip_gen_dir}\'\n' + 'sip-include-dirs = [\'{src_dir}\']\n' + 'sip-module = "wx.siplib"\n' + ).format( + base=base, + abi_version=cfg.SIP_ABI, + tracing=str(cfg.SIP_TRACE).lower(), + extracts=pycode, + src_dir=opj(phoenixDir(), 'src'), + sip_gen_dir=opj(phoenixDir(), 'sip', 'gen'), + ) + with open(opj(tmpdir, 'pyproject.toml'), 'w') as f: + f.write(pyproject_toml) + + sip_pwd = pushDir(tmpdir) + cmd = 'sip-build --no-compile' + runcmd(cmd) + del sip_pwd + + # Write out a sip build file (no longer done by sip itself) + sip_tmp_out_dir = opj(tmpdir, 'build', base) + sip_pwd = pushDir(sip_tmp_out_dir) + header = glob.glob('*.h')[0] + sources = glob.glob('*.cpp') + del sip_pwd + with open(sbf, 'w') as f: + f.write("sources = {}\n".format(' '.join(sources))) + f.write("headers = {}\n".format(header)) classesNeedingClassInfo = { 'sip_corewxTreeCtrl.cpp' : 'wxTreeCtrl', } @@ -1306,7 +1336,7 @@ def processSrc(src, keepHashLines=False): srcTxt = f.read() if keepHashLines: # Either just fix the pathnames in the #line lines... - srcTxt = srcTxt.replace(tmpdir, cfg.SIPOUT) + srcTxt = srcTxt.replace(sip_tmp_out_dir, cfg.SIPOUT) else: # ...or totally remove them by replacing those lines with '' import re @@ -1337,7 +1367,7 @@ def injectClassInfo(className, srcTxt): # Check each file in tmpdir to see if it is different than the same file # in cfg.SIPOUT. If so then copy the new one to cfg.SIPOUT, otherwise # ignore it. - for src in glob.glob(tmpdir + '/*'): + for src in glob.glob(sip_tmp_out_dir + '/*'): dest = opj(cfg.SIPOUT, os.path.basename(src)) if not os.path.exists(dest): msg('%s is a new file, copying...' % os.path.basename(src)) @@ -1360,6 +1390,17 @@ def injectClassInfo(className, srcTxt): # Remove tmpdir and its contents shutil.rmtree(tmpdir) + # Generate sip module code + deleteIfExists(cfg.SIPINC) + with tempfile.TemporaryDirectory() as tmpdir: + cmd = 'sip-module --sdist --abi-version {} --target-dir {} wx.siplib'.format(cfg.SIP_ABI, tmpdir) + runcmd(cmd) + tf_name = glob.glob(tmpdir + '/*.tar*')[0] + tf_dir = os.path.splitext(os.path.splitext(tf_name)[0])[0] + with tarfile.open(tf_name) as tf: + tf.extractall(tmpdir) + shutil.move(tf_dir, cfg.SIPINC) + def cmd_touch(options, args): cmdTimer = CommandTimer('touch') diff --git a/wscript b/wscript index 4f0d0bf5f..80306098d 100644 --- a/wscript +++ b/wscript @@ -563,12 +563,12 @@ def build(bld): features = 'c cxx cshlib cxxshlib pyext', target = makeTargetName(bld, 'siplib'), source = ['sip/siplib/apiversions.c', - 'sip/siplib/array.c', 'sip/siplib/bool.cpp', 'sip/siplib/descriptors.c', 'sip/siplib/int_convertors.c', 'sip/siplib/objmap.c', 'sip/siplib/qtlib.c', + 'sip/siplib/sip_array.c', 'sip/siplib/siplib.c', 'sip/siplib/threads.c', 'sip/siplib/voidptr.c',