Compile Mkvtoolnix with 10.8 (or higher) and Xcode 5.1 (or higher)

H

Harry3

unregistriert
Thread Starter
Dabei seit
19.04.2014
Beiträge
157
Reaktionspunkte
0
Da es fast über ein Jahr keinen Mkvtoolnix-Build gab, habe ich versucht mit sehr großzügiger Hilfe von Moritz Bunkus, OS-X-Builds zu erstellen. Dabei wurden ein paar Mac-Eigenheiten berücksichtigt. So nutzt Mkvtoolnix inzwischen auf dem Mac das in TMPDIR gesetzte Verzeichnis für jeden Nutzer also ein individuelles Verzeichnis, erzeugt man die Mac-App schaut die GUI im Application Bundle nach wenn man nur "mkvmerge" angibt (diese Änderung ist bisher nur via git aber nicht im 6.9.1 Release enthalten). Das hat zur Folge dass man die fertige App überall hinkopieren bzw. umbenennen kann wie man will und es funktioniert. Die Builds sind statisch und setzen zumindest für die GUI 10.8 (or höher) voraus.

Vorbereitung: folgende Dateien runterladen (etliche ändern sich sehr selten)
autoconf-latest.tar.gz, automake-1.14.tar.gz, boost_1_55_0.tar.gz, expat-2.1.0.tar.gz, flac-1.3.0.tar, libebml-1.3.0.tar.bz2, libmatroska-1.4.1.tar.bz2, libogg-1.3.1.tar.gz, libvorbis-1.3.4.tar.gz, pkg-config-0.28.tar.gz, ruby-2.1.1.tar.gz, wxWidgets-3.0.0.tar.bz2, zlib-1.2.8.tar.gz

Verbesserungsvorschläge sind willkommen.
Zuerst eine Ramdisk mit 3GB (2.5GB dürften auch reichen) anlegen und ein paar Umgebungsvariablen setzen.
Code:
VOLNAME=Ramdisk
DISK_ID=$(hdid -nomount ram://6291456)
newfs_hfs -v ${VOLNAME} ${DISK_ID}
diskutil mount ${DISK_ID}

export TARGET="/Volumes/${VOLNAME}/"
export CMPL="/Volumes/${VOLNAME}/compile"
export PATH=${TARGET}/bin:$PATH
export CC="clang"
export CPP="clang -E"
export CXX="clang++"
export CXXCPP="clang++ -E"
export LDFLAGS="-stdlib=libc++"
export CXXFLAGS="-std=c++11 -stdlib=libc++"
mkdir ${CMPL}
Jetzt auf der Ramdisk einen Ordner "source" erstellen und alle Dateien hinkopieren.

Auf einem Mac Mini i7 dauert der folgende Prozess ca. 45 Minuten, am Ende steht dann aber die fertige App.
Code:
# Building autoconf
cd ${CMPL}
tar xzpf ../source/autoconf-latest.tar.gz
cd autoconf-2.69
./configure --prefix=${TARGET}
make -j 2 && make install

# Building automake
cd ${CMPL}
tar xzpf ../source/automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=${TARGET}
make -j 2 && make install

# Building pkg-config
cd ${CMPL} 
tar xzpf ../source/pkg-config-0.28.tar.gz
cd pkg-config-0.28
./configure --prefix=${TARGET} --with-pc-path=${TARGET}/lib/pkgconfig --with-internal-glib --enable-static --enable-shared=no
make -j 2 && make install


# Building libebml
cd ${CMPL}
tar xjpf ../source/libebml-1.3.0.tar.bz2
cd libebml-1.3.0/make/linux/
perl -p -i -e  "s#/usr/local#/Volumes/Ramdisk#g"  Makefile
make staticlib
make install_staticlib install_headers

# Building libMatroska
cd ${CMPL}
tar xjpf ../source/libmatroska-1.4.1.tar.bz2
cd libmatroska-1.4.1/make/linux/
perl -p -i -e  "s#/usr/local#/Volumes/Ramdisk#g"  Makefile
make staticlib
make install_staticlib install_headers

# Building expat
cd ${CMPL}
tar xzpf ../source/expat-2.1.0.tar.gz
cd expat-2.1.0/
./configure CPPFLAGS=-DXML_LARGE_SIZE --prefix=${TARGET} --enable-static --enable-shared=no
make -j 2 && make install

# Building ogg
cd ${CMPL}
tar xzpf ../source/libogg-1.3.1.tar.gz
cd libogg-1.3.1
./configure --prefix=${TARGET} --disable-shared --enable-static
make -j 2 && make install

# Building vorbis
cd ${CMPL}
tar xzpf ../source/libvorbis-1.3.4.tar.gz
cd libvorbis-1.3.4
./configure --prefix=${TARGET} --with-ogg-libraries=${TARGET}/lib --with-ogg-includes=${TARGET}/include/ --enable-static --disable-shared
make -j 2 && make install

# Building flac
cd ${CMPL}
tar xpf ../source/flac-1.3.0.tar
cd flac-1.3.0
./configure --prefix=${TARGET} --disable-asm-optimizations --disable-xmms-plugin --with-ogg-libraries=${TARGET}/lib --with-ogg-includes=${TARGET}/include/ --enable-static --disable-shared
make -j 2 && make install

# Building zlib
cd ${CMPL}
tar xzpf ../source/zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure --prefix=${TARGET} --static
make -j 2 && make install

# Building Ruby
cd ${CMPL}
tar xzpf ../source/ruby-2.1.1.tar.gz
cd ruby-2.1.1
./configure --prefix=${TARGET} --enable-static
make -j 2 && make install

# Building Boost
cd ${CMPL}
tar xzpf ../source/boost_1_55_0.tar.gz
cd boost_1_55_0
./bootstrap.sh --with-toolset=clang --prefix=${TARGET} --libdir=${TARGET}/lib
./b2 --reconfigure toolset=clang link=static -sICONV_PATH=/usr cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" --prefix=${TARGET} install

# Building wxWidgets
cd ${CMPL}
tar xjpf ../source/wxWidgets-3.0.0.tar.bz2
cd wxWidgets-3.0.0
./configure --with-osx_cocoa --with-macosx-version-min=10.8 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk --prefix=${TARGET} --with-opengl OBJCXXFLAGS="-stdlib=libc++ -std=c++11" LDFLAGS="-stdlib=libc++" --disable-shared --enable-static --with-libiconv=/usr/ --with-zlib --without-liblzma
make

# Building mkvtoolnix
cd ${CMPL}
git clone git://github.com/mbunkus/mkvtoolnix.git
cd mkvtoolnix
./autogen.sh
./configure --prefix=${TARGET} --with-extra-libs=${TARGET}/lib --with-extra-includes=${TARGET}/include --with-boost-libdir=${TARGET}/lib toolset=clang CXXFLAGS="-stdlib=libc++ -std=c++11" OBJCXXFLAGS="-stdlib=libc++ -std=c++11" LDFLAGS="-stdlib=libc++" CC=clang CXX=clang++ --disable-debug --without-curl --enable-gui --enable-wxwidgets --with-wx-config=${TARGET}/compile/wxWidgets-3.0.0/wx-config
./drake
Ist man an dieser Stelle angelangt sind die 4 CLI-Programme (mkvinfo, mkvmerge, mkvextract und mkvproedit) im Ordner mkvtoolnix/src und das für die GUI benötigte Programm mmg im Ordner mkvtoolnix/src/mmg. Um das Mac-Programm zu erstellen müssen jetzt ein paar Ordner erstellt (in diesem Fall im Ordner mkvtoolnix/OSX_build), Dateien kopiert werden (man befindet sich zu diesem Moment immer noch im compile/mkvtoolnix-Ordner):

Code:
# Creating OS X Application
mkdir OSX_build
mkdir OSX_build/Mkvtoolnix.app
mkdir OSX_build/Mkvtoolnix.app/Contents
mkdir OSX_build/Mkvtoolnix.app/Contents/Frameworks
mkdir OSX_build/Mkvtoolnix.app/Contents/MacOS
mkdir OSX_build/Mkvtoolnix.app/Contents/Resources
cp src/mkvextract OSX_build/Mkvtoolnix.app/Contents/MacOS/
cp src/mkvinfo OSX_build/Mkvtoolnix.app/Contents/MacOS/
cp src/mkvmerge OSX_build/Mkvtoolnix.app/Contents/MacOS/
cp src/mkvpropedit OSX_build/Mkvtoolnix.app/Contents/MacOS/
cp src/mmg/mmg OSX_build/Mkvtoolnix.app/Contents/MacOS/
Dazu die 2 Textdateien PkgInfo und Info.plist
Code:
cat <<EOF >OSX_build/Mkvtoolnix.app/Contents/PkgInfo
APPL????
EOF


cat <<EOF >OSX_build/Mkvtoolnix.app/Contents/Info.plist
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>       <string>English</string>
    <key>CFBundleExecutable</key>              <string>mmg</string>
    <key>CFBundleInfoDictionaryVersion</key>   <string>6.9</string>
    <key>CFBundlePackageType</key>             <string>APPL</string>
    <key>CSResourcesFileMapped</key>           <true/>
 
    <key>CFBundleVersion</key>                 <string>Mkvtoolnix-6.9.1</string>
    <key>CFBundleShortVersionString</key>      <string>6.9.1</string>
 
    <key>CFBundleName</key>                    <string>Mkvtoolnix</string>
    <key>CFBundleIconFile</key>                <string>mmg.icns</string>
 
    <key>CFBundleDocumentTypes</key> <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                                <!-- Here goes the file formats your app can read -->
            </array>
            <key>CFBundleTypeIconFile</key>      <string>mmg.icns</string>
            <key>CFBundleTypeName</key>          <string>Mkvtoolnix-6.9.1</string>
            <key>CFBundleTypeRole</key>          <string>Editor</string>
            <key>LSIsAppleDefaultForType</key>   <true/>
            <key>LSTypeIsPackage</key>           <false/>
        </dict>
 
    </array>
 
</dict>
</plist>
EOF
Zum Abschluss fehlt noch das Icon (mmg.icns), das ich aus der alten App nach OSX_build/Mkvtoolnix.app/Contents/Resources kopiere.

Hier werden von meinem angepassten Script die Source-Dateien automatisch auf die Ramdisk kopiert und am Ende des Prozesses wird ein komprimiertes Archiv mit dem Ramdisk-Inhalt erstellt, so dass ich nur einzelne Komponenten (wenn z.B. eine neue Mktoolnix-Version rauskommt) neu compilieren muss.

Verbsserungsvorschläge sind willkommen.
 
Zuletzt bearbeitet:
Zurück
Oben Unten