summaryrefslogtreecommitdiff
path: root/.github/workflows/autotools-cmake.yml
blob: c7da5a59a69365ea5619067c36c745d008d10858 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#                          __  __            _
#                       ___\ \/ /_ __   __ _| |_
#                      / _ \\  /| '_ \ / _` | __|
#                     |  __//  \| |_) | (_| | |_
#                      \___/_/\_\ .__/ \__,_|\__|
#                               |_| XML parser
#
# Copyright (c) 2021-2022 Sebastian Pipping <sebastian@pipping.org>
# Licensed under the MIT license:
#
# Permission is  hereby granted,  free of charge,  to any  person obtaining
# a  copy  of  this  software   and  associated  documentation  files  (the
# "Software"),  to  deal in  the  Software  without restriction,  including
# without  limitation the  rights  to use,  copy,  modify, merge,  publish,
# distribute, sublicense, and/or sell copies of the Software, and to permit
# persons  to whom  the Software  is  furnished to  do so,  subject to  the
# following conditions:
#
# The above copyright  notice and this permission notice  shall be included
# in all copies or substantial portions of the Software.
#
# THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
# EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
# NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
# USE OR OTHER DEALINGS IN THE SOFTWARE.

name: Ensure that GNU Autotools and CMake build systems agree

on:
  pull_request:
  push:
  schedule:
    - cron: '0 2 * * 5'  # Every Friday at 2am

permissions:
  contents: read

jobs:
  checks:
    name: Ensure that GNU Autotools and CMake build systems agree
    strategy:
      matrix:
        include:
          - os: macos-11
            configure_args:
            cmake_args:
          - os: ubuntu-20.04
            configure_args:
            cmake_args:
          - os: ubuntu-20.04
            configure_args: --host=i686-w64-mingw32
            cmake_args: -DCMAKE_TOOLCHAIN_FILE=cmake/mingw-toolchain.cmake
    defaults:
      run:
        shell: bash
    runs-on: "${{ matrix.os }}"
    steps:
    - uses: actions/checkout@v3.5.2

    - name: (Linux) Install build dependencies
      if: "${{ runner.os == 'Linux' }}"
      run: |-
        set -x
        sudo apt-get update
        sudo apt-get install --yes --no-install-recommends -V \
            cmake \
            docbook2x \
            lzip \
            mingw-w64

    - name: (macOS) Install build dependencies
      if: "${{ runner.os == 'macOS' }}"
      run: |
        brew install \
            autoconf \
            automake \
            cmake \
            docbook2x \
            gnu-sed \
            libtool \
            lzip

    - name: Produce and extract a release archive
      run: |
        set -x
        cd expat
        ./buildconf.sh
        ./configure
        make dist
        tar xf expat-*.*.*.tar.gz

    - name: Build and install using GNU Autotools
      run: |
        set -x
        cd expat/expat-*.*.*/
        mkdir build_autotools
        cd build_autotools
        ../configure \
            --libdir='${exec_prefix}/lib123' \
            ${{matrix.configure_args}}
        make install DESTDIR="${PWD}"/ROOT
        find ROOT | sort | xargs ls -ld

    - name: Build and install using CMake
      run: |
        set -x
        cd expat/expat-*.*.*/
        mkdir build_cmake
        cd build_cmake
        cmake \
            -DCMAKE_INSTALL_LIBDIR=lib123 \
            ${{matrix.cmake_args}} \
            ..
        make install DESTDIR="${PWD}"/ROOT
        find ROOT | sort | xargs ls -ld

    - name: Check for identical CMake files from both build systems
      run: |
        set -x
        cd expat/expat-*.*.*/

        if [[ "${{ runner.os }}" == macOS ]]; then
          # Autotools' LT_LIB_M has a hardcoded exclude for "*-*-darwin*" hosts,
          # while macOS does have libm and is successfully found by CMake.
          # We patch the CMake side in line here to get the differ below to empty.
          export PATH="$(brew --prefix)/opt/gnu-sed/libexec/gnubin:${PATH}"
          sed 's,-lm,,' -i build_cmake/ROOT/usr/local/lib*/pkgconfig/expat.pc
        fi

        diff \
            --recursive \
            --unified \
            --exclude=xmlwf \
            --exclude=xmlwf.exe \
            --exclude=libexpat.a \
            --exclude=libexpat-*.dll \
            --exclude=libexpat.dll.a \
            --exclude=libexpat.la \
            --exclude=libexpat.so\* \
            --exclude=libexpat.\*dylib \
            --exclude=expat_config.h \
            build_{autotools,cmake}/ROOT

    - name: (Linux except MinGW) Check for identical exported symbols from both build systems
      if: "${{ runner.os == 'Linux' && ! contains(matrix.configure_args, 'mingw') }}"
      run: |
        list_shared_library_symbols_sh="${GITHUB_WORKSPACE}"/.github/workflows/scripts/list-shared-library-symbols.sh
        exported_symbols_txt="${GITHUB_WORKSPACE}"/.github/workflows/data/exported-symbols.txt

        set -x
        cd expat/expat-*.*.*/
        diff -u "${exported_symbols_txt}" <("${list_shared_library_symbols_sh}" build_autotools/ROOT/usr/local/lib*/libexpat.so)
        diff -u "${exported_symbols_txt}" <("${list_shared_library_symbols_sh}" build_cmake/ROOT/usr/local/lib*/libexpat.so)