TL;DR (with expected vs. real)
For a Cygwin build of ffmpeg
, I'm installing x265
, and it seems to me that the executable ends up in the wrong place. I'll show some basic directory structure, then I'll show the tree
outputs for expected and real, both before and after the cmake
installation. For directories where I think this is important, I'll show the outputs before and after the cmake
installation.
My question has two parts. I used the following cmake
and make
commands,
# pwd => $HOME/programs/ffmpeg/ffmpeg_sources/x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
-DENABLE_SHARED=OFF \
-DCMAKE_EXE_LINKER_FLAGS="-static"
../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install
The result is below, with my real vs. expected, and there is a more detailed, more explicit, and hopefully more clear file with the info at pastebin.com/86wHrtxR. Now, for my two-part question:
How can I change my
cmake
command so that myx265.exe
file ends up in$HOME/programs/ffmpeg/bin
with the proper linking, rather than$HOME/programs/ffmpeg/ffmpeg_build/bin
?Would the build/linker/whatever figure things out for the
ffmpeg
build?
I want to know the answer to question number 1 regardless of the answer to question number 2. I haven't used cmake
with the -DVAR=var
flags before, and I'd like to take this opportunity to learn.
For the result:
Things surrounded by double curly brackets are {{ expected }}
.
Things surrounded by double angle brackets are << real >>
, i.e. they exist after the installation is done.
If real matches expected, and the file/directory is new, I've surrounded it by double parentheses, i.e. double round brackets. (( match ))
If something is not new (and thus has the same before and after) I haven't marked it.
me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii bin
bin
|-- lame.exe
|-- mp3rtp.exe
|-- mp3x.exe
`-- x264.exe
{{ `-- x265.exe }} ## Expected, not Exists
me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii \
ffmpeg_build
ffmpeg_build
<< |-- bin >> ## Not expected, Exists
<< | `-- x265.exe >> ## Not expected, Exists
|-- include
| |-- fdk-aac
| | |-- aacdecoder_lib.h
| | |-- aacenc_lib.h
| | `-- ... <more .h files>
| |-- lame
| | `-- lame.h
| |-- x264.h
| `-- x264_config.h
(( | |-- x265.h )) ## Expected and Exists
(( | `-- x265_config.h )) ## Expected and Exists
|-- lib
| |-- libfdk-aac.a
| |-- libfdk-aac.la
| |-- libmp3lame.a
| |-- libmp3lame.la
(( | |-- libx265.a )) ## Expected and Exists
| `-- pkgconfig
| |-- fdk-aac.pc
| `-- x264.pc
(( | `-- x265.pc )) ## Expected and Exists
`-- share
|-- doc
| ... <only lame>
`-- man
... <only lame>
Other, possibly useful information about the build directory structure.
me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -L 1 .
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources
3 directories, 0 files
For this next, ffmpeg_sources
dir, I'm showing the after (which is both expected and real/exists) surrounded by double parentheses, i.e. double round brackets, (( <after> ))
.
me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -L 1 ffmpeg_sources
ffmpeg_sources
|-- fdk-aac.zip
|-- lame-svn
|-- mstorsjo-fdk-aac-e7d8591
|-- x264-snapshot-20191217-2245
|-- x264-snapshot-20191217-2245.tar.bz2
`-- x264-snapshot-20191218-README.txt
(( `-- x265 ))
3 directories, 3 files
(( 4 directories, 3 files ))
NOW, FOR SOME MORE DETAIL
What I'm Doing
I am working on a Cygwin build (vs. a Windows/mingw build) of ffmpeg
. I am following an older guide by koohiimaster (archived). That guide says,
[W]e are not cross-compiling for windows; we are compiling for Cygwin.
This 2014 guide doesn't have all of the codecs I want - I want as complete a build as possible - so I've also been referring to this ffmpeg-for-Ubuntu guide (archived), which I hope is kept up-to-date. It's referred to by koohiimaster.
Also, as a way of checking that I'm getting all the codecs I want, I've been looking at this FFmpeg for Windows guide from SuperUser
I'll give the basics of my steps below. More details, as well as all the output is at pastebin.com/suL1nU6Z.
A look at directory structure for the build
me@MACHINE ~/programs/ffmpeg
$ cd $HOME/programs/ffmpeg
me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -d -L 1
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources
3 directories
Getting the source. Note that I had to apt-cyg install mercurial
, though (with my Cygwin setup GUI/EXE in my Cygwin root directory, i.e. C:\cygwin64\setup-x86_64.exe
), I could also have done /setup-x86_64.exe install -q -P mercurial
.
cd ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265
Running the cmake
and make
commands
cd x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
-DENABLE_SHARED=OFF \
-DCMAKE_EXE_LINKER_FLAGS="-static" \
../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install
It was the last part (actually the very last line) of the make install
output that worried me. Here is the whole output - it's not very long.
make[1]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 20%] Built target encoder
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 83%] Built target common
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 84%] Built target x265-static
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[100%] Built target cli
make[1]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
Install the project...
-- Install configuration: "Release"
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/libx265.a
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265_config.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/pkgconfig/x265.pc
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe
As discussed in the TL;DR section, I expected to see x265.exe
at
home/me/programs/ffmpeg/bin/x265.exe
rather than the path given on the last line of output,
/home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe
This worries me especially because the first part of the ffmpeg
install command that my instructions inform me to run is
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
PKG_CONFIG_PATH="$HOME/programs/ffmpeg/ffmpeg_build/lib/pkgconfig" \
./configure \
--prefix="$HOME/programs/ffmpeg/ffmpeg_build" \
--extra-cflags="-I$HOME/programs/ffmpeg/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/programs/ffmpeg/ffmpeg_build/lib" \
--bindir="$HOME/programs/ffmpeg/bin" \
... and on it goes ...
It would seem to me that the .configure
script for ffmpeg
won't find the x265
executable, since it's not in the bindir
.
I'll repeat my two-part question from before:
- How can I change my
cmake
command so that myx265.exe
file ends up in$HOME/programs/ffmpeg/bin
with the proper linking, rather than$HOME/programs/ffmpeg/ffmpeg_build/bin
?
What I'm looking for here is something akin to the --bindir
flag from make
's ./confiure
.
- Would the build/linker/whatever figure things out for the
ffmpeg
build?
I want to know the answer to question number 1 regardless of the answer to question number 2. I haven't used cmake
with the -DVAR=var
flags before, and I'd like to take this opportunity to learn.
Where I've Looked & What I've Tried
I first started with the man
page and the --help
for cmake
. That was scary. I was hoping that I'd find something useful around the CMAKE_INSTALL_PREFIX
stuff, but I wasn't sure what to make of it.
I tried grep
ing through cmake --help-full
(with 50 lines before and after whatever I was searching for), but got tripped up by the complexity. I've only used basic cmake
stuff, before, and I got more than a little lost.
Even with the --help
, I don't know if I need to look at the help-manual
, the help-command
, the help-module
, the help-policy
, the help-variable
, or something else.
It seemed to me, in reading, that a "binary directory" is the top of the "build", whereas I thought it would be the dir named bin
... I couldn't tell what things were meant to be used by the person creating the package rather than by me, who am trying to make/build the package from the command line.
I looked through what seemed to be a cmake
wiki's Useful Variables page (archived), as well as at this thread at cmake.org (archived), which, along with this SO source and this and this and this and this SO sources, seemed to suggest using the CMAKE_RUNTIME_OUTPUT_DIRECTORY
variable (since the EXECUTABLE_OUTPUT-DIRECTORY
variable has been superseded by it). By the way, I couldn't tell which things should be used by the creator of the package vs. the consumer of the package - the consumer being me. I tried with
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY="$HOME/programs/ffmpeg/bin" \
-DENABLE_SHARED=OFF \
-DCMAKE_EXE_LINKER_FLAGS="-static"
../../source
PATH="$HOME/
and have thought about fifty-or-so other -DVAR variables, but with any I have tried, I still get the same result. I still get the executable in what seems to be the wrong place.
System Details
$ date && date +'%s'
Tue, May 5, 2020 11:14:40 AM
1588698880
$ uname -a
CYGWIN_NT-10.0 MACHINE 3.1.4(0.340/5/3) 2020-02-19 08:49 x86_64 Cygwin
$ cmake --version
cmake version 3.14.5
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ bash --version | head -n 1
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
$ gcc --version | head -n 1
gcc (GCC) 9.3.0
$ g++ --version | head -n 1
g++ (GCC) 9.3.0
$ make --version | head -n 2
GNU Make 4.3
Built for x86_64-pc-cygwin