Fix building on the usual ancient Linux distro suspects

Detect if librsync is new enough to have rs_sig_args
This commit is contained in:
Kovid Goyal 2021-09-18 10:49:46 +05:30
parent 067502bd66
commit 348e632dd6
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 20 additions and 3 deletions

View File

@ -24,11 +24,13 @@ begin_create_signature(PyObject *self UNUSED, PyObject *args) {
if (!PyArg_ParseTuple(args, "|Ll", &file_size, &sl)) return NULL;
rs_magic_number magic_number = 0;
size_t block_len = 0, strong_len = sl;
#ifdef KITTY_HAS_RS_SIG_ARGS
rs_result res = rs_sig_args(file_size, &magic_number, &block_len, &strong_len);
if (res != RS_DONE) {
PyErr_SetString(PyExc_ValueError, rs_strerror(res));
return NULL;
}
#endif
rs_job_t *job = rs_sig_begin(block_len, strong_len, magic_number);
if (!job) return PyErr_NoMemory();
PyObject *ans = PyCapsule_New(job, JOB_CAPSULE, free_job_capsule);

View File

@ -228,11 +228,11 @@ def get_sanitize_args(cc: str, ccver: Tuple[int, int]) -> List[str]:
return sanitize_args
def test_compile(cc: str, *cflags: str, src: Optional[str] = None, lang: str = 'c') -> bool:
def test_compile(cc: str, *cflags: str, src: Optional[str] = None, lang: str = 'c', link_also: bool = True, show_stderr: bool = False) -> bool:
src = src or 'int main(void) { return 0; }'
p = subprocess.Popen(
[cc] + list(cflags) + ['-x', lang, '-o', os.devnull, '-'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.PIPE,
[cc] + list(cflags) + ([] if link_also else ['-c']) + ['-x', lang, '-o', os.devnull, '-'],
stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=None if show_stderr else subprocess.DEVNULL
)
stdin = p.stdin
assert stdin is not None
@ -263,6 +263,20 @@ def set_arches(flags: List[str], arches: Iterable[str] = ('x86_64', 'arm64')) ->
flags.extend(('-arch', arch))
def detect_librsync(cc: str, cflags: List[str]) -> None:
if not test_compile(cc, '-lrsync', show_stderr=True, src='#include <librsync.h>\nint main(void) { rs_strerror(0); return 0; }'):
raise SystemExit('The librsync library is required')
if test_compile(cc, link_also=False, src='''
#include <librsync.h>
int main(void) {
rs_magic_number magic_number = 0;
size_t block_len = 0, strong_len = 0;
rs_sig_args(1024, &magic_number, &block_len, &strong_len);
return 0;
}'''):
cflags.append('-DKITTY_HAS_RS_SIG_ARGS')
def init_env(
debug: bool = False,
sanitize: bool = False,
@ -316,6 +330,7 @@ def init_env(
cflags = shlex.split(cflags_) + shlex.split(
sysconfig.get_config_var('CCSHARED') or ''
)
detect_librsync(cc, cflags)
ldflags_ = os.environ.get(
'OVERRIDE_LDFLAGS',
'-Wall ' + ' '.join(sanitize_args) + ('' if debug else ' -O3')