Build ffmpeg on wsl+msvc(中文)

大致配置命令如下
但在配置之前,我们需要关注一下msvc配置的语言(中文?)与Windows Path对于依赖文件*.d的影响

# 初始化 msvc 环境
cmd /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
# 进入wsl 环境, 试试configure。
wsl -d u18
./configure --toolchain=msvc --enable-gpl --extra-cflags=/utf-8 --enable-shared --disable-stripping --disable-optimizations --disable-doc --prefix=`pwd`/../install

头文件中的中文字符

config.h: #define CC_IDENT "用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27051 版"
可能需要移除,或者翻译,或者转码

转码脚本:

#!/bin/bash

file=$1

if [[ $(file -i $file) == *"charset=utf-8"* ]]; then
    echo "$file is already utf-8 encoded"
else
    echo "$file is not utf-8 encoded"
    # iconv -f $(file -bi $file | awk -F "=" '{print $2}') -t utf-8 $file > ${file}.utf8
    iconv -f GBK -t utf-8 "$file" > "$file.temp"
    mv "$file.temp" "$file"

fi

Windows路径格式

但此时编译可能会遇到 .d 依赖描述文件的路径格式不兼容问题
例如,手动执行以下语句

cl.exe -D__STDC_CONSTANT_MACROS -nologo /utf-8 -I. -utf-8 -showIncludes libavcodec/4xm.c
注意: 包含文件:  h:\code\ot\dxva\ffmpeg\libavcodec\get_bits.h
注意: 包含文件:   h:\code\ot\dxva\ffmpeg\libavcodec\mathops.h
注意: 包含文件:    H:\code\ot\dxva\ffmpeg\libavutil/attributes_internal.h
注意: 包含文件:    h:\code\ot\dxva\ffmpeg\libavcodec\x86/mathops.h
注意: 包含文件:     H:\code\ot\dxva\ffmpeg\libavutil/x86/asm.h
注意: 包含文件:   h:\code\ot\dxva\ffmpeg\libavcodec\vlc.h

注意到configure 中处理路径格式的片段

        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'

是针对英文与unix版路径的,所以需要替换

中文路径

使用 iconv 做管道转码 并更改sed参数
你可以验证以下命令

$ cl.exe -showIncludes -utf-8  -I. libavcodec/4xm.c 2>&1 |\
 iconv -f GBK -t utf-8 |\
 awk '/包含文件/ { sub(/^.*包含文件: */, ""); gsub(/\\/, "/"); if (!match($0, / /)) { b=substr($0,3);  $0=gensub(/(\w):(.*)/,"/mnt/\\1" b,1,tolower($0)); print "$@:", $0 } }'

windows路径

替换到wsl路径

$ cl.exe -showIncludes -utf-8  -I. libavcodec/4xm.c 2>&1 |\
 iconv -f GBK -t utf-8 |\
 awk '/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($0, / /)) { b=substr($0,3);  $0=gensub(/(\w):(.*)/,"/mnt/\\1" b,1,tolower($0)); print "$@:", $0 } }'

综合

注意如果vs不在中文环境的话,只需替换wsl路径就可以了
总之,综合起来就是
注意,控制台或者configure文件的编码是utf8,所以要求awk处理的中文字符也是utf编码的, 这是我的理解

$ cl.exe -showIncludes -utf-8  -I. libavcodec/4xm.c 2>&1 |\
 iconv -f GBK -t utf-8 |\
 awk '/包含文件|including/ { sub(/^.*包含文件: *|^.*file: */, ""); gsub(/\\/, "/"); if (!match($0, / /)) { b=substr($0,3);  $0=gensub(/(\w):(.*)/,"/mnt/\\1" b,1,tolower($0)); print "$@:", $0 } }'

总结

修改configure的内容

#  elif $_cc -nologo- 2>&1 | grep -q Microsoft || { $_cc -v 2>&1 | grep -q clang && $_cc -? > /dev/null 2>&1; }; then
#         _type=msvc
#         if $_cc -nologo- 2>&1 | grep -q Microsoft; then
#             _ident=$($_cc 2>&1 | head -n1 | tr -d '\r')
#         else
#             _ident=$($_cc --version 2>/dev/null | head -n1 | tr -d '\r')
#         fi
# -       _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
# + 
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | iconv -f GBK -t utf-8 | awk '\''/包含文件|including/ { sub(/^.*包含文件: *|^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) { b=substr($$0,3); $$0=gensub(/(\w):(.*)/,"/mnt/\\1" b,1,tolower($$0)); print "$@:", $$0 } }'\'' > $(@:.o=.d)'

configure

# 1. 初始化 msvc 环境
cmd /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
# 2. ... 修改configure的dep gen配置
# 3. 进入wsl 环境
wsl -d u18
# 4. config
./configure --toolchain=msvc --enable-gpl --extra-cflags=/utf-8 --enable-shared --disable-stripping --disable-optimizations --disable-doc --prefix=`pwd`/../install
# 5. 修改 config.h 中的中文CC_INDENT...
# 6. 手动修改 ffbuild/config.mak 中的编译配置也可,例如增加编译选项
# 7. make
make -j

cl.exe -showIncludes -utf-8 -I. libavcodec/4xm.c 2>&1 | iconv -f GBK -t utf-8 | awk '/包含文件|including/ { sub(/^.*包含文件: |^.file: /, ""); gsub(/\/, "/"); if (!match($$0, / /)) { b=substr($$0,3); $$0=gensub(/(\w)😦.)/,"/mnt/\1" b,1,tolower($$0)); print "$@:", $$0 } }'

更多

手动修改编译选项

关注 ffbuild/config.mak
由于编译时出现了一堆警告 libavfilter/af_adelay.c(99): warning C4267: “初始化”: 从“size_t”转换到“const int”,可能丢失数据
故手动添加诸如 -wd4267 之类的标志

CFLAGS= -nologo /utf-8  -Z7 -W3 -wd4018 -wd4133 -wd4146 -wd4244 -wd4267 -wd4305 -wd4334 -wd4554 -O1 -utf-8

附录

追踪 dep gen的命令路径:

  • configure
  • ffbuild/config.mak
  • make -n > make.log
posted @ 2024-02-25 21:28  cheerlisten  阅读(156)  评论(0)    收藏  举报