#!/bin/bash # # This script checks ABI compatibility of the current branch against # a prior release (git tag) of the same branch. # # We recommend to execute this script in an empty, temporary directory. # See below for details why this is useful. # # Requirements: # # CMake, a POSIX shell (bash), abi-checker, and perl (for abi checker). # This script has been tested only on Linux. After the check it *tries* # to open the compatibility report with the standard browser (xdg-open). # # Usage: # # $ /path-to/abi-check FLTK_DIR MINOR_VERSION P1 P2 # # Parameters: # # FLTK_DIR Where the FLTK source files are (must be a git checkout). # This must be a "clean" working copy: this script checks # out the prior version (release tag) and the tip of the # branch (in this order). The last checkout is left in place. # # MINOR_VERSION FLTK major.minor version, e.g. 1.3, 1.4, or 1.5. # # P1 First FLTK patch version to compare (prior release) # # P2 Current version (tip) of the development branch. This # version must be given as well. If the version in git has # not yet been updated you can enter the "next" version. # This is typically the case if you check the current branch # for ABI issues *before* preparation of the next release. # # Examples: # # /path-to/abi-check /path-to/fltk-1.3 1.3 10 11 # /path-to/abi-check /path-to/fltk-1.4 1.4 3 4 # # The latter checks ABI compatibility of git tag "release-1.4.3" and the # HEAD of the selected development branch (see below) as version 1.4.4. This # can be done even if the version number in 'branch-1.4' is still 1.4.3. # # This is typically used to check ABI compatibility of a development branch # against the latest release of the same branch, but can also be used to test # any prior version of the branch against the current tip of the branch. # # The script uses `cmake --build` and `cmake --install` for simplicity, but # you can select any CMake generator you like, as long as the script can # be executed by a POSIX shell and `cmake --install` works for the given # generator (not tested for Xcode and Visual Studio). # "Installing" the build ensures that all header files including generated # ones are present where `abi-compliance-checker.pl` expects them to be. # # This script is known to work with FLTK versions since 1.3.6. Older versions # may not compile, build, or install correctly with current compilers. # # Warning: this script does NOT check runtime errors, e.g. when checking out # git versions, or when building and installing FLTK libs. Please check the # logs that are displayed and/or stored in `logs` for errors. # # Error checks may be added in a later version of this script. # # ------------------------------------------------------------------------------ # # Some variables are "constants" in this script and need to be edited for # use in other build environments. The variables that need to be edited for # your build environment are documented below: # # ABI_PATH Directory of ABI checker ("abi-compliance-checker.pl"); can # be empty (default) if the ABI checker is in the user's PATH. # If the path is given it must have a trailing slash ('/'). # # ABI_CHECKER Name of the ABI checker executable (script). The default # ("abi-compliance-checker.pl") should be correct. # # GENERATOR CMake generator, e.g. "Ninja", "Unix Makefiles" (see CMake docs). # # PARALLEL Number of parallel build jobs, recommended for "Unix Makefiles". # Use CMake syntax "--parallel=N" if needed. # Ninja uses the number of available cores if not specified. # # CMAKE_WARNINGS Should be empty; "-Wno-dev" suppresses "developer warnings". # # CXX_FLAGS Can be used to suppress compiler warnings (not recommended). # # CXX_STANDARD Default: "11" (C++11); can be set to "98" (C++98) for 1.3. # # This script creates several subdirectories in the current working directory # (referred as $PWD below). The files created by the script can be deleted # after the check. # # Both FLTK versions ($VER) will be built in $PWD/build/$VER and installed in # $PWD/bin/$VER, resp.. These folders are cleared before build/installation # but left as-is after the abi-check. They must be deleted manually. # # Example: Folders created for ABI check of FLTK 1.4.2 vs 1.4.3: # # . (current dir: $PWD) # ├── bin # │   ├── 1.4.2 # │   └── 1.4.3 # ├── build # │   ├── 1.4.2 # │   └── 1.4.3 # ├── compat_reports # │   └── fltk # ├── logs # │   └── fltk # └── xml # ├── fltk-1.4.2.xml # └── fltk-1.4.3.xml # # ----------------------------------------------------- # Edit the following "constants" for your environment, # see above for documentation: # ----------------------------------------------------- # ABI_PATH="" ABI_CHECKER="abi-compliance-checker.pl" GENERATOR="Ninja" PARALLEL="" CMAKE_WARNINGS="" CXX_FLAGS="" CXX_STANDARD="11" # ----------------------------------------------------- # End of constants, no need to edit anything below. # ----------------------------------------------------- # Define derived variables ABI_CHECKER="$ABI_PATH$ABI_CHECKER" SOURCE_DIR="$1" BASE_DIR="$PWD" BASE_VERSION="$2" BUILD_DIR="$BASE_DIR/build" PREFIX="$BASE_DIR/bin" # CMake options -- in parts depending on the development branch. # # This could be simplified if the script was written only for the current # FLTK version but for now (work in progress) it is written to be used for # other FLTK versions (branches) as well, just in case older branches need # a new release. It is intended that developers can use the latest script # from the 'master' branch in older branches (1.3.6 and higher) as well. # # Default values are set first for FLTK 1.5 (master). BUILD_SHARED="-D FLTK_BUILD_SHARED_LIBS=ON" BUILD_CAIRO="-D FLTK_OPTION_CAIRO_WINDOW=ON" BUILD_FORMS="-D FLTK_BUILD_FORMS=ON" BUILD_FLUID="-D FLTK_BUILD_FLUID=OFF" BUILD_OPTIONS="-D FLTK_BUILD_FLTK_OPTIONS=OFF" # Version dependent options are set or overriden here: if test v$BASE_VERSION = v1.5; then BASE_BRANCH="master" elif test v$BASE_VERSION = v1.4; then BASE_BRANCH="branch-1.4" else # 1.3: some old option names, some options are not present BASE_BRANCH="branch-1.3" BUILD_SHARED="-D OPTION_BUILD_SHARED_LIBS=ON" BUILD_CAIRO="-D OPTION_CAIRO=ON" BUILD_FORMS="" BUILD_FLUID="" BUILD_OPTIONS="" fi V1=$BASE_VERSION.$3 V2=$BASE_VERSION.$4 # define a common function for both builds build_and_install() { REL="$1" VER="$2" XML="xml/fltk-$VER.xml" # generate XML file for ABI checker echo echo "-------- Creating XML file $XML for abi-checker --------" echo cat > $XML << EOF $VER $PREFIX/$VER/include/FL/ win32.H mac.H $PREFIX/$VER/lib/ EOF pushd $SOURCE_DIR echo echo "-------- Checking out Git tag/branch $REL for $VER in $PWD --------" echo git checkout $REL echo echo "-------- Configuring FLTK $VER in $BUILD_DIR/$VER --------" echo cmake $CMAKE_WARNINGS \ -S . -B $BUILD_DIR/$VER \ -G "$GENERATOR" \ -D CMAKE_BUILD_TYPE=Debug \ -D CMAKE_CXX_FLAGS_INIT="$CXX_FLAGS" \ -D CMAKE_INSTALL_PREFIX=$PREFIX/$VER \ -D FLTK_BUILD_EXAMPLES=OFF \ -D FLTK_BUILD_TEST=OFF \ -D CMAKE_CXX_STANDARD=$CXX_STANDARD \ $BUILD_SHARED $BUILD_FLUID $BUILD_OPTIONS $BUILD_FORMS $BUILD_CAIRO echo echo "-------- Building FLTK $VER in $BUILD_DIR/$VER --------" echo cmake --build $BUILD_DIR/$VER $PARALLEL echo echo "-------- Installing FLTK $VER in $PREFIX/$VER --------" echo rm -rf $PREFIX/$VER cmake --install $BUILD_DIR/$VER popd } # create subdirectory 'xml' if it doesn't exist [[ ! -d xml ]] && mkdir xml [[ ! -d compat_reports ]] && mkdir compat_reports build_and_install release-$V1 $V1 build_and_install $BASE_BRANCH $V2 $ABI_CHECKER \ -lib fltk \ -old xml/fltk-${V1}.xml \ -new xml/fltk-${V2}.xml xdg-open compat_reports/fltk/${V1}_to_${V2}/compat_report.html