File: prebuilt.cmake

package info (click to toggle)
freespace2 24.0.2%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: trixie
  • size: 43,188 kB
  • sloc: cpp: 583,107; ansic: 21,729; python: 1,174; sh: 464; makefile: 248; xml: 181
file content (95 lines) | stat: -rw-r--r-- 3,384 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
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

set(PREBUILT_VERSION_NAME "f81df85")

set(FSO_PREBUILT_OVERRIDE "" CACHE PATH "Path to the prebuilt binaries, if empty the binaries will be downloaded.")
set(PREBUILT_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}/prebuilt")
set(CURRENT_ROOT "${CMAKE_CURRENT_BINARY_DIR}")

function(get_prebuilt_path OUT_VAR)
    if (IS_DIRECTORY "${PREBUILT_LIB_DIR}")
        if (NOT "${FSO_PREBUILT_OVERRIDE}" STREQUAL "")
            set(${OUT_VAR} "${FSO_PREBUILT_OVERRIDE}" PARENT_SCOPE)
            return()
        endif()

        if ("${DOWNLOADED_PREBUILT_VERSION}" STREQUAL "${PREBUILT_VERSION_NAME}")
            # Libraries already downloaded and up-to-date
            set(${OUT_VAR} "${PREBUILT_LIB_DIR}" PARENT_SCOPE)
            return()
        endif()
    endif()
    
    set(PREBUILT_PATH)
    set(TAG_NAME "bin-${PREBUILT_VERSION_NAME}")
    if(PLATFORM_WINDOWS)
        if (IS_64BIT)
            set(FILENAME "bin-win64.zip")
        else()
            set(FILENAME "bin-win32.zip")
        endif()
    elseif(PLATFORM_MAC)
        set(FILENAME "bin-mac.tar.gz")
    else()
        # Use Linux binaries...
        if (IS_ARM64)
            set(FILENAME "bin-linux_arm64.tar.gz")
        else()
            set(FILENAME "bin-linux.tar.gz")
        endif()
    endif()
    set(DOWNLOAD_URL "https://github.com/scp-fs2open/scp-prebuilt/releases/download/${TAG_NAME}/${FILENAME}")
    set(DOWNLOAD_FILE "${CURRENT_ROOT}/${FILENAME}")

    set(MAX_RETRIES 5)
    foreach(i RANGE 1 ${MAX_RETRIES})
        if (NOT (i EQUAL 1))
            message(STATUS "Retry after 5 seconds (attempt #${i}) ...")
            execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep "5")
        endif()

        message(STATUS "Downloading prebuilt libraries from \"${DOWNLOAD_URL}\" (try ${i}/${MAX_RETRIES})")
        file(DOWNLOAD "${DOWNLOAD_URL}" "${DOWNLOAD_FILE}" SHOW_PROGRESS TLS_VERIFY ON STATUS DOWNLOAD_STATUS_LIST)

        list(GET DOWNLOAD_STATUS_LIST 0 DOWNLOAD_STATUS)
        list(GET DOWNLOAD_STATUS_LIST 1 DOWNLOAD_ERROR)
        if (DOWNLOAD_STATUS EQUAL 0)
            break()
        endif()
        message(STATUS "Download of prebuilt binaries failed: ${DOWNLOAD_ERROR}!")
    endforeach()

    if (NOT (DOWNLOAD_STATUS EQUAL 0))
        message(FATAL_ERROR "${MAX_RETRIES} download attempts failed!")
        return()
    endif()

    if (IS_DIRECTORY "${PREBUILT_LIB_DIR}")
        # Remove previous files
        file(REMOVE_RECURSE "${PREBUILT_LIB_DIR}")
        file(MAKE_DIRECTORY "${PREBUILT_LIB_DIR}")
    else()
        # Make sure the directory exists
        file(MAKE_DIRECTORY "${PREBUILT_LIB_DIR}")
    endif()
    
    
    # Extract the downloaded file
    message(STATUS "Extracting library package...")
    execute_process(
        COMMAND ${CMAKE_COMMAND} -E tar xzf "${DOWNLOAD_FILE}"
        WORKING_DIRECTORY "${PREBUILT_LIB_DIR}"
        RESULT_VARIABLE EXTRACT_RESULT
        ERROR_VARIABLE ERROR_TEXT
    )
    
    if (NOT (EXTRACT_RESULT EQUAL 0))
        message(FATAL_ERROR "Extracting prebuilt libraries failed! Error message: ${ERROR_TEXT}")
        return()
    endif()
    
    file(REMOVE "${DOWNLOAD_FILE}")
    
    # We are done now. Set the cache variables and return the result
    set(DOWNLOADED_PREBUILT_VERSION "${PREBUILT_VERSION_NAME}" CACHE INTERNAL "")
    set(${OUT_VAR} "${PREBUILT_LIB_DIR}" PARENT_SCOPE)
endfunction(get_prebuilt_path)