This is an automated email from the ASF dual-hosted git repository. astitcher pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
commit cafa64a19ecefad319050b41a47dd112b46eee44 Author: Andrew Stitcher <[email protected]> AuthorDate: Tue Apr 16 11:30:31 2024 -0400 NO-JIRA: [Python] Some small refactorings to clean package build --- .appveyor.yml | 2 +- .github/workflows/build.yml | 3 +- azure-pipelines/steps.yml | 2 +- python/CMakeLists.txt | 1 + python/MANIFEST.in | 1 + python/{requirements.txt => ci_requirements.txt} | 1 + python/cproton_ext.c | 103 +++++++++++++++++++++++ python/ext_build.py | 100 +++------------------- 8 files changed, 120 insertions(+), 93 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 3de159312..ab07c58bf 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -29,7 +29,7 @@ install: - vcpkg integrate install # https://pythonhosted.org/CodeChat/appveyor.yml.html - "%PYTHON%\\python.exe -m pip install --user --upgrade pip" -- "%PYTHON%\\python.exe -m pip install --user --upgrade setuptools wheel tox flake8" +- "%PYTHON%\\python.exe -m pip install --user --upgrade -r python/ci_requirements.txt" cache: - C:\ProgramData\chocolatey\bin -> .appveyor.yml - C:\ProgramData\chocolatey\lib -> .appveyor.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fbbbb6d90..0633585bf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,12 +32,13 @@ jobs: - name: Setup python uses: actions/setup-python@v5 with: + cache-dependency-path: python/ci_requirements.txt python-version: 3.9 architecture: x64 cache: 'pip' - name: Install python dependencies run: | - python -m pip install --upgrade -r python/requirements.txt + python -m pip install --upgrade -r python/ci_requirements.txt - name: Install Linux dependencies if: runner.os == 'Linux' run: | diff --git a/azure-pipelines/steps.yml b/azure-pipelines/steps.yml index 821f85ddf..4ec0efae5 100644 --- a/azure-pipelines/steps.yml +++ b/azure-pipelines/steps.yml @@ -6,7 +6,7 @@ steps: architecture: $(PythonArch) - script: | python -m pip install --user --upgrade pip - python -m pip install --user --upgrade setuptools wheel tox flake8 + python -m pip install --user --upgrade -r python/ci_requirements.txt name: InstallPythonModules - task: CMake@1 name: CMakeConfigure diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index deb74a8c6..8978c0b73 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -55,6 +55,7 @@ set(py_dist_files MANIFEST.in ext_build.py cproton.h + cproton_ext.c cproton.py docs/conf.py docs/index.rst diff --git a/python/MANIFEST.in b/python/MANIFEST.in index b99a0e8dc..2c2e5af0b 100644 --- a/python/MANIFEST.in +++ b/python/MANIFEST.in @@ -1,6 +1,7 @@ include VERSION.txt include ext_build.py include cproton.h +include cproton_ext.c include cproton.py graft docs graft src diff --git a/python/requirements.txt b/python/ci_requirements.txt similarity index 89% rename from python/requirements.txt rename to python/ci_requirements.txt index 7f92aa2bd..9b0ec6a7f 100644 --- a/python/requirements.txt +++ b/python/ci_requirements.txt @@ -1,4 +1,5 @@ pip +build setuptools wheel flake8 diff --git a/python/cproton_ext.c b/python/cproton_ext.c new file mode 100644 index 000000000..a80ecc688 --- /dev/null +++ b/python/cproton_ext.c @@ -0,0 +1,103 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +#include "proton/version.h" +#include "proton/types.h" +#include "proton/object.h" +#include "proton/error.h" +#include "proton/condition.h" +#include "proton/connection.h" +#include "proton/session.h" +#include "proton/link.h" +#include "proton/terminus.h" +#include "proton/delivery.h" +#include "proton/disposition.h" +#include "proton/transport.h" +#include "proton/event.h" +#include "proton/message.h" +#include "proton/sasl.h" +#include "proton/ssl.h" +#include "proton/codec.h" +#include "proton/connection_driver.h" +#include "proton/cid.h" + +static void pn_pyref_incref(void *object); +static void pn_pyref_decref(void *object); + +static int pn_pyref_refcount(void *object) { + return 1; +} + +pn_connection_t *pn_cast_pn_connection(void *x) { return (pn_connection_t *) x; } +pn_session_t *pn_cast_pn_session(void *x) { return (pn_session_t *) x; } +pn_link_t *pn_cast_pn_link(void *x) { return (pn_link_t *) x; } +pn_delivery_t *pn_cast_pn_delivery(void *x) { return (pn_delivery_t *) x; } +pn_transport_t *pn_cast_pn_transport(void *x) { return (pn_transport_t *) x; } + +static pn_class_t* PN_PYREF; +PN_HANDLE(PN_PYCTX); + +static pn_class_t* pn_create_pyref() { + return pn_class_create("pn_pyref", NULL, NULL, pn_pyref_incref, pn_pyref_decref, pn_pyref_refcount); +} + +pn_event_t *pn_collector_put_py(pn_collector_t *collector, void *context, pn_event_type_t type) { + return pn_collector_put(collector, PN_PYREF, context, type); +} + +void pn_record_def_py(pn_record_t *record) { + pn_record_def(record, PN_PYCTX, PN_PYREF); +} + +void *pn_record_get_py(pn_record_t *record) { + return pn_record_get(record, PN_PYCTX); +} + +void pn_record_set_py(pn_record_t *record, void *value) { + pn_record_set(record, PN_PYCTX, value); +} + +ssize_t pn_message_encode_py(pn_message_t *msg, char *bytes, size_t size) { + int err = pn_message_encode(msg, bytes, &size); + if (err == 0) return size; + else return err; +} + +ssize_t pn_data_format_py(pn_data_t *data, char *bytes, size_t size) { + int err = pn_data_format(data, bytes, &size); + if (err == 0) return size; + else return err; +} + +int pn_ssl_get_peer_hostname_py(pn_ssl_t *ssl, char *hostname, size_t size) { + return pn_ssl_get_peer_hostname(ssl, hostname, &size); +} + +const char *pn_event_class_name_py(pn_event_t *event) { + const pn_class_t *class = pn_event_class(event); + return class ? pn_class_name(class) : 0; +} + +void init() { + PN_PYREF = pn_create_pyref(); +} + + diff --git a/python/ext_build.py b/python/ext_build.py index b1b39048c..fa53e7de0 100644 --- a/python/ext_build.py +++ b/python/ext_build.py @@ -32,14 +32,16 @@ ffibuilder = FFI() cdefs = open('cproton.h').read() ffibuilder.cdef(cdefs) +sources = [] +extra = [] +libraries = [] +pkgconfig = [] + proton_base = '.' proton_c_src = os.path.join(proton_base, 'src') proton_core_src = os.path.join(proton_c_src, 'core') proton_c_include = os.path.join(proton_base, 'include') -sources = [] -extra = [] -libraries = [] for root, dirs, files in os.walk(proton_core_src): dirs.sort() # needed for os.walk to process directories in deterministic order files.sort() @@ -60,13 +62,13 @@ elif os.name == 'posix': sources.append(os.path.join(proton_c_src, 'sasl', 'sasl.c')) sources.append(os.path.join(proton_c_src, 'sasl', 'default_sasl.c')) -pkgconfig = [] if os.name == 'nt': libraries += ['crypt32', 'secur32'] sources.append(os.path.join(proton_c_src, 'ssl', 'schannel.cpp')) else: try: - ssl_pkgcfg = cffi.pkgconfig.flags_from_pkgconfig(['openssl']) + # This is just used to test if pkgconfig finds openssl, if not it will throw + cffi.pkgconfig.flags_from_pkgconfig(['openssl']) sources.append(os.path.join(proton_c_src, 'ssl', 'openssl.c')) pkgconfig.append('openssl') except cffi.pkgconfig.PkgConfigError: @@ -75,7 +77,8 @@ else: # Stub sasl try: - sasl_pkgcfg = cffi.pkgconfig.flags_from_pkgconfig(['libsasl2']) + # This is just used to test if pkgconfig finds cyrus sasl, if not it will throw + cffi.pkgconfig.flags_from_pkgconfig(['libsasl2']) sources.append(os.path.join(proton_c_src, 'sasl', 'cyrus_sasl.c')) pkgconfig.append('libsasl2') except cffi.pkgconfig.PkgConfigError: @@ -84,90 +87,7 @@ except cffi.pkgconfig.PkgConfigError: include_dirs = [proton_c_include, proton_c_src] macros = [('PROTON_DECLARE_STATIC', None)] -c_code = r""" -#include "proton/version.h" -#include "proton/types.h" -#include "proton/object.h" -#include "proton/error.h" -#include "proton/condition.h" -#include "proton/connection.h" -#include "proton/session.h" -#include "proton/link.h" -#include "proton/terminus.h" -#include "proton/delivery.h" -#include "proton/disposition.h" -#include "proton/transport.h" -#include "proton/event.h" -#include "proton/message.h" -#include "proton/sasl.h" -#include "proton/ssl.h" -#include "proton/codec.h" -#include "proton/connection_driver.h" -#include "proton/cid.h" - -static void pn_pyref_incref(void *object); -static void pn_pyref_decref(void *object); - -static int pn_pyref_refcount(void *object) { - return 1; -} - -pn_connection_t *pn_cast_pn_connection(void *x) { return (pn_connection_t *) x; } -pn_session_t *pn_cast_pn_session(void *x) { return (pn_session_t *) x; } -pn_link_t *pn_cast_pn_link(void *x) { return (pn_link_t *) x; } -pn_delivery_t *pn_cast_pn_delivery(void *x) { return (pn_delivery_t *) x; } -pn_transport_t *pn_cast_pn_transport(void *x) { return (pn_transport_t *) x; } - -static pn_class_t* PN_PYREF; -PN_HANDLE(PN_PYCTX); - -static pn_class_t* pn_create_pyref() { - return pn_class_create("pn_pyref", NULL, NULL, pn_pyref_incref, pn_pyref_decref, pn_pyref_refcount); -} - -pn_event_t *pn_collector_put_py(pn_collector_t *collector, void *context, pn_event_type_t type) { - return pn_collector_put(collector, PN_PYREF, context, type); -} - -void pn_record_def_py(pn_record_t *record) { - pn_record_def(record, PN_PYCTX, PN_PYREF); -} - -void *pn_record_get_py(pn_record_t *record) { - return pn_record_get(record, PN_PYCTX); -} - -void pn_record_set_py(pn_record_t *record, void *value) { - pn_record_set(record, PN_PYCTX, value); -} - -ssize_t pn_message_encode_py(pn_message_t *msg, char *bytes, size_t size) { - int err = pn_message_encode(msg, bytes, &size); - if (err == 0) return size; - else return err; -} - -ssize_t pn_data_format_py(pn_data_t *data, char *bytes, size_t size) { - int err = pn_data_format(data, bytes, &size); - if (err == 0) return size; - else return err; -} - -int pn_ssl_get_peer_hostname_py(pn_ssl_t *ssl, char *hostname, size_t size) { - return pn_ssl_get_peer_hostname(ssl, hostname, &size); -} - -const char *pn_event_class_name_py(pn_event_t *event) { - const pn_class_t *class = pn_event_class(event); - return class ? pn_class_name(class) : 0; -} - -void init() { - PN_PYREF = pn_create_pyref(); -} - - -""" +c_code = open('cproton_ext.c').read() if len(pkgconfig) == 0: ffibuilder.set_source( --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
