Use ccache with cmake on travis.

This replaces the custom python script which manipulated various files' mtime with ccache for allowing cmake builds to not need full recompiles every travis run.
This commit is contained in:
pentarctagon 2018-02-16 15:28:33 -06:00 committed by Pentarctagon
parent 72a80fed5b
commit ee1a56a04a
4 changed files with 14 additions and 84 deletions

View File

@ -5,6 +5,7 @@ services:
- docker - docker
cache: cache:
ccache: true
directories: directories:
- build-cache - build-cache
@ -62,12 +63,12 @@ script:
./utils/travis/check_utf8.sh; ./utils/travis/check_utf8.sh;
./utils/travis/utf8_bom_dog.sh; ./utils/travis/utf8_bom_dog.sh;
"$CXX" --version; "$CXX" --version;
scons wesnoth wesnothd campaignd boost_unit_tests build=release ctool="$CC" cxxtool="$CXX" --debug=time extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=true cxx_std="$CXXSTD" nls="$NLS" jobs=2; scons wesnoth wesnothd campaignd boost_unit_tests build=release ctool="$CC" cxxtool="$CXX" --debug=time extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=true cxx_std="$CXXSTD" nls="$NLS" jobs=2 enable_lto=false;
else else
export DISPLAY=:99.0; export DISPLAY=:99.0;
/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1024x768x24; /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1024x768x24;
docker run -v "$PWD"/build-cache:/home/wesnoth-travis/build wesnoth-repo:16.04 bash -c './docker_run.sh "$@"' bash "$NLS" "$TOOL" "$CC" "$CXX" "$CXXSTD" "$EXTRA_FLAGS_RELEASE" "$WML_TESTS" "$WML_TEST_TIME" "$PLAY_TEST" "$MP_TEST" "$BOOST_TEST"; docker run -v "$PWD"/build-cache:/home/wesnoth-travis/build -v "$HOME"/.ccache:/root/.ccache wesnoth-repo:16.04 bash -c './docker_run.sh "$@"' bash "$NLS" "$TOOL" "$CC" "$CXX" "$CXXSTD" "$EXTRA_FLAGS_RELEASE" "$WML_TESTS" "$WML_TEST_TIME" "$PLAY_TEST" "$MP_TEST" "$BOOST_TEST";
fi fi
notifications: notifications:

View File

@ -1,71 +0,0 @@
import os
from time import time
from zlib import crc32
# #
# Functions
# #
# get the CRC of a file's contents
def getCRC32(file):
src_file = open(file, "r", encoding="utf-8")
file_contents = src_file.read()
src_file.close()
return crc32(file_contents.encode("utf8"))
# recursively get all files in all subdirectories
def getAllFiles(start):
file_list = []
for root, _, files in os.walk(start):
for file in files:
file_list.append(root+"/"+file)
return file_list
# #
# Variables
# #
today = time()
yesterday = time() - (24*60*60)
mtime_file = "build/cmake_mtime_crc.txt"
# #
# Run
# #
file_list = getAllFiles("src")
# get the current CRC all relevant files in src/, and set their mtime to yesterday
crc_dict_curr = {}
for file in file_list:
os.utime(file, (yesterday, yesterday))
if (file.endswith(".cpp") or file.endswith(".hpp") or file.endswith(".tpp") or file.endswith(".c") or file.endswith(".h")) and "CMakeFiles" not in file:
crc_dict_curr.update({file : getCRC32(file)})
# if there's an existing stored list of CRCs, read that in
if os.path.isfile(mtime_file):
readfile = open(mtime_file, "r", encoding="utf-8")
crc_dict_prev = {}
for line in readfile:
line_list = line.strip().split(":")
crc_dict_prev.update({line_list[0] : int(line_list[1])})
readfile.close()
# compare file CRCs between the set of CRCs from the previous run and the current run
# if the file has changed, or is brand new, set its mtime to today so that cmake will know to recompile it
for key, value in crc_dict_curr.items():
if key in crc_dict_prev:
if value != crc_dict_prev[key]:
os.utime(key, (today, today))
else:
os.utime(key, (today, today))
# write out the new set of file CRCs
writefile = open(mtime_file, "w")
for key, value in crc_dict_curr.items():
writefile.write(key+":"+str(value)+"\n")
writefile.close()
print("Updated cmake mtime data!")

View File

@ -2,5 +2,7 @@ FROM wesnoth/wesnoth:16.04
COPY ./ /home/wesnoth-travis/ COPY ./ /home/wesnoth-travis/
RUN apt install -y -qq ccache
WORKDIR /home/wesnoth-travis WORKDIR /home/wesnoth-travis

View File

@ -49,19 +49,13 @@ if [ "$NLS" == "true" ]; then
else else
# if not doing the translations, build wesnoth, wesnothd, campaignd, boost_unit_tests # if not doing the translations, build wesnoth, wesnothd, campaignd, boost_unit_tests
if [ "$TOOL" == "cmake" ]; then if [ "$TOOL" == "cmake" ]; then
# softlink to build/ for cmake, since that's where the docker mount point is # set ccache configurations
cd src/ echo "max_size = 200M" > $HOME/.ccache/ccache.conf
ln -s ../build CMakeFiles echo "compiler_check = content" >> $HOME/.ccache/ccache.conf
cd ..
# run cmake separately so config.h will be seen by the md5 script
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GAME=true -DENABLE_SERVER=true -DENABLE_CAMPAIGN_SERVER=true -DENABLE_TESTS=true -DENABLE_NLS=false -DEXTRA_FLAGS_CONFIG="-pipe" -DEXTRA_FLAGS_RELEASE="$EXTRA_FLAGS_RELEASE" -DENABLE_STRICT_COMPILATION="$STRICT"
# run manual md5 file tracking/mtime modification script for cmake
python3 cmake_mtime_crc.py
make VERBOSE=1 -j2
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GAME=true -DENABLE_SERVER=true -DENABLE_CAMPAIGN_SERVER=true -DENABLE_TESTS=true -DENABLE_NLS=false -DEXTRA_FLAGS_CONFIG="-pipe" -DEXTRA_FLAGS_RELEASE="$EXTRA_FLAGS_RELEASE" -DENABLE_STRICT_COMPILATION="$STRICT" -DENABLE_LTO=false -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache && make VERBOSE=1 -j2
else else
scons wesnoth wesnothd campaignd boost_unit_tests build=release ctool=$CC cxxtool=$CXX --debug=time extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict="$STRICT" cxx_std=$CXXSTD nls=false jobs=2 scons wesnoth wesnothd campaignd boost_unit_tests build=release ctool=$CC cxxtool=$CXX --debug=time extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict="$STRICT" cxx_std=$CXXSTD nls=false jobs=2 enable_lto=false
fi fi
# check if the build was successful # check if the build was successful
@ -78,6 +72,7 @@ else
./run_wml_tests -g -v -c -t "$WML_TEST_TIME" ./run_wml_tests -g -v -c -t "$WML_TEST_TIME"
RET=$? RET=$?
if [ $RET != 0 ]; then if [ $RET != 0 ]; then
echo "WML tests failed!"
EXIT_VAL=$RET EXIT_VAL=$RET
fi fi
fi fi
@ -87,6 +82,7 @@ else
./utils/travis/play_test_executor.sh ./utils/travis/play_test_executor.sh
RET=$? RET=$?
if [ $RET != 0 ]; then if [ $RET != 0 ]; then
echo "Play tests failed!"
EXIT_VAL=$RET EXIT_VAL=$RET
fi fi
fi fi
@ -96,6 +92,7 @@ else
./utils/travis/mp_test_executor.sh ./utils/travis/mp_test_executor.sh
RET=$? RET=$?
if [ $RET != 0 ]; then if [ $RET != 0 ]; then
echo "MP tests failed!"
EXIT_VAL=$RET EXIT_VAL=$RET
fi fi
fi fi
@ -105,6 +102,7 @@ else
./utils/travis/test_executor.sh ./utils/travis/test_executor.sh
RET=$? RET=$?
if [ $RET != 0 ]; then if [ $RET != 0 ]; then
echo "Boost tests failed!"
EXIT_VAL=$RET EXIT_VAL=$RET
fi fi
fi fi