travis: convert OS X build to common autoconf+cmake logic

This gets us the same coverage as Linux.
master
Mike Frysinger 2016-05-21 11:35:49 -04:00
parent 5a85d6c3e3
commit 0bc8586ee2
6 changed files with 19 additions and 378 deletions

View File

@ -17,13 +17,6 @@ os:
- linux
- osx
# Note: This is only here due to thumbs.sh bootstrap logic.
before_install:
- if [ "$TRAVIS_OS_NAME" = "osx" ];
then
brew install nasm;
fi
script: ./travis/main.sh
addons:

View File

@ -1,3 +1,3 @@
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src config tests
EXTRA_DIST = test docs examples windows VMS cmake netware bootstrap.sh CMakeLists.txt thumbs.bat thumbs.sh CONTRIBUTORS README.md
EXTRA_DIST = test docs examples windows VMS cmake netware bootstrap.sh CMakeLists.txt CONTRIBUTORS README.md

View File

@ -18,8 +18,10 @@ if ! v autoreconf -f -i ; then
exit 1
fi
(
echo "/* Generated from config.hin via autoheader for cmake; see bootstrap.sh. */"
sed \
-e '1d' \
-e '2i/* Generated from config.hin via autoheader for cmake; see bootstraps.h. */' \
-e 's:#undef:#cmakedefine:' \
src/config.hin > src/config.h.cmake
src/config.hin
) > src/config.h.cmake

View File

@ -1,37 +0,0 @@
@echo off
rem thumbs wrapper for windows; see main file for details
rem find bash from git
rem assumes git is in [gitdir]\cmd
rem and msys in [gitdir]\bin
for %%i in (git.exe) do set gitexe=%%~$PATH:i
pushd "%gitexe%\..\..\bin"
set bashdir=%cd%
popd
set path=%bashdir%;%path%
rem copy all known env vars to bash
setlocal enableDelayedExpansion
set exports=
for %%i in (tbs_conf tbs_arch tbs_tools tbs_static_runtime) do (
if not [!%%i!]==[] (
set exports=!exports!export %%i=!%%i!;
)
)
rem copy dep settings
for %%i in (zlib libjpeg_turbo libpng libtiff freetype libiconv) do (
for %%j in (repo incdir libdir built) do (
if not [!tbsd_%%i_%%j!]==[] (
set exports=!exports!export tbsd_%%i_%%j=!tbsd_%%i_%%j!;
)
)
)
bash -c "%exports%./thumbs.sh %*"

320
thumbs.sh
View File

@ -1,320 +0,0 @@
#!/bin/bash
# THe Ultimate Make Bash Script
# Used to wrap build scripts for easy dep
# handling and multiplatform support
# Basic usage on *nix:
# export tbs_arch=x86
# ./thumbs.sh make
# On Win (msvc 2013):
# C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall x86_amd64
# SET tbs_tools=msvc12
# thumbs make
# On Win (mingw32):
# SET path=C:\mingw32\bin;%path%
# SET tbs_tools=mingw
# SET tbs_arch=x86
# thumbs make
# Global settings are stored in env vars
# Should be inherited
[ $tbs_conf ] || export tbs_conf=Release
[ $tbs_arch ] || export tbs_arch=x64
[ $tbs_tools ] || export tbs_tools=gnu
[ $tbs_static_runtime ] || export tbs_static_runtime=0
[ $tbs_gd_png ] || export tbs_gd_png=1
[ $tbs_gd_jpeg ] || export tbs_gd_jpeg=1
[ $tbs_gd_freetype ] || export tbs_gd_freetype=1
[ $tbs_gd_tiff ] || export tbs_gd_tiff=1
# tbsd_* contains dep related settings
# tbsd_[name]_* contains settings specific to the dep
# name should match the repo name
# deps contains a map of what should be built/used
# keep the keys in sync ... no assoc arrays on msys :/
# targ contains a target for each dep (default=empty str)
# post is executed after each thumbs dep build
# ^ used for copying/renaming any libs you need - uses eval
zname=zlib.lib
jname=jpeg.lib
pname=png.lib
tname=tiff.lib
fname=freetype.lib
if [ $tbs_tools = gnu -o $tbs_tools = mingw ]
then
zname=libz.a
jname=libjpeg.a
pname=libpng.a
tname=libtiff.a
fname=libfreetype.a
fi
deps=()
targ=()
post=()
[ $tbsd_zlib_repo ] || export tbsd_zlib_repo="https://github.com/imazen/zlib"
[ $tbsd_libpng_repo ] || export tbsd_libpng_repo="https://github.com/imazen/libpng"
[ $tbsd_libjpeg_turbo_repo ] || export tbsd_libjpeg_turbo_repo="https://github.com/imazen/libjpeg-turbo libjpeg_turbo"
[ $tbsd_libtiff_repo ] || export tbsd_libtiff_repo="https://github.com/imazen/libtiff"
[ $tbsd_freetype_repo ] || export tbsd_freetype_repo="https://github.com/imazen/freetype"
if [[ "$OSTYPE" == "darwin"* ]]; then cp="rsync"
else cp="cp"
fi
deps+=(zlib); targ+=(zlibstatic)
post+=("$cp -u \$(./thumbs.sh list_slib) ../../deps/$zname")
if [ $tbs_gd_png -gt 0 ]; then
deps+=(libpng); targ+=(png16_static)
post+=("$cp -u \$(./scripts/thumbs.sh list_slib) ../../deps/$pname")
fi
if [ $tbs_gd_jpeg -gt 0 ]; then
deps+=(libjpeg_turbo); targ+=(jpeg_static)
post+=("for lib in \$(./thumbs.sh list_slib); do [ -f \$lib ] && $cp -u \$lib ../../deps/$jname; done")
fi
if [ $tbs_gd_tiff -gt 0 ]; then
ttarg="libtiff/tiff_static"
[ $tbs_tools = gnu -o $tbs_tools = mingw ] && ttarg=tiff_static
deps+=(libtiff); targ+=($ttarg)
post+=("$cp -u \$(./thumbs.sh list_slib) ../../deps/$tname")
fi
if [ $tbs_gd_freetype -gt 0 ]; then
deps+=(freetype); targ+=("freetype_static")
post+=("$cp -u \$(./thumbs.sh list_slib) ../../deps/$fname")
fi
# -----------
# dep processor
process_deps()
{
mkdir build_deps
mkdir deps
cd build_deps
for key in "${!deps[@]}"
do
dep=${deps[$key]}
i_dep_repo="tbsd_${dep}_repo"
i_dep_incdir="tbsd_${dep}_incdir"
i_dep_libdir="tbsd_${dep}_libdir"
i_dep_built="tbsd_${dep}_built"
[ ${!i_dep_built} ] || export "${i_dep_built}=0"
if [ ${!i_dep_built} -eq 0 ]
then
git clone ${!i_dep_repo} --depth 1
cd $dep || exit 1
thumbs="./thumbs.sh"
[ ! -f $thumbs ] && thumbs=$(find . -name thumbs.sh -maxdepth 2)
$thumbs make ${targ[$key]} || exit 1
# copy any includes and do poststep
$cp -u -r $($thumbs list_inc) ../../deps
eval ${post[$key]}
# look in both local and parent dep dirs
export "${i_dep_incdir}=../../deps;deps"
export "${i_dep_libdir}=../../deps;deps"
export "${i_dep_built}=1"
cd ..
fi
done
export "${i_dep_incdir}=../../deps/freetype;deps/freetype"
cd ..
}
# -----------
# constructs dep dirs for cmake
postproc_deps()
{
cm_inc=
cm_lib=
for dep in "${deps[@]}"
do
i_dep_incdir="tbsd_${dep}_incdir"
i_dep_libdir="tbsd_${dep}_libdir"
cm_inc="${!i_dep_incdir};$cm_inc"
cm_lib="${!i_dep_libdir};$cm_lib"
done
cm_args+=(-DCMAKE_LIBRARY_PATH=$cm_lib)
cm_args+=(-DCMAKE_INCLUDE_PATH=$cm_inc)
}
# -----------
if [ $# -lt 1 ]
then
echo ""
echo " Usage : ./thumbs [command]"
echo ""
echo " Commands:"
echo " make - builds everything"
echo " check - runs tests"
echo " clean - removes build files"
echo " list - echo paths to any interesting files"
echo " space separated; relative"
echo " list_bin - echo binary paths"
echo " list_inc - echo lib include files"
echo " list_slib - echo static lib path"
echo " list_dlib - echo dynamic lib path"
echo ""
exit
fi
# -----------
upper()
{
echo $1 | tr [:lower:] [:upper:]
}
# Local settings
l_inc="./src/gd.h ./src/gd_io.h ./src/gdfx.h"
l_slib=
l_dlib=
l_bin=
list=
make=
c_flags=
cm_tools=
cm_args=(-DCMAKE_BUILD_TYPE=$tbs_conf)
cm_args+=(-DBUILD_TEST=1)
cm_args+=(-DENABLE_PNG=$tbs_gd_png)
cm_args+=(-DENABLE_JPEG=$tbs_gd_jpeg)
cm_args+=(-DENABLE_FREETYPE=$tbs_gd_freetype)
cm_args+=(-DENABLE_TIFF=$tbs_gd_tiff)
target=
[ $2 ] && target=$2
# -----------
case "$tbs_tools" in
msvc12)
cm_tools="Visual Studio 12"
[ "$target" = "" ] && mstrg="GD.sln" || mstrg="$target.vcxproj"
make="msbuild.exe $mstrg //p:Configuration=$tbs_conf //v:m"
l_slib="./build/Bin/$tbs_conf/libgd_static.lib"
l_dlib="./build/Bin/$tbs_conf/libgd.lib"
l_bin="./build/Bin/$tbs_conf/libgd.dll"
list="$l_bin $l_slib $l_dlib $l_inc" ;;
gnu)
cm_tools="Unix Makefiles"
c_flags+=" -fPIC"
make="make $target"
l_slib="./build/Bin/libgd.a"
l_dlib="./build/Bin/libgd.so"
l_bin="$l_dlib"
list="$l_slib $l_dlib $l_inc" ;;
mingw)
cm_tools="MinGW Makefiles"
make="mingw32-make $target"
c_flags+=" -fkeep-inline-functions"
# allow sh in path; some old cmake/mingw bug?
cm_args+=(-DCMAKE_SH=)
l_slib="./build/Bin/liblibgd.a"
l_dlib="./build/Bin/liblibgd.dll.a"
l_bin="./build/Bin/liblibgd.dll"
list="$l_bin $l_slib $l_dlib $l_inc" ;;
*) echo "Tool config not found for $tbs_tools"
exit 1 ;;
esac
# -----------
case "$tbs_arch" in
x64)
[ $tbs_tools = msvc12 ] && cm_tools="$cm_tools Win64"
[ $tbs_tools = gnu -o $tbs_tools = mingw ] && c_flags+=" -m64" ;;
x86)
[ $tbs_tools = gnu -o $tbs_tools = mingw ] && c_flags+=" -m32" ;;
*) echo "Arch config not found for $tbs_arch"
exit 1 ;;
esac
# -----------
if [ $tbs_static_runtime -gt 0 ]
then
[ $tbs_tools = msvc12 ] && c_flags+=" /MT"
[ $tbs_tools = gnu ] && cm_args+=(-DCMAKE_SHARED_LINKER_FLAGS="-static-libgcc -static-libstdc++")
[ $tbs_tools = mingw ] && cm_args+=(-DCMAKE_SHARED_LINKER_FLAGS="-static")
fi
# -----------
case "$1" in
make)
process_deps
postproc_deps
mkdir build
cd build
cm_args+=(-DCMAKE_C_FLAGS_$(upper $tbs_conf)="$c_flags")
cm_args+=(-DCMAKE_CXX_FLAGS_$(upper $tbs_conf)="$c_flags")
cmake -G "$cm_tools" "${cm_args[@]}" .. || exit 1
$make || exit 1
cd ..
;;
check)
cd build
ctest -C $tbs_conf . || exit 1
cd ..
;;
clean)
rm -rf deps
rm -rf build_deps
rm -rf build
;;
list) echo $list;;
list_bin) echo $l_bin;;
list_inc) echo $l_inc;;
list_slib) echo $l_slib;;
list_dlib) echo $l_dlib;;
*) echo "Unknown command $1"
exit 1;;
esac

View File

@ -6,6 +6,19 @@
. "${0%/*}"/lib.sh
update_os() {
# Note: Linux deps are maintained in .travis.yml.
case ${TRAVIS_OS_NAME} in
osx)
v --fold="brew_update" brew update
# These packages are already installed in Travis, so omit them or brew fails.
# autoconf automake libtool pkg-config cmake libpng jpeg libtiff
v --fold="brew_install" brew install \
gettext freetype fontconfig webp xz
;;
esac
}
build_autotools() {
v --fold="bootstrap" ./bootstrap.sh
@ -71,18 +84,8 @@ compare_builds() {
diff -ur install-autotools install-cmake || true
}
build_osx() {
v ./thumbs.sh make
v ./thumbs.sh check
}
main() {
if [[ ${TRAVIS_OS_NAME} == "osx" ]] ; then
# TODO: Should convert this to autotools/cmake.
build_osx
return
fi
update_os
build_autotools
build_cmake
compare_builds