summaryrefslogtreecommitdiff
path: root/.appveyor.yml
blob: 091767a1c4e062d6c425294e7e56b1952d2bb3ef (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
157
158
159
# As config was originally based on an example by Olivier Grisel. Thanks!
# https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor.yml
clone_depth: 50

# No reason for us to restrict the number concurrent jobs
max_jobs: 100

cache:
  - '%LOCALAPPDATA%\pip\Cache'

matrix:
  allow_failures:
    - USE_PYTEST: true

environment:
  global:
      MINGW_32: C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin
      MINGW_64: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin
      OPENBLAS_32: https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com/openblas-5f998ef_gcc7_1_0_win32.zip
      OPENBLAS_64: https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com/openblas-5f998ef_gcc7_1_0_win64.zip
      APPVEYOR_SAVE_CACHE_ON_ERROR: true
      APPVEYOR_SKIP_FINALIZE_ON_EXIT: true
      TEST_TIMEOUT: 1000
      NPY_NUM_BUILD_JOBS: 4

  matrix:
    - PYTHON: C:\Python34-x64
      PYTHON_VERSION: 3.4
      PYTHON_ARCH: 64
      USE_PYTEST: true

    - PYTHON: C:\Python36
      PYTHON_VERSION: 3.6
      PYTHON_ARCH: 32
      TEST_MODE: fast

    - PYTHON: C:\Python27-x64
      PYTHON_VERSION: 2.7
      PYTHON_ARCH: 64
      TEST_MODE: fast

    - PYTHON: C:\Python36-x64
      PYTHON_VERSION: 3.6
      PYTHON_ARCH: 64
      TEST_MODE: full

init:
  - "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%"
  - "ECHO \"%APPVEYOR_SCHEDULED_BUILD%\""
  # If there is a newer build queued for the same PR, cancel this one.
  # The AppVeyor 'rollout builds' option is supposed to serve the same
  # purpose but it is problematic because it tends to cancel builds pushed
  # directly to master instead of just PR builds (or the converse).
  # credits: JuliaLang developers.
  - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod `
        https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | `
        Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
          raise "There are newer queued builds for this pull request, skipping build."
        }

install:
  # Prepend newly installed Python to the PATH of this build (this cannot be
  # done from inside the powershell script as it would require to restart
  # the parent CMD process).
  - SET PATH=%PYTHON%;%PYTHON%\Scripts;%PATH%
  - if [%PYTHON_ARCH%]==[32] SET PATH=%MINGW_32%;%PATH% & SET OPENBLAS=%OPENBLAS_32%
  - if [%PYTHON_ARCH%]==[64] SET PATH=%MINGW_64%;%PATH% & SET OPENBLAS=%OPENBLAS_64%

  # Check that we have the expected version and architecture for Python
  - python --version
  - >-
     %CMD_IN_ENV%
     python -c "import sys,platform,struct;
     print(sys.platform, platform.machine(), struct.calcsize('P') * 8, )"

  # Install "openblas.a" to PYTHON\lib
  # Library provided by Matthew Brett at https://github.com/matthew-brett/build-openblas
  - ps: |
      $clnt = new-object System.Net.WebClient
      $file = "$(New-TemporaryFile).zip"
      $tmpdir = New-TemporaryFile | %{ rm $_; mkdir $_ }
      $destination = "$env:PYTHON\lib\openblas.a"

      echo $file
      echo $tmpdir
      echo $env:OPENBLAS

      $clnt.DownloadFile($env:OPENBLAS, $file)
      Get-FileHash $file | Format-List

      Expand-Archive $file $tmpdir      

      rm $tmpdir\$env:PYTHON_ARCH\lib\*.dll.a
      $lib = ls $tmpdir\$env:PYTHON_ARCH\lib\*.a | ForEach { ls $_ } | Select-Object -first 1
      echo $lib

      cp $lib $destination
      ls $destination

  # Upgrade to the latest pip.
  - 'python -m pip install -U pip setuptools wheel'

  # Install the numpy test dependencies.
  - 'pip install -U --timeout 5 --retries 2 -r tools/ci/appveyor/requirements.txt'

build_script:
  # Here, we add MinGW to the path to be able to link an OpenBLAS.dll
  # We then use the import library from the DLL to compile with MSVC
  - ps: |
      If ($env:USE_PYTEST -eq "true") {
          pip install -e .
      } Else {
          pip wheel -v -v -v --wheel-dir=dist .

          # For each wheel that pip has placed in the "dist" directory
          # First, upload the wheel to the "artifacts" tab and then
          # install the wheel. If we have only built numpy (as is the case here),
          # then there will be one wheel to install.
          
          # This method is more representative of what will be distributed,
          # because it actually tests what the built wheels will be rather than
          # what 'setup.py install' will do and at it uploads the wheels so that
          # they can be inspected.

          ls dist -r | Foreach-Object {
              appveyor PushArtifact $_.FullName
              pip install $_.FullName
          }
      }

test_script:
  - if [%USE_PYTEST%]==[true] pytest -n3 --junitxml=junit-results.xml
  - if [%USE_PYTEST%]==[] python runtests.py -v -n -m %TEST_MODE%

after_build:
  # Remove old or huge cache files to hopefully not exceed the 1GB cache limit.
  #
  # If the cache limit is reached, the cache will not be updated (of not even
  # created in the first run). So this is a trade of between keeping the cache
  # current and having a cache at all.
  # NB: This is done only `on_success` since the cache in uploaded only on
  # success anyway.
  - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -mtime +360 -delete
  - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -size +10M -delete
  - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -empty -delete
  # Show size of cache
  - C:\cygwin\bin\du -hs "%LOCALAPPDATA%\pip\Cache"

on_finish:
  # We can get a nice display of test results in the "test" tab with py.test
  # For now, this does nothing.
  - ps: |
      If (Test-Path .\junit-results.xml) {
        (new-object net.webclient).UploadFile(
          "https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)",
          (Resolve-Path .\junit-results.xml)
        )
      }
      $LastExitCode = 0