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}" )
2016-08-17 17:58:21 -07:00
endmacro ( file_to_list )
2016-01-13 13:38:23 +02:00
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 } )
2016-08-17 17:58:21 -07:00
endmacro ( subdirlist )
2014-06-11 13:54:19 +01:00
2016-08-17 17:58:21 -07:00
macro ( upm_create_install_pkgconfig generated_file install_location )
2014-06-11 13:54:19 +01:00
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 } )
2016-08-17 17:58:21 -07:00
endmacro ( upm_create_install_pkgconfig )
2014-06-11 13:54:19 +01:00
2016-09-29 13:46:20 -07:00
# Provides a means to call target_link_libraries AND the necessary
# swig_link_libaries. This iterates over all additional parameters AFTER
# the target name calling target_link_libraries/swig_link_libraries
# as necessary accordingly
macro ( upm_target_link_libraries target_name )
# For each additional argument to upm_target_link_libraries...
foreach ( _library ${ ARGN } )
# Add the dependency
target_link_libraries ( ${ target_name } ${ _library } )
# Call the swig link library method for each library
if ( BUILDSWIGNODE )
set_target_properties ( ${ SWIG_MODULE_jsupm_${libname } _REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE )
swig_link_libraries ( jsupm_ ${ libname } ${ _library } )
endif ( )
# Build python2 AND/OR python3 modules
if ( BUILDSWIGPYTHON )
# python2?
if ( PYTHON2LIBS_FOUND )
set ( pymod_target_name pyupm_ ${ target_name } -python ${ PYTHON2_VERSION_MAJOR } )
set_target_properties ( ${ SWIG_MODULE_pyupm_${pymod_target_name } _REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE )
swig_link_libraries ( ${ pymod_target_name } ${ _library } )
endif ( PYTHON2LIBS_FOUND )
if ( PYTHON3LIBS_FOUND )
set ( pymod_target_name pyupm_ ${ target_name } -python ${ PYTHON3_VERSION_MAJOR } )
set_target_properties ( ${ SWIG_MODULE_pyupm_${pymod_target_name } _REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE )
swig_link_libraries ( ${ pymod_target_name } ${ _library } )
endif ( PYTHON3LIBS_FOUND )
endif ( )
if ( BUILDSWIGJAVA )
set_target_properties ( ${ SWIG_MODULE_javaupm_${libname } _REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE )
swig_link_libraries ( javaupm_ ${ libname } ${ _library } )
endif ( )
endforeach ( _library ${ ARGN } )
endmacro ( upm_target_link_libraries target_name )
2016-03-29 10:28:22 -07:00
2016-09-29 13:46:20 -07:00
# Create a single swig target for python
macro ( _upm_swig_python )
# Create a target name which includes python version
set ( pymod_target_name pyupm_ ${ libname } -python ${ PYTHON_VERSION_MAJOR } )
include_directories ( ${ CMAKE_CURRENT_SOURCE_DIR } /.. )
set_source_files_properties ( pyupm_ ${ libname } .i PROPERTIES CPLUSPLUS ON )
set_source_files_properties ( pyupm_ ${ libname } .i PROPERTIES SWIG_FLAGS "-I${CMAKE_CURRENT_BINARY_DIR}/.." )
2016-03-29 17:08:12 -07:00
2016-09-29 13:46:20 -07:00
# Set current python binary dir
set ( CMAKE_CURRENT_PYTHON_BINARY_DIR
$ { C M A K E _ C U R R E N T _ B I N A R Y _ 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 } )
2016-08-17 17:58:21 -07:00
2016-09-29 13:46:20 -07:00
# Make sure swig places wrapper/.py collateral under python2/3 directory
# Do do this, save the original outdir, set a new outdir, then restore at the
# end of this macro.
set ( CMAKE_SWIG_OUTDIR_SAVED ${ CMAKE_SWIG_OUTDIR } )
set ( CMAKE_SWIG_OUTDIR ${ CMAKE_CURRENT_PYTHON_BINARY_DIR } )
swig_add_module ( ${ pymod_target_name } python pyupm_ ${ libname } .i )
swig_link_libraries ( ${ pymod_target_name } ${ PYTHON_LIBRARIES } ${ MRAA_LIBRARIES } ${ libname } )
target_include_directories ( ${ SWIG_MODULE_${pymod_target_name } _REAL_NAME}
2014-06-11 13:54:19 +01:00
P U B L I C
" $ { P Y T H O N _ I N C L U D E _ P A T H } "
2016-09-29 13:46:20 -07:00
" $ { P Y T H O N _ I N C L U D E _ D I R S } " )
# Add C++ comments to ALL python modules (requires doc build)
if ( BUILDDOC )
# Python module depends on doxy2swig .i file generated from the monolithic doxygen xml file
add_dependencies ( ${ SWIG_MODULE_${pymod_target_name } _REAL_NAME} pyupm_doxy2swig )
# The pydoc target depends on EACH python module
add_dependencies ( pydoc ${ SWIG_MODULE_${pymod_target_name } _REAL_NAME} )
endif ( BUILDDOC )
# Python collateral names with be the same for python2/3 w/different library dirs
set_target_properties ( ${ SWIG_MODULE_${pymod_target_name } _REAL_NAME} PROPERTIES
O U T P U T _ N A M E _ p y u p m _ $ { l i b n a m e }
C O M P I L E _ F L A G S " $ { C M A K E _ C _ F L A G S } "
L I B R A R Y _ O U T P U T _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ P Y T H O N _ B I N A R Y _ D I R } )
# Install py to per-python version site-packages
install ( FILES ${ CMAKE_SWIG_OUTDIR } /pyupm_ ${ libname } .py
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 /
C O M P O N E N T $ { l i b n a m e } )
# Install python wrapped library with TARGETS to correctly handle RPATH
install ( TARGETS ${ SWIG_MODULE_${pymod_target_name } _REAL_NAME}
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 / )
# Restore OUTDIR
set ( CMAKE_SWIG_OUTDIR ${ CMAKE_SWIG_OUTDIR_SAVED } )
endmacro ( _upm_swig_python )
# Generate both python2 and python3 modules if possible
macro ( upm_swig_python )
# Return if not building python
if ( NOT BUILDSWIGPYTHON )
return ( )
endif ( NOT BUILDSWIGPYTHON )
# Generate python2 module if python2 libs are available
if ( PYTHON2LIBS_FOUND )
set ( PYTHON_INCLUDE_DIRS ${ PYTHON2_INCLUDE_DIRS } )
set ( PYTHON_INCLUDE_PATH ${ PYTHON2_INCLUDE_PATH } )
set ( PYTHON_LIBRARIES ${ PYTHON2_LIBRARIES } )
set ( PYTHON_VERSION_MAJOR ${ PYTHON2_VERSION_MAJOR } )
set ( PYTHON_VERSION_MINOR ${ PYTHON2_VERSION_MINOR } )
_upm_swig_python ( )
endif ( PYTHON2LIBS_FOUND )
# Generate python3 module if python3 libs are available
if ( PYTHON3LIBS_FOUND )
set ( PYTHON_INCLUDE_DIRS ${ PYTHON3_INCLUDE_DIRS } )
set ( PYTHON_INCLUDE_PATH ${ PYTHON3_INCLUDE_PATH } )
set ( PYTHON_LIBRARIES ${ PYTHON3_LIBRARIES } )
set ( PYTHON_VERSION_MAJOR ${ PYTHON3_VERSION_MAJOR } )
set ( PYTHON_VERSION_MINOR ${ PYTHON3_VERSION_MINOR } )
_upm_swig_python ( )
endif ( PYTHON3LIBS_FOUND )
2016-08-17 17:58:21 -07:00
endmacro ( upm_swig_python )
2014-06-11 13:54:19 +01:00
2016-08-17 17:58:21 -07:00
macro ( upm_swig_node )
2016-08-03 11:52:43 -06:00
if ( BUILDSWIGNODE )
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-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 )
2016-08-17 17:58:21 -07:00
swig_add_module ( jsupm_ ${ libname } javascript jsupm_ ${ libname } .i )
swig_link_libraries ( jsupm_ ${ libname } ${ MRAA_LIBRARIES } ${ NODE_LIBRARIES } ${ libname } )
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" )
2016-09-05 21:57:41 -07:00
message ( FATAL_ERROR "FATAL_ERROR: GCC 4.7 or above is required to compile jsupm_${libname} " )
2015-12-10 13:57:55 -08:00
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" )
2016-09-05 21:57:41 -07:00
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." )
2016-03-25 11:57:13 -07:00
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 } )
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 ( )
2016-08-17 17:58:21 -07:00
endmacro ( upm_swig_node )
2014-06-11 13:54:19 +01:00
2016-08-17 17:58:21 -07:00
macro ( upm_swig_java )
2016-08-03 11:52:43 -06:00
if ( BUILDSWIGJAVA )
2015-08-05 19:43:31 +03:00
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" )
2016-08-17 17:58:21 -07:00
swig_add_module ( javaupm_ ${ libname } java javaupm_ ${ libname } .i )
swig_link_libraries ( javaupm_ ${ libname } ${ MRAAJAVA_LIBRARIES } ${ MRAA_LIBRARIES } ${ JAVA_LIBRARIES } ${ libname } )
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
)
2016-09-15 18:12:24 +03:00
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /../pom.xml.in
$ { 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 } - $ { V E R S I O N _ M A J O R } . $ { V E R S I O N _ M I N O R } . $ { V E R S I O N _ P A T C H } . p o m )
2015-08-05 19:43:31 +03:00
endif ( )
2016-08-17 17:58:21 -07:00
endmacro ( upm_swig_java )
2015-08-05 19:43:31 +03:00
2014-06-11 13:54:19 +01:00
macro ( upm_doxygen )
2014-08-11 11:31:32 +01:00
if ( DOXYGEN_FOUND )
2014-06-11 13:54:19 +01:00
set ( CMAKE_SWIG_FLAGS -DDOXYGEN= ${ DOXYGEN_FOUND } )
2016-09-29 13:46:20 -07:00
add_dependencies ( doc ${ libname } )
2014-06-11 13:54:19 +01:00
endif ( )
2016-08-17 17:58:21 -07:00
endmacro ( upm_doxygen )
2014-06-11 13:54:19 +01:00
2016-09-29 13:46:20 -07:00
if ( BUILDSWIGNODE )
if ( SWIG_VERSION VERSION_LESS 3.0.5 AND NODE_VERSION_STRING VERSION_GREATER 0.12 )
message ( WARNING "WARNING - SWIG 3.0.5+ required for building with nodejs 0.12. Current version is ${SWIG_VERSION}" )
endif ( )
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
)
macro ( createpackagejson )
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 )
set ( NODE_MODULE_INSTALL_PATH ${ NODE_ROOT_DIR } /lib/node_modules/jsupm_ ${ libname } / )
# If a CMAKE_INSTALL_PREFIX has been provided, set NODE_MODULE_INSTALL_PATH
# relative to the provided install directory.
else ( )
set ( NODE_MODULE_INSTALL_PATH ${ CMAKE_INSTALL_PREFIX } /lib/node_modules/jsupm_ ${ libname } / )
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 } )
endmacro ( createpackagejson )
endif ( BUILDSWIGNODE )
2014-06-11 13:54:19 +01:00
2016-08-17 17:58:21 -07:00
# Process C/C++ sensor modules
# This function pre-processes sensor library input and hands off the
# necessary global variables to upm_module_init for library creation,
# documenation, swigging, etc...
function ( UPM_MIXED_MODULE_INIT )
# CPP_WRAPS_C -> Set to have CPP library link to C library
# DESCRIPTION -> Library description string
# CPP_HDR -> List of CPP header files
# CPP_SRC -> List of CPP source files
# C_HDR -> List of C header files
# C_SRC -> List of C source files
# FTI_SRC -> List of C FTI source files
# REQUIRES -> List requires libraries for pkg-config
set ( options CPP_WRAPS_C )
set ( oneValueArgs NAME DESCRIPTION )
set ( multiValueArgs CPP_HDR CPP_SRC C_HDR C_SRC FTI_SRC FTI_HDR REQUIRES )
# Parse function parameters
cmake_parse_arguments ( UPM_MIXED_MODULE_INIT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
# Set the description
set ( libdescription ${ UPM_MIXED_MODULE_INIT_DESCRIPTION } )
# Always build C libs first
if ( UPM_MIXED_MODULE_INIT_C_SRC )
set ( libname ${ UPM_MIXED_MODULE_INIT_NAME } )
# Set the src and hpp variables for upm_module_init
set ( module_src ${ UPM_MIXED_MODULE_INIT_C_SRC } )
set ( module_hpp ${ UPM_MIXED_MODULE_INIT_C_HDR } )
# Create the reqlibname list
string ( REPLACE ";" " " reqlibname "${UPM_MIXED_MODULE_INIT_REQUIRES}" )
2016-08-24 15:40:30 -06:00
# Append upmc-utilities to the reqlibs (but not on upm-utilities itself)
if ( NOT ${ libname } MATCHES "utilities" )
set ( reqlibname "${reqlibname} upmc-utilities" )
endif ( )
2016-08-17 17:58:21 -07:00
# If building FTI, and FTI src exists, add it in
if ( BUILDFTI AND UPM_MIXED_MODULE_INIT_FTI_SRC )
#set (module_src ${UPM_MIXED_MODULE_INIT_C_SRC} ${UPM_MIXED_MODULE_INIT_FTI_SRC})
list ( APPEND module_src ${ UPM_MIXED_MODULE_INIT_FTI_SRC } )
endif ( BUILDFTI AND UPM_MIXED_MODULE_INIT_FTI_SRC )
# Add include directories for C
include_directories ( ${ UPM_COMMON_HEADER_DIRS }
$ { C M A K E _ S O U R C E _ D I R } / s r c / u t i l i t i e s )
# Set a flag to tell upm_module_init that it's building a C library
set ( IS_C_LIBRARY TRUE )
upm_module_init ( )
2016-08-24 15:40:30 -06:00
# add upmc-utilities as a dependancy to all C libs (but NOT to the
# utilities lib itself)
if ( NOT ${ libname } MATCHES "utilities-c" )
2016-08-31 14:16:56 -07:00
target_link_libraries ( ${ libname } utilities-c )
2016-08-24 15:40:30 -06:00
endif ( )
2016-09-13 11:18:17 -06:00
## "export" the logical C lib target for the calling module's
## CMakeLists.txt
set ( libnamec ${ libname } PARENT_SCOPE )
2016-08-29 17:39:41 -06:00
endif ( UPM_MIXED_MODULE_INIT_C_SRC )
2016-08-17 17:58:21 -07:00
# Build C++ if enabled AND C++ headers exist
if ( BUILDCPP AND UPM_MIXED_MODULE_INIT_CPP_HDR )
# Set the src and hpp variables for upm_module_init
set ( module_src ${ UPM_MIXED_MODULE_INIT_CPP_SRC } )
set ( module_hpp ${ UPM_MIXED_MODULE_INIT_CPP_HDR } )
# Create the reqlibname list
string ( REPLACE ";" " " reqlibname "${UPM_MIXED_MODULE_INIT_REQUIRES}" )
# Reset the libname (upm_module_init can change it)
set ( libname ${ UPM_MIXED_MODULE_INIT_NAME } )
unset ( IS_C_LIBRARY )
upm_module_init ( )
# If the C++ wraps the C target, add the C target as a dependency
if ( UPM_MIXED_MODULE_INIT_CPP_WRAPS_C )
target_link_libraries ( ${ libname } ${ libname } -c )
endif ( UPM_MIXED_MODULE_INIT_CPP_WRAPS_C )
2016-09-13 11:18:17 -06:00
## "export" the logical C++ lib target for the calling module's
## CMakeLists.txt
set ( libnamecxx ${ libname } PARENT_SCOPE )
2016-08-17 17:58:21 -07:00
endif ( BUILDCPP AND UPM_MIXED_MODULE_INIT_CPP_HDR )
2016-09-13 11:18:17 -06:00
2016-08-17 17:58:21 -07:00
endfunction ( UPM_MIXED_MODULE_INIT )
2014-06-11 13:54:19 +01:00
macro ( upm_module_init )
2016-08-17 17:58:21 -07:00
set ( basename ${ libname } )
# If this is a C library, handle different collateral naming
if ( IS_C_LIBRARY )
set ( libname ${ libname } -c )
set ( libprefix upmc- )
set ( pcname upmc- ${ basename } .pc )
else ( )
set ( libprefix upm- )
set ( pcname upm- ${ basename } .pc )
endif ( IS_C_LIBRARY )
2015-12-10 13:57:55 -08:00
link_directories ( ${ MRAA_LIBDIR } )
2016-09-09 14:10:30 -07:00
add_library ( ${ libname } SHARED ${ module_src } ${ module_hpp } )
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 }
2016-08-17 17:58:21 -07:00
P R O P E R T I E S P R E F I X l i b $ { l i b p r e f i x }
O U T P U T _ N A M E $ { b a s e n a m e }
2014-06-17 11:41:05 +01:00
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-08-17 17:58:21 -07:00
upm_create_install_pkgconfig ( ${ pcname } ${ LIB_INSTALL_DIR } /pkgconfig )
# Don't SWIG C
if ( SWIG_FOUND AND NOT IS_C_LIBRARY )
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 ( )
2016-08-17 17:58:21 -07:00
endif ( SWIG_FOUND AND NOT IS_C_LIBRARY )
# Skip doxygen run on C (for now)
if ( BUILDDOC AND NOT IS_C_LIBRARY )
2014-06-11 13:54:19 +01:00
upm_doxygen ( )
endif ( )
2016-08-17 17:58:21 -07:00
install ( TARGETS ${ libname } DESTINATION ${ LIB_INSTALL_DIR } )
2016-04-25 14:27:51 -07:00
install ( FILES ${ module_hpp } 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
2016-09-29 13:46:20 -07:00
if ( BUILDDOC AND BUILDSWIGPYTHON )
2015-12-16 13:58:11 -08:00
# doxy2swig the doxygen output
2016-09-29 13:46:20 -07:00
add_custom_target ( pyupm_doxy2swig ALL
2016-10-05 17:08:42 -07:00
C O M M A N D $ { P Y T H O N 2 _ 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
2015-12-16 13:58:11 -08:00
$ { 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
2016-09-29 13:46:20 -07:00
D E P E N D S d o c )
2015-12-16 13:58:11 -08:00
# BUILDDOC not set but still building python modules, generate an empty
# pyupm_doxy2swig.i file (overwriting if necessary)
2016-09-29 13:46:20 -07:00
elseif ( BUILDSWIGPYTHON )
2016-09-29 18:24:19 -07:00
message ( STATUS "BUILDDOC=${BUILDDOC}, python modules will not contain cxx documentation" )
2015-12-16 13:58:11 -08:00
file ( WRITE ${ CMAKE_CURRENT_BINARY_DIR } /pyupm_doxy2swig.i "// Empty doxy2swig stub" )
2016-09-29 13:46:20 -07:00
endif ( BUILDDOC AND BUILDSWIGPYTHON )
2015-12-16 13:58:11 -08:00
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 ( )