[FFmpeg-devel] [PATCH v4] fate: Add test for namespace prefixes in libraries
Mark Thompson
sw at jkqxz.net
Wed Feb 3 01:25:28 EET 2021
Ensures that external symbols in the built static libraries either have
correct namespace prefixes or are on a known list of exceptions.
Does not run on Windows, because headers there introduce additional global
symbols which would cause this test to fail unhelpfully.
---
Now without exceptions and disabled on Windows.
Requires <https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2021-January/275452.html> from Andreas applied beforehand to fix namespace problems in swscale.
Does anyone know a cleaner way of filtering out Windows for testing? It could go inside the ALLYES if there were a CONFIG_ option matching it, but as far as I can tell there isn't.
Thanks,
- Mark
tests/Makefile | 1 +
tests/fate/namespace.mak | 26 ++++++++++++++++++++++++++
tests/fate/namespace.sh | 18 ++++++++++++++++++
3 files changed, 45 insertions(+)
create mode 100644 tests/fate/namespace.mak
create mode 100755 tests/fate/namespace.sh
diff --git a/tests/Makefile b/tests/Makefile
index 7844901e53..94057eb81d 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -173,6 +173,7 @@ include $(SRC_PATH)/tests/fate/mpeg4.mak
include $(SRC_PATH)/tests/fate/mpegps.mak
include $(SRC_PATH)/tests/fate/mpegts.mak
include $(SRC_PATH)/tests/fate/mxf.mak
+include $(SRC_PATH)/tests/fate/namespace.mak
include $(SRC_PATH)/tests/fate/opus.mak
include $(SRC_PATH)/tests/fate/pcm.mak
include $(SRC_PATH)/tests/fate/pixfmt.mak
diff --git a/tests/fate/namespace.mak b/tests/fate/namespace.mak
new file mode 100644
index 0000000000..2c5e192ea5
--- /dev/null
+++ b/tests/fate/namespace.mak
@@ -0,0 +1,26 @@
+
+# These tests are disabled on Windows, because headers there additional
+# global symbols which would cause them to fail unhelpfully.
+ifneq ($(HAVE_WINDOWS_H),yes)
+
+define FATE_NAMESPACE
+# (library_name, config_option)
+FATE_NAMESPACE-$(call ALLYES, STATIC $(2)) += fate-namespace-$(1)
+fate-namespace-$(1): lib$(1)/$(LIBPREF)$(1)$(LIBSUF)
+fate-namespace-$(1): CMD = runlocal fate/namespace.sh "$(NM_CMD) -P lib$(1)/$(LIBPREF)$(1)$(LIBSUF)"
+fate-namespace-$(1): CMP = null
+endef
+
+$(eval $(call FATE_NAMESPACE,avutil, AVUTIL))
+$(eval $(call FATE_NAMESPACE,avcodec, AVCODEC))
+$(eval $(call FATE_NAMESPACE,avformat, AVFORMAT))
+$(eval $(call FATE_NAMESPACE,avfilter, AVFILTER))
+$(eval $(call FATE_NAMESPACE,avdevice, AVDEVICE))
+$(eval $(call FATE_NAMESPACE,swscale, SWSCALE))
+$(eval $(call FATE_NAMESPACE,swresample, SWRESAMPLE))
+$(eval $(call FATE_NAMESPACE,postproc, POSTPROC))
+
+FATE += $(FATE_NAMESPACE-yes)
+fate-namespace: $(FATE_NAMESPACE-yes)
+
+endif
diff --git a/tests/fate/namespace.sh b/tests/fate/namespace.sh
new file mode 100755
index 0000000000..9a6df9783f
--- /dev/null
+++ b/tests/fate/namespace.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if $1 |
+ grep ' [TDBR] ' | # Filter to all global text/(ro)data/bss symbols.
+ grep -v '^ff_' | # Internal-only globals.
+ grep -v '^av' | # libav* external API.
+ grep -v '^sws' | # libswscale external API.
+ grep -v '^swr' | # libswresample external API.
+ grep -v '^\(postproc\|pp\)_' | # libpostproc external API.
+ grep -v '^\(ffio\|ffurl\)_' | # libavformat internal ffio/ffurl APIs.
+ grep -v '^_[A-Z_]' | # Reserved symbols added by the implementation.
+ grep '^[A-Za-z0-9_]* ' # Only consider normal symbol names.
+then
+ # Any output is an error.
+ exit 1
+else
+ exit 0
+fi
--
2.29.2
More information about the ffmpeg-devel
mailing list