CMakeLists.txt 7.1 KB
Newer Older
A
Alexander Smorkalov 已提交
1
#Cross compile TBB from source
2 3
project(tbb)

4 5 6 7
# 4.1 update 2 - works fine
set(tbb_ver "tbb41_20130116oss")
set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz")
set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85")
8
set(tbb_version_file "version_string.ver")
9 10 11 12 13 14 15
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)

# 4.1 update 1 - works fine
#set(tbb_ver "tbb41_20121003oss")
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20121003oss_src.tgz")
#set(tbb_md5 "2a684fefb855d2d0318d1ef09afa75ff")
#set(tbb_version_file "version_string.ver")
16

17 18 19 20 21 22
# 4.1 - works fine
#set(tbb_ver "tbb41_20120718oss")
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20120718oss_src.tgz")
#set(tbb_md5 "31b9ec300f3d09da2504d5d882788dd4")
#set(tbb_version_file "version_string.ver")

A
Andrey Kamaev 已提交
23 24
# 4.0 update 5 - works fine
#set(tbb_ver "tbb40_20120613oss")
25
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120613oss_src.tgz")
A
Andrey Kamaev 已提交
26 27 28
#set(tbb_md5 "da01ed74944ec5950cfae3476901a172")
#set(tbb_version_file "version_string.ver")

29 30
# 4.0 update 4 - works fine
#set(tbb_ver "tbb40_20120408oss")
31
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120408oss_src.tgz")
32 33 34
#set(tbb_md5 "734b356da7fe0ed308741f3e6018251e")
#set(tbb_version_file "version_string.ver")

35 36
# 4.0 update 3 - build broken
#set(tbb_ver "tbb40_20120201oss")
37
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20120201oss_src.tgz")
38
#set(tbb_md5 "4669e7d4adee018de7a7b8b972987218")
39
#set(tbb_version_file "version_string.tmp")
40 41

# 4.0 update 2 - works fine
42
#set(tbb_ver "tbb40_20111130oss")
43
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111130oss_src.tgz")
44 45 46
#set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")
#set(tbb_version_file "version_string.tmp")
#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
47 48 49

# 4.0 update 1 - works fine
#set(tbb_ver "tbb40_20111003oss")
50
#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb40_20111003oss_src.tgz")
51
#set(tbb_md5 "7b5d94eb35a563b29ef402e0fd8f15c9")
52 53
#set(tbb_version_file "version_string.tmp")
#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
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(tbb_tarball "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_ver}_src.tgz")
set(tbb_src_dir "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")

macro(getMD5 filename varname)
  if(CMAKE_VERSION VERSION_GREATER 2.8.6)
    file(MD5 "${filename}" ${varname})
  else()
    execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum "${filename}"
              RESULT_VARIABLE getMD5_RESULT
              OUTPUT_VARIABLE getMD5_OUTPUT
              OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(getMD5_RESULT EQUAL 0)
      string(REGEX MATCH "^[a-z0-9]+" ${varname} "${getMD5_OUTPUT}")
    else()
      set(${varname} "invalid_md5")
    endif()
  endif()
endmacro()

if(EXISTS "${tbb_tarball}")
  getMD5("${tbb_tarball}" tbb_local_md5)
  if(NOT tbb_local_md5 STREQUAL tbb_md5)
    message(WARNING "Local copy of TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
    file(REMOVE "${tbb_tarball}")
    if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
      file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
    endif()
  endif()
endif()

if(NOT EXISTS "${tbb_tarball}")
  message(STATUS "Downloading ${tbb_ver}_src.tgz")
  file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar)
  if(NOT __statvar EQUAL 0)
    message(FATAL_ERROR "Failed to download TBB sources: ${tbb_url}")
  endif()
  getMD5("${tbb_tarball}" tbb_local_md5)
  if(NOT tbb_local_md5 STREQUAL tbb_md5)
    file(REMOVE "${tbb_tarball}")
    message(FATAL_ERROR "Downloaded TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
  endif()
A
Andrey Kamaev 已提交
96

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
  if(EXISTS "${tbb_src_dir}")
    file(REMOVE_RECURSE "${tbb_src_dir}")
  endif()
endif()

# untar TBB sources
if(NOT EXISTS "${tbb_src_dir}")
  message(STATUS "Unpacking ${tbb_ver}_src.tgz to ${tbb_src_dir}")
  execute_process(COMMAND ${CMAKE_COMMAND} -E tar xz "${tbb_tarball}"
              WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
              RESULT_VARIABLE tbb_untar_RESULT)

  if(NOT tbb_untar_RESULT EQUAL 0 OR NOT EXISTS "${tbb_src_dir}")
    message(FATAL_ERROR "Failed to unpack TBB sources")
  endif()
endif()

114
set(TBB_INCLUDE_DIRS "${tbb_src_dir}/include" PARENT_SCOPE)
115

116 117 118 119
ocv_include_directories("${tbb_src_dir}/include"
                        "${tbb_src_dir}/src/"
                        "${tbb_src_dir}/src/rml/include"
                        "${CMAKE_CURRENT_SOURCE_DIR}")
120 121 122 123 124

file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")
file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")

A
Alexander Smorkalov 已提交
125 126
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0         #required
                -D__TBB_BUILD=1                        #required
A
Alexander Smorkalov 已提交
127 128 129
                -D__TBB_SURVIVE_THREAD_SWITCH=0        #no cilk support
                -DUSE_PTHREAD                          #required for Unix
                -DTBB_USE_GCC_BUILTINS=1               #required for ARM GCC
A
Alexander Smorkalov 已提交
130 131
                -DTBB_USE_DEBUG=0                      #just to be sure
                -DTBB_NO_LEGACY=1                      #don't need backward compatibility
A
Alexander Smorkalov 已提交
132
                -DDO_ITT_NOTIFY=0                      #it seems that we don't need these notifications
133 134
               )

135 136 137 138 139
if(ANDROID_COMPILER_IS_CLANG)
  add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
  ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-prototypes)
endif()

140 141 142
if(tbb_need_GENERIC_DWORD_LOAD_STORE)
  #needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems
  add_definitions(-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1)
143
  set(tbb_need_GENERIC_DWORD_LOAD_STORE ON PARENT_SCOPE)
144 145
endif()

146 147 148 149 150 151 152
set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})

if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
  if (NOT ANDROID)
    set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/arm_linux_stub.cpp")
  endif()
  set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h")
A
Alexander Smorkalov 已提交
153
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")
154 155
endif()

156 157
set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}")

A
Alexander Smorkalov 已提交
158 159
add_library(tbb ${TBB_SOURCE_FILES})
target_link_libraries(tbb c m dl)
160

A
Andrey Kamaev 已提交
161 162
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations)
string(REPLACE "-Werror=non-virtual-dtor" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
163 164

set_target_properties(tbb
A
Andrey Kamaev 已提交
165 166
  PROPERTIES OUTPUT_NAME tbb
  DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
167
  ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
A
Andrey Kamaev 已提交
168 169
  )

170 171 172
if(ENABLE_SOLUTION_FOLDERS)
  set_target_properties(tbb PROPERTIES FOLDER "3rdparty")
endif()
A
Andrey Kamaev 已提交
173

174
if(NOT BUILD_SHARED_LIBS)
175
  install(TARGETS tbb ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
176
endif()
177 178 179

# get TBB version
ocv_parse_header("${tbb_src_dir}/include/tbb/tbb_stddef.h" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)