diff --git a/Makefile b/Makefile index 8731d3b6ba..0122e1628f 100644 --- a/Makefile +++ b/Makefile @@ -87,7 +87,6 @@ tools/target_dec_%_fuzzer$(EXESUF): $(FF_DEP_LIBS) CONFIGURABLE_COMPONENTS = \ $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) \ - $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/version.h)) \ $(SRC_PATH)/libavcodec/bitstream_filters.c \ $(SRC_PATH)/libavformat/protocols.c \ @@ -109,6 +108,12 @@ $(1) := $(1)-yes := endef +ifdef CONFIG_RAISE_MAJOR +RAISE_MAJOR = 100 +else +RAISE_MAJOR = 0 +endif + define DOSUBDIR $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V)))) SUBDIR := $(1)/ diff --git a/configure b/configure index 804b0ce347..96a5e98330 100755 --- a/configure +++ b/configure @@ -6756,20 +6756,6 @@ NOREDZONE_FLAGS=$noredzone_flags LIBFUZZER_PATH=$libfuzzer_path EOF -get_version(){ - lcname=lib${1} - name=$(toupper $lcname) - file=$source_path/$lcname/version.h - eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file") - enabled raise_major && eval ${name}_VERSION_MAJOR=$((${name}_VERSION_MAJOR+100)) - eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO - eval echo "${lcname}_VERSION=\$${name}_VERSION" >> ffbuild/config.mak - eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> ffbuild/config.mak - eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> ffbuild/config.mak -} - -map 'get_version $v' $LIBRARY_LIST - map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> ffbuild/config.mak' $LIBRARY_LIST print_program_extralibs(){ @@ -6866,64 +6852,32 @@ if test -n "$WARNINGS"; then enabled fatal_warnings && exit 1 fi -# build pkg-config files +# Settings for pkg-config files -lib_version(){ - eval printf "\"lib${1}${build_suffix} >= \$LIB$(toupper ${1})_VERSION, \"" -} - -pkgconfig_generate(){ - name=$1 - shortname=${name#lib}${build_suffix} - comment=$2 - version=$3 - libs=$4 - requires=$(map 'lib_version $v' $(eval echo \$${name#lib}_deps)) - requires=${requires%, } - enabled ${name#lib} || return 0 - mkdir -p $name - cat < $name/$name${build_suffix}.pc +cat > ffbuild/config.sh < doc/examples/pc-uninstalled/${name}-uninstalled.pc -prefix= -exec_prefix= -libdir=\${pcfiledir}/../../../$name -includedir=${includedir} - -Name: $name -Description: $comment -Version: $version -Requires: $requires -Conflicts: -Libs: -L\${libdir} -Wl,-rpath,\${libdir} -l${shortname} $(enabled shared || echo $libs) -Cflags: -I\${includedir} -EOF -} - -pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBRT $LIBM" -pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" -pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" -pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" -pkgconfig_generate libavfilter "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" -pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" -pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$LIBM" -pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" -pkgconfig_generate libswresample "FFmpeg audio resampling library" "$LIBSWRESAMPLE_VERSION" "$LIBM $LIBSOXR" +for lib in $LIBRARY_LIST; do + lib_deps="$(eval echo \$${lib}_deps)" + echo ${lib}_deps=\"$lib_deps\" >> ffbuild/config.sh +done diff --git a/ffbuild/.gitignore b/ffbuild/.gitignore index 693b7aa0d3..38ed170752 100644 --- a/ffbuild/.gitignore +++ b/ffbuild/.gitignore @@ -2,3 +2,4 @@ /config.fate /config.log /config.mak +/config.sh diff --git a/ffbuild/common.mak b/ffbuild/common.mak index 195737028a..e61f853ebb 100644 --- a/ffbuild/common.mak +++ b/ffbuild/common.mak @@ -89,7 +89,7 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC) %.h.c: $(Q)echo '#include "$*.h"' >$@ -%.c %.h %.ver: TAG = GEN +%.c %.h %.pc %.ver %.version: TAG = GEN # Dummy rule to stop make trying to rebuild removed or renamed headers %.h: @@ -154,7 +154,7 @@ $(TOOLOBJS): | tools OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS)) -CLEANSUFFIXES = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.ho *$(DEFAULT_YASMD).asm +CLEANSUFFIXES = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm DISTCLEANSUFFIXES = *.pc LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a diff --git a/ffbuild/library.mak b/ffbuild/library.mak index 5e576d18cd..addc945168 100644 --- a/ffbuild/library.mak +++ b/ffbuild/library.mak @@ -1,5 +1,7 @@ include $(SRC_PATH)/ffbuild/common.mak +-include $(SUBDIR)lib$(NAME).version + LIBVERSION := $(lib$(NAME)_VERSION) LIBMAJOR := $(lib$(NAME)_VERSION_MAJOR) LIBMINOR := $(lib$(NAME)_VERSION_MINOR) @@ -7,8 +9,8 @@ INCINSTDIR := $(INCDIR)/lib$(NAME) INSTHEADERS := $(INSTHEADERS) $(HEADERS:%=$(SUBDIR)%) -all-$(CONFIG_STATIC): $(SUBDIR)$(LIBNAME) -all-$(CONFIG_SHARED): $(SUBDIR)$(SLIBNAME) +all-$(CONFIG_STATIC): $(SUBDIR)$(LIBNAME) $(SUBDIR)lib$(NAME).pc +all-$(CONFIG_SHARED): $(SUBDIR)$(SLIBNAME) $(SUBDIR)lib$(NAME).pc LIBOBJS := $(OBJS) $(SUBDIR)%.h.o $(TESTOBJS) $(LIBOBJS) $(LIBOBJS:.o=.s) $(LIBOBJS:.o=.i): CPPFLAGS += -DHAVE_AV_CONFIG_H @@ -31,6 +33,12 @@ $(TESTPROGS): THISLIB = $(SUBDIR)$(LIBNAME) $(TESTPROGS) $(TOOLS): %$(EXESUF): %.o $$(LD) $(LDFLAGS) $(LDEXEFLAGS) $$(LD_O) $$(filter %.o,$$^) $$(THISLIB) $(FFEXTRALIBS) $$(ELIBS) +$(SUBDIR)lib$(NAME).version: $(SUBDIR)version.h | $(SUBDIR) + $$(M) $$(SRC_PATH)/ffbuild/libversion.sh $(NAME) $$< $(RAISE_MAJOR) > $$@ + +$(SUBDIR)lib$(FULLNAME).pc: $(SUBDIR)version.h | $(SUBDIR) + $$(M) $$(SRC_PATH)/ffbuild/pkgconfig_generate.sh $(NAME) "$(DESC)" + $(SUBDIR)lib$(NAME).ver: $(SUBDIR)lib$(NAME).v $(OBJS) $$(M)sed 's/MAJOR/$(lib$(NAME)_VERSION_MAJOR)/' $$< | $(VERSION_SCRIPT_POSTPROCESS_CMD) > $$@ diff --git a/ffbuild/libversion.sh b/ffbuild/libversion.sh new file mode 100755 index 0000000000..687adf28bc --- /dev/null +++ b/ffbuild/libversion.sh @@ -0,0 +1,15 @@ +toupper(){ + echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ +} + +name=lib$1 +ucname=$(toupper ${name}) +file=$2 +raise_major=$3 + +eval $(awk "/#define ${ucname}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file") +eval ${ucname}_VERSION_MAJOR=$((${ucname}_VERSION_MAJOR+${raise_major})) +eval ${ucname}_VERSION=\$${ucname}_VERSION_MAJOR.\$${ucname}_VERSION_MINOR.\$${ucname}_VERSION_MICRO +eval echo "${name}_VERSION=\$${ucname}_VERSION" +eval echo "${name}_VERSION_MAJOR=\$${ucname}_VERSION_MAJOR" +eval echo "${name}_VERSION_MINOR=\$${ucname}_VERSION_MINOR" diff --git a/ffbuild/pkgconfig_generate.sh b/ffbuild/pkgconfig_generate.sh new file mode 100755 index 0000000000..e5de6716d2 --- /dev/null +++ b/ffbuild/pkgconfig_generate.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +. ffbuild/config.sh + +if test "$shared" = "yes"; then + shared=true +else + shared=false +fi + +shortname=$1 +name=lib${shortname} +fullname=${name}${build_suffix} +comment=$2 +libs=$(eval echo \$extralibs_${shortname}) +deps=$(eval echo \$${shortname}_deps) + +for dep in $deps; do + depname=lib${dep} + fulldepname=${depname}${build_suffix} + . ${depname}/${depname}.version + depversion=$(eval echo \$${depname}_VERSION) + requires="$requires ${fulldepname} >= ${depversion}, " +done +requires=${requires%, } + +version=$(grep ${name}_VERSION= $name/${name}.version | cut -d= -f2) + +cat < $name/$fullname.pc +prefix=$prefix +exec_prefix=\${prefix} +libdir=$libdir +includedir=$incdir + +Name: $fullname +Description: $comment +Version: $version +Requires: $($shared || echo $requires) +Requires.private: $($shared && echo $requires) +Conflicts: +Libs: -L\${libdir} $rpath -l${fullname#lib} $($shared || echo $libs) +Libs.private: $($shared && echo $libs) +Cflags: -I\${includedir} +EOF + +mkdir -p doc/examples/pc-uninstalled +includedir=${source_path} +[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.." + cat < doc/examples/pc-uninstalled/${name}-uninstalled.pc +prefix= +exec_prefix= +libdir=\${pcfiledir}/../../../$name +includedir=${source_path} + +Name: $fullname +Description: $comment +Version: $version +Requires: $requires +Conflicts: +Libs: -L\${libdir} -Wl,-rpath,\${libdir} -l${fullname#lib} $($shared || echo $libs) +Cflags: -I\${includedir} +EOF diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 66d7587fb0..e3221184d1 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = avcodec +DESC = FFmpeg codec library HEADERS = avcodec.h \ avdct.h \ diff --git a/libavdevice/Makefile b/libavdevice/Makefile index fb7623f713..c055d6718d 100644 --- a/libavdevice/Makefile +++ b/libavdevice/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = avdevice +DESC = FFmpeg device handling library HEADERS = avdevice.h \ version.h \ diff --git a/libavfilter/Makefile b/libavfilter/Makefile index d19c555c91..0f990866e8 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = avfilter +DESC = FFmpeg audio/video filtering library HEADERS = avfilter.h \ avfiltergraph.h \ diff --git a/libavformat/Makefile b/libavformat/Makefile index d82639d123..4e169fdce5 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = avformat +DESC = FFmpeg container format library HEADERS = avformat.h \ avio.h \ diff --git a/libavresample/Makefile b/libavresample/Makefile index 7d857a0e36..90f025a9f9 100644 --- a/libavresample/Makefile +++ b/libavresample/Makefile @@ -1,4 +1,5 @@ NAME = avresample +DESC = Libav audio resampling library HEADERS = avresample.h \ version.h \ diff --git a/libavutil/Makefile b/libavutil/Makefile index 0239c499f3..1fd8dca54b 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = avutil +DESC = FFmpeg utility library HEADERS = adler32.h \ aes.h \ diff --git a/libpostproc/Makefile b/libpostproc/Makefile index 3c21f00a21..34317193a8 100644 --- a/libpostproc/Makefile +++ b/libpostproc/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = postproc +DESC = FFmpeg postprocessing library FFLIBS = avutil HEADERS = postprocess.h \ diff --git a/libswresample/Makefile b/libswresample/Makefile index f50ee0d5a0..42666e4dd2 100644 --- a/libswresample/Makefile +++ b/libswresample/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = swresample +DESC = FFmpeg audio resampling library FFLIBS = avutil HEADERS = swresample.h \ diff --git a/libswscale/Makefile b/libswscale/Makefile index 19182b370e..5e03e6fa0a 100644 --- a/libswscale/Makefile +++ b/libswscale/Makefile @@ -1,6 +1,5 @@ -include $(SUBDIR)../ffbuild/config.mak - NAME = swscale +DESC = FFmpeg image rescaling library HEADERS = swscale.h \ version.h \