Skip to content

Commit 4376903

Browse files
authored
fix(pkg): vendored 头输给宿主机 —— compat.ffmpeg / compat.catch2 (#183)
两个包在装了同名系统开发包的机器上会拿错头,而 CI 和本地一直看不见:默认 工具链 gcc 是通过 --sysroot 进 xlings subos 编译的,那里 /usr/include 干干 净净。换到 llvm(无 sysroot)宿主机的头就进了默认搜索路径,两个都当场炸。 ## compat.ffmpeg:-idirafter 排在系统目录之后 源码根走 include_dirs_after 是 #249 为 macOS 修的 —— 大小写不敏感的文件系统 上 ffmpeg 的 VERSION 会遮蔽 libc++ 的 <version>。但 -idirafter 的语义是排在 **系统目录之后**,于是在装了 libavutil-dev 的 Debian/Ubuntu 上 (/usr/include/x86_64-linux-gnu 是默认搜索目录),vendored 8.1.2 的每一个 `#include "libavutil/..."` 都输给宿主机的 6.1.1。 不是优雅降级:全局 -DHAVE_AV_CONFIG_H 让宿主机的**公开**头去 include dev 包 根本不装的私有头('x86/bswap.h'、libavutil/internal.h),再叠加 6.x/8.x 的 类型错配(enum AVAlphaMode 不完整、SwsContext 少 typedef)。 改成按 OS 放置,且**只能二选一**:同一个目录同时出现在 -I 和 -idirafter 会 被编译器去重到最后那个位置,保留一份冗余的 -idirafter 就会静默抵消 -I。 clang 22.1.8 上实测过:同一条命令行,只删掉重复的 -idirafter 就编过。 linux → include_dirs。文件系统大小写敏感,VERSION 遮蔽不了 <version>; 而它是唯一有系统 ffmpeg 可输的平台。 macosx → include_dirs_after,#249 原样。 windows → include_dirs_after。NTFS 同样大小写不敏感,换 -I 会把 #249 带 回来,而那边的系统目录里没有 libav*。 生成器 tools/compat-ffmpeg/gen_multiplatform.py 同步改。per-OS 快照已不在, 描述符是手改的,两边保持一致。 ## compat.catch2:上游 2.13.10 漏 #include <new> 单头调了两次 new(std::nothrow)(catch.hpp:977 / :14594)却从不包含 <new>。 libstdc++ 会从别的头把它带进来,libc++ 不会,于是每个 clang 消费者都挂在 "no member named 'nothrow' in namespace 'std'"。Catch2 v2 上游已 EOL。 修法是在 mcpp_generated 里放 shim:#include <new> 后 #include_next 到上游那 份,而不是 patch 一份 17k 行的头 —— sha256 钉住的 tarball 仍是唯一事实来源。 这要求 mcpp_generated 排到 include_dirs 最前,因为 #include_next 从本文件所在 目录之后继续搜。 不能用 cflags 解:描述符的 cflags 到不了消费者的 TU(实测消费端只拿到 include_dirs 和 -std),而 catch.hpp 恰恰是消费者包含的。 ## 删除冻结的 mcpplibs:opencv@0.0.10 #165 已把它迁到 opencv:opencv@5.0.0 并冻结保留。索引内三个消费成员早就写成 限定形式,删除零 fallout;顺带修掉三处说自己在消费裸名的过时注释。 注意 `mcpp new -t opencv:imgproc` 会随之失效 —— `-t` 的 spec 语法里冒号是 模板分隔符,表达不出 ns:name,所以在 mcpp 给限定名留出位置之前,模板路径 拿不到 opencv。 ## 验证 在一台装了 ffmpeg 6.1.1 dev 头和 Catch2 v3 的机器上,llvm@22.1.8 与 gcc@16.1.0 双工具链: ffmpeg 消费者 llvm 2311 个 .o(libswscale 71,原先整批全灭);二进制断言 avutil_version()>>16 == 60 通过 —— 用的确是 vendored 8.1.2 gcc 回归 2281 个 .o,同样通过,走新的 -I<root> + sysroot opencv 端到端 import opencv.cv; + cvtColor/GaussianBlur,llvm 下通过 catch2 catch2 / catch2-main / catch2-v2 三成员双工具链通过 已知未修:catch2-v2-main 在 llvm 下仍失败。catch2_main.cpp 用 __has_include(<catch2/catch_all.hpp>) 判 v2/v3,该探测同样会落到系统目录, 在装了系统 Catch2 v3 的机器上把 v2 判成 v3,链接报 undefined Catch::Session。 同一类问题,但要不问文件系统就知道版本,得等 per-version build blocks (mcpp#290)。回退本提交后同样失败,是既有问题而非本次引入。
1 parent 1ba4161 commit 4376903

7 files changed

Lines changed: 107 additions & 131 deletions

File tree

pkgs/c/compat.catch2.lua

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,46 @@ package = {
118118

119119
-- Union of both layouts. v2 resolves */single_include, v3 resolves
120120
-- */src; the other one matches nothing and is skipped. mcpp_generated
121-
-- carries catch2/catch_user_config.hpp for v3.
122-
include_dirs = { "*/single_include", "*/src", "mcpp_generated" },
121+
-- carries catch2/catch_user_config.hpp for v3 and the v2 <new> shim.
122+
--
123+
-- ORDER MATTERS: mcpp_generated goes FIRST so the shim below is found
124+
-- before upstream's own catch2/catch.hpp, which it then reaches with
125+
-- #include_next. This is the only lever available — a descriptor's
126+
-- cflags do not reach CONSUMER translation units (verified: a consumer
127+
-- TU gets the include_dirs and -std, nothing else), and the consumer is
128+
-- exactly who includes catch.hpp.
129+
include_dirs = { "mcpp_generated", "*/single_include", "*/src" },
123130

124131
generated_files = {
132+
-- v2 only, and only because upstream 2.13.10 is wrong: its
133+
-- single header calls `new(std::nothrow)` twice (catch.hpp:977
134+
-- and :14594) and never includes <new>. libstdc++ happens to
135+
-- drag <new> in through another header, so gcc has always been
136+
-- green; libc++ does not, so every clang consumer fails with
137+
-- "no member named 'nothrow' in namespace 'std'". Catch2 v2 is
138+
-- EOL upstream, so this is not getting fixed there.
139+
--
140+
-- A shim rather than a patched copy of the 17k-line header: it
141+
-- keeps the sha256-pinned tarball as the only source of truth.
142+
-- #include_next resumes the search AFTER this file's directory,
143+
-- which is why mcpp_generated must sort first in include_dirs.
144+
--
145+
-- CAVEAT for whoever touches the v2/v3 discriminator: this file
146+
-- is on the include path for BOTH majors, so
147+
-- `__has_include(<catch2/catch.hpp>)` is now unconditionally true
148+
-- and can never be used to detect v2. (On v3 it would be found
149+
-- and then fail in #include_next, since there is no upstream
150+
-- catch.hpp behind it — but __has_include never gets that far.)
151+
-- The existing discriminator probes catch_all.hpp instead, which
152+
-- is unaffected. See the header comment for why per-version
153+
-- blocks (mcpp#290) are the real answer here.
154+
["mcpp_generated/catch2/catch.hpp"] = [==[
155+
#ifndef MCPP_COMPAT_CATCH2_NOTHROW_SHIM
156+
#define MCPP_COMPAT_CATCH2_NOTHROW_SHIM
157+
#include <new>
158+
#include_next <catch2/catch.hpp>
159+
#endif
160+
]==],
125161
-- v3 only. Upstream ships catch_user_config.hpp.in and lets CMake
126162
-- materialise it. Only the two VALUE defines are mandatory —
127163
-- everything else in the .in is a #cmakedefine, i.e. absent means

pkgs/c/compat.ffmpeg.lua

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
-- Data/logic separation (mcpp 0.0.100 design): sources glob-compressed, list
55
-- files shared when identical, config.{h,asm}/config_components.{h,asm} split
66
-- into a neutral <name>.base + tiny per-OS deltas. ffmpeg source root sits on
7-
-- include_dirs_after (-idirafter, mcpp#249) so libc++ <version> is not shadowed
8-
-- by ffmpeg's VERSION file on case-insensitive macOS.
7+
-- include_dirs_after (-idirafter, mcpp#249) on macOS/windows so libc++
8+
-- <version> is not shadowed by ffmpeg's VERSION file on their case-insensitive
9+
-- filesystems. On linux it is on plain include_dirs INSTEAD: -idirafter ranks
10+
-- below the system dirs, so a host-installed ffmpeg (/usr/include/x86_64-linux-
11+
-- gnu on Debian/Ubuntu) would otherwise outrank the vendored 8.1.2 tree. Never
12+
-- both -- a dir named on -I and -idirafter dedupes to the last one, cancelling
13+
-- the -I.
914
package = {
1015
spec = "1", namespace = "compat", name = "ffmpeg",
1116
description = "FFmpeg 8.1.2 multimedia libraries, full source build (LGPL profile, multi-platform)",
@@ -35,9 +40,6 @@ package = {
3540
"mcpp_generated/libavdevice",
3641
"*/libavcodec",
3742
},
38-
include_dirs_after = {
39-
"*",
40-
},
4143
cflags = {
4244
"-DHAVE_AV_CONFIG_H",
4345
"-D_ISOC11_SOURCE",
@@ -7791,6 +7793,7 @@ static const FFOutputFormat * const muxer_list[] = {
77917793
"*/libavfilter/x86",
77927794
"*/libswscale/x86",
77937795
"*/libswresample/x86",
7796+
"*",
77947797
},
77957798
flags = {
77967799
{ glob = "**/*.asm", asmflags = { "-Pconfig.asm" } },
@@ -8254,6 +8257,9 @@ static const URLProtocol * const url_protocols[] = {
82548257
ldflags = {
82558258
"-lm",
82568259
},
8260+
include_dirs_after = {
8261+
"*",
8262+
},
82578263
sources = {
82588264
"*/libavcodec/{012v,4xm,8bps,8svx,a64multienc,aac_ac3_parser,aac_parser,aaccoder,aacenc,aacenc_is,aacenc_tns,aacenctab,aacps_common,aacps_fixed,aacps_float,aacpsdsp_fixed,aacpsdsp_float,aacpsy,aacsbr,aacsbr_fixed,aactab,aandcttab,aasc,ac3,ac3_channel_layout_tab,ac3_parser,ac3dec_data,ac3dec_fixed,ac3dec_float,ac3dsp,ac3enc,ac3enc_fixed,ac3enc_float,ac3tab,acelp_filters,acelp_pitch_delay,acelp_vectors,adpcm,adpcm_data,adpcmenc,adts_header,adts_parser,adx,adx_parser,adxdec,adxenc,agm,aic,alac,alac_data,alacdsp,alacenc,aliaspixdec,aliaspixenc,allcodecs,alsdec,amr_parser,amrnbdec,amrwbdec,anm,ansi,aom_film_grain,apac,apedec,aptx,aptxdec,aptxenc,apv_decode,apv_dsp,apv_entropy,apv_parser,arbc,argo,ass,ass_split,assdec,assenc,asv,asvdec,asvenc,atrac,atrac1,atrac3,atrac3plus,atrac3plusdec,atrac3plusdsp,atrac9dec,atsc_a53,audio_frame_queue,audiodsp,aura,av1_parse,av1_parser,av1dec,avcodec,avdct,avrndec,avs,avs2,avs2_parser,avs3_parser,avuidec,avuienc,bethsoftvideo,bfi,bgmc,bink,binkaudio,binkdsp,bintext,bitpacked_dec,bitpacked_enc,bitstream,bitstream_filters,blockdsp,bmp,bmp_parser,bmpenc,bmvaudio,bmvvideo,bonk,brenderpix,bsf,bswapdsp,c93,cabac,canopus,cavs,cavs_parser,cavsdata,cavsdec,cavsdsp,cbrt_data,cbrt_data_fixed,cbrt_tablegen_common,cbs,cbs_apv,cbs_av1,cbs_bsf,cbs_h264,cbs_h2645,cbs_h265,cbs_h266,cbs_lcevc,cbs_mpeg2,cbs_sei,cbs_vp8,cbs_vp9,ccaption_dec,cdgraphics,cdtoons,cdxl,celp_filters,celp_math,cfhd,cfhddata,cfhddsp,cfhdenc,cfhdencdsp,cga_data,cinepak,cinepakenc,clearvideo,cljrdec,cljrenc,cllc,cngdec,cngenc,codec_desc,codec_par,cook,cook_parser,cpia,cri,cri_parser,cscd,cyuv,d3d11va,dca,dca_core,dca_exss,dca_lbr,dca_parser,dca_sample_rate_tab,dca_xll,dcaadpcm,dcadata,dcadct,dcadec,dcadsp,dcaenc,dcahuff,dct32_fixed,dct32_float,dds,decode,dfa,dfpwmdec,dfpwmenc,dirac,dirac_arith,dirac_dwt,dirac_parser,dirac_vlc,diracdec,diracdsp,diractab,dnxhd_parser,dnxhddata,dnxhddec,dnxhdenc,dnxuc_parser,dolby_e,dolby_e_parse,dolby_e_parser,dovi_rpu,dovi_rpudec,dovi_rpuenc,dpcm,dpx,dpx_parser,dpxenc,dsd,dsddec,dsicinaudio,dsicinvideo,dss_sp,dstdec,dv,dv_profile,dvaudio_parser,dvaudiodec,dvbsub_parser,dvbsubdec,dvbsubenc,dvd_nav_parser,dvdata,dvdec,dvdsub,dvdsub_parser,dvdsubdec,dvdsubenc,dvenc,dxtory,dxv,dxvenc,dynamic_hdr_vivid,eac3_data,eac3enc,eacmv,eaidct,eamad,eatgq,eatgv,eatqi,elbg,encode,error_resilience,escape124,escape130,evc_parse,evc_parser,evc_ps,evrcdec,executor,exif,faandct,faanidct,fastaudio,faxcompr,fdctdsp,ffv1,ffv1_parse,ffv1_parser,ffv1dec,ffv1enc,ffwavesynth,fic,fits,fitsdec,fitsenc,flac,flac_parser,flacdata,flacdec,flacdsp,flacenc,flacencdsp,flicvideo,flvdec,flvenc,fmtconvert,fmvc,frame_thread_encoder,fraps,frwu,ftr,ftr_parser,g722,g722dec,g722dsp,g722enc,g723_1,g723_1_parser,g723_1dec,g723_1enc,g726,g728dec,g729_parser,g729dec,g729postfilter,gdv,gemdec,get_buffer,gif,gif_parser,gifdec,golomb,gsm_parser,gsmdec,gsmdec_data,h261,h261_parser,h261data,h261dec,h261enc,h263,h263_parser,h263data,h263dec,h263dsp,h2645_parse,h2645_sei,h2645_vui,h2645data,h264_cabac,h264_cavlc,h264_direct,h264_levels,h264_loopfilter,h264_mb,h264_parse,h264_parser,h264_picture,h264_ps,h264_refs,h264_sei,h264_slice,h264chroma,h264data,h264dec,h264dsp,h264idct,h264pred,h264qpel,h265_profile_level,h274,hap,hapdec,hashtable,hcadec,hcom,hdr_parser,hdrdec,hdrenc,hnm4video,hpeldsp,hq_common,hq_hqa,hq_hqadsp,hqx,hqxdsp,htmlsubtitles,huffman,huffyuv,huffyuvdec,huffyuvdsp,huffyuvenc,huffyuvencdsp,idcinvideo,idctdsp,iff,ilbcdec,imc,imgconvert,imm4,imm5,imx,indeo2,indeo3,indeo4,indeo5,intelh263dec,interplayacm,interplayvideo,intrax8,intrax8dsp,ipu_parser,ituh263dec,ituh263enc,ivi,ivi_dsp,j2kenc,jacosubdec,jfdctfst,jfdctint,jni,jpeg2000,jpeg2000_parser,jpeg2000dec,jpeg2000dsp,jpeg2000dwt,jpeg2000htdec,jpegls,jpeglsdec,jpeglsenc,jpegquanttables,jpegtables,jpegxl_parse,jpegxl_parser,jpegxs_parser,jrevdct,jvdec,kbdwin,kgv1dec,kmvc,lagarith,lagarithrac,latm_parser,lcevc_parser,lcevctab,lcldec,leaddec,ljpegenc,loco,lossless_audiodsp,lossless_videodsp,lossless_videoencdsp,lpc,lsp,lzf,lzw,lzwenc,m101,mace,magicyuv,magicyuvenc,mathtables,mdec,me_cmp,mediacodec,metasound,microdvddec,midivid,mimic,misc4,misc4_parser,mjpeg_parser,mjpegbdec,mjpegdec,mjpegdec_common,mjpegenc,mjpegenc_common,mjpegenc_huffman,mlp,mlp_parse,mlp_parser,mlpdec,mlpdsp,mlpenc,mlz,mmvideo,mobiclip,motion_est,motionpixels,movtextdec,movtextenc,mpc,mpc7,mpc8,mpeg12,mpeg12data,mpeg12dec,mpeg12enc,mpeg12framerate,mpeg4audio,mpeg4audio_sample_rates,mpeg4video,mpeg4video_parser,mpeg4videodec,mpeg4videodsp,mpeg4videoenc,mpeg_er,mpegaudio,mpegaudio_parser,mpegaudiodata,mpegaudiodec_common,mpegaudiodec_fixed,mpegaudiodec_float,mpegaudiodecheader,mpegaudiodsp,mpegaudiodsp_data,mpegaudiodsp_fixed,mpegaudiodsp_float,mpegaudioenc,mpegaudiotabs,mpegpicture,mpegutils,mpegvideo,mpegvideo_dec,mpegvideo_enc,mpegvideo_motion,mpegvideo_parser,mpegvideo_unquantize,mpegvideodata,mpegvideoencdsp,mpl2dec,mqc,mqcdec,mqcenc,msgsmdec,msmpeg4,msmpeg4_vc1_data,msmpeg4data,msmpeg4dec,msmpeg4enc,msp2dec,msrle,msrledec,msrleenc,mss1,mss12,mss2,mss2dsp,mss3,mss34dsp,mss4,msvideo1,msvideo1enc,mv30,mvcdec,mxpegdec,nellymoser,nellymoserdec,nellymoserenc,notchlc,null,nuv,on2avc,on2avcdata,options,osq,packet,pafaudio,pafvideo,pamenc,parser,parsers,pcm,pcm-bluray,pcm-blurayenc,pcm-dvd,pcm-dvdenc,pcx,pcxenc,pgssubdec,pgxdec,photocd,pictordec,pixblockdsp,pixlet,png_parser,pnm,pnm_parser,pnmdec,pnmenc,profiles,prores_parser,prores_raw,prores_raw_parser,proresdata,proresdec,proresdsp,proresenc_anatoliy,proresenc_kostya,proresenc_kostya_common,prosumer,psd,psymodel,pthread,pthread_frame,pthread_slice,ptx,qcelpdec,qdm2,qdmc,qdrw,qoadec,qoi_parser,qoidec,qoienc,qpeg,qpeldsp,qsv_api,qtrle,qtrleenc,r210dec,r210enc,ra144,ra144dec,ra144enc,ra288,ralf,rangecoder,ratecontrol,raw,rawdec,rawenc,realtextdec,rka,rl,rl2,rle,roqaudioenc,roqvideo,roqvideodec,roqvideoenc,rpza,rpzaenc,rtjpeg,rtv1,rv10,rv10enc,rv20enc,rv30,rv30dsp,rv34,rv34_parser,rv34dsp,rv40,rv40dsp,rv60dec,rv60dsp,s302m,s302menc,samidec,sanm,sbc,sbc_parser,sbcdec,sbcdsp,sbcenc,sbrdsp,sbrdsp_fixed,scpr,sga,sgidec,sgienc,sgirledec,sheervideo,shorten,simple_idct,sinewin,sipr,sipr16k,sipr_parser,siren,smacker,smc,smcenc,smpte_436m,snappy,snow,snow_dwt,snowdec,snowenc,sonic,sp5xdec,speedhq,speedhqdec,speedhqenc,speexdec,srtdec,srtenc,startcode,subviewerdec,sunrast,sunrastenc,svq1,svq1dec,svq1enc,svq3,synth_filter,tak,tak_parser,takdec,takdsp,targa,targa_y216dec,targaenc,textdec,texturedsp,texturedspenc,threadprogress,tiertexseqv,tiff,tiff_common,tiffenc,tmv,to_upper4,tpeldsp,truemotion1,truemotion2,truemotion2rt,truespeech,tscc2,tta,ttadata,ttadsp,ttaenc,ttaencdsp,ttmlenc,twinvq,twinvqdec,txd,ulti,utils,utvideodec,utvideodsp,utvideoenc,v210dec,v210enc,v210x,v308dec,v308enc,v408dec,v408enc,v410dec,v410enc,vb,vble,vbndec,vbnenc,vc1,vc1_block,vc1_loopfilter,vc1_mc,vc1_parser,vc1_pred,vc1data,vc1dec,vc1dsp,vc2enc,vc2enc_dwt,vcr1,version,videodsp,vima,vlc,vmdaudio,vmdvideo,vmixdec,vmnc,vorbis,vorbis_data,vorbis_parser,vorbisdec,vorbisdsp,vorbisenc,vp3,vp3_parser,vp3dsp,vp5,vp56,vp56data,vp5dsp,vp6,vp6dsp,vp8,vp8_parser,vp8data,vp8dsp,vp9,vp9_parser,vp9block,vp9data,vp9dsp,vp9dsp_10bpp,vp9dsp_12bpp,vp9dsp_8bpp,vp9lpf,vp9mvs,vp9prob,vp9recon,vpx_rac,vqavideo,vqcdec,vvc_parser,wavarc,wavpack,wavpackdata,wavpackenc,wbmpdec,wbmpenc,webp,webp_parser,webvttdec,webvttenc,wma,wma_common,wma_freqs,wmadec,wmaenc,wmalosslessdec,wmaprodec,wmavoice,wmv2data,wmv2dec,wmv2dsp,wmv2enc,wnv1,wrapped_avframe,ws-snd1,xan,xbm_parser,xbmdec,xbmenc,xface,xfacedec,xfaceenc,xiph,xl,xma_parser,xpmdec,xsubdec,xsubenc,xvididct,xwd_parser,xwddec,xwdenc,xxan,y41pdec,y41penc,ylc,yop,yuv4dec,yuv4enc}.c",
82598265
"*/libavcodec/aac/{aacdec,aacdec_ac,aacdec_fixed,aacdec_float,aacdec_lpd,aacdec_tab,aacdec_usac,aacdec_usac_mps212}.c",
@@ -8578,6 +8584,9 @@ static const URLProtocol * const url_protocols[] = {
85788584
"-luuid",
85798585
"-lshlwapi",
85808586
},
8587+
include_dirs_after = {
8588+
"*",
8589+
},
85818590
include_dirs = {
85828591
"*/libavutil/x86",
85838592
"*/libavcodec/x86",

pkgs/o/opencv.lua

Lines changed: 0 additions & 112 deletions
This file was deleted.

tests/examples/opencv-module-dnn/mcpp.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# opencv.dnn interface, so `import opencv.dnn;` is available. All three
44
# platforms (mlas on linux/macOS, built-in fast_gemm on windows).
55
# Overrides the workspace-root redirect: root declares `compat`, this member
6-
# needs `default`. A member-level [indices] REPLACES the inherited table rather
6+
# needs `opencv`. A member-level [indices] REPLACES the inherited table rather
77
# than merging with it, which is what keeps this to ONE project index repo —
88
# two repos pointing at the same tree make every lookup ambiguous.
99
[indices]

tests/examples/opencv-module-unifont/mcpp.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# ["unifont"] }` embeds the CJK font (no new module surface), so FontFace("uni")
33
# renders CJK through `import opencv.cv;`. Exercised on linux and macOS.
44
# Overrides the workspace-root redirect: root declares `compat`, this member
5-
# needs `default`. A member-level [indices] REPLACES the inherited table rather
5+
# needs `opencv`. A member-level [indices] REPLACES the inherited table rather
66
# than merging with it, which is what keeps this to ONE project index repo —
77
# two repos pointing at the same tree make every lookup ambiguous.
88
[indices]

0 commit comments

Comments
 (0)