OpenCVPackaging.cmake 15 KB
Newer Older
wester committed
1 2 3
# Use patched version of CPACK to build accurate set of Debian packages
# https://github.com/asmorkalov/CMake/tree/deb_generator_improvement

wester committed
4 5 6 7 8 9 10 11 12 13 14 15 16
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
set(CPACK_set_DESTDIR "on")

if(NOT OPENCV_CUSTOM_PACKAGE_INFO)
  set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Computer Vision Library")
  set(CPACK_PACKAGE_DESCRIPTION
"OpenCV (Open Source Computer Vision Library) is an open source computer vision
and machine learning software library. OpenCV was built to provide a common
infrastructure for computer vision applications and to accelerate the use of
machine perception in the commercial products. Being a BSD-licensed product,
OpenCV makes it easy for businesses to utilize and modify the code.")
  set(CPACK_PACKAGE_VENDOR "OpenCV Foundation")
  set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
wester committed
17
  set(CPACK_PACKAGE_CONTACT "OpenCV Developers <admin@opencv.org>")
wester committed
18 19 20 21
  set(CPACK_PACKAGE_VERSION_MAJOR "${OPENCV_VERSION_MAJOR}")
  set(CPACK_PACKAGE_VERSION_MINOR "${OPENCV_VERSION_MINOR}")
  set(CPACK_PACKAGE_VERSION_PATCH "${OPENCV_VERSION_PATCH}")
  set(CPACK_PACKAGE_VERSION "${OPENCV_VCSVERSION}")
wester committed
22 23 24 25
  if (NOT "${OPENCV_VCSVERSION}" MATCHES "^${OPENCV_VERSION}.*")
    message(WARNING "CPACK_PACKAGE_VERSION does not match version provided by version.hpp header!")
  endif()
  set(OPENCV_DEBIAN_COPYRIGHT_FILE "")
wester committed
26 27
endif(NOT OPENCV_CUSTOM_PACKAGE_INFO)

wester committed
28 29
set(CPACK_STRIP_FILES 1)

wester committed
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
#arch
if(X86)
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386")
  set(CPACK_RPM_PACKAGE_ARCHITECTURE "i686")
elseif(X86_64)
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
  set(CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64")
elseif(ARM)
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "armhf")
  set(CPACK_RPM_PACKAGE_ARCHITECTURE "armhf")
elseif(AARCH64)
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
  set(CPACK_RPM_PACKAGE_ARCHITECTURE "aarch64")
else()
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
  set(CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
endif()

if(CPACK_GENERATOR STREQUAL "DEB")
  set(OPENCV_PACKAGE_ARCH_SUFFIX ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})
elseif(CPACK_GENERATOR STREQUAL "RPM")
  set(OPENCV_PACKAGE_ARCH_SUFFIX ${CPACK_RPM_PACKAGE_ARCHITECTURE})
else()
  set(OPENCV_PACKAGE_ARCH_SUFFIX ${CMAKE_SYSTEM_PROCESSOR})
endif()

set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${OPENCV_VCSVERSION}-${OPENCV_PACKAGE_ARCH_SUFFIX}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${OPENCV_VCSVERSION}-${OPENCV_PACKAGE_ARCH_SUFFIX}")

#rpm options
set(CPACK_RPM_COMPONENT_INSTALL TRUE)
set(CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
set(CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION})
set(CPACK_RPM_PACKAGE_URL "http://opencv.org")
set(CPACK_RPM_PACKAGE_LICENSE "BSD")

#deb options
set(CPACK_DEB_COMPONENT_INSTALL TRUE)
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://opencv.org")

#display names
set(CPACK_COMPONENT_DEV_DISPLAY_NAME     "Development files")
set(CPACK_COMPONENT_DOCS_DISPLAY_NAME    "Documentation")
set(CPACK_COMPONENT_JAVA_DISPLAY_NAME    "Java bindings")
set(CPACK_COMPONENT_LIBS_DISPLAY_NAME    "Libraries and data")
set(CPACK_COMPONENT_PYTHON_DISPLAY_NAME  "Python bindings")
set(CPACK_COMPONENT_SAMPLES_DISPLAY_NAME "Samples")
set(CPACK_COMPONENT_TESTS_DISPLAY_NAME   "Tests")

#depencencies
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS TRUE)
set(CPACK_COMPONENT_LIBS_REQUIRED TRUE)
wester committed
84
set(CPACK_COMPONENT_SAMPLES_DEPENDS libs dev)
wester committed
85 86 87 88
set(CPACK_COMPONENT_DEV_DEPENDS libs)
set(CPACK_COMPONENT_DOCS_DEPENDS libs)
set(CPACK_COMPONENT_JAVA_DEPENDS libs)
set(CPACK_COMPONENT_PYTHON_DEPENDS libs)
wester committed
89
set(CPACK_DEB_PYTHON_PACKAGE_DEPENDS "python-numpy (>=${PYTHON_NUMPY_VERSION}), python${PYTHON_VERSION_MAJOR_MINOR}")
wester committed
90
set(CPACK_COMPONENT_TESTS_DEPENDS libs)
wester committed
91 92 93
if (HAVE_opencv_python)
  set(CPACK_DEB_TESTS_PACKAGE_DEPENDS "python-numpy (>=${PYTHON_NUMPY_VERSION}), python${PYTHON_VERSION_MAJOR_MINOR}")
endif()
wester committed
94 95 96

if(HAVE_CUDA)
  string(REPLACE "." "-" cuda_version_suffix ${CUDA_VERSION})
wester committed
97 98 99
  if(CUDA_VERSION VERSION_LESS "6.5")
    set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "cuda-core-libs-${cuda_version_suffix}, cuda-extra-libs-${cuda_version_suffix}")
    set(CPACK_DEB_DEV_PACKAGE_DEPENDS "cuda-headers-${cuda_version_suffix}")
wester committed
100
  else()
wester committed
101 102
    set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "cuda-cudart-${cuda_version_suffix} | libcudart${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnppc${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnppi${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnpps${CUDA_VERSION}")
    set(CPACK_DEB_DEV_PACKAGE_DEPENDS "cuda-cudart-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION}), cuda-npp-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})")
wester committed
103
    if(HAVE_CUFFT)
wester committed
104 105
      set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cufft-${cuda_version_suffix} | libcufft${CUDA_VERSION}")
      set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cufft-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})")
wester committed
106 107
    endif()
    if(HAVE_HAVE_CUBLAS)
wester committed
108 109
      set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cublas-${cuda_version_suffix} |  libcublas${CUDA_VERSION}")
      set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cublas-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})")
wester committed
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
    endif()
  endif()
endif()

if(HAVE_TBB AND NOT BUILD_TBB)
  if(CPACK_DEB_DEV_PACKAGE_DEPENDS)
    set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, libtbb-dev")
  else()
    set(CPACK_DEB_DEV_PACKAGE_DEPENDS "libtbb-dev")
  endif()
endif()

set(STD_OPENCV_LIBS opencv-data)
set(STD_OPENCV_DEV libopencv-dev)

wester committed
125 126 127 128 129 130 131 132 133
set(ABI_VERSION_SUFFIX "")
if(CMAKE_COMPILER_IS_GNUCXX)
  if(${CMAKE_OPENCV_GCC_VERSION_MAJOR} EQUAL 5)
     set(ABI_VERSION_SUFFIX "v5")
  endif()
endif()

foreach(module calib3d contrib core features2d flann gpu highgui imgproc legacy
               ml objdetect ocl photo stitching superres ts video videostab)
wester committed
134
  if(HAVE_opencv_${module})
wester committed
135
    list(APPEND STD_OPENCV_LIBS "libopencv-${module}2.4${ABI_VERSION_SUFFIX}")
wester committed
136 137 138 139
    list(APPEND STD_OPENCV_DEV "libopencv-${module}-dev")
  endif()
endforeach()

wester committed
140 141
list(APPEND STD_OPENCV_DEV "libhighgui-dev" "libcv-dev" "libcvaux-dev")

wester committed
142 143 144 145 146 147 148 149 150 151 152 153
string(REPLACE ";" ", " CPACK_COMPONENT_LIBS_CONFLICTS "${STD_OPENCV_LIBS}")
string(REPLACE ";" ", " CPACK_COMPONENT_LIBS_PROVIDES "${STD_OPENCV_LIBS}")
string(REPLACE ";" ", " CPACK_COMPONENT_LIBS_REPLACES "${STD_OPENCV_LIBS}")

string(REPLACE ";" ", " CPACK_COMPONENT_DEV_CONFLICTS "${STD_OPENCV_DEV}")
string(REPLACE ";" ", " CPACK_COMPONENT_DEV_PROVIDES "${STD_OPENCV_DEV}")
string(REPLACE ";" ", " CPACK_COMPONENT_DEV_REPLACES "${STD_OPENCV_DEV}")

set(CPACK_COMPONENT_PYTHON_CONFLICTS python-opencv)
set(CPACK_COMPONENT_PYTHON_PROVIDES python-opencv)
set(CPACK_COMPONENT_PYTHON_REPLACES python-opencv)

wester committed
154 155 156
set(CPACK_COMPONENT_JAVA_CONFLICTS "libopencv2.4-java, libopencv2.4-jni")
set(CPACK_COMPONENT_JAVA_PROVIDES "libopencv2.4-java, libopencv2.4-jni")
set(CPACK_COMPONENT_JAVA_REPLACES "libopencv2.4-java, libopencv2.4-jni")
wester committed
157 158 159 160 161 162

set(CPACK_COMPONENT_DOCS_CONFLICTS opencv-doc)
set(CPACK_COMPONENT_SAMPLES_CONFLICTS opencv-doc)

if(NOT OPENCV_CUSTOM_PACKAGE_INFO)
  set(CPACK_COMPONENT_LIBS_DESCRIPTION "Open Computer Vision Library")
wester committed
163 164
  set(CPACK_DEBIAN_COMPONENT_LIBS_NAME "libopencv")
  set(CPACK_DEBIAN_COMPONENT_LIBS_SECTION "libs")
wester committed
165 166

  set(CPACK_COMPONENT_PYTHON_DESCRIPTION "Python bindings for Open Source Computer Vision Library")
wester committed
167 168
  set(CPACK_DEBIAN_COMPONENT_PYTHON_NAME "libopencv-python")
  set(CPACK_DEBIAN_COMPONENT_PYTHON_SECTION "python")
wester committed
169 170

  set(CPACK_COMPONENT_JAVA_DESCRIPTION "Java bindings for Open Source Computer Vision Library")
wester committed
171 172
  set(CPACK_DEBIAN_COMPONENT_JAVA_NAME "libopencv-java")
  set(CPACK_DEBIAN_COMPONENT_JAVA_SECTION "java")
wester committed
173 174

  set(CPACK_COMPONENT_DEV_DESCRIPTION "Development files for Open Source Computer Vision Library")
wester committed
175 176
  set(CPACK_DEBIAN_COMPONENT_DEV_NAME "libopencv-dev")
  set(CPACK_DEBIAN_COMPONENT_DEV_SECTION "libdevel")
wester committed
177 178

  set(CPACK_COMPONENT_DOCS_DESCRIPTION "Documentation for Open Source Computer Vision Library")
wester committed
179 180
  set(CPACK_DEBIAN_COMPONENT_DOCS_NAME "libopencv-docs")
  set(CPACK_DEBIAN_COMPONENT_DOCS_SECTION "doc")
wester committed
181 182

  set(CPACK_COMPONENT_SAMPLES_DESCRIPTION "Samples for Open Source Computer Vision Library")
wester committed
183 184
  set(CPACK_DEBIAN_COMPONENT_SAMPLES_NAME "libopencv-samples")
  set(CPACK_DEBIAN_COMPONENT_SAMPLES_SECTION "devel")
wester committed
185 186

  set(CPACK_COMPONENT_TESTS_DESCRIPTION "Accuracy and performance tests for Open Source Computer Vision Library")
wester committed
187 188
  set(CPACK_DEBIAN_COMPONENT_TESTS_NAME "libopencv-tests")
  set(CPACK_DEBIAN_COMPONENT_TESTS_SECTION "misc")
wester committed
189 190
endif(NOT OPENCV_CUSTOM_PACKAGE_INFO)

wester committed
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
set(CPACK_DEBIAN_COMPONENT_DOCS_ARCHITECTURE "all")

# lintian stuff

#
# ocv_generate_lintian_overrides_file: generates lintian overrides file for
#   the specified component (deb-package). It's assumed that <comp>_LINTIAN_OVERRIDES
#   variable with suppressed tags is defined.
#
# Usage: ocv_generate_lintian_overrides_file(<component name>)
#

function(ocv_generate_lintian_overrides_file comp)
    string(TOUPPER ${comp} comp_upcase)

    set(package_name ${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME})
    set(suppressions ${${comp_upcase}_LINTIAN_OVERRIDES})

    if(suppressions)
        if(NOT package_name)
            message(FATAL_ERROR "Package name for the ${comp} component is not defined")
        endif()

        # generate content of lintian overrides file

        foreach(suppression ${suppressions})
            set(line "${package_name}: ${suppression}")
            if(content)
                set(content "${content}\n${line}")
            else()
                set(content "${line}")
            endif()
        endforeach()

        # create file and install it
        set(cpack_tmp_dir "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}")
        set(overrides_filename "${cpack_tmp_dir}/${package_name}")

        file(WRITE "${overrides_filename}" "${content}")

        # install generated file
        install(FILES "${overrides_filename}"
            DESTINATION share/lintian/overrides/
            COMPONENT ${comp})

        unset(content)
    endif()
endfunction()

function(ocv_get_lintian_version version)
    find_program(LINTIAN_EXECUTABLE lintian)

    if(NOT LINTIAN_EXECUTABLE)
        return()
    endif()

    execute_process(COMMAND ${LINTIAN_EXECUTABLE} --version
              WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
              RESULT_VARIABLE LINTIAN_EXITCODE
              OUTPUT_VARIABLE LINTIAN_VERSION
              ERROR_QUIET)

    if(NOT LINTIAN_EXITCODE EQUAL 0)
        return()
    endif()

    if(LINTIAN_VERSION MATCHES "([0-9]+\\.[0-9]+\\.[0-9]+)")
        set(LINTIAN_VERSION "${CMAKE_MATCH_1}" CACHE INTERNAL "Lintian version")
    endif()

    set("${version}" "${LINTIAN_VERSION}" PARENT_SCOPE)
endfunction()

ocv_get_lintian_version(LINTIAN_VERSION)

set(LIBS_LINTIAN_OVERRIDES "binary-or-shlib-defines-rpath" # usr/lib/libopencv_core.so.2.4.12
                           "package-name-doesnt-match-sonames") # libopencv-calib3d2.4 libopencv-contrib2.4

if(AARCH64 AND CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
   # GCC 4.8 has a bug which sometimes causes it to produce non-PIC aarch64 code.
   list(APPEND LIBS_LINTIAN_OVERRIDES "shlib-with-non-pic-code")
endif()

if(HAVE_opencv_python)
    set(PYTHON_LINTIAN_OVERRIDES "binary-or-shlib-defines-rpath" # usr/lib/python2.7/dist-packages/cv2.so
                                 "missing-dependency-on-numpy-abi")
else()
    set(PYTHON_LINTIAN_OVERRIDES "empty-binary-package") # python module is off
endif()

if(NOT HAVE_opencv_java)
    set(JAVA_LINTIAN_OVERRIDES "empty-binary-package") # Java is off
else()
    # TODO: add smht here
endif()

set(DEV_LINTIAN_OVERRIDES "binary-or-shlib-defines-rpath" # usr/bin/opencv_traincascade
                          "binary-without-manpage") # usr/bin/opencv_traincascade

if(LINTIAN_VERSION VERSION_GREATER "2.5.30" OR
    LINTIAN_VERSION VERSION_EQUAL "2.5.30")
    list(APPEND DEV_LINTIAN_OVERRIDES "pkg-config-bad-directive") # usr/lib/pkgconfig/opencv.pc -L/usr/local/cuda-7.0/lib64
endif()

if(NOT INSTALL_C_EXAMPLES)
    set(SAMPLES_LINTIAN_OVERRIDES "empty-binary-package") # samples are not installed
endif()

if(INSTALL_TESTS)
    set(TESTS_LINTIAN_OVERRIDES "arch-dependent-file-in-usr-share" # usr/share/OpenCV/bin/opencv_test_ml
                                "binary-or-shlib-defines-rpath" # usr/share/OpenCV/bin/opencv_test_ml
                                "python-script-but-no-python-dep") # usr/share/OpenCV/bin/calchist.py
else()
    set(TESTS_LINTIAN_OVERRIDES "empty-binary-package") # there is no tests
endif()

set(ALL_COMPONENTS "libs" "dev" "docs" "python" "java" "samples" "tests")

foreach (comp ${ALL_COMPONENTS})
    string(TOUPPER ${comp} comp_upcase)
    list(APPEND ${comp_upcase}_LINTIAN_OVERRIDES "misplaced-extra-member-in-deb") # for signed packages
endforeach()

if(CPACK_GENERATOR STREQUAL "DEB")
  find_program(GZIP_TOOL NAMES "gzip" PATHS "/bin" "/usr/bin" "/usr/local/bin")
  if(NOT GZIP_TOOL)
    message(FATAL_ERROR "Unable to find 'gzip' program")
  endif()

  execute_process(COMMAND "date" "-R"
                  OUTPUT_VARIABLE CHANGELOG_PACKAGE_DATE
                  OUTPUT_STRIP_TRAILING_WHITESPACE)

  set(CHANGELOG_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
  foreach (comp ${ALL_COMPONENTS})
    string(TOUPPER "${comp}" comp_upcase)

    set(DEBIAN_CHANGELOG_OUT_FILE    "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog.Debian")
    set(DEBIAN_CHANGELOG_OUT_FILE_GZ "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog.Debian.gz")
    set(CHANGELOG_PACKAGE_NAME "${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME}")
    configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/changelog.Debian.in" "${DEBIAN_CHANGELOG_OUT_FILE}" @ONLY)

    execute_process(COMMAND "${GZIP_TOOL}" "-ncf9" "${DEBIAN_CHANGELOG_OUT_FILE}"
                    OUTPUT_FILE "${DEBIAN_CHANGELOG_OUT_FILE_GZ}"
                    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")

    install(FILES "${DEBIAN_CHANGELOG_OUT_FILE_GZ}"
            DESTINATION "share/doc/${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME}"
            COMPONENT "${comp}")

    set(CHANGELOG_OUT_FILE "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog")
    set(CHANGELOG_OUT_FILE_GZ "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog.gz")
    file(WRITE ${CHANGELOG_OUT_FILE} "Upstream changelog stub. See https://github.com/opencv/opencv/wiki/ChangeLog")

    execute_process(COMMAND "${GZIP_TOOL}" "-ncf9" "${CHANGELOG_OUT_FILE}"
                    OUTPUT_FILE "${CHANGELOG_OUT_FILE_GZ}"
                    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")

    install(FILES "${CHANGELOG_OUT_FILE_GZ}"
            DESTINATION "share/doc/${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME}"
            COMPONENT "${comp}")

    if(OPENCV_DEBIAN_COPYRIGHT_FILE)
        install(FILES "${OPENCV_DEBIAN_COPYRIGHT_FILE}"
                DESTINATION "share/doc/${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME}"
                COMPONENT "${comp}")
    endif()

    ocv_generate_lintian_overrides_file("${comp}")

  endforeach()
endif()

wester committed
364 365
include(CPack)

wester committed
366
ENDif(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")