• Otto Kekäläinen's avatar
    MDEV-20392: Skip ABI check if 'diff' is not found · b7d87bf0
    Otto Kekäläinen authored
    Not all environments have 'diff' installed. Most notably CentOS 8
    does not have diff out-of-the-box. Thus users running 'cmake .' and
    'make' would fail to build MariaDB, and they would think the error
    was in ABI incompatibilities due to the error message emitted by CMake
    when in reality simply 'diff' was missing.
    
    This fixes it and makes the developer experience better by simply skipping
    the diffing if 'diff' is not found.
    
    ## Proof
    
    Running in a clean CentOS 8 container.
    
    ### Before
    
    ```
    $ cmake .
    ...
    -- Looking for cpuid.h
    -- Looking for cpuid.h - found
    -- Looking for x86intrin.h
    -- Looking for x86intrin.h - found
    -- Looking for event.h
    -- Looking for event.h - not found
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /build
    
    $ make
    Scanning dependencies of target abi_check
    CMake Error at cmake/do_abi_check.cmake:82 (MESSAGE):
      ABI check found difference between /build/include/mysql/plugin_audit.h.pp
      and /build/abi_check.out
    
    make[2]: *** [CMakeFiles/abi_check.dir/build.make:57: CMakeFiles/abi_check] Error 1
    make[1]: *** [CMakeFiles/Makefile2:168: CMakeFiles/abi_check.dir/all] Error 2
    make: *** [Makefile:163: all] Error 2
    
    $ yum install -y diffutils
    ...
    Installed:
      diffutils-3.6-6.el8.x86_64
    Complete!
    
    $ make
    [  0%] Built target abi_check
    Scanning dependencies of target INFO_BIN
    [  0%] Built target INFO_BIN
    Scanning dependencies of target INFO_SRC
    [  0%] Built target INFO_SRC
    Scanning dependencies of target wsrep_api_v26
    [  0%] Building C object wsrep-lib/wsrep-API/CMakeFiles/wsrep_api_v26.dir/v26/wsrep_dummy.c.o
    [  0%] Building C object wsrep-lib/wsrep-API/CMakeFiles/wsrep_api_v26.dir/v26/wsrep_gtid.c.o
    [  0%] Building C object wsrep-lib/wsrep-API/CMakeFiles/wsrep_api_v26.dir/v26/wsrep_loader.c.o
    [  0%] Building C object wsrep-lib/wsrep-API/CMakeFiles/wsrep_api_v26.dir/v26/wsrep_uuid.c.o
    [  0%] Linking C static library libwsrep_api_v26.a
    [  0%] Built target wsrep_api_v26
    ```
    
    ### After
    
    ```
    $ make
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_audit.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_ftparser.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/psi/psi_abi_v1.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/psi/psi_abi_v2.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/client_plugin.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_auth.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_password_validation.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_encryption.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_data_type.h skipped.
    Command 'diff' not found. ABI check for /build/server/include/mysql/plugin_function.h skipped.
    [  0%] Built target abi_check
    [  0%] Built target INFO_SRC
    [  0%] Built target INFO_BIN
    [  0%] Built target wsrep_api_v26
    [  0%] Building CXX object wsrep-lib/src/CMakeFiles/wsrep-lib.dir/server_state.cpp.o
    ```
    
    If diff is installed, those warnings are simply not shown. Builds pass
    without the need to install 'diff'.
    b7d87bf0
do_abi_check.cmake 3.57 KB