summaryrefslogtreecommitdiff
path: root/indra/cmake/Prebuilt.cmake
blob: 4034599fdec7d148f4e9ee8ddc6cd57dc141dbf8 (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
125
126
127
128
129
130
131
132
# -*- cmake -*-
include_guard()

include(FindAutobuild)
if(INSTALL_PROPRIETARY)
  include(FindSCP)
endif(INSTALL_PROPRIETARY)

set(PREBUILD_TRACKING_DIR ${AUTOBUILD_INSTALL_DIR}/cmake_tracking)
# For the library installation process;
# see cmake/Prebuild.cmake for the counterpart code.
if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${PREBUILD_TRACKING_DIR}/sentinel_installed")
  file(MAKE_DIRECTORY ${PREBUILD_TRACKING_DIR})
  file(WRITE ${PREBUILD_TRACKING_DIR}/sentinel_installed "0")
endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${PREBUILD_TRACKING_DIR}/sentinel_installed")

# The use_prebuilt_binary macro handles automated installation of package
# dependencies using autobuild.  The goal is that 'autobuild install' should
# only be run when we know we need to install a new package.  This should be
# the case in a clean checkout, or if autobuild.xml has been updated since the
# last run (encapsulated by the file ${PREBUILD_TRACKING_DIR}/sentinel_installed),
# or if a previous attempt to install the package has failed (the exit status
# of previous attempts is serialized in the file
# ${PREBUILD_TRACKING_DIR}/${_binary}_installed)
macro (use_prebuilt_binary _binary)
    if( NOT DEFINED ${_binary}_installed )
        set( ${_binary}_installed "")
    endif()

    if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed")
        file(READ ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${_binary}_installed")
        if(DEBUG_PREBUILT)
            message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"")
        endif(DEBUG_PREBUILT)
    endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed")

    if(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
        if(DEBUG_PREBUILT)
            message(STATUS "cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
        --install-dir=${AUTOBUILD_INSTALL_DIR}
        ${_binary} ")
        endif(DEBUG_PREBUILT)
        if(USESYSTEMLIBS)
            execute_process(COMMAND xmllint
                --xpath
                "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'common')]/text()" autobuild.xml
                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/..
                OUTPUT_VARIABLE package_url
                OUTPUT_STRIP_TRAILING_WHITESPACE
                )
            if ("${package_url}" STREQUAL "")
                string(TOLOWER ${CMAKE_SYSTEM_NAME} system_name)
                if (${system_name} MATCHES freebsd)
                    set(system_name "linux")
                endif (${system_name} MATCHES freebsd)
                execute_process(COMMAND xmllint
                    --xpath
                    "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'${system_name}')]/text()" autobuild.xml
                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/..
                    OUTPUT_VARIABLE package_url
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    )
            endif ("${package_url}" STREQUAL "")
            string(REGEX REPLACE "^https://(megapahit.net/downloads|github.com/secondlife|automated-builds-secondlife-com.s3.amazonaws.com/ct2).*/" "" package_name ${package_url})
            file(DOWNLOAD
                ${package_url}
                ${CMAKE_BINARY_DIR}/${package_name}
                )
            file(ARCHIVE_EXTRACT
                INPUT ${CMAKE_BINARY_DIR}/${package_name}
                DESTINATION ${AUTOBUILD_INSTALL_DIR}
                )
            set(${_binary}_installed 0)
        else(USESYSTEMLIBS)
        execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
                install
                --install-dir=${AUTOBUILD_INSTALL_DIR}
                ${_binary}
                WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
                RESULT_VARIABLE ${_binary}_installed
                )
        endif(USESYSTEMLIBS)
        file(WRITE ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${${_binary}_installed}")
    endif(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)

    if(NOT ${_binary}_installed EQUAL 0)
        message(FATAL_ERROR
                "Failed to download or unpack prebuilt '${_binary}'."
                " Process returned ${${_binary}_installed}.")
    endif (NOT ${_binary}_installed EQUAL 0)
endmacro (use_prebuilt_binary _binary)

#Sadly we need a macro here, otherwise the return() will not properly work
macro ( use_system_binary package )
  if( USE_CONAN )
    target_link_libraries( ll::${package} INTERFACE CONAN_PKG::${package} )
    foreach( extra_pkg "${ARGN}" )
      if( extra_pkg )
        target_link_libraries( ll::${package} INTERFACE CONAN_PKG::${extra_pkg} )
      endif()
    endforeach()
    return()
  elseif( NOT USE_AUTOBUILD_3P )
    include(FindPkgConfig)
    pkg_check_modules(${package} ${package})
    if( ${package}_FOUND )
      target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} )
    else()
      pkg_check_modules(${package} lib${package})
      if( ${package}_FOUND )
        target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} )
      else()
        find_package( ${package} REQUIRED )
      endif()
    endif()
    target_include_directories( ll::${package} SYSTEM INTERFACE ${${package}_INCLUDE_DIRS} )
    target_link_libraries( ll::${package} INTERFACE ${${package}_LIBRARIES} )
    return()
  endif()
endmacro()

find_package(Patch)

# Download the third party software archive and patch it.
macro(prepare_thirdparty url filename dirname patch hash)
  file(DOWNLOAD ${url} ${filename} EXPECTED_HASH SHA512=${hash})
  file(ARCHIVE_EXTRACT INPUT ${filename}
	  DESTINATION ${CMAKE_SOURCE_DIR}/../..)
  execute_process(COMMAND ${Patch_EXECUTABLE} "-p1" "-i"
	  ${CMAKE_SOURCE_DIR}/../patches/${patch}
	  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../../${dirname})
endmacro()