media-autobuild_suite icon indicating copy to clipboard operation
media-autobuild_suite copied to clipboard

[mingw64] [repo] .\build\ffmpeg-git\build-shared-64bit\src is a SYMLINK not a DIR

Open hunterhogan opened this issue 8 months ago • 2 comments

The nominal error is ffmpegSHARED failing to compile because libplacebo is missing. Logs attached.

ERROR: libplacebo >= 4.192.0 not found using pkg-config

I was curious if the same problem would happen with only a static build. It does. Logs attached.

If I comment out libplacebo #--enable-libplacebo from ffmpeg_options.txt, everything compiles.

By luck, I noticed that .\build\ffmpeg-git\build-shared-64bit\src is a shortcut[^1] not a directory. Even worse, the target of the shortcut is two directories above the shortcut, .\build\ffmpeg-git\. At least within the Windows file system, this creates a recursive reference, so my logical file structure includes the following paths.[^2] (See also, symlinks_dir.txt, attached.)

DIR *.* /A:DL /S /B

.\build\ffmpeg-git\build-shared-64bit\src
.\build\ffmpeg-git\build-shared-64bit\src\build-shared-64bit\src
...
.\build\ffmpeg-git\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src\build-shared-64bit\src

Including the base path where I installed MABS, the last path is 783 characters long. To add another recursion would require 23 characters, which would total 806 characters. Windows/DOS has character limits to the total path length, but off the top of my head, I don't know the limit for this precise situation in Windows Server 2019. Microsoft Windows [Version 10.0.17763.4851] Nevertheless, ~806 is odd[^4] but not inconsistent with my experience.[^3]

I suspect that the use of a shortcut in MABS is unintentional. I searched the all MABS subdirectories: shortcuts are rare and there aren't any other shortcuts for directories. See attached.

I used grepWin on all subdirectories from the MABS root to search for "CreateShortcut". I didn't see anything suspicious. The only result that I think was written by MABS is in media-autobuild_suite.bat of course. echo.Set link = Shell.CreateShortcut("%instdir%\mintty.lnk"^)

Now, I am at the limit of my ability to troubleshoot this efficiently, therefore, I am opening this ticket. I suspect that someone who knows the MABS code will know exactly were to look.

I also suspect that some other open tickets referring to libplacebo and vulkan are related to this issue. But since I couldn't find an open issue that mentioned this exact problem, I opened a new ticket so things didn't get confusing. #2499 #2399 Perhaps this recursion is causing some of the other ERROR: library not found using pkg-config.

(I'm still learning to use git and GitHub for documentation, so I have probably missed some opportunities to improve these notes.)

logs_shared.zip logs_static.zip symlinks.txt symlinks_dir.txt [^1]: SYMLINK, symbolic link, or reparse point. [^2]: I don't know mintty, so I can't be sure that it uses the Windows file system. It is theoretically possible that mintty does not resolve the shortcut recursively. [^3]: Experience from a long time ago. A+ in 1998. MCSE 2000. MCSA 2003/XP. [^4]: The "classic" limit was 256 + drive letter + colon + backslash + terminator = 260. I would have expected to see a limit closer to a power of 2, such as 1024 or 32,768, but whatever.

hunterhogan avatar Oct 10 '23 20:10 hunterhogan

I realized I didn't show the directory structure for the static build. DIR *.* /ALD /B /S>symlinks_dir_static.txt

C:\apps\media-autobuild_suite\build\ffmpeg-git\build-static-64bit\src
C:\apps\media-autobuild_suite\build\ffmpeg-git\build-static-64bit\src\build-static-64bit\src
...
C:\apps\media-autobuild_suite\build\ffmpeg-git\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src\build-static-64bit\src

Also 783 characters long (including the terminator) symlinks_dir_static.txt

hunterhogan avatar Oct 10 '23 20:10 hunterhogan

.\build\ffmpeg-git\configure reads

# find source path
if test -f configure; then
    source_path=.
elif test -f src/configure; then
    source_path=src
else
    source_path=$(cd $(dirname "$0"); pwd)
    case "$source_path" in
        *[[:blank:]]*) die "Out of tree builds are impossible with whitespace in source path." ;;
    esac
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
fi

config.log reads source_path=/build/ffmpeg-git

.\build\ffmpeg-git\configure reads

if [ "$source_path" != "." ] && [ "$source_path" != "src" ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then
    # create link to source path
    [ -e src ] && rm src
    $ln_s "$source_path" src
    source_link=src
else
    # creating directory links doesn't work
    # fall back to using the full source path
    source_link="$source_path"
fi

I'm very unsure, but I think in the last block of code, this $ln_s "$source_path" src could do:

  • in the current directory,
  • create a symbolic link
  • named src
  • with a target directory of ./build/ffmpeg-git.

So if the current directory were ./build/ffmpeg-git/build-static-64bit, then src would be in ./build/ffmpeg-git/build-static-64bit with a target of ./build/ffmpeg-git.

(I'm feeling faint: recursion is hard.)

hunterhogan avatar Oct 10 '23 21:10 hunterhogan

Should be closed with https://github.com/m-ab-s/media-autobuild_suite/commit/e9fc1af2098bd3740b5391c658dc01e501b81d68 as it no longer uses glslang for libplacebo

1480c1 avatar Mar 01 '24 23:03 1480c1