lyx_mirror/development/lyx-tester/lyxbuild

781 lines
28 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env bash
# File: lyxbuild
# Run the following command for usage and description:
# ./lyxbuild --help
# Copyright 2013, Scott Kostyshak
# Copyright 2013, Kornel Benko
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -o nounset
function checkTerm() {
# check if the column is 0 and if not start a new line (useful bc of the progress bar).
# based on code from: http://stackoverflow.com/questions/2575037/how-to-get-the-cursor-position-in-bash
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
# on my system, the following line can be replaced by the line below it
echo -en "\033[6n" > /dev/tty
# tput u7 > /dev/tty # when TERM=xterm (and relatives)
IFS=';' read -r -d R -a pos
stty $oldstty
# change from one-based to zero based so they work with: tput cup $row $col
row=$((${pos[0]:2} - 1)) # strip off the esc-[
col=$((${pos[1]} - 1))
if [ "${col}" = "0" ]; then
exit
else
echo "\n"
fi
}
function ECHOPREFIX() {
if [[ "$-" =~ i ]]; then
exit
else
echo -e "$(checkTerm)$( basename "$0" ): "
fi
}
function ERRORPREFIX() {
echo "$(ECHOPREFIX)ERROR: "
}
function WARNINGPREFIX() {
echo "$(ECHOPREFIX)WARNING: "
}
ARGS=$( getopt -o "j:ahr:vu:p:q:fogx" -l "jobs:,automake,help,profile:,version,user-dir:,patches-dir:,qt-build-dir:,qt5,patch-old,gcc,enable-export-tests" \
-n "$( basename "$0" )" -- "$@" )
# If bad arguments, exit (getopt will have already written the error to STDERR).
[ "$?" = "0" ] || exit 1
eval set -- "$ARGS"
automake=0
help=0
version=0
proFile=
njobs=1
# clang is default
# setting --gcc changes clang to 0.
clang=1
userUserDir=
patchesDir=
qtBuildDir=
# for cmake:
qt_version='QT6'
# for autotools:
configure_options='--enable-qt6'
patch_old=0
# 1 means enable it depending on if we are in a bisect.
always_enable_export_tests=1
while true
do
case "$1" in
-j|--jobs) njobs="$2"
if [[ $2 =~ ^[0-9]+$ ]]; then
njobs="$2"
else
echo "$(ERRORPREFIX)the argument to $1 must be a positive number." >&2
exit 1
fi
shift 2
;;
-a|--automake) automake=1
shift 1
;;
-f|--qt5) qt_version='QT5'
configure_options='--enable-qt5'
shift 1
;;
-u|--user-dir)
if [ -d "$2" ]; then
userUserDir=$( readlink -f "$2" )
else
echo "$(ERRORPREFIX)the argument to $1 must be a folder that exists." >&2
exit 1
fi
shift 2
;;
-g|--gcc) clang=0
shift 1
;;
-h|--help) help=1
shift 1
;;
-v|--version) version=1
shift 1
;;
-p|--patches-dir)
if [ -d "$2" ]; then
patchesDir=$( readlink -f "$2" )
else
echo "$(ERRORPREFIX)the argument to $1 must be a folder that exists." >&2
exit 1
fi
shift 2
;;
-q|--qt-build-dir)
if [ -d "$2" ]; then
qtBuildDir=$( readlink -f "$2" )
else
echo "$(ERRORPREFIX)the argument to $1 must be a folder that exists." >&2
exit 1
fi
if [ ! -d "$2/qtbase/bin" ]; then
# simple check that the build directory is valid
echo "$(ERRORPREFIX)the argument to $1 must contain the subdirectory qtbase/bin" >&2
exit 1
fi
shift 2
;;
-r|--profile)
if [ -f "$2" -a ! -w "$2" ]; then
echo "$(ERRORPREFIX)the file $2 is not writable" >&2
exit 1
elif [ ! -w "$( dirname "$2" )" ]; then
echo "$(ERRORPREFIX)the directory of $2 is not writable" >&2
exit 1
else
proFile="$( readlink -f "$2" )"
fi
shift 2
;;
-o|--patch-old) patch_old=1
shift 1
;;
-x|--enable-export-tests)
# TODO: sanity check the possible values of the argument.
always_enable_export_tests=1
shift 1
;;
--)
shift 1
break;;
*)
echo -e "$(ERRORPREFIX)the getopt command must be out of sync. Please report this."\\n\
"The following flag is not recognized: $1" >&2
exit 1
;;
esac
done
if [ "$#" != "0" ]; then
echo "$(ERRORPREFIX)the following arguments are not recognized: $@" >&2
exit 1
fi
if [ "${help}" = "1" ]; then
echo -e "
USAGE
lyxbuild [OPTIONS]
DESCRIPTION
lyxbuild builds LyX from a git checkout. CMake (default) or Automake can be
used and logs of each step in the build process are stored. A separate user
directory is set up in the parent folder. One sensible directory configuration
is to have something like ~/lyxbuilds/master/repo. Then, lyxbuild will create
~/lyxbuilds/master/build-logs and ~/lyxbuilds/master/user-dir. To run this
LyX build, copy the functions 'mylyx' and 'mylyxcd' into your .bashrc (or
source it). You can then enter 'mylyx master' to run this build of the above
example. 'mylyx' finds the CMake or Automake binary and runs it with the
correct user-dir. 'mylyxcd' changes to the Git repo of the specified build.
They come with tab completion.
OPTIONS
-j N, --jobs N \e[00;36m number of jobs to pass to make. Default is 1. \e[00m
-a, --automake \e[00;36m use Automake instead of CMake. \e[00m
-c, --clang \e[00;36m compile with Ubuntu's default location of clang. \e[00m
-f, --qt5 \e[00;36m build with Qt 5. \e[00m
-p DIR, --patches-dir DIR \e[00;36m path to dir containing patches to apply \e[00m
-o, --patch-old \e[00;36m apply needed patches to build old commits on new systems \e[00m
-q DIR, --qt-build-dir DIR \e[00;36m path to dir the build of Qt 5 to prefix to PATH \e[00m
-r FILE, --profile FILE \e[00;36m path to (new or existing) file to append profiling info. \e[00m
-h, --help \e[00;36m display this help output and exit. \e[00m
-u DIR, --user-dir DIR \e[00;36m the user-dir from which to copy. \e[00m
-v, --version \e[00;36m display version and contact info. \e[00m
"
exit 0
fi
if [ "${version}" = "1" ]; then
echo -e "\\nlyxbuild\\nVersion 0.3dev\\nAuthors: Scott Kostyshak, Kornel Benko\\nContact: skostysh@princeton.edu"
exit 0
fi
# automake's analog to CMake's -DLYX_STDLIB_DEBUG=ON
configure_options="${configure_options} --enable-stdlib-debug=yes"
if [ -n "${qtBuildDir}" ]; then
# Should I remove the qt5-stable PATH? I do not want it to be found if something is not found in
# qt5-dev (I would prefer to force an error). That would be invasive and fragile though. Maybe
# better to check that all of qt5-dev is found.
echo "export PATH=${qtBuildDir}/qtbase/bin:${PATH}"
export PATH="${qtBuildDir}/qtbase/bin:${PATH}"
if [ "${automake}" = "1" ]; then
export MYQTDIR="${qtBuildDir}/qtbase"
configure_options="${configure_options} --with-qt-dir=$MYQTDIR"
fi
fi
# lyxbuild should only be run in the LyX source directory
# Otherwise, if it is accidentally run in a different dir with Git, "git clean"
# could remove files unexpectedly.
if [ ! -f 'lyx.1in' ]; then
echo "$(ERRORPREFIX)Root of LyX source directory not detected (no file 'lyx.1in')" >&2
exit 1
fi
# if not in a git directory, this will fail.
echo "$(ECHOPREFIX)running git clean..."
git clean -xdf > /dev/null 2>&1 \
|| { echo "$(ERRORPREFIX)failed to run git clean. The git directory is required for now." >&2; exit 1; }
if [ -n "${patchesDir}" ]; then
echo "$(ECHOPREFIX)applying patches..."
for patch in ${patchesDir}/*; do
# gitHash="$(head -n 1 "${patch}" | sed 's/From \([^ ]*\).*/\1/')"
# TODO checking subject line is weak. User might amend the patch it locally and not copy to the patches folder. On the other hand, this behavior could be desired.
subjectLine=$(head -n 4 "${patch}" | tail -n 1 | sed 's/Subject: \[PATCH[^\]*\] //')
# TODO change for 2.0.x...
if git log origin/master..master | grep "${subjectLine}"; then
echo "$(ECHOPREFIX)patch already applied, skipping ${patch}."
else
git am "${patch}" || { echo "$(ERRORPREFIX)failed to apply $(basename "${patch}"). Running git am --abort and exiting." >&2; git am --abort; exit 1; }
fi
done
fi
# https://stackoverflow.com/questions/70861523/check-if-git-bisect-is-active-in-a-script-in-a-robist-stable-way
if git bisect log > /dev/null 2>&1; then
echo "$(ECHOPREFIX)detected git bisect in progress"
bisect=1
else
bisect=0
fi
if [ "${bisect}" = 1 ]; then
# might as well just set automatically so I don't have to remember.
patch_old=1
fi
# It is empty if not on a named branch.
# (https://stackoverflow.com/questions/6245570/how-do-i-get-the-current-branch-name-in-git)
current_branch="$( git branch --show-current )"
if [ "${current_branch}" = "master" ]; then
# copied from lyxrm_final_stages
if grep -R '\\origin unavailable' lib/doc lib/examples lib/templates; then
echo "ERROR: found instance(s) of \\origin unavailable"
echo "need to clean these up for Windows build. See the following for more information:"
echo "https://www.mail-archive.com/search?l=mid&q=ndao0s%24vvb%242%40ger.gmane.org"
# e.g., Message-ID:<20230105150956.b4a2vhy2lefb7sek@gary>
# (e.g., koma-book.bib is not found in the KOMA-Script_Book.lyx tests.
echo "We also use \\origin for ctests to figure out where to copy file dependencies from."
exit 1
fi
fi
if [ "${patch_old}" = "1" ]; then
# e.g., on 2.3.0 it will correctly compile with Qt5 (we did not have support
# for Qt6 at this point).
#
# "AUTO" is a reasonable choice. But sometimes want more control
# (e.g., a certain commit doesn't compile with the AUTO's choice).
qt_version="QT5"
echo "$(ECHOPREFIX)Compiling with Qt ${qt_version}..."
if [ "${bisect}" = "1" ]; then
hash_orig="$( git rev-parse HEAD )"
fi
echo "$(ECHOPREFIX)cherry-picking potentially needed fixes for compiling this older commit..."
# TODO: make an array of commits and loop through them. If they are not an
# ancestor, apply. However, need to give multiple commits for branches (e.g.,
# 2.3.x, 2.4.x, master)
cmake_major="$( cmake -E capabilities | jq .version.major )"
cmake_minor="$( cmake -E capabilities | jq .version.minor )"
# Criteria: CMake version 3.18 or greater (i.e., Ubuntu 21.04).
# This fix is not needed for CMake 3.13, but not sure for 3.14 <= x < 3.18.
if [ "${cmake_major}" -ge "3" ] && [ "${cmake_minor}" -ge "18" ] &&
# for now, enable only for 2.3.1 and before AND before about same time on master.
# This fix can be extended.
! git merge-base --is-ancestor 2.3.1 HEAD &&
! git merge-base --is-ancestor 305d449a HEAD; then
echo "applying commits needed for newer CMake versions"
# not sure all of these are needed.
# --keep-redundant-commits causes "git cherry pick" to succeed even if
# the cherry-pick leads to an empty change (otherwise non-zero exit).
if ! git merge-base --is-ancestor "1a440494" HEAD; then
git cherry-pick -x --keep-redundant-commits --strategy=recursive -X theirs 1a440494
fi
if ! git merge-base --is-ancestor "889d10cd" HEAD; then
git cherry-pick -x --keep-redundant-commits --strategy=recursive -X theirs 889d10cd
fi
if ! git merge-base --is-ancestor "80b3adc4" HEAD; then
git cherry-pick -x --keep-redundant-commits --strategy=recursive -X theirs 80b3adc4
fi
git checkout 2.3.6 CMakeLists.txt &&
git commit -m "CMakeLists.txt from 2.3.6" &&
git cherry-pick -x --keep-redundant-commits 7b44280da4fc015a4a930c311cc6073cebacf738
fi
if ! git merge-base --is-ancestor "51cc8aa9" HEAD; then
git cherry-pick -x --keep-redundant-commits --strategy=recursive -X theirs 51cc8aa9
fi
if ! git merge-base --is-ancestor "1a440494" HEAD; then
git cherry-pick -x --keep-redundant-commits 1a440494
fi
# TODO: loop!
if ! git merge-base --is-ancestor "b73ab025" HEAD; then
# TODO: add "-X theirs" to all (and centralize options?)
# this particular instance of "-X theirs" is needed for b6cb557.
git cherry-pick --keep-redundant-commits -x -X theirs "b73ab025"
fi
if ! git merge-base --is-ancestor "1ef1808c" HEAD; then
git cherry-pick --keep-redundant-commits -x -X theirs "1ef1808c"
fi
if ! git merge-base --is-ancestor "9649e80c" HEAD; then
git cherry-pick --keep-redundant-commits -x -X theirs "9649e80c"
fi
if ! git merge-base --is-ancestor "9715d350" HEAD; then
git cherry-pick --keep-redundant-commits -x -X theirs "9715d350"
fi
if ! git merge-base --is-ancestor "8c4d6bbb" HEAD; then
git cherry-pick --keep-redundant-commits -x -X theirs "8c4d6bbb"
fi
if ! git merge-base --is-ancestor "6874c86c" HEAD; then
git cherry-pick --keep-redundant-commits -x -X theirs "6874c86c"
fi
# EXPIRE:
# The following is not strictly (because we do not run the cmake dev flags if
# --patch-old) necessary and it sync not apply cleanly in many cases.
#if ! git merge-base --is-ancestor "8d79860e" HEAD; then
# git cherry-pick --keep-redundant-commits -x -X theirs "8d79860e"
#fi
# if 2.3.0 < HEAD < 2.3.x, ...
if git merge-base --is-ancestor 2.3.0 HEAD &&
! git merge-base --is-ancestor 2.3.x HEAD; then
# Needed because of Python fixes.
echo "checking out 2.3.x's configure and lyx2lyx scripts"
git checkout origin/2.3.x "lib/configure.py" "lib/lyx2lyx/" "lib/scripts/layout2layout.py"
fi
# Newer compiler versions are more strict
WERROR=0
# LyX 2.2.0 fails to compile on Ubuntu 19.04 with CXX11. The warning
# starts with the following:
# undefined reference to `boost::re_detail_106000::perl_matcher...
# (An alternative would be to backport some commits)
USE_CXX11="OFF"
else
USE_CXX11="ON"
# enable WERROR after some fixes on master.
# 2.3.x fails with WERROR=1 for example.
#
# TODO: I'm not actually sure which commit fixed it for Ubuntu 21.10.
# In the future, need to condition on Qt version and on gcc version.
# We really only want to turn this on anyway when compiling
# master or when bisecting when the warning first started occurring.
warning_fix_commit="874ae71f"
if git merge-base --is-ancestor "${warning_fix_commit}" HEAD; then
WERROR=1
else
WERROR=0
fi
fi
echo "$(ECHOPREFIX)removing previous build logs..."
[ -d ../build-logs ] && rm -rf ../build-logs
mkdir ../build-logs
# Start timing here for profiling.
begin_chain="$(date +%s)"
gitRepoDIR="$( readlink -f ./ )"
# We want to do this for autotools also so mylyx() doesn't run an old cmake build rather than a new autotools build.
[ -d ../CMakeBuild ] && { echo "$(ECHOPREFIX)removing previous CMake build" && rm -rf ../CMakeBuild ;}
echo "$(ECHOPREFIX)updating layouts in LyX's lib..."
python3 development/tools/updatelayouts.py
if [ "${clang}" = "1" ]; then
export CC="clang"
# TODO: add option to build with libc++ :
# export CXX="clang++ -stdlib=libc++"
export CXX="clang++"
else
# didn't use to specify this "else" because GCC
# was default, but the system default might not
# be GCC so it's best to be explicit.
export CC="gcc"
export CXX="g++"
fi
if [ "${automake}" = "1" ]; then
if [ "${WERROR}" = "1" ]; then
# see "Some influential environment variables" in ./configure --help
export CXXFLAGS="-Werror"
fi
echo "$(ECHOPREFIX)running autogen..."
./autogen.sh > ../build-logs/autogen 2>&1 \
|| { echo "$(ERRORPREFIX)running autogen.sh" >&2; exit 1; }
echo "$(ECHOPREFIX)running configure..."
# echo "configure options are: ${configure_options}"
./configure ${configure_options} > ../build-logs/configure 2>&1 \
|| { echo "$(ERRORPREFIX)running configure" >&2; exit 1; }
else
# this check needs to be done before cd'ing to build dir (or need to cd back)
# only compile with Enchant on Ubuntu >= 20.04 if we have the fix that
# supports Enchant 2
ENCHANT_FLAG="ON"
ubuntu_ver="$( lsb_release -sr )"
ubuntu_ver_yr="${ubuntu_ver:0:2}"
if [ "${ubuntu_ver_yr}" -ge "20" ]; then
enchant_commit="f1694db49681451f9b947f25238f8032769799f8"
if ! git merge-base --is-ancestor "${enchant_commit}" HEAD; then
echo "CMake flags: Not compiling with Enchant."
ENCHANT_FLAG="OFF"
fi
fi
HUNSPELL_FLAG="ON"
# could condition on CMake version.
# This one cherry-pick's clean, but we might also need to cherry-pick the one
# this one is based on and that does not cherry-pick clean.
hunspell_commit="cf980435b12e697b90508924cf0c82dd3c1c0b36"
if ! git merge-base --is-ancestor "${hunspell_commit}" HEAD; then
echo "CMake flags: Not compiling with Hunspell."
HUNSPELL_FLAG="OFF"
fi
# this commit is not the one that fixed it, it is just known to work.
if git merge-base --is-ancestor "3aab9ad2" HEAD; then
# -Werror=dev turns CMake warnings into errors, but not all warnings. For
# example, cannot turn warnings about unused flags into errors:
# https://stackoverflow.com/questions/42684572/how-to-make-cmake-exit-non-0-in-response-to-warning-manually-specified-variable
#
# -Wdev has the following documentation:
# Enable developer warnings.
# Enable warnings that are meant for the author of the CMakeLists.txt files.
#
cmake_Werror_flags='-Wdev -Werror=dev'
else
cmake_Werror_flags='-Wno-dev -Wno-error=dev'
fi
# for --patch-old, just ignore warnings:
if [ "${patch_old}" = "1" ]; then
cmake_Werror_flags='-Wno-dev -Wno-error=dev'
fi
echo "$(ECHOPREFIX)creating \"CMakeBuild\" dir and running cmake..."
mkdir ../CMakeBuild
cd ../CMakeBuild
if [ "${WERROR}" = "1" ]; then
# should be a semi-colon separated list (if more than one option).
CPPFLAGS="-Werror"
if [ "${clang}" = "0" ]; then
# (https://stackoverflow.com/questions/5188267/checking-the-gcc-version-in-a-makefile)
# (https://stackoverflow.com/a/17947005)
gcc_version="$( gcc -dumpfullversion -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/')"
if [ "${gcc_version}" -ge "130000" ]; then
# turn all warnings into errors except for one:
#
# 'dangling-reference' is starting with GCC 13.
# In LyX, we get it in a few places and are not sure if they are
# false-positives, or if it's worth it to fix them.
CPPFLAGS+=";-Wno-error=dangling-reference"
fi
fi
else
CPPFLAGS=""
fi
#
# Should be a semi-colon separated list (if more than one option).
# The following naive Bash append works well even if CPPFLAGS is empty,
# i.e., ";-O3" is processed well.
CPPFLAGS_FAST="${CPPFLAGS};-O3;-march=native"
if [ "${always_enable_export_tests}" = "1" ]; then
ctest_flags="ON"
else
if [ "${bisect}" = "1" ]; then
# This flag just controls whether cmake configures the tests,
# which can take e.g. a minute for the export tests.
# This flag does not control whether the tests are actually run.
ctest_flags="OFF"
else
ctest_flags="ON"
fi
fi
cmake_flags=(
# TODO what about /usr/local/git_branch ?
-DCMAKE_INSTALL_PREFIX=/usr/local
-DLYX_DEBUG=ON -DLYX_RELEASE=OFF -DLYX_CPACK=ON
# set to OFF so binary now has name "lyx" instead of e.g. "lyx2.3".
# I like this so that if I install, all my scripts can just call "lyx"
# todo: but might be easy to make a separate 'lyx' binary that just
# points to one lyx2.3 or other.
-DLYX_PROGRAM_SUFFIX=OFF
-DLYX_LOCALVERSIONING=ON
# note, these all depend on the option -DLYX_CPACK=ON
# (otherwise unrecognized)
-DCPACK_BINARY_DEB:BOOL=ON
# requires "rpmbuild" binary from Ubuntu "rpm" package.
-DCPACK_BINARY_RPM:BOOL=OFF
-DCPACK_BINARY_NSIS:BOOL=OFF -DCPACK_BINARY_STGZ:BOOL=OFF
# set to ON for "make package" to create a tar file (of the *binaries*)
# (not sure if useful)
-DCPACK_BINARY_TGZ:BOOL=OFF
-DCPACK_BINARY_TBZ2:BOOL=OFF
-DCPACK_BINARY_TZ:BOOL=OFF
# These control behavior of "make package_source"
-DCPACK_SOURCE_TGZ:BOOL=ON
-DCPACK_SOURCE_TBZ2:BOOL=OFF
-DCPACK_SOURCE_TZ:BOOL=OFF
-DCPACK_SOURCE_ZIP:BOOL=OFF -DLYX_EXTERNAL_BOOST=OFF
-DLYX_HUNSPELL=${HUNSPELL_FLAG}
# if LYX_EXTERNAL_HUNSPELL=ON and LYX_DEBUG_GLIBC=ON LyX will crash when
# correcting a word with hunspell as spellchecker.
# See d9e0a842 and bda9e38a.
# Note that if we mistakenly turn both on, CMake catches it during the
# 'cmake' command.
# TODO: Before Ubuntu 21.10, I would set EXTERNAL_HUNSPELL to OFF
# and STDLIB_DEBUG=OFF to ON. This now causes LyX to crash when
# correcting a word.
-DLYX_EXTERNAL_HUNSPELL=${HUNSPELL_FLAG}
-DLYX_ENCHANT=${ENCHANT_FLAG}
-DLYX_EXTERNAL_Z=ON
-DLYX_EXTERNAL_DTL=ON
-DLYX_EXTERNAL_ICONV=ON
-DLYX_NLS=ON
-DLYX_ENABLE_URLTESTS=OFF
-DLYX_ENABLE_EXPORT_TESTS=${ctest_flags}
-DLYX_ENABLE_KEYTESTS=OFF
-DLYX_PROFILE=ON
-DLYX_USE_QT=${qt_version} -DLYX_CXX_FLAGS_EXTRA="${CPPFLAGS}"
# Compile with STL debug code.
# For one particular use case, see:
# https://www.lyx.org/trac/ticket/11204
# see https://www.lyx.org/trac/ticket/11777#comment:10
# -DLYX_DEBUG_GLIBC=ON
# see d9e0a842
# STDLIB_DEBUG=ON is possibly helpful for getting better backtraces
# (https://www.lyx.org/trac/ticket/12226#comment:28)
-DLYX_STDLIB_DEBUG=OFF
-DLYX_DEBUG_GLIBC=OFF
-DLYX_DEBUG_GLIBC_PEDANTIC=OFF
#-DLYX_DEBUG_SANITIZE="ADDRESS"
# TODO: enable only for GCC? Clang currently gives output that
# I'm not sure how to fix and not sure if it's a real issue.
#-DLYX_DEBUG_SANITIZE="UNSPECIFIED"
)
cmake_flags_fast=(
-DCMAKE_INSTALL_PREFIX=/usr/local
-DLYX_DEBUG=OFF -DLYX_RELEASE=ON -DLYX_CPACK=OFF
-DLYX_PROGRAM_SUFFIX=OFF
-DLYX_LOCALVERSIONING=ON
-DLYX_EXTERNAL_BOOST=OFF
-DLYX_HUNSPELL=${HUNSPELL_FLAG}
-DLYX_EXTERNAL_HUNSPELL=${HUNSPELL_FLAG}
-DLYX_ENCHANT=${ENCHANT_FLAG}
-DLYX_EXTERNAL_Z=ON
-DLYX_EXTERNAL_DTL=ON
-DLYX_EXTERNAL_ICONV=ON
-DLYX_NLS=ON
-DLYX_ENABLE_URLTESTS=OFF
-DLYX_ENABLE_EXPORT_TESTS=${ctest_flags}
-DLYX_ENABLE_KEYTESTS=OFF
-DLYX_PROFILE=OFF
-DLYX_USE_QT=${qt_version} -DLYX_CXX_FLAGS_EXTRA="${CPPFLAGS_FAST}"
-DLYX_STDLIB_DEBUG=OFF
-DLYX_DEBUG_GLIBC=OFF
-DLYX_DEBUG_GLIBC_PEDANTIC=OFF
)
cmake ${cmake_Werror_flags} "${gitRepoDIR}/" ${cmake_flags[@]} > ../build-logs/cmake 2>&1 \
|| { echo "$(ERRORPREFIX)running cmake" >&2; exit 1; }
fi
echo "$(ECHOPREFIX)running make..."
echo "$(ECHOPREFIX)building with ${njobs} core(s)" > ../build-logs/make
make -j${njobs} >> ../build-logs/make 2>&1
make_ret=$?
if [ "${make_ret}" != 0 ]; then
echo "$(ERRORPREFIX)running make" >&2
cd "${gitRepoDIR}"
if [ "${bisect}" = "1" ] && [ "${patch_old}" = "1" ]; then
# The following is helpful when we are bisecting compilation success.
# todo: but it might be annoying when we are not, because we might want to
# cd and then manually run 'make' to see the error, but because of
# this it could cause a different error.
#
# restore so that "git bisect good/bad" works.
echo "$(ECHOPREFIX)reseting and checking out so that good/bad works..."
git reset --hard
git checkout "${hash_orig}"
fi
exit 1
fi
end_chain=$(date +%s)
if [ "${patch_old}" != "1" ]; then
# extra checks in make log.
#
# Check for warnings from msgmerge (see e.g., the LyX commit 46aedb4e).
# msgmerge does not seem to have an option to convert warnings to errors
# (--strict does not do it). We could instead propose to write a wrapper script
# for msgmerge that checks for this output (i.e., upstream this check to theLyX
# build scripts).
if grep "warning: internationalized messages should not contain" ../build-logs/make; then
echo "$(ERRORPREFIX)invalid string(s) in po file(s). See grepped lines just above." >&2
exit 1
fi
fi
if [ "${automake}" = "0" ]; then
# Can be any test. We have to run some test though, so that the ctest user
# directory is configured so that prefTest (see below) can be run.
ctest -R "examples/Welcome_pdf2"
# Enable needauth for knitr, Sweave, gnuplot, etc for ctests.
# This enables it only for the ctest user directory.
./prefTest.pl test
fi
DIFF=$(( end_chain - begin_chain ))
cd "${gitRepoDIR}"
compname=$( uname -n )
commitinfo=$( git describe )
MASTER_DIR=$( readlink -f ../ )
LYX_USER_DIR="${MASTER_DIR}/user-dir"
[ -d "${LYX_USER_DIR}" ] && rm -r "${LYX_USER_DIR}"
mkdir "${LYX_USER_DIR}"
if [ "${automake}" = "1" ]; then
echo "$(ECHOPREFIX)checking out 'po/'..."
git checkout "po/" ||
echo "$(ERRORPREFIX)checkout of 'po/' failed" >&2
fi
if [ -n "${proFile}" ]; then
if [ -f "${proFile}" ]; then
echo "${compname} ${commitinfo} ${njobs} ${DIFF} ${automake}" >> "${proFile}"
else
echo "compname commitinfo njobs DIFF automake" > "${proFile}"
echo "${compname} ${commitinfo} ${njobs} ${DIFF} ${automake}" >> "${proFile}"
fi
fi
cd "${LYX_USER_DIR}"
if [ -n "${userUserDir}" ]; then
echo "$(ECHOPREFIX)copying user-dir..."
cp -r "${userUserDir}"/* ./
# LyX does not currently allow ~ in session files,
# so need to substitute the user name in.
sed -i "s/\/home\/[^/]*/\/home\/${USER}/g" session
#
# resolve lnx files
# Because many services (like Dropbox) do not support links,
# can use a manually-implemented link. A .lnx file is just
# a plain-text file with one line that is the path to
# a different file.
# Here, we convert that to an actual symbolic link.
# TODO: allow to use .lnx files besides just layouts ? e.g., preferences?
if [ -d "layouts" ]; then
shopt -s nullglob
for lnx in layouts/*.lnx; do
sed -i "s/~/\/home\/${USER}/g" "${lnx}"
pathtofile="$( cat "${lnx}" )"
if [ -e "${pathtofile}" ]; then
ln -s "${pathtofile}" "${lnx%.*}"
fi
done
shopt -u nullglob
fi
fi
# Just for convenience (of not having to configure when starting LyX and of having preferences)
echo "$(ECHOPREFIX)reconfiguring..."
# LyX did not have perfect Python3 support for a while, so we use Python2 for
# older commits.
# This commit is conservative (could make it older).
# The actual commit has nothing to do with Python3, we just use it
# since it has been tested to work with Python3.
cd "${gitRepoDIR}"
python3_commit="af7ffc7dfa00297e58d332d57f4ead76265cdda3"
if git merge-base --is-ancestor "${python3_commit}" HEAD; then
PYTHON_EXEC="python3"
else
PYTHON_EXEC="python2"
fi
# TODO: expire the above. "python2" is no longer available Ubuntu releases
# starting with 23.04.
PYTHON_EXEC="python3"
cd "${LYX_USER_DIR}"
${PYTHON_EXEC} -tt "${gitRepoDIR}/lib/configure.py" > ../build-logs/reconfigure 2>&1 \
|| { echo "$(WARNINGPREFIX)reconfigure failed." >&2; exit 1; }
LYX_USER_DIR_NOAUTH="${LYX_USER_DIR}-noauth"
[ -d "${LYX_USER_DIR_NOAUTH}" ] && rm -r "${LYX_USER_DIR_NOAUTH}"
cp -r "${LYX_USER_DIR}" "${LYX_USER_DIR_NOAUTH}"
echo "\\use_converter_needauth false" >> "${LYX_USER_DIR_NOAUTH}"/preferences
cd "${gitRepoDIR}"
if [ "${bisect}" = "1" ] && [ "${patch_old}" = "1" ]; then
# restore so that "git bisect good/bad" works.
echo "$(ECHOPREFIX)checking out original bisect commit, before patches..."
git reset --hard
git checkout "${hash_orig}"
fi
echo "$(ECHOPREFIX)done."