2016-01-13 13:38:23 +02:00
macro ( file_to_list readfile outlist )
FILE ( READ "${readfile}" contents )
STRING ( REGEX REPLACE ";" "\\\\;" contents "${contents}" )
STRING ( REGEX REPLACE "\n" ";" contents "${contents}" )
set ( "${outlist}" "${contents}" )
endmacro ( )
file_to_list ( "javaswig_blacklist" JAVASWIG_BLACKLIST )
file_to_list ( "pythonswig_blacklist" PYTHONSWIG_BLACKLIST )
file_to_list ( "nodeswig_blacklist" NODESWIG_BLACKLIST )
2014-06-05 13:58:34 +01:00
macro ( subdirlist result curdir )
file ( GLOB children RELATIVE ${ curdir } ${ curdir } /* )
set ( dirlist "" )
foreach ( child ${ children } )
if ( IS_DIRECTORY ${ curdir } / ${ child } )
set ( dirlist ${ dirlist } ${ child } )
endif ( )
endforeach ( )
set ( ${ result } ${ dirlist } )
endmacro ( )
2014-06-11 13:54:19 +01:00
macro ( upm_CREATE_INSTALL_PKGCONFIG generated_file install_location )
configure_file ( ${ PROJECT_SOURCE_DIR } /src/pkgconfig.in
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { g e n e r a t e d _ f i l e } @ O N L Y )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ generated_file } DESTINATION ${ install_location } )
endmacro ( upm_CREATE_INSTALL_PKGCONFIG )
macro ( upm_SWIG_PYTHON )
2014-08-11 11:31:32 +01:00
if ( BUILDSWIGPYTHON AND BUILDSWIG )
2016-03-29 10:28:22 -07:00
2014-06-11 13:54:19 +01:00
set_source_files_properties ( pyupm_ ${ libname } .i PROPERTIES CPLUSPLUS ON )
2015-12-16 13:58:11 -08:00
set_source_files_properties ( pyupm_ ${ libname } .i PROPERTIES SWIG_FLAGS "-I${CMAKE_CURRENT_BINARY_DIR}/.." )
2014-06-12 11:39:10 +01:00
swig_add_module ( pyupm_ ${ libname } python pyupm_ ${ libname } .i ${ module_src } )
2014-06-25 10:05:27 +01:00
swig_link_libraries ( pyupm_ ${ libname } ${ PYTHON_LIBRARIES } ${ MRAA_LIBRARIES } )
2014-06-11 13:54:19 +01:00
target_include_directories ( ${ SWIG_MODULE_pyupm_${libname } _REAL_NAME}
P U B L I C
" $ { P Y T H O N _ I N C L U D E _ P A T H } "
" $ { P Y T H O N _ I N C L U D E _ D I R S } "
)
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /_pyupm_ ${ libname } .so
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / p y u p m _ $ { l i b n a m e } . p y
2016-03-28 16:11:46 -07:00
D E S T I N A T I O N $ { L I B _ I N S T A L L _ D I R } / p y t h o n $ { P Y T H O N _ V E R S I O N _ M A J O R } . $ { P Y T H O N _ V E R S I O N _ M I N O R } / s i t e - p a c k a g e s /
2014-06-11 13:54:19 +01:00
C O M P O N E N T $ { l i b n a m e } )
endif ( )
endmacro ( )
macro ( upm_SWIG_NODE )
2014-08-07 19:23:29 +01:00
if ( BUILDSWIGNODE AND BUILDSWIG )
2016-03-22 12:01:59 +00:00
# SWIG treats SWIG_FLAGS as a list and not a string so semicolon seperation is
# required. This hardcodes V8_VERSION to be <10 but I assume that's not going
# to be a problem for a little while! SWIG uses a padded SWIG_V8 version which
# we hack together from our findnode module.
set ( V8_VERSION_HEX 0x0 ${ V8_VERSION_MAJOR } ${ V8_VERSION_MINOR } ${ V8_VERSION_PATCH } )
string ( LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length )
while ( V8_VERSION_HEX_length LESS 8 )
set ( V8_VERSION_HEX "${V8_VERSION_HEX}0" )
string ( LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length )
endwhile ( )
2016-03-29 10:28:22 -07:00
2016-03-25 11:57:13 -07:00
# include_directories (${NODE_INCLUDE_DIRS})
2016-03-22 12:01:59 +00:00
2016-03-26 22:01:46 +03:00
include_directories (
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / . .
)
2016-03-22 12:01:59 +00:00
set_property ( SOURCE jsupm_ ${ libname } .i PROPERTY SWIG_FLAGS "-node" "-DV8_VERSION=${V8_VERSION_HEX}" )
2014-06-11 13:54:19 +01:00
set_source_files_properties ( jsupm_ ${ libname } .i PROPERTIES CPLUSPLUS ON )
2014-06-12 11:39:10 +01:00
swig_add_module ( jsupm_ ${ libname } javascript jsupm_ ${ libname } .i ${ module_src } )
2014-06-25 10:05:27 +01:00
swig_link_libraries ( jsupm_ ${ libname } ${ MRAA_LIBRARIES } ${ NODE_LIBRARIES } )
2014-06-11 13:54:19 +01:00
target_include_directories ( ${ SWIG_MODULE_jsupm_${libname } _REAL_NAME}
P U B L I C
" $ { N O D E _ I N C L U D E _ D I R S } "
2016-03-22 12:01:59 +00:00
)
2014-06-11 13:54:19 +01:00
set_target_properties ( jsupm_ ${ libname } PROPERTIES
2016-03-22 12:01:59 +00:00
C O M P I L E _ F L A G S " $ { C M A K E _ C X X _ F L A G S } - D B U I L D I N G _ N O D E _ E X T E N S I O N - D S W I G _ V 8 _ V E R S I O N = $ { V 8 _ V E R S I O N _ H E X } "
2014-06-11 13:54:19 +01:00
P R E F I X " "
S U F F I X " . n o d e "
)
2015-11-24 02:50:17 +03:00
if ( ${ V8_VERSION_MAJOR } GREATER 3 )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2015-12-10 13:57:55 -08:00
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7" )
message ( FATAL_ERROR " **ERROR** GCC 4.7 or above is required to compile jsupm_${libname} " )
endif ( )
2015-11-24 02:50:17 +03:00
endif ( )
2016-03-29 10:28:22 -07:00
2016-03-25 11:57:13 -07:00
if ( NOT ENABLECXX11 )
set_property ( TARGET jsupm_ ${ libname } PROPERTY CXX_STANDARD 11 )
set_property ( TARGET jsupm_ ${ libname } PROPERTY CXX_STANDARD_REQUIRED ON )
if ( CMAKE_VERSION VERSION_LESS "3.1" )
if ( CMAKE_COMPILER_IS_GNUCXX )
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7" )
message ( FATAL_ERROR " FATAL ERROR: GNU gcc compiler is also too old (need 4.7+, but ${CMAKE_CXX_COMPILER_VERSION}) and does not support C++11 standard." )
endif ( )
set ( UPM_CXX11_WORKAROUND_OPTION "-std=gnu++11" )
else ( )
set ( UPM_CXX11_WORKAROUND_OPTION "-std=c++11" )
endif ( )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${UPM_CXX11_WORKAROUND_OPTION} " )
2016-03-22 16:15:31 +00:00
endif ( )
endif ( )
2015-11-24 02:50:17 +03:00
endif ( )
2014-06-11 13:54:19 +01:00
createpackagejson ( ${ libname } )
2016-03-28 16:11:46 -07:00
set ( NODE_MODULE_INSTALL_PATH ${ NODE_ROOT_DIR } / ${ LIB_INSTALL_DIR } /node_modules/jsupm_ ${ libname } / )
2014-06-11 13:54:19 +01:00
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /jsupm_ ${ libname } .node
2016-03-21 17:21:46 +00:00
D E S T I N A T I O N $ { N O D E _ M O D U L E _ I N S T A L L _ P A T H } C O M P O N E N T $ { l i b n a m e } )
2014-06-11 13:54:19 +01:00
endif ( )
endmacro ( )
2015-08-05 19:43:31 +03:00
macro ( upm_SWIG_JAVA )
if ( BUILDSWIGJAVA AND BUILDSWIG )
FIND_PACKAGE ( JNI REQUIRED )
2015-12-23 17:47:26 +02:00
pkg_check_modules ( MRAAJAVA REQUIRED mraajava>=0.8.0 )
2015-08-05 19:43:31 +03:00
include_directories (
$ { J A V A _ I N C L U D E _ P A T H }
$ { J A V A _ I N C L U D E _ P A T H 2 }
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / . .
)
set_source_files_properties ( javaupm_ ${ libname } .i PROPERTIES CPLUSPLUS ON )
set_source_files_properties ( javaupm_ ${ libname } .i PROPERTIES SWIG_FLAGS ";-package;upm_${libname};-I${CMAKE_BINARY_DIR}/src" )
swig_add_module ( javaupm_ ${ libname } java javaupm_ ${ libname } .i ${ module_src } )
2015-12-23 17:47:26 +02:00
swig_link_libraries ( javaupm_ ${ libname } ${ MRAAJAVA_LDFLAGS } ${ JAVA_LDFLAGS } )
2015-08-05 19:43:31 +03:00
target_include_directories ( ${ SWIG_MODULE_javaupm_${libname } _REAL_NAME}
P U B L I C
" $ { J A V A _ I N C L U D E _ D I R S } "
" $ { J A V A _ I N C L U D E _ P A T H } "
)
set_target_properties ( javaupm_ ${ libname } PROPERTIES
2015-09-14 18:10:12 +03:00
C O M P I L E _ F L A G S " $ { C M A K E _ C X X _ F L A G S } - f p e r m i s s i v e - D J A V A C A L L B A C K "
2015-08-12 19:07:48 +03:00
P R E F I X " l i b "
2015-08-05 19:43:31 +03:00
S U F F I X " . s o "
)
2016-03-28 16:11:46 -07:00
install ( TARGETS javaupm_ ${ libname } LIBRARY DESTINATION ${ LIB_INSTALL_DIR } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /upm_ ${ libname } .jar DESTINATION ${ LIB_INSTALL_DIR } /../lib/java )
2015-08-05 19:43:31 +03:00
2015-10-08 18:07:25 +03:00
if ( NOT DEFINED $ENV{ JAVA_HOME_NATIVE } )
2015-11-24 02:50:17 +03:00
set ( JAVAC $ENV{ JAVA_HOME } /bin/javac )
set ( JAR $ENV{ JAVA_HOME } /bin/jar )
2015-10-08 18:07:25 +03:00
else ( )
2015-11-24 02:50:17 +03:00
set ( JAVAC $ENV{ JAVA_HOME_NATIVE } /bin/javac )
set ( JAR $ENV{ JAVA_HOME_NATIVE } /bin/jar )
2015-10-08 18:07:25 +03:00
endif ( )
2015-08-05 19:43:31 +03:00
add_custom_command ( TARGET javaupm_ ${ libname }
P O S T _ B U I L D
C O M M A N D c m a k e - E e c h o " C o m p i l i n g j a v a . . "
2015-08-17 16:36:33 +03:00
C O M M A N D c m a k e - E m a k e _ d i r e c t o r y $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / u p m _ $ { l i b n a m e }
2015-08-05 19:43:31 +03:00
C O M M A N D $ { J A V A C } * . j a v a - d $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }
C O M M A N D c m a k e - E e c h o " C r e a t i n g j a r "
2015-08-17 16:36:33 +03:00
C O M M A N D $ { J A R } c v f u p m _ $ { l i b n a m e } . j a r u p m _ $ { l i b n a m e }
2015-08-05 19:43:31 +03:00
)
endif ( )
endmacro ( )
2014-06-11 13:54:19 +01:00
macro ( upm_doxygen )
2014-08-11 11:31:32 +01:00
if ( DOXYGEN_FOUND )
2015-07-22 11:48:17 -07:00
if ( NOT DEFINED classname )
set ( classname ${ libname } )
endif ( )
2014-06-11 13:54:19 +01:00
set ( CMAKE_SWIG_FLAGS -DDOXYGEN= ${ DOXYGEN_FOUND } )
2014-08-11 11:31:32 +01:00
if ( BUILDSWIG )
2015-12-16 13:58:11 -08:00
add_dependencies ( _pyupm_ ${ libname } pyupm_doxy2swig )
2015-06-02 11:55:49 -07:00
add_dependencies ( pydoc _pyupm_ ${ libname } )
2014-08-11 11:31:32 +01:00
else ( )
add_dependencies ( ${ libname } doc )
endif ( )
2014-06-11 13:54:19 +01:00
endif ( )
endmacro ( )
if ( SWIG_FOUND )
2016-03-25 11:57:13 -07:00
if ( BUILDSWIGPYTHON )
if ( NOT PYTHONLIBS_FOUND )
find_package ( PythonLibs ${ PYTHONBUILD_VERSION } REQUIRED )
2016-03-28 13:37:59 -07:00
string ( REPLACE "." ";" PYTHON_VERSION_LIST ${ PYTHONLIBS_VERSION_STRING } )
list ( GET PYTHON_VERSION_LIST 0 PYTHON_VERSION_MAJOR )
list ( GET PYTHON_VERSION_LIST 1 PYTHON_VERSION_MINOR )
2016-03-25 11:57:13 -07:00
endif ( )
2016-03-28 13:37:59 -07:00
endif ( BUILDSWIGPYTHON )
2016-03-21 17:22:25 +00:00
if ( BUILDSWIGNODE )
2015-05-28 08:53:57 -07:00
if ( NOT NODE_FOUND )
2016-03-21 17:21:46 +00:00
find_package ( Node )
2015-05-28 08:53:57 -07:00
endif ( )
if ( SWIG_VERSION VERSION_LESS 3.0.5 AND NODE_VERSION_STRING VERSION_GREATER 0.12 )
message ( "WARNING - SWIG 3.0.5+ required for building with nodejs 0.12. Current version is ${SWIG_VERSION}" )
endif ( )
2016-03-21 17:21:46 +00:00
find_path ( NODE_ROOT_DIR "include/node/node.h" )
set ( NODE_INCLUDE_DIRS
$ { N O D E _ R O O T _ D I R } / i n c l u d e / s r c
$ { N O D E _ R O O T _ D I R } / i n c l u d e / n o d e
$ { N O D E _ R O O T _ D I R } / i n c l u d e / d e p s / v 8 / i n c l u d e
$ { N O D E _ R O O T _ D I R } / i n c l u d e / d e p s / u v / i n c l u d e
)
2014-06-11 13:54:19 +01:00
macro ( createpackagejson )
2016-03-28 14:13:11 -07:00
configure_file ( ${ PROJECT_SOURCE_DIR } /src/package.json.in ${ CMAKE_CURRENT_BINARY_DIR } /package.json @ONLY )
# If a CMAKE_INSTALL_PREFIX has NOT been provided, set NODE_MODULE_INSTALL_PATH
# base on the NODE_ROOT_DIR.
if ( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT )
2016-03-28 16:11:46 -07:00
set ( NODE_MODULE_INSTALL_PATH ${ NODE_ROOT_DIR } / ${ LIB_INSTALL_DIR } /node_modules/jsupm_ ${ libname } / )
2016-03-28 14:13:11 -07:00
# If a CMAKE_INSTALL_PREFIX has been provided, set NODE_MODULE_INSTALL_PATH
# relative to the provided install directory.
else ( )
2016-03-28 16:11:46 -07:00
set ( NODE_MODULE_INSTALL_PATH ${ CMAKE_INSTALL_PREFIX } / ${ LIB_INSTALL_DIR } /node_modules/jsupm_ ${ libname } / )
2016-03-28 14:13:11 -07:00
endif ( )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /package.json
D E S T I N A T I O N $ { N O D E _ M O D U L E _ I N S T A L L _ P A T H } C O M P O N E N T $ { l i b n a m e } )
2014-06-11 13:54:19 +01:00
endmacro ( )
endif ( BUILDSWIGNODE )
endif ( )
macro ( upm_module_init )
2015-12-10 13:57:55 -08:00
link_directories ( ${ MRAA_LIBDIR } )
2014-06-12 11:39:10 +01:00
add_library ( ${ libname } SHARED ${ module_src } )
2015-01-17 10:09:06 +00:00
foreach ( linkflag ${ ARGN } )
target_link_libraries ( ${ libname } ${ linkflag } )
endforeach ( )
2016-03-29 10:28:22 -07:00
include_directories ( ${ MRAA_INCLUDE_DIRS } . .. )
2014-06-25 10:05:27 +01:00
target_link_libraries ( ${ libname } ${ MRAA_LIBRARIES } )
2014-06-17 11:41:05 +01:00
set_target_properties (
$ { l i b n a m e }
P R O P E R T I E S P R E F I X " l i b u p m - "
S O V E R S I O N $ { u p m _ V E R S I O N _ M A J O R }
V E R S I O N $ { u p m _ V E R S I O N _ S T R I N G }
)
2016-03-28 16:11:46 -07:00
upm_create_install_pkgconfig ( upm- ${ libname } .pc ${ LIB_INSTALL_DIR } /pkgconfig )
2014-06-11 13:54:19 +01:00
if ( SWIG_FOUND )
2016-01-13 13:38:23 +02:00
if ( NOT ";${PYTHONSWIG_BLACKLIST};" MATCHES ";${libname};" )
upm_swig_python ( )
endif ( )
if ( NOT ";${NODESWIG_BLACKLIST};" MATCHES ";${libname};" )
upm_swig_node ( )
endif ( )
if ( NOT ";${JAVASWIG_BLACKLIST};" MATCHES ";${libname};" )
upm_swig_java ( )
endif ( )
2014-08-11 11:31:32 +01:00
endif ( )
if ( BUILDDOC )
2014-06-11 13:54:19 +01:00
upm_doxygen ( )
endif ( )
2016-03-28 16:11:46 -07:00
install ( TARGETS ${ libname } DESTINATION ${ LIB_INSTALL_DIR } )
2014-06-12 11:39:10 +01:00
install ( FILES ${ module_h } DESTINATION include/upm COMPONENT ${ libname } )
2014-06-11 13:54:19 +01:00
if ( IPK )
cpack_add_component ( ${ libname } DISPLAY_NAME ${ libname } REQUIRED INSTALL_TYPES all )
set ( CPACK_COMPONENT_ ${ libname } _DESCRIPTION "${libdescription}" )
endif ( )
endmacro ( upm_module_init )
2015-12-16 13:58:11 -08:00
# Generate python module documentation from doxygen collateral
if ( BUILDDOC AND BUILDSWIGPYTHON AND SWIG_FOUND )
# doxy2swig the doxygen output
add_custom_command ( OUTPUT ${ CMAKE_CURRENT_BINARY_DIR } /pyupm_doxy2swig.i
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / d o x y 2 s w i g . p y
$ { C M A K E _ B I N A R Y _ D I R } / x m l / i n d e x . x m l
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / p y u p m _ d o x y 2 s w i g . i
D E P E N D S $ { C M A K E _ B I N A R Y _ D I R } / x m l / i n d e x . x m l
)
add_custom_target ( pyupm_doxy2swig DEPENDS ${ CMAKE_CURRENT_BINARY_DIR } /pyupm_doxy2swig.i )
add_dependencies ( pyupm_doxy2swig doc )
# BUILDDOC not set but still building python modules, generate an empty
# pyupm_doxy2swig.i file (overwriting if necessary)
elseif ( BUILDSWIGPYTHON AND SWIG_FOUND )
message ( INFO " Generating empty ${CMAKE_CURRENT_BINARY_DIR}/pyupm_doxy2swig.i" )
file ( WRITE ${ CMAKE_CURRENT_BINARY_DIR } /pyupm_doxy2swig.i "// Empty doxy2swig stub" )
endif ( BUILDDOC AND BUILDSWIGPYTHON AND SWIG_FOUND )
2015-11-19 15:49:18 -08:00
if ( MODULE_LIST )
set ( SUBDIRS ${ MODULE_LIST } )
set ( SUBDIRS ${ SUBDIRS } upm )
else ( )
subdirlist ( SUBDIRS ${ CMAKE_CURRENT_SOURCE_DIR } )
endif ( )
2014-06-05 13:58:34 +01:00
foreach ( subdir ${ SUBDIRS } )
2015-01-15 18:24:52 +01:00
if ( EXISTS ${ CMAKE_CURRENT_SOURCE_DIR } / ${ subdir } /CMakeLists.txt )
add_subdirectory ( ${ subdir } )
endif ( )
2014-06-05 13:58:34 +01:00
endforeach ( )