summaryrefslogtreecommitdiffstats
path: root/project/cmake/scripts/common/handle-depends.cmake
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2015-03-03 16:53:59 +0100
committermanuel <manuel@mausz.at>2015-03-03 16:53:59 +0100
commitffca21f2743a7b367fa212799c6e2fea6190dd5d (patch)
tree0608ea3a29cf644ec9ab204e2b4bb9bfaae1c381 /project/cmake/scripts/common/handle-depends.cmake
downloadkodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.tar.gz
kodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.tar.bz2
kodi-pvr-build-ffca21f2743a7b367fa212799c6e2fea6190dd5d.zip
initial commit for kodi master
Diffstat (limited to 'project/cmake/scripts/common/handle-depends.cmake')
-rw-r--r--project/cmake/scripts/common/handle-depends.cmake191
1 files changed, 191 insertions, 0 deletions
diff --git a/project/cmake/scripts/common/handle-depends.cmake b/project/cmake/scripts/common/handle-depends.cmake
new file mode 100644
index 0000000..b3bf3cd
--- /dev/null
+++ b/project/cmake/scripts/common/handle-depends.cmake
@@ -0,0 +1,191 @@
1include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake)
2
3# handle addon depends
4function(add_addon_depends addon searchpath)
5 # input: string addon string searchpath
6
7 set(OUTPUT_DIR ${DEPENDS_PATH})
8 file(GLOB_RECURSE cmake_input_files ${searchpath}/${CORE_SYSTEM_NAME}/*.txt)
9 file(GLOB_RECURSE cmake_input_files2 ${searchpath}/common/*.txt)
10 list(APPEND cmake_input_files ${cmake_input_files2})
11
12 foreach(file ${cmake_input_files})
13 if(NOT (file MATCHES CMakeLists.txt OR
14 file MATCHES install.txt OR
15 file MATCHES noinstall.txt OR
16 file MATCHES flags.txt OR
17 file MATCHES deps.txt OR
18 file MATCHES platforms.txt))
19 message(STATUS "Processing ${file}")
20 file(STRINGS ${file} def)
21 separate_arguments(def)
22 list(LENGTH def deflength)
23 get_filename_component(dir ${file} PATH)
24
25 # get the id of the dependency
26 if(NOT "${def}" STREQUAL "")
27 # read the id from the file
28 list(GET def 0 id)
29 else()
30 # read the id from the filename
31 get_filename_component(id ${file} NAME_WE)
32 endif()
33
34 # check if the dependency has a platforms.txt
35 set(platform_found FALSE)
36 check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found)
37
38 if(${platform_found} AND NOT TARGET ${id})
39 # determine the download URL of the dependency
40 set(url "")
41 if(deflength GREATER 1)
42 list(GET def 1 url)
43 message(STATUS "${id} url: ${url}")
44 endif()
45
46 # check if there are any library specific flags that need to be passed on
47 if(EXISTS ${dir}/flags.txt)
48 file(STRINGS ${dir}/flags.txt extraflags)
49 separate_arguments(extraflags)
50 message(STATUS "${id} extraflags: ${extraflags}")
51 endif()
52
53 set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
54 -DOUTPUT_DIR=${OUTPUT_DIR}
55 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
56 -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE}
57 -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX}
58 -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR}
59 -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME}
60 -DENABLE_STATIC=1
61 -DBUILD_SHARED_LIBS=0)
62 # if there are no make rules override files available take care of manually passing on ARCH_DEFINES
63 if(NOT CMAKE_USER_MAKE_RULES_OVERRIDE AND NOT CMAKE_USER_MAKE_RULES_OVERRIDE_CXX)
64 # make sure we create strings, not lists
65 set(TMP_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_DEFINES}")
66 set(TMP_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_DEFINES}")
67 list(APPEND BUILD_ARGS -DCMAKE_C_FLAGS=${TMP_C_FLAGS}
68 -DCMAKE_CXX_FLAGS=${TMP_CXX_FLAGS})
69 endif()
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 set(PATCH_FILE ${BUILD_DIR}/${id}/tmp/patch.cmake)
79 if(EXISTS ${dir}/CMakeLists.txt)
80 file(APPEND ${PATCH_FILE}
81 "file(COPY ${dir}/CMakeLists.txt
82 DESTINATION ${BUILD_DIR}/${id}/src/${id})\n")
83 endif()
84
85 # check if we have patches to apply
86 file(GLOB patches ${dir}/*.patch)
87 list(SORT patches)
88 foreach(patch ${patches})
89 file(APPEND ${PATCH_FILE}
90 "execute_process(COMMAND patch -p1 -i ${patch})\n")
91 endforeach()
92
93
94 # if there's an install.txt use it to properly install the built files
95 set(INSTALL_COMMAND "")
96 if(EXISTS ${dir}/install.txt)
97 set(INSTALL_COMMAND INSTALL_COMMAND ${CMAKE_COMMAND}
98 -DINPUTDIR=${BUILD_DIR}/${id}/src/${id}-build/
99 -DINPUTFILE=${dir}/install.txt
100 -DDESTDIR=${OUTPUT_DIR}
101 -DENABLE_STATIC=1
102 "${extraflags}"
103 -P ${PROJECT_SOURCE_DIR}/install.cmake)
104 elseif(EXISTS ${dir}/noinstall.txt)
105 set(INSTALL_COMMAND INSTALL_COMMAND "")
106 endif()
107
108 # check if there's a deps.txt containing dependencies on other libraries
109 if(EXISTS ${dir}/deps.txt)
110 file(STRINGS ${dir}/deps.txt deps)
111 message(STATUS "${id} depends: ${deps}")
112 else()
113 set(deps)
114 endif()
115
116 if(CROSS_AUTOCONF AND AUTOCONF_FILES)
117 foreach(afile ${AUTOCONF_FILES})
118 file(APPEND ${PATCH_FILE}
119 "message(STATUS \"AUTOCONF: copying ${afile} to ${BUILD_DIR}/${id}/src/${id}\")\n
120 file(COPY ${afile} DESTINATION ${BUILD_DIR}/${id}/src/${id})\n")
121 endforeach()
122 endif()
123
124 # if the patch file exists we need to set the PATCH_COMMAND
125 set(PATCH_COMMAND "")
126 if (EXISTS ${PATCH_FILE})
127 set(PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_FILE})
128 endif()
129
130 # prepare the setup of the call to externalproject_add()
131 set(EXTERNALPROJECT_SETUP PREFIX ${BUILD_DIR}/${id}
132 CMAKE_ARGS ${extraflags} ${BUILD_ARGS}
133 PATCH_COMMAND ${PATCH_COMMAND}
134 "${INSTALL_COMMAND}")
135
136 # if there's an url defined we need to pass that to externalproject_add()
137 if(DEFINED url AND NOT "${url}" STREQUAL "")
138 # check if there's a third parameter in the file
139 if(deflength GREATER 2)
140 # the third parameter is considered as a revision of a git repository
141 list(GET def 2 revision)
142
143 externalproject_add(${id}
144 GIT_REPOSITORY ${url}
145 GIT_TAG ${revision}
146 "${EXTERNALPROJECT_SETUP}")
147 else()
148 set(CONFIGURE_COMMAND "")
149 if(NOT WIN32)
150 # manually specify the configure command to be able to pass in the custom PKG_CONFIG_PATH
151 set(CONFIGURE_COMMAND PKG_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig
152 ${CMAKE_COMMAND} -DCMAKE_LIBRARY_PATH=${OUTPUT_DIR}/lib ${extraflags} ${BUILD_ARGS}
153 ${BUILD_DIR}/${id}/src/${id}
154 -DPACKAGE_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig
155 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
156 -DOUTPUT_DIR=${OUTPUT_DIR}
157 -DCMAKE_PREFIX_PATH=${OUTPUT_DIR}
158 -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR}
159 -DCMAKE_EXE_LINKER_FLAGS=-L${OUTPUT_DIR}/lib
160 -DCMAKE_INCLUDE_PATH=${OUTPUT_DIR}/include)
161 endif()
162
163 externalproject_add(${id}
164 URL ${url}
165 DOWNLOAD_DIR ${BUILD_DIR}/download
166 CONFIGURE_COMMAND ${CONFIGURE_COMMAND}
167 "${EXTERNALPROJECT_SETUP}")
168 endif()
169 else()
170 externalproject_add(${id}
171 SOURCE_DIR ${dir}
172 "${EXTERNALPROJECT_SETUP}")
173 endif()
174
175 if(deps)
176 add_dependencies(${id} ${deps})
177 endif()
178 endif()
179
180 # if the dependency is available for the target platform add it to the list of the addon's dependencies
181 # (even if the target already exists as it still has to be built before the addon)
182 if(${platform_found})
183 list(APPEND ${addon}_DEPS ${id})
184 endif()
185 endif()
186 endforeach()
187
188 # make the ${addon}_DEPS variable available to the calling script
189 set(${addon}_DEPS "${${addon}_DEPS}" PARENT_SCOPE)
190endfunction()
191