File: ExternalCMakeProject.cmake

package info (click to toggle)
lammps 20250204%2Bdfsg.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 474,368 kB
  • sloc: cpp: 1,060,070; python: 27,785; ansic: 8,956; f90: 7,254; sh: 6,044; perl: 4,171; fortran: 2,442; xml: 1,714; makefile: 1,352; objc: 238; lisp: 188; yacc: 58; csh: 16; awk: 14; tcl: 6; javascript: 2
file content (47 lines) | stat: -rw-r--r-- 2,447 bytes parent folder | download
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
# Build a CMake based external library as subdirectory.
# The sources will be unpacked to ${CMAKE_BINARY_DIR}/_deps/${target}-src
# The binaries will be built in ${CMAKE_BINARY_DIR}/_deps/${target}-build
#
function(ExternalCMakeProject target url hash basedir cmakedir cmakefile)
  # change settings locally
  set(BUILD_SHARED_LIBS OFF)
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)

  get_filename_component(archive ${url} NAME)
  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src)
  if(EXISTS ${CMAKE_BINARY_DIR}/_deps/${archive})
    file(MD5 ${CMAKE_BINARY_DIR}/_deps/${archive} DL_MD5)
  endif()
  if(NOT "${DL_MD5}" STREQUAL "${hash}")
    message(STATUS "Downloading ${url}")
    file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} STATUS DL_STATUS SHOW_PROGRESS)
    file(MD5 ${CMAKE_BINARY_DIR}/_deps/${archive} DL_MD5)
    if((NOT DL_STATUS EQUAL 0) OR (NOT "${DL_MD5}" STREQUAL "${hash}"))
      set(${target}_URL ${url})
      GetFallbackURL(${target}_URL fallback)
      message(WARNING "Download from primary URL ${url} failed\nTrying fallback URL ${fallback}")
      file(DOWNLOAD ${fallback} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS)
    endif()
  else()
    message(STATUS "Using already downloaded archive ${CMAKE_BINARY_DIR}/_deps/${archive}")
  endif()
  message(STATUS "Unpacking and configuring ${archive}")
  execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src)
  file(GLOB TARGET_SOURCE "${CMAKE_BINARY_DIR}/_deps/src/${basedir}*")
  list(LENGTH TARGET_SOURCE _num)
  if(_num GREATER 1)
    message(FATAL_ERROR "Inconsistent ${target} library sources. "
      "Please delete ${CMAKE_BINARY_DIR}/_deps/src and re-run cmake")
  endif()
  file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src)
  file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src)
  if(NOT (cmakefile STREQUAL ""))
    file(COPY ${cmakefile} DESTINATION ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/)
    get_filename_component(_cmakefile ${cmakefile} NAME)
    file(RENAME "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/${_cmakefile}"
      "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt")
  endif()
  add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}"
    "${CMAKE_BINARY_DIR}/_deps/${target}-build" EXCLUDE_FROM_ALL)
endfunction(ExternalCMakeProject)