Merge pull request #5014 from Montellese/binary_addons
[vuplus_xbmc] / project / cmake / addons / depends / CMakeLists.txt
1 project(xbmc-addons-depends)
2
3 cmake_minimum_required(VERSION 2.8)
4
5 list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
6
7 if(NOT CMAKE_BUILD_TYPE)
8   set(CMAKE_BUILD_TYPE Release)
9 endif()
10
11 if(NOT CORE_SYSTEM_NAME)
12   string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME)
13 endif()
14
15 include(ExternalProject)
16
17 if(NOT CMAKE_INSTALL_PREFIX)
18   set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/../output/depends)
19 else()
20   file(TO_CMAKE_PATH "${CMAKE_INSTALL_PREFIX}" CMAKE_INSTALL_PREFIX)
21 endif()
22 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
23 list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
24
25 ## handle dependencies with a cmake based buildsystem which need to be downloaded, built and installed
26 file(GLOB_RECURSE cmake_input_files ${CORE_SYSTEM_NAME}/cmake/*.txt)
27 file(GLOB_RECURSE cmake_input_files2 common/*.txt)
28 list(APPEND cmake_input_files ${cmake_input_files2})
29 foreach(file ${cmake_input_files})
30   if(NOT (file MATCHES CMakeLists.txt OR
31           file MATCHES install.txt OR
32           file MATCHES noinstall.txt OR
33           file MATCHES flags.txt OR
34           file MATCHES deps.txt))
35     message(STATUS "Processing ${file}")
36     file(STRINGS ${file} def)
37     string(REPLACE " " ";" def ${def})
38     list(LENGTH def deflength)
39     get_filename_component(dir ${file} PATH)
40
41     # get the id and url of the dependency
42     set(url "")
43     if(NOT "${def}" STREQUAL "")
44       # read the id and the url from the file
45       list(GET def 0 id)
46       if(deflength GREATER 1)
47         list(GET def 1 url)
48         message(STATUS "${id} url: ${url}")
49       endif()
50     else()
51       # read the id from the filename
52       get_filename_component(id ${file} NAME_WE)
53     endif()
54
55     # check if there are any library specific flags that need to be passed on
56     if(EXISTS ${dir}/flags.txt})
57       file(STRINGS ${dir}/flags.txt extraflags)
58       message(STATUS "${id} extraflags: ${extraflags}")
59     endif()
60
61     set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}
62                    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
63                    -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE}
64                    -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX}
65                    -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
66                    -DARCH_DEFINES=${ARCH_DEFINES}
67                    -DENABLE_STATIC=1
68                    -DBUILD_SHARED_LIBS=0
69                    "${extraflags}")
70
71     if(CMAKE_TOOLCHAIN_FILE)
72       list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
73       MESSAGE("toolchain specified")
74       MESSAGE(${BUILD_ARGS})
75     endif()
76
77     # if there's a CMakeLists.txt use it to prepare the build
78     if(EXISTS ${dir}/CMakeLists.txt)
79       set(PATCH_COMMAND ${CMAKE_COMMAND} -E copy
80                         ${dir}/CMakeLists.txt
81                         ${CMAKE_BINARY_DIR}/build/${id}/src/${id})
82     else()
83       set(PATCH_COMMAND "")
84     endif()
85
86     # if there's an install.txt use it to properly install the built files
87     if(EXISTS ${dir}/install.txt)
88       set(INSTALL_COMMAND INSTALL_COMMAND ${CMAKE_COMMAND}
89                                           -DINPUTDIR=${CMAKE_BINARY_DIR}/build/${id}/src/${id}-build/
90                                           -DINPUTFILE=${dir}/install.txt
91                                           -DDESTDIR=${CMAKE_INSTALL_PREFIX}
92                                           -DENABLE_STATIC=1
93                                           "${extraflags}"
94                                           -P ${PROJECT_SOURCE_DIR}/install.cmake)
95     elseif(EXISTS ${dir}/noinstall.txt)
96       set(INSTALL_COMMAND INSTALL_COMMAND "")
97     else()
98       set(INSTALL_COMMAND "")
99     endif()
100
101     # check if there's a deps.txt containing dependencies on other libraries
102     if(EXISTS ${dir}/deps.txt})
103       file(STRINGS ${dir}/deps.txt deps)
104       message(STATUS "${id} dependencies: ${deps}")
105       set(DEPENDS_COMMAND DEPENDS ${deps})
106     else()
107       set(DEPENDS_COMMAND "")
108     endif()
109
110     # prepare the setup of the call to externalproject_add()
111     set(EXTERNALPROJECT_SETUP PREFIX build/${id}
112                               CMAKE_ARGS ${BUILD_ARGS}
113                               PATCH_COMMAND ${PATCH_COMMAND}
114                               "${INSTALL_COMMAND}"
115                               "${DEPENDS_COMMAND}")
116
117     # if there's an url defined we need to pass that to externalproject_add()
118     if(DEFINED url AND NOT "${url}" STREQUAL "")
119       # check if there's a third parameter in the file
120       if(deflength GREATER 2)
121         # the third parameter is considered as a revision of a git repository
122         list(GET def 2 revision)
123
124         externalproject_add(${id}
125                             GIT_REPOSITORY ${url}
126                             GIT_TAG ${revision}
127                             "${EXTERNALPROJECT_SETUP}"
128                            )
129       else()
130         externalproject_add(${id}
131                             URL ${url}
132                             "${EXTERNALPROJECT_SETUP}"
133                            )
134       endif()
135     else()
136       externalproject_add(${id}
137                           SOURCE_DIR ${dir}
138                           "${EXTERNALPROJECT_SETUP}"
139                          )
140     endif()
141   endif()
142 endforeach()
143
144 ## if there's a platform-specific sub-directory containing a CMakeLists.txt, add it to the build as well
145 if(EXISTS ${PROJECT_SOURCE_DIR}/${CORE_SYSTEM_NAME}/CMakeLists.txt)
146   message(STATUS "Processing ${CORE_SYSTEM_NAME}")
147   add_subdirectory(${CORE_SYSTEM_NAME})
148 else()
149   message(FATAL_ERROR "CORE_SYSTEM_NAME: ${PROJECT_SOURCE_DIR}/${CORE_SYSTEM_NAME}/CMakeLists.txt")
150 endif()