diff --git a/.gitattributes b/.gitattributes index de66d2ba7..5c53af99c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ .gitignore export-ignore .gitattributes export-ignore - +* text eol=lf diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..8c36abd90 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,49 @@ +name: $(BuildID) + +trigger: + branches: + include: + - 'master' + +variables: + MESON_FIXED_NINJA: 1 + CI: 1 + +jobs: +#- job: vs2015 +# pool: +# vmImage: vs2015-win2012r2 +# +# strategy: +# maxParallel: 10 +# matrix: +# vc2015x86ninja: +# arch: x86 +# compiler: msvc2015 +# backend: ninja +# vc2015x86vs: +# arch: x86 +# compiler: msvc2015 +# backend: vs2015 +# +# steps: +# - template: ci/azure-steps.yml + +- job: vs2017 + pool: + vmImage: VS2017-Win2016 + + strategy: + maxParallel: 10 + matrix: + vc2017x64ninja: + arch: x64 + compiler: msvc2017 + backend: ninja + vc2017x64vs: + arch: x64 + compiler: msvc2017 + backend: vs2017 + + steps: + - template: ci/azure-steps.yml diff --git a/ci/azure-steps.yml b/ci/azure-steps.yml new file mode 100644 index 000000000..4cb6ac8ba --- /dev/null +++ b/ci/azure-steps.yml @@ -0,0 +1,94 @@ +steps: +- powershell: | + # test_find_program exercises some behaviour which relies on .py being in PATHEXT + $env:PATHEXT += ';.py' + + where.exe python + + python ./skip_ci.py --base-branch-env=SYSTEM_PULLREQUEST_TARGETBRANCH --is-pull-env=SYSTEM_PULLREQUEST_PULLREQUESTID --base-branch-origin + if ($LastExitCode -ne 0) { + throw ('error in skip_ci.py') + } + + # remove MinGW from path, so we don't find gfortran and try to use it + $env:Path = ($env:Path.Split(';') | Where-Object { $_ -notlike '*mingw*' }) -join ';' + + # download and install prerequisites + function DownloadFile([String] $Source, [String] $Destination) { + $retries = 10 + for ($i = 1; $i -le $retries; $i++) { + try { + (New-Object net.webclient).DownloadFile($Source, $Destination) + break # succeeded + } catch [net.WebException] { + if ($i -eq $retries) { + throw # fail on last retry + } + $backoff = (10 * $i) # backoff 10s, 20s, 30s... + echo ('{0}: {1}' -f $Source, $_.Exception.Message) + echo ('Retrying in {0}s...' -f $backoff) + Start-Sleep -m ($backoff * 1000) + } + } + } + + DownloadFile -Source 'https://github.com/mesonbuild/cidata/raw/master/ninja.exe' -Destination $(System.WorkFolder)\ninja.exe + DownloadFile -Source 'http://nirbheek.in/files/binaries/pkg-config/win32/pkg-config.exe' -Destination $(System.WorkFolder)\pkg-config.exe + DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/msmpisdk.msi' -Destination msmpisdk.msi + DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/MSMpiSetup.exe' -Destination MSMpiSetup.exe + Start-Process msiexec.exe -ArgumentList '/i msmpisdk.msi /quiet' -Wait + Start-Process .\MSMpiSetup.exe -ArgumentList '-unattend -full' -Wait + + # import ms-mpi env vars (set by installer) + foreach ($p in "MSMPI_INC", "MSMPI_LIB32", "MSMPI_LIB64") { + $v = [Environment]::GetEnvironmentVariable($p, "Machine") + Set-Content "env:$p" "$v" + } + + # add downloads to PATH + $env:Path = "$env:SYSTEM_WORKFOLDER;$env:Path" + + # import visual studio variables + Set-PSRepository -Name PSGallery -InstallationPolicy Trusted + Install-Module Pscx -Scope CurrentUser -AllowClobber + Install-Module VSSetup -Scope CurrentUser + $vsver = $env:compiler.Replace('msvc', '') + Import-VisualStudioVars -VisualStudioVersion $vsver -Architecture $(arch) + + # add .NET framework tools to path for resgen for C# tests + # (always use 32-bit tool, as there doesn't seem to be a 64-bit tool) + if ((Get-Command "resgen.exe" -ErrorAction SilentlyContinue) -eq $null) { + $env:Path = "$env:WindowsSDK_ExecutablePath_x86;$env:Path" + } + + if ($env:backend -eq 'ninja') { + ninja --version + } else { + MSBuild /version + } + + python run_tests.py --backend $(backend) + + echo "##vso[task.setvariable variable=test_status]$LastExitCode" + + continueOnError: true + +- task: PublishTestResults@2 + inputs: + testResultsFiles: meson-test-run.xml + testRunTitle: $(System.JobName) + publishRunAttachments: true + +- task: CopyFiles@2 + inputs: + contents: 'meson-test-run.*' + targetFolder: $(Build.ArtifactStagingDirectory) + +- task: PublishBuildArtifacts@1 + inputs: + artifactName: $(System.JobName) + +- powershell: | + # after publishing test results, even if some failed + # exit with the test status + exit $(test_status) diff --git a/run_cross_test.py b/run_cross_test.py index 6e04fa28b..b2ef6bedb 100755 --- a/run_cross_test.py +++ b/run_cross_test.py @@ -40,7 +40,7 @@ def runtests(cross_file, failfast): print('\nTotal passed cross tests:', passing_tests) print('Total failed cross tests:', failing_tests) print('Total skipped cross tests:', skipped_tests) - if failing_tests > 0 and ('TRAVIS' in os.environ or 'APPVEYOR' in os.environ): + if failing_tests > 0 and ('CI' in os.environ): print('\nMesonlogs of failing tests\n') for log in failing_logs: print(log, '\n') diff --git a/run_project_tests.py b/run_project_tests.py index 647418549..2445dd429 100755 --- a/run_project_tests.py +++ b/run_project_tests.py @@ -82,7 +82,7 @@ class AutoDeletedDir: failing_logs = [] print_debug = 'MESON_PRINT_TEST_OUTPUT' in os.environ -under_ci = not {'TRAVIS', 'APPVEYOR'}.isdisjoint(os.environ) +under_ci = 'CI' in os.environ do_debug = under_ci or print_debug no_meson_log_msg = 'No meson-log.txt found.' diff --git a/run_tests.py b/run_tests.py index 1e03fa75c..3445e30ca 100755 --- a/run_tests.py +++ b/run_tests.py @@ -261,7 +261,7 @@ def main(): cross = options.cross backend, _ = guess_backend(options.backend, shutil.which('msbuild')) # Running on a developer machine? Be nice! - if not mesonlib.is_windows() and not mesonlib.is_haiku() and 'TRAVIS' not in os.environ: + if not mesonlib.is_windows() and not mesonlib.is_haiku() and 'CI' not in os.environ: os.nice(20) # Appveyor sets the `platform` environment variable which completely messes # up building with the vs2010 and vs2015 backends. diff --git a/run_unittests.py b/run_unittests.py index 58b273db4..dfa9bc934 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -83,7 +83,7 @@ def is_tarball(): return False def is_ci(): - if 'TRAVIS' in os.environ or 'APPVEYOR' in os.environ: + if 'CI' in os.environ: return True return False @@ -100,8 +100,8 @@ def _git_init(project_dir): def skipIfNoPkgconfig(f): ''' - Skip this test if no pkg-config is found, unless we're on Travis or - Appveyor CI. This allows users to run our test suite without having + Skip this test if no pkg-config is found, unless we're on CI. + This allows users to run our test suite without having pkg-config installed on, f.ex., macOS, while ensuring that our CI does not silently skip the test because of misconfiguration. @@ -1673,7 +1673,7 @@ class AllPlatformTests(BasePlatformTests): self.assertIsInstance(linker, lib) self.assertEqual(cc.id, 'msvc') self.assertTrue(hasattr(cc, 'is_64')) - # If we're in the appveyor CI, we know what the compiler will be + # If we're on Windows CI, we know what the compiler will be if 'arch' in os.environ: if os.environ['arch'] == 'x64': self.assertTrue(cc.is_64) diff --git a/skip_ci.py b/skip_ci.py index 752dfdc01..5e0a7aa72 100755 --- a/skip_ci.py +++ b/skip_ci.py @@ -54,9 +54,13 @@ def main(): help='Branch push is targeted to') parser.add_argument('--is-pull-env', required=True, help='Variable set if it is a PR') + parser.add_argument('--base-branch-origin', action='store_true', + help='Base branch reference is only in origin remote') args = parser.parse_args() check_pr(args.is_pull_env) base = get_base_branch(args.base_branch_env) + if args.base_branch_origin: + base = 'origin/' + base if all(is_documentation(f) for f in get_git_files(base)): print("Don't run CI for documentation-only changes, add '[skip ci]' to commit title.") print('See http://mesonbuild.com/Contributing.html#skipping-integration-tests') diff --git a/test cases/csharp/1 basic/installed_files.txt b/test cases/csharp/1 basic/installed_files.txt index f64c68c66..5022d2870 100644 --- a/test cases/csharp/1 basic/installed_files.txt +++ b/test cases/csharp/1 basic/installed_files.txt @@ -1 +1,2 @@ usr/bin/prog.exe +?msvc:usr/bin/prog.pdb diff --git a/test cases/csharp/2 library/installed_files.txt b/test cases/csharp/2 library/installed_files.txt index 4ebea55d1..73e77a211 100644 --- a/test cases/csharp/2 library/installed_files.txt +++ b/test cases/csharp/2 library/installed_files.txt @@ -1,2 +1,5 @@ usr/bin/prog.exe -usr/lib/helper.dll +?msvc:usr/bin/prog.pdb +?msvc:usr/bin/helper.dll +?msvc:usr/bin/helper.pdb +?gcc:usr/lib/helper.dll diff --git a/test cases/frameworks/17 mpi/meson.build b/test cases/frameworks/17 mpi/meson.build index 1085d40c8..ae3f08afc 100644 --- a/test cases/frameworks/17 mpi/meson.build +++ b/test cases/frameworks/17 mpi/meson.build @@ -17,7 +17,7 @@ exec = executable('exec', test('MPI C', exec) if build_machine.system() != 'windows' - # C++ MPI not supported by MS-MPI used on AppVeyor. + # C++ MPI not supported by MS-MPI mpicpp = dependency('mpi', language : 'cpp') execpp = executable('execpp', 'main.cpp', @@ -44,4 +44,6 @@ if uburesult.returncode() != 0 and add_languages('fortran', required : false) endif # Check we can apply a version constraint -dependency('mpi', version: '>=@0@'.format(mpic.version())) +if mpic.version() != 'unknown' + dependency('mpi', version: '>=@0@'.format(mpic.version())) +endif