gen.lua (11392B)
- local arch = 'x86'
- cflags{
- '-Wno-deprecated-declarations',
- '-Wno-discarded-qualifiers',
- '-Wno-stringop-overflow',
- '-I $dir/include',
- '-I $outdir',
- '-I $outdir/include',
- '-I $outdir/internal',
- '-I $srcdir',
- '-I $srcdir/libavcodec',
- }
- nasmflags{
- '-i $srcdir/',
- '-i $srcdir/libavcodec/'..arch..'/',
- '-i $srcdir/libavutil/'..arch..'/',
- '-f elf64',
- '-P $outdir/config.asm',
- }
- -- TODO: Copy the rest of the headers.
- pkg.hdrs = {
- '$outdir/include/libavutil/avconfig.h',
- '$outdir/include/libavutil/ffversion.h',
- }
- pkg.deps = {
- '$outdir/config.asm',
- '$outdir/config.h',
- '$outdir/config_components.h',
- '$gendir/headers',
- }
- local probe = {
- '$builddir/probe/PIC',
- '$builddir/probe/HAVE_INLINE_ASM',
- '$builddir/probe/HAVE_MMINTRIN_H',
- }
- build('cat', '$outdir/config.h', {'$dir/config-head.h', probe, '$dir/config.h', '$dir/config-tail.h'})
- build('copy', '$outdir/config_components.h', '$dir/config_components.h')
- build('sed', '$outdir/config.asm', {probe, '$dir/config.h'}, {
- expr=[[-n -e 's,^# *,%,p']],
- })
- build('awk', '$outdir/config.texi', '$dir/config.h', {
- expr=[['$$3 == "1" {gsub("_", "-", $$2); print "@set", tolower($$2), "yes"}']],
- })
- build('awk', '$outdir/include/libavutil/avconfig.h', {'$dir/config.h', '|', '$dir/avconfig.awk'}, {
- expr='-f $dir/avconfig.awk',
- })
- rule('genlist', 'lua $dir/list.lua $dir/config_components.h $type $var <$in >$out')
- local function genlist(out, src, type, var)
- build('genlist', out, {src, '|', '$dir/list.lua', '$dir/config_components.h'}, {type=type, var=var})
- table.insert(pkg.deps, out)
- end
- genlist('$outdir/internal/libavfilter/filter_list.c', '$srcdir/libavfilter/allfilters.c', 'AVFilter', 'filter_list')
- genlist('$outdir/internal/libavcodec/codec_list.c', '$srcdir/libavcodec/allcodecs.c', 'FFCodec', 'codec_list')
- genlist('$outdir/internal/libavcodec/parser_list.c', '$srcdir/libavcodec/parsers.c', 'AVCodecParser', 'parser_list')
- genlist('$outdir/internal/libavcodec/bsf_list.c', '$srcdir/libavcodec/bitstream_filters.c', 'FFBitStreamFilter', 'bitstream_filters')
- genlist('$outdir/internal/libavformat/demuxer_list.c', '$srcdir/libavformat/allformats.c', 'FFInputFormat', 'demuxer_list')
- genlist('$outdir/internal/libavformat/muxer_list.c', '$srcdir/libavformat/allformats.c', 'FFOutputFormat', 'muxer_list')
- genlist('$outdir/internal/libavdevice/indev_list.c', '$srcdir/libavdevice/alldevices.c', 'FFInputFormat', 'indev_list')
- genlist('$outdir/internal/libavdevice/outdev_list.c', '$srcdir/libavdevice/alldevices.c', 'FFOutputFormat', 'outdev_list')
- genlist('$outdir/internal/libavformat/protocol_list.c', '$srcdir/libavformat/protocols.c', 'URLProtocol', 'url_protocols')
- build('awk', '$outdir/include/libavutil/ffversion.h', {'$dir/ver'}, {
- expr=[['{printf "#define FFMPEG_VERSION \"%s\"\n", $$1}']],
- })
- local options = {}
- for _, file in ipairs{'config.h', 'config_components.h'} do
- for line in iterlines(file, 1) do
- local cfg, val = line:match('^#define ([^ ]+) ([^ ]+)')
- if cfg then
- options[cfg] = val == '1'
- end
- end
- end
- local sources = {
- libavcodec={},
- libavdevice={},
- libavfilter={},
- libavformat={},
- libavutil={},
- libswresample={},
- libswscale={},
- }
- local archs = {
- ['aarch64']=true,
- ['alpha']=true,
- ['arm']=true,
- ['avr32']=true,
- ['avr32_ap']=true,
- ['avr32_uc']=true,
- ['bfin']=true,
- ['ia64']=true,
- ['loongarch']=true,
- ['m68k']=true,
- ['mips']=true,
- ['parisc']=true,
- ['ppc']=true,
- ['riscv']=true,
- ['s390']=true,
- ['sh4']=true,
- ['sparc']=true,
- ['tilegx']=true,
- ['tilepro']=true,
- ['x86']=true,
- }
- for line in iterlines('sources.txt', 1) do
- local i = line:find(' ', 1, true)
- if i and options[line:sub(1, i - 1)] then
- for src, lib, dir in line:gmatch('(([%w_-]+)/?([%w_-]*)[%w_/-]*/[%w_.-]+)', i + 1) do
- if not archs[dir] or dir == arch then
- sources[lib][src] = true
- end
- end
- end
- end
- -- combination option in libavutil/x86/Makefile
- if not options.HAVE_MMX_INLINE and options.HAVE_MMX_EXTERNAL and not options.HAVE_MM_EMPTY then
- sources.libavutil['libavutil/x86/emms.asm'] = true
- end
- for lib, srcs in pairs(sources) do
- sources[lib] = table.keys(srcs)
- end
- if options.CONFIG_ALSA_INDEV or options.config_ALSA_OUTDEV then
- cflags{'-isystem $builddir/pkg/alsa-lib/include'}
- table.insert(pkg.deps, 'pkg/alsa-lib/headers')
- table.insert(sources.libavdevice, '$builddir/pkg/alsa-lib/libasound.a')
- end
- if options.CONFIG_LIBDAV1D_DECODER then
- cflags{'-isystem $builddir/pkg/dav1d/include'}
- table.insert(pkg.deps, 'pkg/dav1d/headers')
- table.insert(sources.libavcodec, '$builddir/pkg/dav1d/libdav1d.a')
- end
- if options.CONFIG_TLS_PROTOCOL and options.CONFIG_LIBTLS then
- cflags{'-isystem $builddir/pkg/libtls-bearssl/include'}
- table.insert(pkg.deps, 'pkg/libtls-bearssl/headers')
- table.insert(sources.libavformat, '$builddir/pkg/libtls-bearssl/libtls.a.d')
- end
- if options.CONFIG_TLS_PROTOCOL and options.CONFIG_OPENSSL then
- cflags{'-isystem $builddir/pkg/libressl/include'}
- table.insert(pkg.deps, 'pkg/libressl/headers')
- table.insert(sources.libavformat, '$builddir/pkg/libressl/libssl.a.d')
- end
- if options.CONFIG_LIBOPUS_ENCODER or options.CONFIG_LIBOPUS_DECODER then
- cflags{'-isystem $builddir/pkg/opus/include'}
- table.insert(pkg.deps, 'pkg/opus/headers')
- table.insert(sources.libavcodec, '$builddir/pkg/opus/libopus.a')
- end
- if options.CONFIG_ZLIB then
- cflags{'-isystem $builddir/pkg/zlib/include'}
- table.insert(pkg.deps, 'pkg/zlib/headers')
- table.insert(sources.libavcodec, '$builddir/pkg/zlib/libz.a')
- table.insert(sources.libavformat, '$builddir/pkg/zlib/libz.a')
- end
- if options.CONFIG_BLURAY_PROTOCOL then
- cflags{'-isystem $builddir/pkg/libbluray/include'}
- table.insert(pkg.deps, 'pkg/libbluray/headers')
- table.insert(sources.libavcodec, '$builddir/pkg/libbluray/libbluray.a.d')
- end
- sub('lib.ninja', function()
- cflags{'-D HAVE_AV_CONFIG_H'}
- lib('libavcodec.a', {
- expand{'libavcodec/', {
- 'ac3_parser.c',
- 'adts_parser.c',
- 'allcodecs.c',
- 'avcodec.c',
- 'avdct.c',
- 'avfft.c',
- 'avpacket.c',
- 'bitstream.c',
- 'bitstream_filters.c',
- 'bsf.c',
- 'codec_desc.c',
- 'codec_par.c',
- 'd3d11va.c',
- 'decode.c',
- 'dirac.c',
- 'dv_profile.c',
- 'encode.c',
- 'get_buffer.c',
- 'imgconvert.c',
- 'jni.c',
- 'mathtables.c',
- 'mediacodec.c',
- 'mpeg12framerate.c',
- 'options.c',
- 'parser.c',
- 'parsers.c',
- 'profiles.c',
- 'qsv_api.c',
- 'raw.c',
- 'refstruct.c',
- 'utils.c',
- 'version.c',
- 'vlc.c',
- 'vorbis_parser.c',
- 'xiph.c',
- 'x86/constants.c',
- }},
- sources.libavcodec,
- 'libavutil.a',
- })
- lib('libavdevice.a', {
- expand{'libavdevice/', {
- 'alldevices.c',
- 'avdevice.c',
- 'utils.c',
- 'version.c',
- }},
- sources.libavdevice,
- 'libavcodec.a.d',
- 'libavformat.a.d',
- 'libavutil.a',
- })
- lib('libavfilter.a', {
- expand{'libavfilter/', {
- 'allfilters.c',
- 'audio.c',
- 'avfilter.c',
- 'avfiltergraph.c',
- 'buffersink.c',
- 'buffersrc.c',
- 'colorspace.c',
- 'ccfifo.c',
- 'drawutils.c',
- 'formats.c',
- 'framepool.c',
- 'framequeue.c',
- 'graphdump.c',
- 'graphparser.c',
- 'version.c',
- 'video.c',
- }},
- sources.libavfilter,
- 'libavutil.a',
- })
- cc('libavformat/protocols.c', {'$gendir/deps', '$outdir/internal/libavformat/protocol_list.c'})
- lib('libavformat.a', {
- expand{'libavformat/', {
- 'allformats.c',
- 'avformat.c',
- 'avio.c',
- 'aviobuf.c',
- 'demux.c',
- 'demux_utils.c',
- 'dump.c',
- 'dv.c',
- 'format.c',
- 'id3v1.c',
- 'id3v2.c',
- 'isom_tags.c',
- 'metadata.c',
- 'mux.c',
- 'mux_utils.c',
- 'options.c',
- 'os_support.c',
- 'protocols.c.o',
- 'riff.c',
- 'sdp.c',
- 'seek.c',
- 'url.c',
- 'utils.c',
- 'version.c',
- }},
- sources.libavformat,
- 'libavcodec.a.d',
- 'libavutil.a',
- })
- lib('libavutil.a', {
- expand{'libavutil/', {
- 'adler32.c',
- 'aes.c',
- 'aes_ctr.c',
- 'ambient_viewing_environment.c',
- 'audio_fifo.c',
- 'avstring.c',
- 'avsscanf.c',
- 'base64.c',
- 'blowfish.c',
- 'bprint.c',
- 'buffer.c',
- 'cast5.c',
- 'camellia.c',
- 'channel_layout.c',
- 'cpu.c',
- 'crc.c',
- 'csp.c',
- 'des.c',
- 'detection_bbox.c',
- 'dict.c',
- 'display.c',
- 'dovi_meta.c',
- 'downmix_info.c',
- 'encryption_info.c',
- 'error.c',
- 'eval.c',
- 'executor.c',
- 'fifo.c',
- 'file.c',
- 'file_open.c',
- 'float_dsp.c',
- 'fixed_dsp.c',
- 'frame.c',
- 'hash.c',
- 'hdr_dynamic_metadata.c',
- 'hdr_dynamic_vivid_metadata.c',
- 'hmac.c',
- 'hwcontext.c',
- 'iamf.c',
- 'imgutils.c',
- 'integer.c',
- 'intmath.c',
- 'lfg.c',
- 'lls.c',
- 'log.c',
- 'log2_tab.c',
- 'lzo.c',
- 'mathematics.c',
- 'mastering_display_metadata.c',
- 'md5.c',
- 'mem.c',
- 'murmur3.c',
- 'opt.c',
- 'parseutils.c',
- 'pixdesc.c',
- 'pixelutils.c',
- 'random_seed.c',
- 'rational.c',
- 'reverse.c',
- 'rc4.c',
- 'ripemd.c',
- 'samplefmt.c',
- 'sha.c',
- 'sha512.c',
- 'slicethread.c',
- 'spherical.c',
- 'stereo3d.c',
- 'threadmessage.c',
- 'time.c',
- 'timecode.c',
- 'timestamp.c',
- 'tree.c',
- 'twofish.c',
- 'utils.c',
- 'xga_font_data.c',
- 'xtea.c',
- 'tea.c',
- 'tx.c',
- 'tx_float.c',
- 'tx_double.c',
- 'tx_int32.c',
- 'uuid.c',
- 'version.c',
- 'video_enc_params.c',
- 'video_hint.c',
- 'film_grain_params.c',
- 'x86/cpu.c',
- 'x86/fixed_dsp_init.c',
- 'x86/float_dsp_init.c',
- 'x86/imgutils_init.c',
- 'x86/lls_init.c',
- 'x86/cpuid.asm',
- 'x86/fixed_dsp.asm',
- 'x86/float_dsp.asm',
- 'x86/imgutils.asm',
- 'x86/lls.asm',
- 'x86/tx_float.asm',
- }},
- sources.libavutil,
- })
- lib('libswresample.a', {
- expand{'libswresample/', {
- 'audioconvert.c',
- 'dither.c',
- 'options.c',
- 'rematrix.c',
- 'resample.c',
- 'resample_dsp.c',
- 'swresample.c',
- 'swresample_frame.c',
- 'version.c',
- 'x86/audio_convert.asm',
- 'x86/rematrix.asm',
- 'x86/resample.asm',
- 'x86/audio_convert_init.c',
- 'x86/rematrix_init.c',
- 'x86/resample_init.c',
- }},
- sources.libswresample,
- 'libavutil.a',
- })
- lib('libswscale.a', {
- expand{'libswscale/', {
- 'alphablend.c',
- 'hscale.c',
- 'hscale_fast_bilinear.c',
- 'gamma.c',
- 'half2float.c',
- 'input.c',
- 'options.c',
- 'output.c',
- 'rgb2rgb.c',
- 'slice.c',
- 'swscale.c',
- 'swscale_unscaled.c',
- 'utils.c',
- 'version.c',
- 'yuv2rgb.c',
- 'vscale.c',
- 'x86/rgb2rgb.c',
- 'x86/swscale.c',
- 'x86/yuv2rgb.c',
- 'x86/hscale_fast_bilinear_simd.c',
- 'x86/input.asm',
- 'x86/output.asm',
- 'x86/scale.asm',
- 'x86/scale_avx2.asm',
- 'x86/rgb_2_rgb.asm',
- 'x86/yuv_2_rgb.asm',
- 'x86/yuv2yuvX.asm',
- }},
- sources.libswscale,
- 'libavutil.a',
- })
- end)
- local libs = {
- 'libavcodec.a.d',
- 'libavdevice.a.d',
- 'libavfilter.a.d',
- 'libavformat.a.d',
- 'libavutil.a',
- 'libswresample.a.d',
- 'libswscale.a.d',
- }
- cc('fftools/cmdutils.c', {'$gendir/deps'})
- cc('fftools/opt_common.c', {'$gendir/deps'})
- exe('ffprobe', {paths[[fftools/(ffprobe.c cmdutils.c.o opt_common.c.o)]], libs})
- file('bin/ffprobe', '755', '$outdir/ffprobe')
- exe('ffmpeg', {paths[[
- fftools/(
- ffmpeg.c
- ffmpeg_dec.c
- ffmpeg_demux.c
- ffmpeg_enc.c
- ffmpeg_filter.c
- ffmpeg_hw.c
- ffmpeg_mux.c
- ffmpeg_mux_init.c
- ffmpeg_opt.c
- ffmpeg_sched.c
- objpool.c
- sync_queue.c
- thread_queue.c
- cmdutils.c.o
- opt_common.c.o
- )
- ]], libs})
- file('bin/ffmpeg', '755', '$outdir/ffmpeg')
- rule('texi2mdoc', [[$builddir/pkg/texi2mdoc/host/texi2mdoc -d 'August 2, 2024' -I $outdir $in >$out]])
- build('texi2mdoc', '$outdir/ffprobe.1', {'$srcdir/doc/ffprobe.texi', '|', '$outdir/config.texi', '$builddir/pkg/texi2mdoc/host/texi2mdoc'})
- build('texi2mdoc', '$outdir/ffmpeg.1', {'$srcdir/doc/ffmpeg.texi', '|', '$outdir/config.texi', '$builddir/pkg/texi2mdoc/host/texi2mdoc'})
- man{'$outdir/ffprobe.1', '$outdir/ffmpeg.1'}
- fetch 'git'