summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake/Swift/RunCMakeTest.cmake
blob: 39f754cc62fa460064206f61d6519ce59e0fbdb9 (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
include(RunCMake)

# Early bailouts.
if(RunCMake_GENERATOR STREQUAL "Xcode" AND XCODE_VERSION VERSION_LESS 6.1)
  run_cmake(XcodeTooOld)
  return()
elseif(NOT CMake_TEST_Swift)
  return()
elseif(NOT RunCMake_GENERATOR MATCHES "^Ninja|^Xcode$")
  run_cmake(NotSupported)
  return()
endif()

if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release")
endif()

block()
  run_cmake(CMP0157-NEW)
  run_cmake(CMP0157-WARN)

  if(RunCMake_GENERATOR MATCHES "Ninja.*")
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0157-OLD-build)
  endif()

  run_cmake(CMP0157-OLD)

  if(RunCMake_GENERATOR MATCHES "Ninja.*")
    set(RunCMake_TEST_NO_CLEAN 1)
    # -n: dry-run to avoid actually compiling, -v: verbose to capture executed command
    run_cmake_command(CMP0157-OLD-build ${CMAKE_COMMAND} --build . -- -n -v)
  endif()
endblock()

if(RunCMake_GENERATOR MATCHES "Ninja")
  run_cmake(SwiftSimple)

  block()
    if (CMAKE_SYSTEM_NAME MATCHES "Windows")
      run_cmake_with_options(Win32ExecutableDisallowed)
    else()
      run_cmake_with_options(Win32ExecutableIgnored)
      list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_SYSTEM_NAME=Darwin)
      run_cmake(SwiftMultiArch)
    endif()
  endblock()

  # Test that a second build with no changes does nothing.
  block()
    run_cmake(NoWorkToDo)
    set(RunCMake_TEST_NO_CLEAN 1)
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/NoWorkToDo-build)
    set(RunCMake_TEST_OUTPUT_MERGE 1)
    run_cmake_command(NoWorkToDo-build ${CMAKE_COMMAND} --build .)
    run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain)
    file(WRITE ${RunCMake_TEST_BINARY_DIR}/hello.swift "//No-op change\n")
    run_cmake_command(NoWorkToDo-norelink ${CMAKE_COMMAND} --build . -- -d explain)
    run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain)
  endblock()

  # Test that intermediate static libraries are rebuilt when the public
  # interface of their dependency changes
  block()
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/IncrementalSwift-build)
    # Since files are modified during test, the files are created in the cmake
    # file into the build directory
    run_cmake(IncrementalSwift)
    set(RunCMake_TEST_NO_CLEAN 1)
    run_cmake_command(IncrementalSwift-first ${CMAKE_COMMAND} --build .)

    # Modify public interface of libA requiring rebuild of libB
    file(WRITE ${RunCMake_TEST_BINARY_DIR}/a.swift
      "public func callA() -> Float { return 32.0 }\n")

    # Note: We still expect this to fail, but instead of failure at link time,
    # it should fail while re-compiling libB because the function changed
    run_cmake_command(IncrementalSwift-second ${CMAKE_COMMAND} --build . -- -d explain)
  endblock()

  block()
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CompileCommands-build)
    run_cmake(CompileCommands)
    set(RunCMake_TEST_NO_CLEAN 1)
    run_cmake_command(CompileCommands-check ${CMAKE_COMMAND} --build .)
  endblock()

  block()
    # Try enabling Swift with a static-library try-compile
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/StaticLibTryCompile-build)
    list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY)
    run_cmake(EnableSwift)
  endblock()

  block()
    # Try enabling Swift with an executable try-compile
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ExecutableTryCompile-build)
    list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_TRY_COMPILE_TARGET_TYPE=EXECUTABLE)
    run_cmake(EnableSwift)
  endblock()

  block()
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ForceResponseFile-build)
    run_cmake(ForceResponseFile)
    set(RunCMake_TEST_NO_CLEAN 1)
    # -v: verbose to capture executed commands -n: dry-run to avoid actually compiling
    run_cmake_command(ForceResponseFile-check ${CMAKE_COMMAND} --build . -- -vn)
  endblock()

  block()
    if(CMAKE_SYSTEM_NAME MATCHES Windows)
      set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ImportLibraryFlags-build)
      run_cmake(ImportLibraryFlags)
      set(RunCMake_TEST_NO_CLEAN 1)
      run_cmake_command(ImportLibraryFlags-check ${CMAKE_COMMAND} --build . -- -n -v)
    endif()
  endblock()

  block()
    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SwiftLibraryModuleCommand-build)
    run_cmake(SwiftLibraryModuleCommand)
    set(RunCMake_TEST_NO_CLEAN 1)
    run_cmake_command(SwiftLibraryModuleCommand-check ${CMAKE_COMMAND} --build . -- -n -v)
  endblock()
endif()