From 169f8748baa7a80b616132265638ceae10de0158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Wed, 22 Feb 2023 23:23:22 +0100 Subject: [PATCH 1/4] libnm: Specify the main header in the .gir file Bindings compiling to C need to know which main header to include. --- Makefile.am | 2 +- src/libnm-client-impl/meson.build | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 49411f8c36..7fc7804775 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2019,7 +2019,7 @@ src_libnm_client_impl_NM_1_0_gir_FILES = \ $(libnm_lib_h_pub_real) \ $(src_libnm_client_public_mkenums_c) \ $(libnm_lib_c_real) -src_libnm_client_impl_NM_1_0_gir_SCANNERFLAGS = --warn-all --identifier-prefix=NM --symbol-prefix=nm +src_libnm_client_impl_NM_1_0_gir_SCANNERFLAGS = --warn-all --identifier-prefix=NM --symbol-prefix=nm --c-include="NetworkManager.h" src/libnm-client-impl/libnm.typelib: src/libnm-client-impl/libnm.gir $(INTROSPECTION_COMPILER) --includedir=$(srcdir)/src/libnm-core-public --includedir=$(builddir)/src/libnm-core-public --includedir=$(srcdir)/libnm-client-public --includedir=$(builddir)/libnm-client-public $< -o $@ diff --git a/src/libnm-client-impl/meson.build b/src/libnm-client-impl/meson.build index 143126c51a..fb879dca47 100644 --- a/src/libnm-client-impl/meson.build +++ b/src/libnm-client-impl/meson.build @@ -142,6 +142,7 @@ if enable_introspection src_inc, top_inc, ], + header: 'NetworkManager.h', dependencies: [ declare_dependency( compile_args: [ From e0b2123c2c2656b590cb608fea5bea211ce3e5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Wed, 22 Feb 2023 23:27:33 +0100 Subject: [PATCH 2/4] libnm/connection: Add missing annotations to nm_connection_diff Allows to use this function in GObject introspected languages. Also workaround a current issue with the gtk-doc parser not taking nested element-type into account. --- src/libnm-core-impl/nm-connection.c | 33 +++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/libnm-core-impl/nm-connection.c b/src/libnm-core-impl/nm-connection.c index 3a9eda0e18..994f08d5d2 100644 --- a/src/libnm-core-impl/nm-connection.c +++ b/src/libnm-core-impl/nm-connection.c @@ -759,15 +759,18 @@ diff_one_connection(NMConnection *a, return diff_found; } +/* Required until https://gitlab.gnome.org/GNOME/gtk-doc/-/merge_requests/71 */ +#ifndef __GTK_DOC_IGNORE__ /** * nm_connection_diff: * @a: a #NMConnection * @b: a second #NMConnection to compare with the first * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT - * @out_settings: (element-type utf8 GLib.HashTable): if the - * connections differ, on return a hash table mapping setting names to - * second-level GHashTable (utf8 to guint32), which contains the key names that - * differ mapped to one or more of %NMSettingDiffResult as a bitfield + * @out_settings: (out) (element-type utf8 GLib.HashTable) + * (optional) (allow-none): if the connections differ, on return a hash table + * mapping setting names to second-level GHashTable (utf8 to guint32), which + * contains the key names that differ mapped to one or more of + * %NMSettingDiffResult as a bitfield * * Compares two #NMConnection objects for similarity, with comparison behavior * modified by a set of flags. See nm_setting_compare() for a description of @@ -778,6 +781,28 @@ diff_one_connection(NMConnection *a, * Returns: %TRUE if the connections contain the same values, %FALSE if they do * not **/ +#else +/** + * nm_connection_diff: + * @a: a #NMConnection + * @b: a second #NMConnection to compare with the first + * @flags: compare flags, e.g. %NM_SETTING_COMPARE_FLAG_EXACT + * @out_settings: (out) (element-type utf8 GLib.HashTable<utf8,uint32>) + * (optional) (nullable): if the connections differ, on return a hash table + * mapping setting names to second-level GHashTable (utf8 to guint32), which + * contains the key names that differ mapped to one or more of + * %NMSettingDiffResult as a bitfield + * + * Compares two #NMConnection objects for similarity, with comparison behavior + * modified by a set of flags. See nm_setting_compare() for a description of + * each flag's behavior. If the connections differ, settings and keys within + * each setting that differ are added to the returned @out_settings hash table. + * No values are returned, only key names. + * + * Returns: %TRUE if the connections contain the same values, %FALSE if they do + * not + **/ +#endif gboolean nm_connection_diff(NMConnection *a, NMConnection *b, From 4d325bafe193dc1fc4fbd0beabae7bb6ab8901bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Wed, 22 Feb 2023 23:28:44 +0100 Subject: [PATCH 3/4] vapi: Add several namespace changes and more specific types for properties Add overrides for properties constants of new objects to allow to match them with their object type as it was the case for former objects. Specify the types of properties with element-types. Namespace Attributes so that they are logically sorted. Remove several skips to allow to use the entirety of the visible methods. --- vapi/NM-1.0.metadata | 96 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 20 deletions(-) diff --git a/vapi/NM-1.0.metadata b/vapi/NM-1.0.metadata index a86d4632ff..48df877b51 100644 --- a/vapi/NM-1.0.metadata +++ b/vapi/NM-1.0.metadata @@ -4,82 +4,138 @@ * The API is still unstable */ -* cheader_filename="NetworkManager.h" - +Client.new_async name="new_@async" +Device.lldp_neighbors type="GLib.GenericArray" +Device.ports type="GLib.GenericArray" DeviceWifi.request_scan_options_async finish_name="nm_device_wifi_request_scan_finish" -Setting.get_secret_flags#virtual_method skip -Setting.set_secret_flags#virtual_method skip -Setting.verify#virtual_method skip -VpnEditorPlugin.get_vt#virtual_method skip +IPConfig.addresses type="GLib.GenericArray" +VpnEditorPlugin.get_vt#virtual_method name="get_vt_impl" +.out_vt_size out +SETTING_NAME parent="NM.Setting" + +SETTING_6LOWPAN_* parent="NM.Setting6Lowpan" name="SETTING_6LOWPAN_(.+)" SETTING_802_1X_* parent="NM.Setting8021x" name="SETTING_802_1X_(.+)" SETTING_ADSL_* parent="NM.SettingAdsl" name="SETTING_ADSL_(.+)" SETTING_BLUETOOTH_* parent="NM.SettingBluetooth" name="SETTING_BLUETOOTH_(.+)" +SETTING_BOND_PORT_* parent="NM.SettingBondPort" name="SETTING_BOND_PORT_(.+)" SETTING_BOND_* parent="NM.SettingBond" name="SETTING_BOND_(.+)" +SETTING_BRIDGE_PORT_* parent="NM.SettingBridgePort" name="SETTING_BRIDGE_PORT_(.+)" SETTING_BRIDGE_* parent="NM.SettingBridge" name="SETTING_BRIDGE_(.+)" SETTING_CDMA_* parent="NM.SettingCdma" name="SETTING_CDMA_(.+)" SETTING_CONNECTION_* parent="NM.SettingConnection" name="SETTING_CONNECTION_(.+)" SETTING_DCB_* parent="NM.SettingDcb" name="SETTING_DCB_(.+)" +SETTING_DNS_OPTION_* parent="NM.SettingDnsOption" name="SETTING_DNS_OPTION_(.+)" +SETTING_DUMMY_* parent="NM.SettingDummy" name="SETTING_DUMMY_(.+)" +SETTING_ETHTOOL_* parent="NM.SettingEthtool" name="SETTING_ETHTOOL_(.+)" SETTING_GENERIC_* parent="NM.SettingGeneric" name="SETTING_GENERIC_(.+)" SETTING_GSM_* parent="NM.SettingGsm" name="SETTING_GSM_(.+)" +SETTING_HOSTNAME_* parent="NM.SettingHostname" name="SETTING_HOSTNAME_(.+)" SETTING_INFINIBAND_* parent="NM.SettingInfiniband" name="SETTING_INFINIBAND_(.+)" SETTING_IP4_CONFIG_* parent="NM.SettingIP4Config" name="SETTING_IP4_CONFIG_(.+)" SETTING_IP6_CONFIG_* parent="NM.SettingIP6Config" name="SETTING_IP6_CONFIG_(.+)" SETTING_IP_CONFIG_* parent="NM.SettingIPConfig" name="SETTING_IP_CONFIG_(.+)" SETTING_IP_TUNNEL_* parent="NM.SettingIPTunnel" name="SETTING_IP_TUNNEL_(.+)" +SETTING_LOOPBACK_* parent="NM.SettingLoopback" name="SETTING_LOOPBACK_(.+)" +SETTING_MACSEC_* parent="NM.SettingMacsec" name="SETTING_MACSEC_(.+)" SETTING_MACVLAN_* parent="NM.SettingMacvlan" name="SETTING_MACVLAN_(.+)" +SETTING_MATCH_* parent="NM.SettingMatch" name="SETTING_MATCH_(.+)" SETTING_OLPC_MESH_* parent="NM.SettingOlpcMesh" name="SETTING_OLPC_MESH_(.+)" +SETTING_OVS_BRIDGE_* parent="NM.SettingOvsBridge" name="SETTING_OVS_BRIDGE_(.+)" +SETTING_OVS_DPDK_* parent="NM.SettingOvsDpdk" name="SETTING_OVS_DPDK_(.+)" +SETTING_OVS_EXTERNAL_IDS_* parent="NM.SettingOvsExternalIDs" name="SETTING_OVS_EXTERNAL_IDS_(.+)" +SETTING_OVS_INTERFACE_* parent="NM.SettingOvsInterface" name="SETTING_OVS_INTERFACE_(.+)" +SETTING_OVS_OTHER_CONFIG_* parent="NM.SettingOvsOtherConfig" name="SETTING_OVS_OTHER_CONFIG_(.+)" +SETTING_OVS_PATCH_* parent="NM.SettingOvsPatch" name="SETTING_OVS_PATCH_(.+)" +SETTING_OVS_PORT_* parent="NM.SettingOvsPort" name="SETTING_OVS_PORT_(.+)" +SETTING_PARAM_* parent="NM.Setting" name="SETTING_PARAM_(.+)" SETTING_PPPOE_* parent="NM.SettingPppoe" name="SETTING_PPPOE_(.+)" SETTING_PPP_* parent="NM.SettingPpp" name="SETTING_PPP_(.+)" SETTING_PROXY_* parent="NM.SettingProxy" name="SETTING_PROXY_(.+)" SETTING_SERIAL_* parent="NM.SettingSerial" name="SETTING_SERIAL_(.+)" +SETTING_SRIOV_* parent="NM.SettingSriov" name="SETTING_SRIOV_(.+)" +SETTING_TC_CONFIG_* parent="NM.SettingTCConfig" name="SETTING_TC_CONFIG_(.+)" +SETTING_TEAM_PORT_* parent="NM.SettingTeamPort" name="SETTING_TEAM_PORT_(.+)" SETTING_TEAM_* parent="NM.SettingTeam" name="SETTING_TEAM_(.+)" SETTING_TUN_* parent="NM.SettingTun" name="SETTING_TUN_(.+)" +SETTING_USER_* parent="NM.SettingUser" name="SETTING_USER_(.+)" +SETTING_VETH_* parent="NM.SettingVeth" name="SETTING_VETH_(.+)" SETTING_VLAN_* parent="NM.SettingVlan" name="SETTING_VLAN_(.+)" SETTING_VPN_* parent="NM.SettingVpn" name="SETTING_VPN_(.+)" +SETTING_VRF_* parent="NM.SettingVrf" name="SETTING_VRF_(.+)" SETTING_VXLAN_* parent="NM.SettingVxlan" name="SETTING_VXLAN_(.+)" SETTING_WIFI_P2P_* parent="NM.SettingWifiP2P" name="SETTING_WIFI_P2P_(.+)" SETTING_WIMAX_* parent="NM.SettingWimax" name="SETTING_WIMAX_(.+)" SETTING_WIRED_* parent="NM.SettingWired" name="SETTING_WIRED_(.+)" SETTING_WIREGUARD_* parent="NM.SettingWireGuard" name="SETTING_WIREGUARD_(.+)" SETTING_WIRELESS_* parent="NM.SettingWireless" name="SETTING_WIRELESS_(.+)" +SETTING_WIRELESS_SECURITY_* parent="NM.SettingWirelessSecurity" name="SETTING_WIRELESS_SECURITY_(.+)" +SETTING_WPAN_* parent="NM.SettingWpan" name="SETTING_WPAN_(.+)" -VPN_* parent="NM.Vpn" name="VPN_(.+)" +WIREGUARD_*_KEY_LEN parent="NM.SettingWireGuard" name="WIREGUARD_(.+)" connection_error_quark parent="NM.Connection" name="connection_(.+)" -SETTING_PARAM_* parent="NM.Setting" name="SETTING_PARAM_(.+)" utils_* parent="NM.Utils" name="utils_(.+)" UTILS_* parent="NM.Utils" name="UTILS_(.+)" UtilsSecurityType parent="NM.Utils" name="SecurityType" -Client.new_finish symbol_type="function" - -ACTIVE_CONNECTION_* parent="NM.ActiveConnection" name="ACTIVE_CONNECTION_(.+)" -CLIENT_* parent="NM.Client" name="CLIENT_(.+)" ACCESS_POINT_* parent="NM.AccessPoint" name="ACCESS_POINT_(.+)" +ACTIVE_CONNECTION_* parent="NM.ActiveConnection" name="ACTIVE_CONNECTION_(.+)" +BRIDGE_VLAN_* parent="NM.BridgeVlan" name="BRIDGE_VLAN_(.+)" +CHECKPOINT_* parent="NM.Checkpoint" name="CHECKPOINT_(.+)" +CLIENT_* parent="NM.Client" name="CLIENT_(.+)" +CONNECTION_* parent="NM.Connection" name="CONNECTION_(.+)" +DHCP_CONFIG_* parent="NM.DhcpConfig" name="DHCP_CONFIG_(.+)" +IP_ADDRESS_ATTRIBUTE_* parent="NM.IPAddress" name="IP_ADDRESS_(.+)" +IP_CONFIG_* parent="NM.IPConfig" name="IP_CONFIG_(.+)" +IP_ROUTE_ATTRIBUTE_* parent="NM.IpRouteAttributes" name="IP_ROUTE_ATTRIBUTE_(.+)" +LLDP_ATTR_* parent="NM.LldpAttributes" name="LLDP_ATTR_(.+)" +OBJECT_* parent="NM.Object" name="OBJECT_(.+)" +REMOTE_CONNECTION_* parent="NM.RemoteConnection" name="REMOTE_CONNECTION_(.+)" +SECRET_AGENT_OLD_* parent="NM.SecretAgentOld" name="SECRET_AGENT_OLD_(.+)" +SRIOV_VF_ATTRIBUTE_* parent="NM.SriovVfAttributes" name="SRIOV_VF_ATTRIBUTE_(.+)" +TEAM_LINK_WATCHER_* parent="NM.TeamLinkWatcher" name="TEAM_LINK_WATCHER_(.+)" +VPN_* parent="NM.Vpn" name="VPN_(.+)" +VPN_CONNECTION_* parent="NM.VpnConnection" name="VPN_CONNECTION_(.+)" +WIFI_P2P_PEER_* parent="NM.WifiP2PPeer" name="WIFI_P2P_PEER_(.+)" +WIMAX_NSP_* parent="NM.WimaxNsp" name="WIMAX_NSP_(.+)" +WIREGUARD_PEER_ATTR_* parent="NM.WireguardPeerAttributes" name="WIREGUARD_PEER_ATTR_(.+)" -DEVICE_* parent="NM.Device" name="DEVICE_(.+)" +DEVICE_6LOWPAN_* parent="NM.Device6Lowpan" name="DEVICE_6LOWPAN_(.+)" DEVICE_ADSL_* parent="NM.DeviceAdsl" name="DEVICE_ADSL_(.+)" DEVICE_BOND_* parent="NM.DeviceBond" name="DEVICE_BOND_(.+)" DEVICE_BRIDGE_* parent="NM.DeviceBridge" name="DEVICE_BRIDGE_(.+)" DEVICE_BT_* parent="NM.DeviceBt" name="DEVICE_BT_(.+)" +DEVICE_DUMMY_* parent="NM.DeviceDummy" name="DEVICE_DUMMY_(.+)" DEVICE_ETHERNET_* parent="NM.DeviceEthernet" name="DEVICE_ETHERNET_(.+)" DEVICE_GENERIC_* parent="NM.DeviceGeneric" name="DEVICE_GENERIC_(.+)" -DEVICE_TEAM_* parent="NM.DeviceTeam" name="DEVICE_TEAM_(.+)" DEVICE_INFINIBAND_* parent="NM.DeviceInfiniband" name="DEVICE_INFINIBAND_(.+)" +DEVICE_IP_TUNNEL_* parent="NM.DeviceIPTunnel" name="DEVICE_IP_TUNNEL_(.+)" +DEVICE_LOOPBACK_* parent="NM.DeviceLoopback" name="DEVICE_LOOPBACK_(.+)" +DEVICE_MACSEC_* parent="NM.DeviceMacsec" name="DEVICE_MACSEC_(.+)" +DEVICE_MACVLAN_* parent="NM.DeviceMacvlan" name="DEVICE_MACVLAN_(.+)" DEVICE_MODEM_* parent="NM.DeviceModem" name="DEVICE_MODEM_(.+)" DEVICE_OLPC_MESH_* parent="NM.DeviceOlpcMesh" name="DEVICE_OLPC_(.+)" +DEVICE_OVS_BRIDGE_* parent="NM.DeviceOvsBridge" name="DEVICE_OVS_BRIDGE_(.+)" +DEVICE_OVS_INTERFACE_* parent="NM.DeviceOvsInterface" name="DEVICE_OVS_INTERFACE_(.+)" +DEVICE_OVS_PORT_* parent="NM.DeviceOvsPort" name="DEVICE_OVS_PORT_(.+)" +DEVICE_PPP_* parent="NM.DevicePpp" name="DEVICE_PPP_(.+)" +DEVICE_TEAM_* parent="NM.DeviceTeam" name="DEVICE_TEAM_(.+)" +DEVICE_TUN_* parent="NM.DeviceTun" name="DEVICE_TUN_(.+)" +DEVICE_VETH_* parent="NM.DeviceVeth" name="DEVICE_VETH_(.+)" DEVICE_VLAN_* parent="NM.DeviceVlan" name="DEVICE_VLAN_(.+)" +DEVICE_VRF_* parent="NM.DeviceVrf" name="DEVICE_VRF_(.+)" +DEVICE_VXLAN_* parent="NM.DeviceVxlan" name="DEVICE_VXLAN_(.+)" DEVICE_WIFI_* parent="NM.DeviceWifi" name="DEVICE_WIFI_(.+)" +DEVICE_WIFI_P2P_* parent="NM.DeviceWifiP2P" name="DEVICE_WIFI_P2P_(.+)" DEVICE_WIMAX_* parent="NM.DeviceWimax" name="DEVICE_WIMAX_(.+)" DEVICE_WIREGUARD_* parent="NM.DeviceWireGuard" name="DEVICE_WIREGUARD_(.+)" +DEVICE_WPAN_* parent="NM.DeviceWpan" name="DEVICE_WPAN_(.+)" +DEVICE_* parent="NM.Device" name="DEVICE_(.+)" -DHCP_CONFIG_OPTIONS parent="NM.DhcpConfig" name="DHCP_CONFIG_(.+)" -IP_CONFIG_* parent="NM.IPConfig" name="IP_CONFIG_(.+)" -OBJECT_* parent="NM.Object" name="OBJECT_(.+)" -REMOTE_CONNECTION_* parent="NM.RemoteConnection" name="REMOTE_CONNECTION_(.+)" -VPN_CONNECTION_* parent="NM.VpnConnection" name="VPN_CONNECTION_(.+)" -WIMAX_NSP_* parent="NM.WimaxNsp" name="WIMAX_NSP_(.+)" +ETHTOOL_OPTNAME_* parent="NM.EthtoolOptname" name="ETHTOOL_OPTNAME_(.+)" +ethtool_optname_* parent="NM.EthtoolOptname" name="ethtool_optname_(.+)" +VLAN_FLAGS_ALL parent="NM.VlanFlags" name="ALL" type="NM.VlanFlags" From fdec6a97e85987359fdf26c367b00a1f8ac27be3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Feb 2023 07:51:07 +0100 Subject: [PATCH 4/4] vapi: add test for consistency of "vapi/NM-1.0.metadata" --- Makefile.am | 6 ++++++ meson.build | 5 +++++ tools/check-vapi.sh | 25 +++++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100755 tools/check-vapi.sh diff --git a/Makefile.am b/Makefile.am index 7fc7804775..67bcdde132 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5726,6 +5726,11 @@ EXTRA_DIST += \ vapi/libnm.deps \ vapi/meson.build +check-local-vapi: + $(srcdir)/tools/check-vapi.sh + +check_local += check-local-vapi + ############################################################################### girdir = $(datadir)/gir-1.0 @@ -5793,6 +5798,7 @@ EXTRA_DIST += \ tools/check-compare-generated.sh \ tools/check-gitlab-ci.sh \ tools/check-tree.sh \ + tools/check-vapi.sh \ tools/create-exports-NetworkManager.sh \ tools/debug-helper.py \ tools/meson-post-install.sh \ diff --git a/meson.build b/meson.build index b79240efc0..1327513b4c 100644 --- a/meson.build +++ b/meson.build @@ -941,6 +941,11 @@ if enable_vapi subdir('vapi') endif +test( + 'check-vapi', + find_program(join_paths(source_root, 'tools', 'check-vapi.sh')), +) + subdir('examples/C/glib') enable_qt = get_option('qt') diff --git a/tools/check-vapi.sh b/tools/check-vapi.sh new file mode 100755 index 0000000000..da640cfd0f --- /dev/null +++ b/tools/check-vapi.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e + +die() { + printf "%s\n" "$*" >&2 + exit 1 +} + +cd "$(dirname "$(readlink -f "$0")")/.." || die "cannot change to srcdir" + +VAPI=./vapi/NM-1.0.metadata + +for s in $(grep -r -h '#define \+\' -- ./src/libnm-core-public/ \ + | sed -n 's/^#define \+NM_\(SETTING_[A-Z0-9_]\+\)_SETTING_NAME\> \+.*/\1/p') ; do + grep -q "^$s" -- "$VAPI" || die "didn't see '$s' in \"$VAPI\"" +done + +for f in ./src/libnm-client-public/nm-device-*.h ; do + D=( $(sed -n 's/^#define \+NM_IS_DEVICE_\([A-Z0-9_]\+\)_CLASS\>(.*/\1/p' "$f") ) + test ${#D[@]} = 1 || die "did not detect device in \"$f\"" + s="${D[0]}" + c="$(grep -c "^DEVICE_${s}_\* *parent=" -- "$VAPI")" + test "$c" = 1 || die "didn't see device '$s' in \"$VAPI\"" +done