├── .dockerignore ├── .gitignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── build-ubuntu.sh ├── build.sh ├── download.pl ├── env.source ├── fetchurl └── renovate.json /.dockerignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | build/ 3 | dl/ 4 | target/ 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | target/ 3 | *.swp 4 | bin/ 5 | dl/ 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | 3 | services: 4 | - docker 5 | 6 | install: 7 | - docker build -t ci . 8 | 9 | script: 10 | - docker run -ti --rm ci bash -c "cd /ffmpeg-static ; ./build.sh -j $(($(nproc) + 1)) && ldd bin/ffmpeg ; (ldd bin/ffmpeg | grep 'not a dynamic executable')" 11 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:noble 2 | 3 | # Basic packages needed to download dependencies and unpack them. 4 | RUN apt-get update && apt-get install -y \ 5 | bzip2 \ 6 | perl \ 7 | tar \ 8 | wget \ 9 | xz-utils \ 10 | && rm -rf /var/lib/apt/lists/* 11 | 12 | # Install packages necessary for compilation. 13 | RUN apt-get update && apt-get install -y \ 14 | autoconf \ 15 | automake \ 16 | bash \ 17 | build-essential \ 18 | cmake \ 19 | curl \ 20 | frei0r-plugins-dev \ 21 | gawk \ 22 | libfontconfig-dev \ 23 | libfreetype6-dev \ 24 | libopencore-amrnb-dev \ 25 | libopencore-amrwb-dev \ 26 | libsdl2-dev \ 27 | libspeex-dev \ 28 | libtheora-dev \ 29 | libtool \ 30 | libva-dev \ 31 | libvdpau-dev \ 32 | libvo-amrwbenc-dev \ 33 | libvorbis-dev \ 34 | libwebp-dev \ 35 | libxcb1-dev \ 36 | libxcb-shm0-dev \ 37 | libxcb-xfixes0-dev \ 38 | libxvidcore-dev \ 39 | lsb-release \ 40 | pkg-config \ 41 | sudo \ 42 | tar \ 43 | texi2html \ 44 | yasm \ 45 | && rm -rf /var/lib/apt/lists/* 46 | 47 | # Copy the build scripts. 48 | COPY build.sh download.pl env.source fetchurl /ffmpeg-static/ 49 | 50 | VOLUME /ffmpeg-static 51 | WORKDIR /ffmpeg-static 52 | CMD /bin/bash 53 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010(s), zimbatm and contributors. 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any 4 | purpose with or without fee is hereby granted, provided that the above 5 | copyright notice and this permission notice appear in all copies. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 8 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 9 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 10 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 11 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 12 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 13 | PERFORMANCE OF THIS SOFTWARE. 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | FFmpeg static build 2 | =================== 3 | 4 | *STATUS*: community-supported 5 | 6 | Three scripts to make a static build of ffmpeg with all the latest codecs (webm + h264). 7 | 8 | Just follow the instructions below. Once you have the build dependencies, 9 | run ./build.sh, wait and you should get the ffmpeg binary in target/bin 10 | 11 | Build dependencies 12 | ------------------ 13 | 14 | # Debian & Ubuntu 15 | $ apt-get install build-essential curl tar libass-dev libtheora-dev libvorbis-dev libtool cmake automake autoconf 16 | 17 | # OS X 18 | # 1. install XCode 19 | # 2. install XCode command line tools 20 | # 3. install homebrew 21 | # brew install openssl frei0r sdl2 wget 22 | 23 | Build & "install" 24 | ----------------- 25 | 26 | $ ./build.sh [-j ] [-B] [-d] 27 | # ... wait ... 28 | # binaries can be found in ./target/bin/ 29 | 30 | Ubuntu users can download dependencies and and install in one command: 31 | 32 | $ sudo ./build-ubuntu.sh 33 | 34 | If you have built ffmpeg before with `build.sh`, the default behaviour is to keep the previous configuration. If you would like to reconfigure and rebuild all packages, use the `-B` flag. `-d` flag will only download and unpack the dependencies but not build. 35 | 36 | NOTE: If you're going to use the h264 presets, make sure to copy them along the binaries. For ease, you can put them in your home folder like this: 37 | 38 | $ mkdir ~/.ffmpeg 39 | $ cp ./target/share/ffmpeg/*.ffpreset ~/.ffmpeg 40 | 41 | 42 | Build in docker 43 | --------------- 44 | 45 | $ docker build -t ffmpeg-static . 46 | $ docker run -it ffmpeg-static 47 | $ ./build.sh [-j ] [-B] [-d] 48 | 49 | The binaries will be created in `/ffmpeg-static/bin` directory. 50 | Method of getting them out of the Docker container is up to you. 51 | `/ffmpeg-static` is a Docker volume. 52 | 53 | Debug 54 | ----- 55 | 56 | On the top-level of the project, run: 57 | 58 | $ . env.source 59 | 60 | You can then enter the source folders and make the compilation yourself 61 | 62 | $ cd build/ffmpeg-* 63 | $ ./configure --prefix=$TARGET_DIR #... 64 | # ... 65 | 66 | Remaining links 67 | --------------- 68 | 69 | I'm not sure it's a good idea to statically link those, but it probably 70 | means the executable won't work across distributions or even across releases. 71 | 72 | # On Ubuntu 10.04: 73 | $ ldd ./target/bin/ffmpeg 74 | not a dynamic executable 75 | 76 | # on OSX 10.6.4: 77 | $ otool -L ffmpeg 78 | ffmpeg: 79 | /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0) 80 | 81 | Community, bugs and reports 82 | --------------------------- 83 | 84 | This repository is community-supported. If you make a useful PR then you will 85 | be added as a contributor to the repo. All changes are assumed to be licensed 86 | under the same license as the project (ISC). 87 | 88 | As a contributor you can do whatever you want. Help maintain the scripts, 89 | upgrade dependencies and merge other people's PRs. Just be responsible and 90 | make an issue if you want to introduce bigger changes so we can discuss them 91 | beforehand. 92 | 93 | ### TODO 94 | 95 | * Add some tests to check that video output is correctly generated 96 | this would help upgrading the package without too much work 97 | * OSX's xvidcore does not detect yasm correctly 98 | * remove remaining libs (?) 99 | 100 | Related projects 101 | ---------------- 102 | 103 | * FFmpeg Static Builds - http://johnvansickle.com/ffmpeg/ 104 | 105 | License 106 | ------- 107 | 108 | This project is licensed under the ISC. See the [LICENSE](LICENSE) file for 109 | the legalities. 110 | 111 | -------------------------------------------------------------------------------- /build-ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo apt-get install build-essential curl tar pkg-config 4 | sudo apt-get -y --force-yes install \ 5 | autoconf \ 6 | automake \ 7 | build-essential \ 8 | cmake \ 9 | frei0r-plugins-dev \ 10 | gawk \ 11 | libass-dev \ 12 | libfreetype6-dev \ 13 | libopencore-amrnb-dev \ 14 | libopencore-amrwb-dev \ 15 | libsdl1.2-dev \ 16 | libspeex-dev \ 17 | libssl-dev \ 18 | libtheora-dev \ 19 | libtool \ 20 | libva-dev \ 21 | libvdpau-dev \ 22 | libvo-amrwbenc-dev \ 23 | libvorbis-dev \ 24 | libwebp-dev \ 25 | libxcb1-dev \ 26 | libxcb-shm0-dev \ 27 | libxcb-xfixes0-dev \ 28 | libxvidcore-dev \ 29 | pkg-config \ 30 | texi2html \ 31 | zlib1g-dev 32 | 33 | # For 12.04 34 | # libx265 requires cmake version >= 2.8.8 35 | # 12.04 only have 2.8.7 36 | ubuntu_version=`lsb_release -rs` 37 | need_ppa=`echo $ubuntu_version'<=12.04' | bc -l` 38 | if [ $need_ppa -eq 1 ]; then 39 | sudo add-apt-repository ppa:roblib/ppa 40 | sudo apt-get update 41 | sudo apt-get install cmake 42 | fi 43 | 44 | ./build.sh "$@" 45 | 46 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | set -u 5 | 6 | jflag= 7 | jval=2 8 | rebuild=0 9 | download_only=0 10 | uname -mpi | grep -qE 'x86|i386|i686' && is_x86=1 || is_x86=0 11 | 12 | while getopts 'j:Bd' OPTION 13 | do 14 | case $OPTION in 15 | j) 16 | jflag=1 17 | jval="$OPTARG" 18 | ;; 19 | B) 20 | rebuild=1 21 | ;; 22 | d) 23 | download_only=1 24 | ;; 25 | ?) 26 | printf "Usage: %s: [-j concurrency_level] (hint: your cores + 20%%) [-B] [-d]\n" $(basename $0) >&2 27 | exit 2 28 | ;; 29 | esac 30 | done 31 | shift $(($OPTIND - 1)) 32 | 33 | if [ "$jflag" ] 34 | then 35 | if [ "$jval" ] 36 | then 37 | printf "Option -j specified (%d)\n" $jval 38 | fi 39 | fi 40 | 41 | [ "$rebuild" -eq 1 ] && echo "Reconfiguring existing packages..." 42 | [ $is_x86 -ne 1 ] && echo "Not using yasm or nasm on non-x86 platform..." 43 | 44 | cd `dirname $0` 45 | ENV_ROOT=`pwd` 46 | . ./env.source 47 | 48 | # check operating system 49 | OS=`uname` 50 | platform="unknown" 51 | 52 | case $OS in 53 | 'Darwin') 54 | platform='darwin' 55 | ;; 56 | 'Linux') 57 | platform='linux' 58 | ;; 59 | esac 60 | 61 | #if you want a rebuild 62 | #rm -rf "$BUILD_DIR" "$TARGET_DIR" 63 | mkdir -p "$BUILD_DIR" "$TARGET_DIR" "$DOWNLOAD_DIR" "$BIN_DIR" 64 | 65 | #download and extract package 66 | download(){ 67 | filename="$1" 68 | if [ ! -z "$2" ];then 69 | filename="$2" 70 | fi 71 | ../download.pl "$DOWNLOAD_DIR" "$1" "$filename" "$3" "$4" 72 | #disable uncompress 73 | REPLACE="$rebuild" CACHE_DIR="$DOWNLOAD_DIR" ../fetchurl "http://cache/$filename" 74 | } 75 | 76 | echo "#### FFmpeg static build ####" 77 | 78 | #this is our working directory 79 | cd $BUILD_DIR 80 | 81 | [ $is_x86 -eq 1 ] && download \ 82 | "yasm-1.3.0.tar.gz" \ 83 | "" \ 84 | "fc9e586751ff789b34b1f21d572d96af" \ 85 | "http://www.tortall.net/projects/yasm/releases/" 86 | 87 | [ $is_x86 -eq 1 ] && download \ 88 | "nasm-2.15.05.tar.bz2" \ 89 | "" \ 90 | "b8985eddf3a6b08fc246c14f5889147c" \ 91 | "https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/" 92 | 93 | download \ 94 | "OpenSSL_1_0_2o.tar.gz" \ 95 | "" \ 96 | "5b5c050f83feaa0c784070637fac3af4" \ 97 | "https://github.com/openssl/openssl/archive/" 98 | 99 | download \ 100 | "v1.2.11.tar.gz" \ 101 | "zlib-1.2.11.tar.gz" \ 102 | "0095d2d2d1f3442ce1318336637b695f" \ 103 | "https://github.com/madler/zlib/archive/" 104 | 105 | download \ 106 | "v1.5.3.tar.gz" \ 107 | "" \ 108 | "df8213a3669dd846ddaad0fa1e9f417b" \ 109 | "https://github.com/Haivision/srt/archive/refs/tags/" 110 | 111 | download \ 112 | "x264-stable.tar.gz" \ 113 | "" \ 114 | "nil" \ 115 | "https://code.videolan.org/videolan/x264/-/archive/stable/" 116 | 117 | download \ 118 | "x265_3.4.tar.gz" \ 119 | "" \ 120 | "e37b91c1c114f8815a3f46f039fe79b5" \ 121 | "http://download.openpkg.org/components/cache/x265/" 122 | 123 | download \ 124 | "v0.1.6.tar.gz" \ 125 | "fdk-aac.tar.gz" \ 126 | "223d5f579d29fb0d019a775da4e0e061" \ 127 | "https://github.com/mstorsjo/fdk-aac/archive" 128 | 129 | # libass dependency 130 | download \ 131 | "harfbuzz-1.4.6.tar.bz2" \ 132 | "" \ 133 | "e246c08a3bac98e31e731b2a1bf97edf" \ 134 | "https://www.freedesktop.org/software/harfbuzz/release/" 135 | 136 | download \ 137 | "fribidi-1.0.2.tar.bz2" \ 138 | "" \ 139 | "bd2eb2f3a01ba11a541153f505005a7b" \ 140 | "https://github.com/fribidi/fribidi/releases/download/v1.0.2/" 141 | 142 | download \ 143 | "0.13.6.tar.gz" \ 144 | "libass-0.13.6.tar.gz" \ 145 | "nil" \ 146 | "https://github.com/libass/libass/archive/" 147 | 148 | download \ 149 | "lame-3.99.5.tar.gz" \ 150 | "" \ 151 | "84835b313d4a8b68f5349816d33e07ce" \ 152 | "http://downloads.sourceforge.net/project/lame/lame/3.99" 153 | 154 | download \ 155 | "opus-1.1.2.tar.gz" \ 156 | "" \ 157 | "1f08a661bc72930187893a07f3741a91" \ 158 | "https://github.com/xiph/opus/releases/download/v1.1.2" 159 | 160 | download \ 161 | "v1.6.1.tar.gz" \ 162 | "vpx-1.6.1.tar.gz" \ 163 | "b0925c8266e2859311860db5d76d1671" \ 164 | "https://github.com/webmproject/libvpx/archive" 165 | 166 | download \ 167 | "rtmpdump-2.3.tgz" \ 168 | "" \ 169 | "eb961f31cd55f0acf5aad1a7b900ef59" \ 170 | "https://rtmpdump.mplayerhq.hu/download/" 171 | 172 | download \ 173 | "soxr-0.1.2-Source.tar.xz" \ 174 | "" \ 175 | "0866fc4320e26f47152798ac000de1c0" \ 176 | "https://sourceforge.net/projects/soxr/files/" 177 | 178 | download \ 179 | "release-0.98b.tar.gz" \ 180 | "vid.stab-release-0.98b.tar.gz" \ 181 | "299b2f4ccd1b94c274f6d94ed4f1c5b8" \ 182 | "https://github.com/georgmartius/vid.stab/archive/" 183 | 184 | download \ 185 | "release-2.7.4.tar.gz" \ 186 | "zimg-release-2.7.4.tar.gz" \ 187 | "1757dcc11590ef3b5a56c701fd286345" \ 188 | "https://github.com/sekrit-twc/zimg/archive/" 189 | 190 | download \ 191 | "v2.1.2.tar.gz" \ 192 | "openjpeg-2.1.2.tar.gz" \ 193 | "40a7bfdcc66280b3c1402a0eb1a27624" \ 194 | "https://github.com/uclouvain/openjpeg/archive/" 195 | 196 | download \ 197 | "v0.6.1.tar.gz" \ 198 | "libwebp-0.6.1.tar.gz" \ 199 | "1c3099cd2656d0d80d3550ee29fc0f28" \ 200 | "https://github.com/webmproject/libwebp/archive/" 201 | 202 | download \ 203 | "v1.3.6.tar.gz" \ 204 | "vorbis-1.3.6.tar.gz" \ 205 | "03e967efb961f65a313459c5d0f4cbfb" \ 206 | "https://github.com/xiph/vorbis/archive/" 207 | 208 | download \ 209 | "v1.3.3.tar.gz" \ 210 | "ogg-1.3.3.tar.gz" \ 211 | "b8da1fe5ed84964834d40855ba7b93c2" \ 212 | "https://github.com/xiph/ogg/archive/" 213 | 214 | download \ 215 | "Speex-1.2.0.tar.gz" \ 216 | "Speex-1.2.0.tar.gz" \ 217 | "4bec86331abef56129f9d1c994823f03" \ 218 | "https://github.com/xiph/speex/archive/" 219 | 220 | download \ 221 | "n6.0.tar.gz" \ 222 | "ffmpeg6.0.tar.gz" \ 223 | "586ca7cc091d26fd0a4c26308950ca51" \ 224 | "https://github.com/FFmpeg/FFmpeg/archive" 225 | 226 | download \ 227 | "SDL2-2.0.22.tar.gz" \ 228 | "SDL2-2.0.22.tar.gz" \ 229 | "40aedb499cb2b6f106d909d9d97f869a" \ 230 | "https://github.com/libsdl-org/SDL/releases/download/release-2.0.22" 231 | 232 | [ $download_only -eq 1 ] && exit 0 233 | 234 | TARGET_DIR_SED=$(echo $TARGET_DIR | awk '{gsub(/\//, "\\/"); print}') 235 | 236 | if [ $is_x86 -eq 1 ]; then 237 | echo "*** Building yasm ***" 238 | cd $BUILD_DIR/yasm* 239 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 240 | [ ! -f config.status ] && ./configure --prefix=$TARGET_DIR --bindir=$BIN_DIR 241 | make -j $jval 242 | make install 243 | fi 244 | 245 | if [ $is_x86 -eq 1 ]; then 246 | echo "*** Building nasm ***" 247 | cd $BUILD_DIR/nasm* 248 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 249 | [ ! -f config.status ] && ./configure --prefix=$TARGET_DIR --bindir=$BIN_DIR 250 | make -j $jval 251 | make install 252 | fi 253 | 254 | echo "*** Building OpenSSL ***" 255 | cd $BUILD_DIR/openssl* 256 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 257 | if [ "$platform" = "darwin" ]; then 258 | PATH="$BIN_DIR:$PATH" ./Configure darwin64-x86_64-cc --prefix=$TARGET_DIR 259 | elif [ "$platform" = "linux" ]; then 260 | PATH="$BIN_DIR:$PATH" ./config --prefix=$TARGET_DIR 261 | fi 262 | PATH="$BIN_DIR:$PATH" make -j $jval 263 | make install 264 | 265 | echo "*** Building zlib ***" 266 | cd $BUILD_DIR/zlib* 267 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 268 | if [ "$platform" = "linux" ]; then 269 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" ./configure --prefix=$TARGET_DIR 270 | elif [ "$platform" = "darwin" ]; then 271 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" ./configure --prefix=$TARGET_DIR 272 | fi 273 | PATH="$BIN_DIR:$PATH" make -j $jval 274 | make install 275 | 276 | echo "*** Building x264 ***" 277 | cd $BUILD_DIR/x264* 278 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 279 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared --disable-opencl --enable-pic 280 | PATH="$BIN_DIR:$PATH" make -j $jval 281 | make install 282 | 283 | echo "*** Building x265 ***" 284 | cd $BUILD_DIR/x265* 285 | cd build/linux 286 | [ $rebuild -eq 1 ] && find . -mindepth 1 ! -name 'make-Makefiles.bash' -and ! -name 'multilib.sh' -exec rm -r {} + 287 | PATH="$BIN_DIR:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$TARGET_DIR" -DENABLE_SHARED:BOOL=OFF -DSTATIC_LINK_CRT:BOOL=ON -DENABLE_CLI:BOOL=OFF ../../source 288 | sed -i 's/-lgcc_s/-lgcc_eh/g' x265.pc 289 | make -j $jval 290 | make install 291 | 292 | echo "*** Building fdk-aac ***" 293 | cd $BUILD_DIR/fdk-aac* 294 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 295 | autoreconf -fiv 296 | [ ! -f config.status ] && ./configure --prefix=$TARGET_DIR --disable-shared 297 | make -j $jval 298 | make install 299 | 300 | echo "*** Building harfbuzz ***" 301 | cd $BUILD_DIR/harfbuzz-* 302 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 303 | ./configure --prefix=$TARGET_DIR --disable-shared --enable-static 304 | make -j $jval 305 | make install 306 | 307 | echo "*** Building fribidi ***" 308 | cd $BUILD_DIR/fribidi-* 309 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 310 | ./configure --prefix=$TARGET_DIR --disable-shared --enable-static --disable-docs 311 | make -j $jval 312 | make install 313 | 314 | echo "*** Building libass ***" 315 | cd $BUILD_DIR/libass-* 316 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 317 | ./autogen.sh 318 | ./configure --prefix=$TARGET_DIR --disable-shared 319 | make -j $jval 320 | make install 321 | 322 | echo "*** Building mp3lame ***" 323 | cd $BUILD_DIR/lame* 324 | # The lame build script does not recognize aarch64, so need to set it manually 325 | uname -a | grep -q 'aarch64' && lame_build_target="--build=arm-linux" || lame_build_target='' 326 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 327 | [ ! -f config.status ] && ./configure --prefix=$TARGET_DIR --enable-nasm --disable-shared $lame_build_target 328 | make 329 | make install 330 | 331 | echo "*** Building opus ***" 332 | cd $BUILD_DIR/opus* 333 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 334 | [ ! -f config.status ] && ./configure --prefix=$TARGET_DIR --disable-shared 335 | make 336 | make install 337 | 338 | echo "*** Building libvpx ***" 339 | cd $BUILD_DIR/libvpx* 340 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 341 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" ./configure --prefix=$TARGET_DIR --disable-examples --disable-unit-tests --enable-pic 342 | PATH="$BIN_DIR:$PATH" make -j $jval 343 | make install 344 | 345 | echo "*** Building librtmp ***" 346 | cd $BUILD_DIR/rtmpdump-* 347 | cd librtmp 348 | [ $rebuild -eq 1 ] && make distclean || true 349 | 350 | # there's no configure, we have to edit Makefile directly 351 | if [ "$platform" = "linux" ]; then 352 | sed -i "/INC=.*/d" ./Makefile # Remove INC if present from previous run. 353 | sed -i "s/prefix=.*/prefix=${TARGET_DIR_SED}\nINC=-I\$(prefix)\/include/" ./Makefile 354 | sed -i "s/SHARED=.*/SHARED=no/" ./Makefile 355 | elif [ "$platform" = "darwin" ]; then 356 | sed -i "s/prefix=./prefix=${TARGET_DIR_SED}/" ./Makefile 357 | fi 358 | make install_base 359 | 360 | echo "*** Building libsoxr ***" 361 | cd $BUILD_DIR/soxr-* 362 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 363 | PATH="$BIN_DIR:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$TARGET_DIR" -DBUILD_SHARED_LIBS:bool=off -DWITH_OPENMP:bool=off -DBUILD_TESTS:bool=off 364 | make -j $jval 365 | make install 366 | 367 | echo "*** Building libvidstab ***" 368 | cd $BUILD_DIR/vid.stab-release-* 369 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 370 | if [ "$platform" = "linux" ]; then 371 | sed -i "s/vidstab SHARED/vidstab STATIC/" ./CMakeLists.txt 372 | elif [ "$platform" = "darwin" ]; then 373 | sed -i "s/vidstab SHARED/vidstab STATIC/" ./CMakeLists.txt 374 | fi 375 | PATH="$BIN_DIR:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$TARGET_DIR" 376 | make -j $jval 377 | make install 378 | 379 | echo "*** Building openjpeg ***" 380 | cd $BUILD_DIR/openjpeg-* 381 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 382 | PATH="$BIN_DIR:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$TARGET_DIR" -DBUILD_SHARED_LIBS:bool=off 383 | make -j $jval 384 | make install 385 | 386 | echo "*** Building zimg ***" 387 | cd $BUILD_DIR/zimg-release-* 388 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 389 | ./autogen.sh 390 | ./configure --enable-static --prefix=$TARGET_DIR --disable-shared 391 | sed -i 's/size_t/std::size_t/g' src/zimg/colorspace/matrix3.cpp 392 | make -j $jval 393 | make install 394 | 395 | echo "*** Building libwebp ***" 396 | cd $BUILD_DIR/libwebp* 397 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 398 | ./autogen.sh 399 | ./configure --prefix=$TARGET_DIR --disable-shared 400 | make -j $jval 401 | make install 402 | 403 | echo "*** Building libvorbis ***" 404 | cd $BUILD_DIR/vorbis* 405 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 406 | ./autogen.sh 407 | ./configure --prefix=$TARGET_DIR --disable-shared 408 | make -j $jval 409 | make install 410 | 411 | echo "*** Building libogg ***" 412 | cd $BUILD_DIR/ogg* 413 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 414 | ./autogen.sh 415 | ./configure --prefix=$TARGET_DIR --disable-shared 416 | make -j $jval 417 | make install 418 | 419 | echo "*** Building libspeex ***" 420 | cd $BUILD_DIR/speex* 421 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 422 | ./autogen.sh 423 | ./configure --prefix=$TARGET_DIR --disable-shared 424 | make -j $jval 425 | make install 426 | 427 | echo "*** Building libsdl ***" 428 | cd $BUILD_DIR/SDL* 429 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 430 | ./autogen.sh 431 | ./configure --prefix=$TARGET_DIR --disable-shared 432 | make -j $jval 433 | make install 434 | 435 | echo "*** Building RIST ***" 436 | cd $BUILD_DIR 437 | rm -rf librist 438 | git clone https://code.videolan.org/rist/librist.git 439 | cd $BUILD_DIR/librist* 440 | git checkout v0.2.10 441 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 442 | mkdir -p build 443 | cd build 444 | meson --default-library=static .. --prefix=$TARGET_DIR --bindir="../bin/" --libdir="$TARGET_DIR/lib" 445 | ninja 446 | ninja install 447 | 448 | echo "*** Building SRT ***" 449 | cd $BUILD_DIR/srt* 450 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 451 | mkdir -p build 452 | cd build 453 | cmake -DENABLE_APPS=OFF -DCMAKE_INSTALL_PREFIX=$TARGET_DIR -DENABLE_C_DEPS=ON -DENABLE_SHARED=OFF -DENABLE_STATIC=ON -DOPENSSL_USE_STATIC_LIBS=ON .. 454 | sed -i 's/-lgcc_s/-lgcc_eh/g' haisrt.pc 455 | sed -i 's/-lgcc_s/-lgcc_eh/g' srt.pc 456 | make 457 | make install 458 | 459 | # FFMpeg 460 | echo "*** Building FFmpeg ***" 461 | cd $BUILD_DIR/FFmpeg* 462 | [ $rebuild -eq 1 -a -f Makefile ] && make distclean || true 463 | 464 | if [ "$platform" = "linux" ]; then 465 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" \ 466 | PKG_CONFIG_PATH="$TARGET_DIR/lib/pkgconfig" ./configure \ 467 | --prefix="$TARGET_DIR" \ 468 | --pkg-config-flags="--static" \ 469 | --extra-cflags="-I$TARGET_DIR/include" \ 470 | --extra-ldflags="-L$TARGET_DIR/lib" \ 471 | --extra-libs="-lpthread -lm -lz" \ 472 | --extra-ldexeflags="-static" \ 473 | --bindir="$BIN_DIR" \ 474 | --enable-pic \ 475 | --enable-ffplay \ 476 | --enable-fontconfig \ 477 | --enable-frei0r \ 478 | --enable-gpl \ 479 | --enable-version3 \ 480 | --enable-libass \ 481 | --enable-libfribidi \ 482 | --enable-libfdk-aac \ 483 | --enable-libfreetype \ 484 | --enable-libmp3lame \ 485 | --enable-libopencore-amrnb \ 486 | --enable-libopencore-amrwb \ 487 | --enable-libopenjpeg \ 488 | --enable-libopus \ 489 | --enable-librtmp \ 490 | --enable-libsoxr \ 491 | --enable-libspeex \ 492 | --enable-libtheora \ 493 | --enable-libvidstab \ 494 | --enable-libvo-amrwbenc \ 495 | --enable-libvorbis \ 496 | --enable-libvpx \ 497 | --enable-libwebp \ 498 | --enable-libx264 \ 499 | --enable-libx265 \ 500 | --enable-libxvid \ 501 | --enable-libzimg \ 502 | --enable-nonfree \ 503 | --enable-openssl \ 504 | --enable-librist \ 505 | --enable-libsrt 506 | elif [ "$platform" = "darwin" ]; then 507 | [ ! -f config.status ] && PATH="$BIN_DIR:$PATH" \ 508 | PKG_CONFIG_PATH="${TARGET_DIR}/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/local/Cellar/openssl/1.0.2o_1/lib/pkgconfig" ./configure \ 509 | --cc=/usr/bin/clang \ 510 | --prefix="$TARGET_DIR" \ 511 | --pkg-config-flags="--static" \ 512 | --extra-cflags="-I$TARGET_DIR/include" \ 513 | --extra-ldflags="-L$TARGET_DIR/lib" \ 514 | --extra-ldexeflags="-Bstatic" \ 515 | --bindir="$BIN_DIR" \ 516 | --enable-pic \ 517 | --enable-ffplay \ 518 | --enable-fontconfig \ 519 | --enable-frei0r \ 520 | --enable-gpl \ 521 | --enable-version3 \ 522 | --enable-libass \ 523 | --enable-libfribidi \ 524 | --enable-libfdk-aac \ 525 | --enable-libfreetype \ 526 | --enable-libmp3lame \ 527 | --enable-libopencore-amrnb \ 528 | --enable-libopencore-amrwb \ 529 | --enable-libopenjpeg \ 530 | --enable-libopus \ 531 | --enable-librtmp \ 532 | --enable-libsoxr \ 533 | --enable-libspeex \ 534 | --enable-libvidstab \ 535 | --enable-libvorbis \ 536 | --enable-libvpx \ 537 | --enable-libwebp \ 538 | --enable-libx264 \ 539 | --enable-libx265 \ 540 | --enable-libxvid \ 541 | --enable-libzimg \ 542 | --enable-nonfree \ 543 | --enable-openssl \ 544 | --enable-librist \ 545 | --enable-libsrt 546 | fi 547 | 548 | PATH="$BIN_DIR:$PATH" make -j $jval 549 | make install 550 | make distclean 551 | hash -r 552 | -------------------------------------------------------------------------------- /download.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Copyright (C) 2006 OpenWrt.org 4 | # 5 | # This is free software, licensed under the GNU General Public License v2. 6 | # See /LICENSE for more information. 7 | # 8 | 9 | use strict; 10 | use warnings; 11 | use File::Basename; 12 | use File::Copy; 13 | 14 | @ARGV > 2 or die "Syntax: $0 [ ...]\n"; 15 | 16 | my $target = shift @ARGV; 17 | my $filename = shift @ARGV; 18 | my $aliasname = shift @ARGV; 19 | my $md5sum = shift @ARGV; 20 | my $scriptdir = dirname($0); 21 | my @mirrors; 22 | my $ok; 23 | 24 | sub localmirrors { 25 | my @mlist; 26 | open LM, "$scriptdir/localmirrors" and do { 27 | while () { 28 | chomp $_; 29 | push @mlist, $_ if $_; 30 | } 31 | close LM; 32 | }; 33 | 34 | my $mirror = $ENV{'DOWNLOAD_MIRROR'}; 35 | $mirror and push @mlist, split(/;/, $mirror); 36 | 37 | return @mlist; 38 | } 39 | 40 | sub which($) { 41 | my $prog = shift; 42 | my $res = `which $prog`; 43 | $res or return undef; 44 | $res =~ /^no / and return undef; 45 | $res =~ /not found/ and return undef; 46 | return $res; 47 | } 48 | 49 | my $md5cmd = which("md5sum") || which("md5") || die 'no md5 checksum program found, please install md5 or md5sum'; 50 | chomp $md5cmd; 51 | 52 | sub download 53 | { 54 | my $mirror = shift; 55 | my $options = $ENV{WGET_OPTIONS} || ""; 56 | 57 | $mirror =~ s!/$!!; 58 | 59 | if ($mirror =~ s!^file://!!) { 60 | if (! -d "$mirror") { 61 | print STDERR "Wrong local cache directory -$mirror-.\n"; 62 | cleanup(); 63 | return; 64 | } 65 | 66 | if (! -d "$target") { 67 | system("mkdir", "-p", "$target/"); 68 | } 69 | 70 | if (! open TMPDLS, "find $mirror -follow -name $aliasname 2>/dev/null |") { 71 | print("Failed to search for $aliasname in $mirror\n"); 72 | return; 73 | } 74 | 75 | my $link; 76 | 77 | while (defined(my $line = readline TMPDLS)) { 78 | chomp ($link = $line); 79 | if ($. > 1) { 80 | print("$. or more instances of $aliasname in $mirror found . Only one instance allowed.\n"); 81 | return; 82 | } 83 | } 84 | 85 | close TMPDLS; 86 | 87 | if (! $link) { 88 | print("No instances of $aliasname found in $mirror.\n"); 89 | return; 90 | } 91 | 92 | print("Copying $aliasname from $link\n"); 93 | copy($link, "$target/$aliasname.dl"); 94 | 95 | if (system("$md5cmd '$target/$aliasname.dl' > '$target/$aliasname.md5sum'")) { 96 | print("Failed to generate md5 sum for $aliasname\n"); 97 | return; 98 | } 99 | } else { 100 | if (-e "$target/$aliasname") { 101 | my $filesum = `$md5cmd "$target/$aliasname"`; 102 | $filesum =~ /^(\w+)\s*/ or die "Could not get md5sum\n"; 103 | $filesum = $1; 104 | if (($filesum =~ /\w{32}/) and ($filesum ne $md5sum) and ($md5sum ne "nil")) { 105 | print STDERR "MD5 sum of the downloaded file does not match (file: $filesum, requested: $md5sum) - redownload.\n"; 106 | } else { 107 | return; 108 | } 109 | } 110 | open WGET, "wget -t5 --timeout=20 --no-check-certificate $options -O- '$mirror/$filename' |" or die "Cannot launch wget.\n"; 111 | open MD5SUM, "| $md5cmd > '$target/$aliasname.md5sum'" or die "Cannot launch md5sum.\n"; 112 | open OUTPUT, "> $target/$aliasname.dl" or die "Cannot create file $target/$aliasname.dl: $!\n"; 113 | my $buffer; 114 | while (read WGET, $buffer, 1048576) { 115 | print MD5SUM $buffer; 116 | print OUTPUT $buffer; 117 | } 118 | close MD5SUM; 119 | close WGET; 120 | close OUTPUT; 121 | 122 | if ($? >> 8) { 123 | print STDERR "Download failed.\n"; 124 | cleanup(); 125 | return; 126 | } 127 | } 128 | 129 | my $sum = `cat "$target/$aliasname.md5sum"`; 130 | $sum =~ /^(\w+)\s*/ or die "Could not generate md5sum\n"; 131 | $sum = $1; 132 | 133 | if (($md5sum =~ /\w{32}/) and ($sum ne $md5sum) and ($md5sum ne "nil")) { 134 | print STDERR "MD5 sum of the downloaded file does not match (file: $sum, requested: $md5sum) - deleting download.\n"; 135 | cleanup(); 136 | return; 137 | } 138 | 139 | unlink "$target/$aliasname"; 140 | system("mv", "$target/$aliasname.dl", "$target/$aliasname"); 141 | cleanup(); 142 | } 143 | 144 | sub cleanup 145 | { 146 | unlink "$target/$aliasname.dl"; 147 | unlink "$target/$aliasname.md5sum"; 148 | } 149 | 150 | @mirrors = localmirrors(); 151 | 152 | foreach my $mirror (@ARGV) { 153 | if ($mirror =~ /^\@SF\/(.+)$/) { 154 | # give sourceforge a few more tries, because it redirects to different mirrors 155 | for (1 .. 5) { 156 | push @mirrors, "http://downloads.sourceforge.net/$1"; 157 | } 158 | } elsif ($mirror =~ /^\@GNU\/(.+)$/) { 159 | push @mirrors, "http://ftpmirror.gnu.org/$1"; 160 | push @mirrors, "http://ftp.gnu.org/pub/gnu/$1"; 161 | push @mirrors, "ftp://ftp.belnet.be/mirror/ftp.gnu.org/gnu/$1"; 162 | push @mirrors, "ftp://ftp.mirror.nl/pub/mirror/gnu/$1"; 163 | push @mirrors, "http://mirror.switch.ch/ftp/mirror/gnu/$1"; 164 | } elsif ($mirror =~ /^\@SAVANNAH\/(.+)$/) { 165 | push @mirrors, "http://download.savannah.gnu.org/releases/$1"; 166 | push @mirrors, "http://nongnu.uib.no/$1"; 167 | push @mirrors, "http://ftp.igh.cnrs.fr/pub/nongnu/$1"; 168 | push @mirrors, "http://download-mirror.savannah.gnu.org/releases/$1"; 169 | } elsif ($mirror =~ /^\@KERNEL\/(.+)$/) { 170 | my @extra = ( $1 ); 171 | if ($aliasname =~ /linux-\d+\.\d+(?:\.\d+)?-rc/) { 172 | push @extra, "$extra[0]/testing"; 173 | } elsif ($$aliasname =~ /linux-(\d+\.\d+(?:\.\d+)?)/) { 174 | push @extra, "$extra[0]/longterm/v$1"; 175 | } 176 | foreach my $dir (@extra) { 177 | push @mirrors, "ftp://ftp.all.kernel.org/pub/$dir"; 178 | push @mirrors, "http://ftp.all.kernel.org/pub/$dir"; 179 | } 180 | } elsif ($mirror =~ /^\@GNOME\/(.+)$/) { 181 | push @mirrors, "http://ftp.gnome.org/pub/GNOME/sources/$1"; 182 | push @mirrors, "http://ftp.unina.it/pub/linux/GNOME/sources/$1"; 183 | push @mirrors, "http://fr2.rpmfind.net/linux/gnome.org/sources/$1"; 184 | push @mirrors, "ftp://ftp.dit.upm.es/pub/GNOME/sources/$1"; 185 | push @mirrors, "ftp://ftp.no.gnome.org/pub/GNOME/sources/$1"; 186 | push @mirrors, "http://ftp.acc.umu.se/pub/GNOME/sources/$1"; 187 | push @mirrors, "http://ftp.belnet.be/mirror/ftp.gnome.org/sources/$1"; 188 | push @mirrors, "http://linorg.usp.br/gnome/sources/$1"; 189 | push @mirrors, "http://mirror.aarnet.edu.au/pub/GNOME/sources/$1"; 190 | push @mirrors, "http://mirrors.ibiblio.org/pub/mirrors/gnome/sources/$1"; 191 | push @mirrors, "ftp://ftp.cse.buffalo.edu/pub/Gnome/sources/$1"; 192 | push @mirrors, "ftp://ftp.nara.wide.ad.jp/pub/X11/GNOME/sources/$1"; 193 | } 194 | else { 195 | push @mirrors, $mirror; 196 | } 197 | } 198 | 199 | #push @mirrors, 'http://mirror1.openwrt.org'; 200 | push @mirrors, 'http://mirror2.openwrt.org/sources'; 201 | push @mirrors, 'http://downloads.openwrt.org/sources'; 202 | 203 | while (!$ok) { 204 | my $mirror = shift @mirrors; 205 | $mirror or die "No more mirrors to try - giving up.\n"; 206 | 207 | download($mirror); 208 | -f "$target/$aliasname" and $ok = 1; 209 | } 210 | 211 | $SIG{INT} = \&cleanup; 212 | 213 | -------------------------------------------------------------------------------- /env.source: -------------------------------------------------------------------------------- 1 | # Source this shell script to get the same environment as the build script 2 | 3 | if [ -z "$ENV_ROOT" ]; then 4 | if [ -f "./env.source" ]; then 5 | ENV_ROOT=`pwd` 6 | export ENV_ROOT 7 | fi 8 | fi 9 | 10 | if [ -z "$ENV_ROOT" ]; then 11 | echo "Missing ENV_ROOT variable" >&2 12 | elif [ "${ENV_ROOT#/}" = "$ENV_ROOT" ]; then 13 | echo "ENV_ROOT must be an absolute path" >&2 14 | else 15 | 16 | BUILD_DIR="${BUILD_DIR:-$ENV_ROOT/build}" 17 | TARGET_DIR="${TARGET_DIR:-$ENV_ROOT/target}" 18 | DOWNLOAD_DIR="${DOWNLOAD_DIR:-$ENV_ROOT/dl}" 19 | BIN_DIR="${BIN_DIR:-$ENV_ROOT/bin}" 20 | 21 | export LDFLAGS="-L${TARGET_DIR}/lib" 22 | # FIXME: detect OS somehow 23 | export DYLD_LIBRARY_PATH="${TARGET_DIR}/lib" 24 | export PKG_CONFIG_PATH="$TARGET_DIR/lib/pkgconfig" 25 | #export CFLAGS="-I${TARGET_DIR}/include $LDFLAGS -static-libgcc -Wl,-Bstatic -lc" 26 | export CFLAGS="-I${TARGET_DIR}/include $LDFLAGS" 27 | export PATH="${TARGET_DIR}/bin:${PATH}" 28 | # Force PATH cache clearing 29 | hash -r 30 | fi 31 | -------------------------------------------------------------------------------- /fetchurl: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Small utility to fetch and unpack archives on the web (with cache) 4 | # 5 | # Depends on : curl, tar 6 | # 7 | 8 | set -e 9 | set +u 10 | 11 | # ENV vars, inherited from external 12 | CACHE=${CACHE:-1} 13 | UNPACK=${UNPACK:-1} 14 | VERBOSE=${VERBOSE:-0} 15 | 16 | EXTRACT_DIR=${EXTRACT_DIR:-`pwd`} 17 | if [ -n "$HOME" ]; then 18 | CACHE_DIR=${CACHE_DIR:-$HOME/.cache/fetchurl} 19 | else 20 | CACHE_DIR=${CACHE_DIR:-} 21 | fi 22 | TMP_DIR=${TMP_DIR:-/tmp} 23 | 24 | URL=$1 25 | 26 | set -u 27 | 28 | stderr () { 29 | echo $@ 1>&2 30 | } 31 | 32 | sh () { 33 | echo $ $@ 34 | if [ "$VERBOSE" -ne 0 ]; then 35 | $@ 36 | else 37 | $@ >/dev/null 2>&1 38 | fi 39 | } 40 | 41 | expand_path() { 42 | here=`pwd` 43 | cd $1 44 | echo `pwd -P` 45 | cd "$here" 46 | } 47 | 48 | usage() { 49 | echo "Usage: fetchurl url" 50 | echo "CACHE=${CACHE}" 51 | echo "UNPACK=${UNPACK}" 52 | echo "REPLACE=${REPLACE}" 53 | echo "VERBOSE=${VERBOSE}" 54 | 55 | echo "EXTRACT_DIR=${EXTRACT_DIR}" 56 | echo "CACHE_DIR=${CACHE_DIR}" 57 | echo "TMP_DIR=${TMP_DIR}" 58 | 59 | echo "URL=${URL}" 60 | exit 1 61 | } 62 | 63 | if [ -z "$URL" ]; then 64 | stderr "ERROR: missing url" 65 | usage 66 | fi 67 | 68 | if [ -z "$CACHE_DIR" ] && [ "$CACHE" -ne 0 ]; then 69 | stderr "ERROR: missing cache dir" 70 | usage 71 | fi 72 | 73 | filename=`basename "$URL" | sed 's/\?.*//'` 74 | tmp_file="$TMP_DIR/$filename" 75 | cache_file="$CACHE_DIR/$filename" 76 | 77 | mkdir -p "$CACHE_DIR" 78 | 79 | # Fetch 80 | if [ "$CACHE" -eq 0 ] || [ ! -f "$cache_file" ]; then 81 | rm -rf "$tmp_file" 82 | sh curl -L -o "$tmp_file" "$URL" 83 | sh mv "$tmp_file" "$cache_file" 84 | fi 85 | 86 | # TODO: checksums 87 | 88 | # Unpack 89 | if [ "$UNPACK" -ne 0 ]; then 90 | 91 | if [ "$filename" != "${filename%.tar.gz}" ]; then 92 | extname=.tar.gz 93 | elif [ "$filename" != "${filename%.tgz}" ]; then 94 | extname=.tgz 95 | elif [ "$filename" != "${filename%.tar.bz2}" ]; then 96 | extname=.tar.bz2 97 | elif [ "$filename" != "${filename%.tar.xz}" ]; then 98 | extname=.tar.xz 99 | else 100 | stderr extension of $filename is not supported 101 | exit 1 102 | fi 103 | 104 | target_dir=`expand_path "$EXTRACT_DIR"` 105 | mkdir -p "$target_dir" 106 | sh cd "$target_dir" 107 | 108 | [ "$REPLACE" -ne 1 ] && [ `uname` = "Linux" ] && tarargs="--skip-old-files" || tarargs="" 109 | case "$extname" in 110 | .tar.gz|.tgz) 111 | sh tar "$tarargs" -xzvf "$cache_file" 112 | ;; 113 | .tar.bz2) 114 | sh tar "$tarargs" -xjvf "$cache_file" 115 | ;; 116 | .tar.xz) 117 | sh tar "$tarargs" -xJvf "$cache_file" 118 | ;; 119 | *) 120 | stderr BUG, this should not happen 121 | exit 1 122 | ;; 123 | esac 124 | fi 125 | 126 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ] 6 | } 7 | --------------------------------------------------------------------------------