203 lines
7.2 KiB
Bash
203 lines
7.2 KiB
Bash
#!/bin/bash
|
|
|
|
# Required variables
|
|
# ------------------
|
|
# these are very important variables. Must be set into rtdata/CMakeLists.txt!
|
|
# - PROJECT_NAME
|
|
# - PROJECT_SOURCE_DIR
|
|
# - PROJECT_VERSION (if without git)
|
|
# - CMAKE_BUILD_TYPE
|
|
# - PROC_BIT_DEPTH
|
|
# - GTK_PREFIX
|
|
|
|
function message {
|
|
printf '\e[34m-- %s\e[m\n' "$*"
|
|
}
|
|
|
|
function GetDependencies {
|
|
otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }'
|
|
}
|
|
|
|
function CheckLink {
|
|
GetDependencies "$1" | while read; do
|
|
local dest="${LIB}/$(basename "${REPLY}")"
|
|
test -f "${dest}" || { ditto --arch ${arch} "${REPLY}" "${dest}"; CheckLink "${dest}"; }
|
|
done
|
|
}
|
|
|
|
# source check
|
|
if test ! -d "${CMAKE_BUILD_TYPE}"; then
|
|
printf "\e[31m${PWD}/${CMAKE_BUILD_TYPE} directory is not found. Please execute 'make install' first.\e[m\n"
|
|
exit 1
|
|
fi
|
|
|
|
# update project version
|
|
if test -x "$(which git)" -a -d "${PROJECT_SOURCE_DIR}/.git"; then
|
|
# This is what the version ought to look like to be accurate in the git universe:
|
|
PROJECT_FULL_VERSION="$(git describe --tags --always | sed 's/-g.*//')_$(git symbolic-ref --short -q HEAD)"
|
|
# outputs: 4.2-677-g904467b_master
|
|
# but Apple requirements https://goo.gl/eWDQv6 state we should use this:
|
|
PROJECT_VERSION="$(git describe --tags --always | sed -e 's/-g.*//' -e 's/-/./')"
|
|
# outputs: 4.2.677
|
|
fi
|
|
|
|
# if not specify CMAKE_OSX_DEPLOYMENT_TARGET when compiling,
|
|
# 'MINIMUM_VERSION' will be used host OS X version.
|
|
MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')"
|
|
if test ! -n "${MINIMUM_SYSTEM_VERSION}"; then
|
|
MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)"
|
|
fi
|
|
|
|
# check for pango-querymodules. Pango 1.38.0 and above do not include it.
|
|
# https://github.com/Homebrew/homebrew/issues/44764#issuecomment-146795820
|
|
PangoVer="$(brew list --versions pango)"
|
|
PangoVer="${PangoVer//./}"
|
|
# Only check the first 4 digits, so that "1.36.99" (13699) doesn't test greater than "1.38.0" (1380)
|
|
PangoVer="${PangoVer:0:4}"
|
|
if [[ "$PangoVer" -ge "1380" ]]; then
|
|
ExistPangoQuerymodules="false"
|
|
else
|
|
ExistPangoQuerymodules="true"
|
|
fi
|
|
|
|
case ${PROC_BIT_DEPTH} in
|
|
64) arch=x86_64;;
|
|
32) arch=i386;;
|
|
esac
|
|
|
|
cat <<__EOS__
|
|
PROJECT_NAME: ${PROJECT_NAME}
|
|
PROJECT_VERSION: ${PROJECT_VERSION}
|
|
PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}
|
|
CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}
|
|
PROC_BIT_DEPTH: ${PROC_BIT_DEPTH}
|
|
MINIMUM_SYSTEM_VERSION: ${MINIMUM_SYSTEM_VERSION}
|
|
GTK_PREFIX: ${GTK_PREFIX}
|
|
PWD: ${PWD}
|
|
__EOS__
|
|
|
|
APP="${PROJECT_NAME}".app
|
|
CONTENTS="${APP}"/Contents
|
|
RESOURCES="${CONTENTS}"/Resources
|
|
MACOS="${CONTENTS}"/MacOS
|
|
LIB="${MACOS}"/lib
|
|
ETC="${MACOS}"/etc
|
|
EXECUTABLE="${MACOS}"/rawtherapee
|
|
|
|
message "Removing old files"
|
|
rm -rf "${APP}" ${PROJECT_NAME}_*.dmg
|
|
|
|
message "Creating bundle container"
|
|
install -d "${RESOURCES}" \
|
|
"${MACOS}" \
|
|
"${LIB}" \
|
|
"${ETC}"
|
|
|
|
message "Copying release files"
|
|
ditto "${CMAKE_BUILD_TYPE}" "${MACOS}"
|
|
|
|
message "Copying dependencies from ${GTK_PREFIX}"
|
|
CheckLink "${EXECUTABLE}"
|
|
|
|
message "Copying library modules from ${GTK_PREFIX}"
|
|
ditto --arch "${arch}" {"${GTK_PREFIX}"/lib,"${LIB}"}/gdk-pixbuf-2.0
|
|
ditto --arch "${arch}" {"${GTK_PREFIX}"/lib,"${LIB}"}/gtk-2.0
|
|
ditto --arch "${arch}" {"${GTK_PREFIX}"/lib,"${LIB}"}/pango
|
|
|
|
message "Removing static libraries and cache files"
|
|
find -E "${LIB}" -type f -regex '.*\.(a|la|cache)$' | while read; do rm "${REPLY}"; done
|
|
|
|
message "Copying configuration files from ${GTK_PREFIX}"
|
|
install -d "${ETC}"/{gtk-2.0,pango}
|
|
cp "${GTK_PREFIX}"/etc/gtk-2.0/im-multipress.conf "${ETC}"/gtk-2.0
|
|
"${GTK_PREFIX}"/bin/gdk-pixbuf-query-loaders "${LIB}"/gdk-pixbuf-2.0/*/loaders/*.so > "${ETC}"/gtk-2.0/gdk-pixbuf.loaders
|
|
"${GTK_PREFIX}"/bin/gtk-query-immodules-2.0 "${LIB}"/gtk-2.0/*/immodules/*.so > "${ETC}"/gtk-2.0/gtk.immodules
|
|
sed -i "" -e "s|${PWD}|/tmp|" "${ETC}"/gtk-2.0/gdk-pixbuf.loaders \
|
|
"${ETC}"/gtk-2.0/gtk.immodules
|
|
if [[ "$ExistPangoQuerymodules" = "true" ]]; then
|
|
"${GTK_PREFIX}"/bin/pango-querymodules "${LIB}"/pango/*/modules/*.so > "${ETC}"/pango/pango.modules
|
|
sed -i "" -e "s|${PWD}|/tmp|" "${ETC}"/pango/pango.modules
|
|
printf "[Pango]\nModuleFiles = /tmp/${ETC}/pango/pango.modules" > "${ETC}"/pango/pangorc
|
|
fi
|
|
|
|
message "Copying shared files from ${GTK_PREFIX}"
|
|
cp -R "${GTK_PREFIX}"/share/mime "${MACOS}"/share
|
|
# gtk themes
|
|
ditto {"${GTK_PREFIX}","${MACOS}"}/share/themes/Mac/gtk-2.0-key/gtkrc
|
|
ditto {"${GTK_PREFIX}","${MACOS}"}/share/themes/Clearlooks/gtk-2.0/gtkrc
|
|
install -d "${MACOS}"/share/themes/Raleigh/gtk-2.0
|
|
(cd "${MACOS}"/share/themes/Raleigh/gtk-2.0 && ln -s ../../Clearlooks/gtk-2.0/gtkrc)
|
|
# fontconfig files (X11 backend only)
|
|
if otool -L "${EXECUTABLE}" | grep -sq 'libgtk-x11-2.0'; then
|
|
message "Installing fontconfig files (Your library is X11 backend. 'FONTCONFIG_PATH' will be set by executable loader.)"
|
|
cp -RL "${GTK_PREFIX}"/etc/fonts "${ETC}"
|
|
fi
|
|
|
|
|
|
|
|
# install names
|
|
find -E "${MACOS}" -type f -regex '.*/(rawtherapee|.*\.(dylib|so))' | while read x; do
|
|
message "Modifying install names: ${x}"
|
|
{
|
|
# id
|
|
case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac
|
|
# names
|
|
GetDependencies "${x}" | while read y; do
|
|
echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'"
|
|
done
|
|
} | bash -v
|
|
done
|
|
|
|
message "Registering @loader_path into the executable"
|
|
echo " install_name_tool -add_rpath @loader_path/lib '${EXECUTABLE}'" | bash -v
|
|
|
|
|
|
|
|
message "Installing required application bundle files"
|
|
PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}"/tools/osx
|
|
# executable loader
|
|
# note: executable is renamed to 'rawtherapee-bin'.
|
|
mv "${MACOS}"/rawtherapee{,-bin}
|
|
install -m 0755 "${PROJECT_SOURCE_DATA_DIR}"/executable_loader.in "${MACOS}"/rawtherapee
|
|
# app bundle resources
|
|
cp "${PROJECT_SOURCE_DATA_DIR}"/{rawtherapee,profile}.icns "${RESOURCES}"
|
|
cp "${PROJECT_SOURCE_DATA_DIR}"/PkgInfo "${CONTENTS}"
|
|
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/Info.plist.in "${CONTENTS}"/Info.plist
|
|
sed -i "" -e "s|@version@|${PROJECT_VERSION}|
|
|
s|@shortVersion@|${PROJECT_VERSION}|
|
|
s|@arch@|${arch}|" \
|
|
"${CONTENTS}"/Info.plist
|
|
plutil -convert binary1 "${CONTENTS}"/Info.plist
|
|
|
|
|
|
|
|
function CreateDmg {
|
|
local srcdir="$(mktemp -dt $$)"
|
|
|
|
message "Preparing disk image sources at ${srcdir}"
|
|
mv "${APP}" "${srcdir}"
|
|
cp AboutThisBuild.txt "${srcdir}"
|
|
ln -s /Applications "${srcdir}"
|
|
|
|
# web bookmarks
|
|
function CreateWebloc {
|
|
defaults write "${srcdir}/$1" URL "$2"
|
|
mv "${srcdir}/$1".{plist,webloc}
|
|
}
|
|
CreateWebloc 'RawTherapee Blog' 'http://www.rawtherapee.com'
|
|
CreateWebloc 'Online Manual' 'http://rawpedia.rawtherapee.com/'
|
|
|
|
# disk image name
|
|
dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}"
|
|
if ! echo "${CMAKE_BUILD_TYPE}" | grep -sqi "release"; then
|
|
dmg_name="${dmg_name}_$(echo ${CMAKE_BUILD_TYPE} | tr '[:upper:]' '[:lower:]')"
|
|
fi
|
|
|
|
message "Creating disk image"
|
|
hdiutil create -format UDBZ -srcdir "${srcdir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}".dmg
|
|
|
|
message "Removing disk image caches"
|
|
rm -rf "${srcdir}"
|
|
}
|
|
CreateDmg
|