From 9ec5c146cee17062d3273ae50d551f893536201d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 28 Jul 2013 21:48:42 -0700 Subject: gras: created GRAS_SWIG_TOOL to help registering new types --- CMakeLists.txt | 1 + cmake/Modules/GRASTool.in.cmake | 166 ++++++++++++++++++++++++++++++---------- 2 files changed, 125 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b609b2..69d7785 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,7 @@ CPACK_COMPONENT("${GRAS_COMP_PYTHON}" list(APPEND CMAKE_MODULE_PATH ${GRAS_SOURCE_DIR}/cmake/Modules) list(APPEND CMAKE_MODULE_PATH ${GRAS_BINARY_DIR}/cmake/Modules) set(GRAS_ROOT ${GRAS_SOURCE_DIR}) +list(APPEND GR_TEST_ENVIRONS "GRAS_ROOT=${GRAS_SOURCE_DIR}") set(CMAKE_SOURCE_DIR ${GRAS_SOURCE_DIR}/grextras) set(CMAKE_BINARY_DIR ${GRAS_BINARY_DIR}/grextras) diff --git a/cmake/Modules/GRASTool.in.cmake b/cmake/Modules/GRASTool.in.cmake index ce729c1..a478e3a 100644 --- a/cmake/Modules/GRASTool.in.cmake +++ b/cmake/Modules/GRASTool.in.cmake @@ -26,6 +26,44 @@ else() set(GRAS_ROOT "@CMAKE_INSTALL_PREFIX@") endif() +######################################################################## +## where to look for development files +######################################################################## +set(GRAS_TOOL_INCLUDE_DIR ${GRAS_ROOT}/include) +set(GRAS_TOOL_LIBRARY_DIR ${GRAS_ROOT}/lib@LIBSUFFIX@) + +#locate PMC and GRAS includes +if (NOT PMC_INCLUDE_DIRS) + find_path( + PMC_INCLUDE_DIRS + NAMES PMC/PMC.hpp + PATHS ${GRAS_TOOL_INCLUDE_DIR} + ) +endif() +if (NOT GRAS_INCLUDE_DIRS) + find_path( + GRAS_INCLUDE_DIRS + NAMES gras/gras.hpp + PATHS ${GRAS_TOOL_INCLUDE_DIR} + ) +endif() + +#locate PMC and GRAS libraries +if (NOT PMC_LIBRARIES) + find_library( + PMC_LIBRARIES + NAMES pmc + PATHS ${GRAS_TOOL_LIBRARY_DIR} + ) +endif() +if (NOT GRAS_LIBRARIES) + find_library( + GRAS_LIBRARIES + NAMES gras + PATHS ${GRAS_TOOL_LIBRARY_DIR} + ) +endif() + ######################################################################## ## GRAS_TOOL cmake function - the swiss army knife for GRAS users ## @@ -86,55 +124,14 @@ function(GRAS_TOOL) set(GRAS_TOOL_PYTHON_DIR lib@LIBSUFFIX@/gras/python/${GRAS_TOOL_DIRECTORY}) set(GRAS_TOOL_GRC_DIR share/gnuradio/grc/blocks/${GRAS_TOOL_DIRECTORY}) - #were to look for development files - set(GRAS_TOOL_INCLUDE_DIR ${GRAS_ROOT}/include) - set(GRAS_TOOL_LIBRARY_DIR ${GRAS_ROOT}/lib@LIBSUFFIX@) - + #development and framework directories include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - - #locate PMC and GRAS includes - if (NOT PMC_INCLUDE_DIRS) - find_path( - PMC_INCLUDE_DIRS - NAMES PMC/PMC.hpp - PATHS ${GRAS_TOOL_INCLUDE_DIR} - ) - endif() include_directories(${PMC_INCLUDE_DIRS}) - if (NOT GRAS_INCLUDE_DIRS) - find_path( - GRAS_INCLUDE_DIRS - NAMES gras/gras.hpp - PATHS ${GRAS_TOOL_INCLUDE_DIR} - ) - endif() include_directories(${GRAS_INCLUDE_DIRS}) - - #locate PMC and GRAS libraries - if (NOT PMC_LIBRARIES) - find_library( - PMC_LIBRARIES - NAMES pmc - PATHS ${GRAS_TOOL_LIBRARY_DIR} - ) - endif() list(APPEND GRAS_TOOL_LIBRARIES ${PMC_LIBRARIES}) - if (NOT GRAS_LIBRARIES) - find_library( - GRAS_LIBRARIES - NAMES gras - PATHS ${GRAS_TOOL_LIBRARY_DIR} - ) - endif() list(APPEND GRAS_TOOL_LIBRARIES ${GRAS_LIBRARIES}) #and boost includes as well - if (NOT Boost_FOUND) - find_package(Boost COMPONENTS) - if (NOT Boost_FOUND) - message(FATAL_ERROR "GRAS_TOOL could not find boost headers!") - endif() - endif() include_directories(${Boost_INCLUDE_DIRS}) #build and install module to path @@ -172,3 +169,88 @@ function(GRAS_TOOL) endif() endfunction(GRAS_TOOL) + +######################################################################## +## GRAS_SWIG_TOOL cmake function - export new types for the loader +## +## Options: +## SOURCE - the swig .i file +## TARGET - target name for the build products +## DIRECTORY - name of installation directory or ${TARGET} +## COMPONENT - name of installation component or ${TARGET} +## +## External vars: +## GRAS_SWIG_TOOL_INCLUDES - list of additional include directories +## GRAS_SWIG_TOOL_LIBRARIES - list of additional libraries to link to +######################################################################## +function(GRAS_SWIG_TOOL) + + find_package(SWIG) + if(NOT SWIG_FOUND) + return() + endif() + + find_package(PythonLibs) + if(NOT PYTHONLIBS_FOUND) + return() + endif() + + include(CMakeParseArguments) + cmake_parse_arguments(GRAS_SWIG_TOOL "" "SOURCE;TARGET;DIRECTORY;COMPONENT" "" ${ARGN}) + + #give an install directory if not specified + if(NOT GRAS_SWIG_TOOL_DIRECTORY) + set(GRAS_SWIG_TOOL_DIRECTORY ${GRAS_SWIG_TOOL_TARGET}) + endif() + + #give the target a component name if not specified + if(NOT GRAS_SWIG_TOOL_COMPONENT) + set(GRAS_SWIG_TOOL_COMPONENT ${GRAS_SWIG_TOOL_TARGET}) + endif() + + #development and framework directories + list(APPEND GRAS_SWIG_TOOL_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}) + list(APPEND GRAS_SWIG_TOOL_INCLUDES ${PMC_SWIG_INCLUDE_DIRS}) + list(APPEND GRAS_SWIG_TOOL_INCLUDES ${GRAS_SWIG_INCLUDE_DIRS}) + list(APPEND GRAS_SWIG_TOOL_LIBRARIES ${PMC_LIBRARIES}) + list(APPEND GRAS_SWIG_TOOL_LIBRARIES ${GRAS_LIBRARIES}) + + #and boost includes as well + include_directories(${Boost_INCLUDE_DIRS}) + + #setup python includes/libs + include_directories(${PYTHON_INCLUDE_PATH}) + include_directories(${PYTHON_INCLUDE_DIRS}) + list(APPEND GRAS_SWIG_TOOL_LIBRARIES ${PYTHON_LIBRARIES}) + + #include swig generation deps for compiling + include_directories(${GRAS_SWIG_TOOL_INCLUDES}) + + #set the C++ property on the swig .i file so it builds + set_source_files_properties(${GRAS_SWIG_TOOL_SOURCE} PROPERTIES CPLUSPLUS ON) + + #setup swig flags + foreach(inc ${GRAS_SWIG_TOOL_INCLUDES}) + list(APPEND CMAKE_SWIG_FLAGS "-I${inc}") + endforeach(inc) + set(CMAKE_SWIG_FLAGS -fvirtual -module ${GRAS_SWIG_TOOL_TARGET} ${CMAKE_SWIG_FLAGS}) + + #register swig build + include(UseSWIG) + SWIG_ADD_MODULE(${GRAS_SWIG_TOOL_TARGET} python ${GRAS_SWIG_TOOL_SOURCE}) + SWIG_LINK_LIBRARIES(${GRAS_SWIG_TOOL_TARGET} ${GRAS_SWIG_TOOL_LIBRARIES}) + + #install rules for generated module and py file + set(GRAS_TOOL_PYTHON_DIR lib@LIBSUFFIX@/gras/python/${GRAS_SWIG_TOOL_DIRECTORY}) + install( + TARGETS ${SWIG_MODULE_${GRAS_SWIG_TOOL_TARGET}_REAL_NAME} + DESTINATION ${GRAS_TOOL_PYTHON_DIR} + COMPONENT ${GRAS_SWIG_TOOL_COMPONENT} + ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${GRAS_SWIG_TOOL_TARGET}.py + DESTINATION ${GRAS_TOOL_PYTHON_DIR} + COMPONENT ${GRAS_SWIG_TOOL_COMPONENT} + ) + +endfunction(GRAS_SWIG_TOOL) -- cgit