1cmake_minimum_required (VERSION 2.8.11)
2project (upm)
3
4if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
5message("WARNING: building into sources dir can be risky, prefer other directory")
6endif ()
7
8find_package (SWIG)
9if (SWIG_FOUND)
10  include (${SWIG_USE_FILE})
11endif ()
12
13find_package (Threads REQUIRED)
14find_package (PkgConfig REQUIRED)
15
16# force a libmraa search and minimum required version every time a config is generated
17unset(MRAA_FOUND CACHE)
18pkg_check_modules (MRAA REQUIRED mraa>=0.8.0)
19message (INFO " found mraa version: ${MRAA_VERSION}")
20
21# Appends the cmake/modules path to MAKE_MODULE_PATH variable.
22set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
23set (LIB_INSTALL_DIR "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries")
24
25# Set CMAKE_LIB_INSTALL_DIR if not defined
26include(GNUInstallDirs)
27
28# Make a version file containing the current version from git.
29include (GetGitRevisionDescription)
30git_describe (VERSION "--tags")
31if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND")
32  message (WARNING " - Install git to compile a production UPM!")
33  set (VERSION "v0.4.0-dirty")
34endif ()
35
36message (INFO " - UPM Version ${VERSION}")
37
38#parse the version information into pieces.
39string (REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}")
40string (REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION}")
41string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION}")
42string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+\\-([0-9]+).*" "\\1" VERSION_COMMIT "${VERSION}")
43string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+-[0-9]+\\-(.*)" "\\1" VERSION_SHA1 "${VERSION}")
44
45if ("${VERSION_COMMIT}" MATCHES "^v.*")
46  set (VERSION_COMMIT "")
47endif()
48
49set (upm_VERSION_MAJOR ${VERSION_MAJOR})
50set (upm_VERSION_MINOR ${VERSION_MINOR})
51set (upm_VERSION_PATCH ${VERSION_PATCH})
52set (upm_VERSION_STRING ${upm_VERSION_MAJOR}.${upm_VERSION_MINOR}.${upm_VERSION_PATCH})
53
54set (CMAKE_SWIG_FLAGS "")
55
56option (BUILDDOC "Build all doc." OFF)
57option (BUILDSWIG "Build swig modules." ON)
58option (BUILDSWIGPYTHON "Build swig python modules." ON)
59option (BUILDSWIGNODE "Build swig node modules." ON)
60option (BUILDEXAMPLES "Build C++ example binaries" OFF)
61option (BUILDSWIGJAVA "Build swig java modules" OFF)
62option (IPK "Generate IPK using CPack" OFF)
63option (RPM "Generate RPM using CPack" OFF)
64
65# detect arch
66include (TargetArch)
67target_architecture (DETECTED_ARCH)
68message( INFO " - Target arch is ${DETECTED_ARCH}")
69
70if (BUILDDOC)
71  # add a target to generate API documentation with Doxygen
72  find_package (Doxygen)
73  if (DOXYGEN_FOUND)
74    configure_file (${CMAKE_CURRENT_SOURCE_DIR}/doxy/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
75    if (BUILDSWIGJAVA)
76        configure_file (${CMAKE_CURRENT_SOURCE_DIR}/doxy/Doxyfile.java.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile-java @ONLY)
77    endif()
78    file(GLOB PNG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/docs docs/icons/*.png)
79    foreach(PNG_FILE ${PNG_FILES})
80      configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docs/${PNG_FILE} ${CMAKE_CURRENT_BINARY_DIR}/html/docs/${PNG_FILE} COPYONLY)
81    endforeach()
82    add_custom_target (doc
83      ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
84      COMMAND tar -czf html/xml.tar.gz -C xml .
85      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
86      COMMENT "Generating API documentation with Doxygen" VERBATIM
87    )
88  endif (DOXYGEN_FOUND)
89  # check if Sphinx is installed and add target to generate API documentation
90  find_package (Sphinx)
91  if(SPHINX_FOUND AND BUILDSWIG AND BUILDSWIGPYTHON)
92    # python required for Sphinx build
93    find_package (PythonLibs)
94    string (REPLACE "." ";" PYTHON_VERSION_LIST ${PYTHONLIBS_VERSION_STRING})
95    list (GET PYTHON_VERSION_LIST 0 PYTHON_VERSION_MAJOR)
96    list (GET PYTHON_VERSION_LIST 1 PYTHON_VERSION_MINOR)
97    set (SITE_PACKAGES ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
98    configure_file (${CMAKE_CURRENT_SOURCE_DIR}/doxy/conf.py.in ${CMAKE_CURRENT_BINARY_DIR}/pydoc/conf.py @ONLY)
99    configure_file (${CMAKE_CURRENT_SOURCE_DIR}/doxy/index.rst ${CMAKE_CURRENT_BINARY_DIR}/pydoc/index.rst COPYONLY)
100    add_custom_target (pydoc ALL
101      COMMAND rm -r -f ${CMAKE_BINARY_DIR}/pyupm && mkdir -p ${CMAKE_BINARY_DIR}/pyupm
102      COMMAND find ${CMAKE_BINARY_DIR}/src -name "_pyupm_*.so" -exec cp {} ${CMAKE_BINARY_DIR}/pyupm \;
103      COMMAND find ${CMAKE_BINARY_DIR}/src -name "pyupm_*.py" -exec cp {} ${CMAKE_BINARY_DIR}/pyupm \;
104      COMMAND ${SPHINX_API_EXECUTABLE} -f -o pydoc  ${CMAKE_BINARY_DIR}/pyupm
105      # todo: use a separate cmake FILE module for string replacement instead
106      COMMAND ${SPHINX_EXECUTABLE} -b html pydoc html/python
107      COMMAND sed -i.bak s|\">pyupm_|\">|g html/python/index.html html/python/modules.html
108      COMMAND sed -i.bak s|[[:space:]][mM]odule</a>|</a>|g html/python/index.html html/python/modules.html
109      DEPENDS doc
110      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
111      COMMENT "Generating API documentation with Sphinx" VERBATIM
112    )
113  endif ()
114  # check if Yuidoc is installed and add target for API documentation
115  find_package(Yuidoc)
116  if(YUIDOC_FOUND AND BUILDSWIGNODE)
117    # node required for Yuidoc documentation
118    find_package(Node)
119    file(GLOB_RECURSE JSDOC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/doxy/node doxy/node/*)
120    foreach(JSDOC_FILE ${JSDOC_FILES})
121      configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doxy/node/${JSDOC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${JSDOC_FILE} COPYONLY)
122    endforeach()
123    add_custom_target(jsdoc ALL
124      COMMAND ${NODE_EXECUTABLE} docgen -m upm -i xml -t ${CMAKE_CURRENT_SOURCE_DIR}/src -g ../../
125      COMMAND ${YUIDOC_EXECUTABLE} -C --no-sort --helpers generators/yuidoc/helper.js --themedir generators/yuidoc/tmpl -o html/node jsdoc/yuidoc/upm
126      COMMAND ${NODE_EXECUTABLE} tolower -i html/node
127      DEPENDS doc
128      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
129      COMMENT "Generating API documentation with Yuidoc" VERBATIM
130    )
131  endif()
132endif()
133
134if (IPK)
135
136 # Get target package arch from Yocto ADT sysroot if set or host OS, mapping to Ubuntu name if necessary
137  if (DEFINED ENV{OECORE_TARGET_SYSROOT})
138    GET_FILENAME_COMPONENT (DETECTED_SYSROOT $ENV{OECORE_TARGET_SYSROOT} NAME)
139    string (REGEX REPLACE "-poky-linux" "" TARGET_ARCH "${DETECTED_SYSROOT}")
140  else ()
141    # debian uses amd64 to denote x86_64
142    if (DETECTED_ARCH STREQUAL "x86_64")
143      set (TARGET_ARCH "amd64")
144    else ()
145      set (TARGET_ARCH ${DETECTED_ARCH})
146    endif ()
147  endif ()
148  message (INFO " - Package arch is ${TARGET_ARCH}")
149
150  set(CPACK_GENERATOR "DEB" "TGZ")
151  set(OPKG_ARCH ${TARGET_ARCH})
152  set(CPACK_BINARY_DIR ${CMAKE_BINARY_DIR})
153  set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Intel IoT-Devkit") #required
154  set(upm_PACKAGE_ON_TAG ".")
155  if ("${VERSION_COMMIT}" STREQUAL "")
156    set(upm_PACKAGE_ON_TAG "")
157  endif()
158  set(CPACK_PACKAGE_VERSION
159      "${upm_VERSION_MAJOR}.${upm_VERSION_MINOR}.${upm_VERSION_PATCH}${upm_PACKAGE_ON_TAG}${VERSION_COMMIT}")
160  set(CPACK_PACKAGE_NAME "upm")
161  set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
162  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${TARGET_ARCH})
163  set(CPACK_SYSTEM_NAME ${TARGET_ARCH})
164  set(CPACK_DEBIAN_PACKAGE_DEPENDS "mraa (>= ${MRAA_VERSION})")
165  set(CPACK_DEBIAN_PACKAGE_PROVIDES "upm-dev, upm-dbg, upm-doc")
166  set(CPACK_DEBIAN_PACKAGE_REPLACES ${CPACK_DEBIAN_PACKAGE_PROVIDES})
167  set(CPACK_DEBIAN_PACKAGE_CONFLICTS ${CPACK_DEBIAN_PACKAGE_PROVIDES})
168  set(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}")
169  include (CPack)
170endif()
171
172if (RPM)
173  message (INFO " - RPM packaging enabled for ${DETECTED_ARCH}")
174  set(CPACK_PACKAGE_VERSION ${VERSION})
175  set(CPACK_GENERATOR "RPM")
176  set(CPACK_PACKAGE_NAME "libupm${upm_VERSION_MAJOR}")
177  set(CPACK_PACKAGE_RELEASE 1)
178  set(CPACK_PACKAGE_VERSION
179      "${upm_VERSION_MAJOR}.${upm_VERSION_MINOR}.${upm_VERSION_PATCH}-${upm_PACKAGE_ON_TAG}${VERSION_COMMIT}")
180  set(CPACK_PACKAGE_CONTACT "Intel IoT-Devkit")
181  set(CPACK_PACKAGE_VENDOR "Intel IoT-Devkit")
182  set(CPACK_RPM_PACKAGE_REQUIRES "mraa >= ${MRAA_VERSION}")
183  set(CPACK_RPM_PACKAGE_PROVIDES "${CPACK_PACKAGE_NAME}-devel")
184  EXECUTE_PROCESS(COMMAND rpm --showrc
185    COMMAND grep -E "dist[[:space:]]*\\."
186    COMMAND sed -e "s/^.*dist\\s*\\.//"
187    COMMAND tr \\n \\t
188    COMMAND sed  -e s/\\t//
189    OUTPUT_VARIABLE DIST_TAG)
190  set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${DIST_TAG}.${DETECTED_ARCH}")
191  include(CPack)
192endif()
193
194add_subdirectory (src)
195
196if(BUILDEXAMPLES)
197  add_subdirectory (examples/c++)
198endif()
199