summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake/RunCPack.cmake
blob: b21eb269ebeae4f0307c178e4e1dffa4b4e0cf7e (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
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

include(RunCMake)

#[[
set(RunPack_GENERATORS ...)
run_cpack(<case>
  # general options
  [CONFIG <config>]     # Build/package given configuration (default "Release").
  [GENERATORS <gen>...] # Tell cpack to use the given generator(s).
  [SAMPLE <sample>]     # Use RunCPack/<sample> project (default <case>).

  # build step
  [BUILD]               # Build the test project before packaging.

  # package,cpack-<gen> steps
  [PACKAGE]             # Run cpack via buildsystem "package" target.
  [NO_CPACK]            # Do not run cpack directly.

  # verify step
  [NO_VERIFY]           # Do not run verify step.
  [GLOB <glob>...]      # Match expected package files with globbing patterns.
  [VERIFY <command>...] # Run custom verification command on each package file.
  )
#]]
function(run_cpack case)
  cmake_parse_arguments(PARSE_ARGV 1 run_cpack
    # Zero-value
    "BUILD;PACKAGE;NO_CPACK;NO_VERIFY"
    # One-value
    "CONFIG;SAMPLE"
    # Multi-value
    "GENERATORS;GLOB;VERIFY"
    )

  if(DEFINED RunCPack_UNPARSED_ARGUMENTS)
    message(FATAL_ERROR "Unknown arguments:\n  ${RunCPack_UNPARSED_ARGUMENTS}")
  endif()
  if(DEFINED RunCPack_KEYWORDS_MISSING_VALUES)
    message(FATAL_ERROR "Keywords missing values:\n  ${RunCPack_KEYWORDS_MISSING_VALUES}")
  endif()

  if(run_cpack_GENERATORS)
    set(RunCPack_GENERATORS "${run_cpack_GENERATORS}")
  elseif(NOT RunCPack_GENERATORS)
    message(FATAL_ERROR "RunCPack_GENERATORS not defined by caller!")
  endif()

  if(run_cpack_CONFIG)
    set(RunCPack_CONFIG "${run_cpack_CONFIG}")
  elseif(NOT RunCPack_CONFIG)
    set(RunCPack_CONFIG "Release")
  endif()

  if(run_cpack_SAMPLE)
    set(RunCPack_SAMPLE "${run_cpack_SAMPLE}")
  else()
    set(RunCPack_SAMPLE "${case}")
  endif()

  if(run_cpack_GLOB)
    set(RunCPack_GLOB "${run_cpack_GLOB}")
  endif()

  if(run_cpack_VERIFY)
    set(RunCPack_VERIFY ${run_cpack_VERIFY})
  endif()

  # Configure the sample project.
  set(RunCMake_TEST_SOURCE_DIR ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RunCPack/${RunCPack_SAMPLE})
  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build)
  string(APPEND RunCMake_TEST_RAW_ARGS " \"-DCPACK_GENERATOR=${RunCPack_GENERATORS}\"")
  if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
    list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=${RunCPack_CONFIG})
  endif()
  run_cmake(${case}-cmake)
  unset(RunCMake_TEST_RAW_ARGS)
  set(RunCMake_TEST_NO_CLEAN 1)

  # Optionally build the project.
  if(run_cpack_BUILD)
    set(RunCMake_TEST_OUTPUT_MERGE 1)
    run_cmake_command(${case}-build
      "${CMAKE_COMMAND}" --build . --config "${RunCPack_CONFIG}")
    unset(RunCMake_TEST_OUTPUT_MERGE)
  endif()

  # Optionally package through the build system.
  if(run_cpack_PACKAGE)
    set(RunCMake_TEST_OUTPUT_MERGE 1)
    run_cmake_command(${case}-package
      "${CMAKE_COMMAND}" --build . --config "${RunCPack_CONFIG}" --target package)
    unset(RunCMake_TEST_OUTPUT_MERGE)
  endif()

  # Run cpack with each generator.
  if(NOT run_cpack_NO_CPACK)
    foreach(RunCPack_GENERATOR IN LISTS RunCPack_GENERATORS)
      run_cmake_command(${case}-cpack-${RunCPack_GENERATOR}
        "${CMAKE_CPACK_COMMAND}" -C "${RunCPack_CONFIG}" -G "${RunCPack_GENERATOR}")
    endforeach()
  endif()

  # Verify the resulting package files.
  if(NOT run_cpack_NO_VERIFY)
    set(RunCMake_TEST_RAW_ARGS " \"-Dglob=${RunCPack_GLOB}\" \"-Dverify=${RunCPack_VERIFY}\" -P \"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RunCPack/verify.cmake\"")
    run_cmake_command(${case}-verify
      "${CMAKE_COMMAND}" -Ddir=${RunCMake_TEST_BINARY_DIR})
    unset(RunCMake_TEST_RAW_ARGS)
  endif()
endfunction()