aboutsummaryrefslogtreecommitdiff
path: root/.appveyor.yml
blob: 134a0c49fff12832beffc722198ccd3ced4f1804 (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
version: 1.0.{build}

clone_depth: 50

# Appveyor images are named after the Visual Studio version they contain.
# But we compile using MinGW, not Visual Studio.
# We use these images because they have different Windows versions.
image:
  # Windows Server 2019
  - Visual Studio 2019

environment:
  compiler: mingw

  matrix:
  - target: i686-w64-mingw32
    compiler_path: mingw32
    mingw_prefix: mingw-w64-i686
    hardening: --enable-all-bugs-are-fatal
  - target: x86_64-w64-mingw32
    compiler_path: mingw64
    mingw_prefix: mingw-w64-x86_64
    # hardening doesn't work with mingw-w64-x86_64-gcc, because it's gcc 8
    hardening: --disable-gcc-hardening

matrix:
  # Don't keep building failing jobs
  fast_finish: true
  # Skip the 32-bit Windows Server 2019 job, and the 64-bit Windows Server
  # 2012 R2 job, to speed up the build.
  # The environment variables must be listed without the 'environment' tag.
  exclude:
    - image: Visual Studio 2019
      target: i686-w64-mingw32
      compiler_path: mingw32
      mingw_prefix: mingw-w64-i686
      hardening: --enable-all-bugs-are-fatal

install:
- ps: >-
    Function Execute-Command ($commandPath)
    {
        & $commandPath $args 2>&1
        if ( $LastExitCode -ne 0 ) {
            $host.SetShouldExit( $LastExitCode )
        }
    }
    Function Execute-Bash ()
    {
        Execute-Command 'c:\msys64\usr\bin\bash' '-e' '-c' $args
    }
    <# mingw packages start with ${env:mingw_prefix}
     # unprefixed packages are from MSYS2, which is like Cygwin. Avoid them.
     #
     # Use pacman --debug to show package downloads and install locations
     #
     # All installed library dlls must be copied to the test and app
     # directories, before running tor's tests. (See below.)
     #>
    Execute-Command "C:\msys64\usr\bin\pacman" -Syu --verbose --noconfirm pacman ;
- ps: >-
    Execute-Command "C:\msys64\usr\bin\pacman" -Sy --verbose --needed --noconfirm ${env:mingw_prefix}-libevent ${env:mingw_prefix}-openssl ${env:mingw_prefix}-pkg-config ${env:mingw_prefix}-xz ${env:mingw_prefix}-zstd ;

build_script:
- ps: >-
    if ($env:compiler -eq "mingw") {
            <# use the MSYS2 compiler and user binaries to build and install #>
            $oldpath = ${env:Path} -split ';'
            $buildpath = @("C:\msys64\${env:compiler_path}\bin", "C:\msys64\usr\bin") + $oldpath
            $env:Path = @($buildpath) -join ';'
            $env:build = @("${env:APPVEYOR_BUILD_FOLDER}", $env:target) -join '\'
            Set-Location "${env:APPVEYOR_BUILD_FOLDER}"
            Execute-Bash 'autoreconf -i'
            mkdir "${env:build}"
            Set-Location "${env:build}"
            Execute-Bash "which ${env:target}-gcc"
            Execute-Bash "${env:target}-gcc --version"
            <# compile for mingw
             # mingw zstd doesn't come with a pkg-config file, so we manually
             # configure its flags. liblzma just works.
             #>
            Execute-Bash "ZSTD_CFLAGS='-L/${env:compiler_path}/include' ZSTD_LIBS='-L/${env:compiler_path}/lib -lzstd' ../configure --prefix=/${env:compiler_path} --build=${env:target} --host=${env:target} --with-openssl-dir=/${env:compiler_path} --disable-asciidoc --enable-fatal-warnings ${env:hardening} CFLAGS='-D__USE_MINGW_ANSI_STDIO=0'"
            Execute-Bash "V=1 make -k -j2"
            Execute-Bash "V=1 make -k -j2 install"
     }

test_script:
- ps: >-
    if ($env:compiler -eq "mingw") {
            <# use the MSYS2 compiler binaries to make check #>
            $oldpath = ${env:Path} -split ';'
            $buildpath = @("C:\msys64\${env:compiler_path}\bin") + $oldpath
            $env:Path = $buildpath -join ';'
            Set-Location "${env:build}"
            <# Some compiler dlls must be copied to the test and app
             # directories, before running tor's tests.
             #>
            Copy-Item "C:/msys64/${env:compiler_path}/bin/libssp-0.dll","C:/msys64/${env:compiler_path}/bin/zlib1.dll" -Destination "${env:build}/src/test"
            Copy-Item "C:/msys64/${env:compiler_path}/bin/libssp-0.dll","C:/msys64/${env:compiler_path}/bin/zlib1.dll" -Destination "${env:build}/src/app"
            <# All installed library dlls must be copied to the test and app
             # directories, before running tor's tests.
             # (See install command above.)
             #>
            Copy-Item "C:/${env:compiler_path}/bin/libcrypto*.dll","C:/${env:compiler_path}/bin/libssl*.dll","C:/${env:compiler_path}/bin/liblzma*.dll","C:/${env:compiler_path}/bin/libevent*.dll","C:/${env:compiler_path}/bin/libzstd*.dll" -Destination "${env:build}/src/test"
            Copy-Item "C:/${env:compiler_path}/bin/libcrypto*.dll","C:/${env:compiler_path}/bin/libssl*.dll","C:/${env:compiler_path}/bin/liblzma*.dll","C:/${env:compiler_path}/bin/libevent*.dll","C:/${env:compiler_path}/bin/libzstd*.dll" -Destination "${env:build}/src/app"
            Execute-Bash "VERBOSE=1 TOR_SKIP_TESTCASES=crypto/openssl_version make -k -j2 check"
    }

on_finish:
- ps: >-
    <# if we failed before install:, these functions won't be defined #>
    Function Execute-Command ($commandPath)
    {
        & $commandPath $args 2>&1
        if ( $LastExitCode -ne 0 ) {
            $host.SetShouldExit( $LastExitCode )
        }
    }
    Function Execute-Bash ()
    {
        Execute-Command 'c:\msys64\usr\bin\bash' '-e' '-c' $args
    }
    if ($env:compiler -eq "mingw") {
            <# use the MSYS2 user binaries to archive failures #>
            $oldpath = ${env:Path} -split ';'
            $buildpath = @("C:\msys64\usr\bin") + $oldpath
            $env:Path = @($buildpath) -join ';'
            Set-Location "${env:build}"
            <# store logs as appveyor artifacts: see the artifacts tab #>
            Execute-Bash "7z a logs.zip config.log || true"
            Execute-Bash "7z a logs.zip test-suite.log || true"
            Execute-Bash "appveyor PushArtifact logs.zip || true"
            Execute-Bash "tail -1000 config.log || true"
            Execute-Bash "cat test-suite.log || true"
    }

# notify the IRC channel of any failures
on_failure:
- cmd: C:\Python27\python.exe %APPVEYOR_BUILD_FOLDER%\scripts\test\appveyor-irc-notify.py irc.oftc.net:6697 tor-ci failure