From 180fd0042a3d0deada34c5df5012d8784b48f4a8 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Sat, 26 Oct 2013 21:09:50 +0200 Subject: [PATCH] gr-fosphor: Make the different GUI version optional You'd don't have to have glfw, qt and wx all at once, you can select which variant you want built. Python support is also make fully optional Signed-off-by: Sylvain Munaut --- CMakeLists.txt | 64 ++++++++++--- cmake/Modules/GrComponent.cmake | 115 ++++++++++++++++++++++++ grc/CMakeLists.txt | 9 +- include/gnuradio/fosphor/CMakeLists.txt | 13 ++- lib/CMakeLists.txt | 39 +++++--- lib/qt_sink_c_impl.cc | 12 ++- python/CMakeLists.txt | 9 +- python/__init__.py | 6 +- swig/CMakeLists.txt | 4 + swig/fosphor_swig.i | 6 ++ 10 files changed, 241 insertions(+), 36 deletions(-) create mode 100644 cmake/Modules/GrComponent.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 35debec..d09121f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,16 +92,13 @@ set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks) ######################################################################## # Find gr-fosphor build dependencies ######################################################################## + +# Required find_package(OpenGL) if(NOT OPENGL_FOUND) message(FATAL_ERROR "OpenGL required to compile gr-fosphor") endif() -find_package(GLFW3) -if (NOT GLFW3_FOUND) - message(FATAL_ERROR "GLFW3 required to compile gr-fosphor") -endif() - find_package(OpenCL) if(NOT OPENCL_FOUND) message(FATAL_ERROR "OpenCL required to compile gr-fosphor") @@ -112,9 +109,13 @@ if(NOT FREETYPE2_FOUND) message(FATAL_ERROR "freetype2 required to compile gr-fosphor") endif() -find_package(Qt4 4.2.0 COMPONENTS QtCore QtGui QtOpenGL) -include(GrSetupQt4) +# Optional +find_package(GLFW3) +find_package(Qt4 4.2.0 COMPONENTS QtCore QtGui QtOpenGL) +if (QT_FOUND) + include(GrSetupQt4) +endif (QT_FOUND) ######################################################################## # Find gnuradio build dependencies @@ -131,6 +132,38 @@ endif() find_package(Doxygen) +find_package(PythonLibs 2) + +find_package(SWIG) + +######################################################################## +# Setup the components +######################################################################## + +include(GrComponent) + +GR_REGISTER_COMPONENT("Python" ENABLE_PYTHON + PYTHONLIBS_FOUND SWIG_FOUND +) + +GR_REGISTER_COMPONENT("GLFW" ENABLE_GLFW + GLFW3_FOUND +) + +GR_REGISTER_COMPONENT("QT" ENABLE_QT + QT_FOUND +) + +GR_REGISTER_COMPONENT("WX" ENABLE_WX + PYTHONLIBS_FOUND SWIG_FOUND ENABLE_PYTHON +) + +macro(list_cond_append cond list_name) + if(${cond}) + list(APPEND ${list_name} ${ARGN}) + endif(${cond}) +endmacro(list_cond_append) + ######################################################################## # Setup the include and linker paths ######################################################################## @@ -168,10 +201,14 @@ add_custom_target(uninstall ######################################################################## add_subdirectory(include/gnuradio/fosphor) add_subdirectory(lib) -add_subdirectory(swig) -add_subdirectory(python) -add_subdirectory(grc) -add_subdirectory(apps) + +if(ENABLE_PYTHON) + add_subdirectory(swig) + add_subdirectory(python) + add_subdirectory(grc) + add_subdirectory(apps) +endif(ENABLE_PYTHON) + add_subdirectory(docs) ######################################################################## @@ -191,3 +228,8 @@ install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-fosphor.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig ) + +######################################################################## +# Print Summary +######################################################################## +GR_PRINT_COMPONENT_SUMMARY() diff --git a/cmake/Modules/GrComponent.cmake b/cmake/Modules/GrComponent.cmake new file mode 100644 index 0000000..a6c2912 --- /dev/null +++ b/cmake/Modules/GrComponent.cmake @@ -0,0 +1,115 @@ +# Copyright 2010-2011 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +if(DEFINED __INCLUDED_GR_COMPONENT_CMAKE) + return() +endif() +set(__INCLUDED_GR_COMPONENT_CMAKE TRUE) + +set(_gr_enabled_components "" CACHE INTERNAL "" FORCE) +set(_gr_disabled_components "" CACHE INTERNAL "" FORCE) + +if(NOT DEFINED ENABLE_DEFAULT) + set(ENABLE_DEFAULT ON) + message(STATUS "") + message(STATUS "The build system will automatically enable all components.") + message(STATUS "Use -DENABLE_DEFAULT=OFF to disable components by default.") +endif() + +######################################################################## +# Register a component into the system +# - name: canonical component name +# - var: variable for enabled status +# - argn: list of dependencies +######################################################################## +function(GR_REGISTER_COMPONENT name var) + include(CMakeDependentOption) + message(STATUS "") + message(STATUS "Configuring ${name} support...") + foreach(dep ${ARGN}) + message(STATUS " Dependency ${dep} = ${${dep}}") + endforeach(dep) + + #if the user set the var to force, we note this + if("${${var}}" STREQUAL "FORCE") + set(${var} ON) + set(var_force TRUE) + else() + set(var_force FALSE) + endif() + + #rewrite the dependency list so that deps that are also components use the cached version + unset(comp_deps) + foreach(dep ${ARGN}) + list(FIND _gr_enabled_components ${dep} dep_enb_index) + list(FIND _gr_disabled_components ${dep} dep_dis_index) + if (${dep_enb_index} EQUAL -1 AND ${dep_dis_index} EQUAL -1) + list(APPEND comp_deps ${dep}) + else() + list(APPEND comp_deps ${dep}_cached) #is a component, use cached version + endif() + endforeach(dep) + + #setup the dependent option for this component + CMAKE_DEPENDENT_OPTION(${var} "enable ${name} support" ${ENABLE_DEFAULT} "${comp_deps}" OFF) + set(${var} "${${var}}" PARENT_SCOPE) + set(${var}_cached "${${var}}" CACHE INTERNAL "" FORCE) + + #force was specified, but the dependencies were not met + if(NOT ${var} AND var_force) + message(FATAL_ERROR "user force-enabled ${name} but configuration checked failed") + endif() + + #append the component into one of the lists + if(${var}) + message(STATUS " Enabling ${name} support.") + list(APPEND _gr_enabled_components ${name}) + else(${var}) + message(STATUS " Disabling ${name} support.") + list(APPEND _gr_disabled_components ${name}) + endif(${var}) + message(STATUS " Override with -D${var}=ON/OFF") + + #make components lists into global variables + set(_gr_enabled_components ${_gr_enabled_components} CACHE INTERNAL "" FORCE) + set(_gr_disabled_components ${_gr_disabled_components} CACHE INTERNAL "" FORCE) +endfunction(GR_REGISTER_COMPONENT) + +######################################################################## +# Print the registered component summary +######################################################################## +function(GR_PRINT_COMPONENT_SUMMARY) + message(STATUS "") + message(STATUS "######################################################") + message(STATUS "# gr-fosphor enabled components ") + message(STATUS "######################################################") + foreach(comp ${_gr_enabled_components}) + message(STATUS " * ${comp}") + endforeach(comp) + + message(STATUS "") + message(STATUS "######################################################") + message(STATUS "# gr-fosphor disabled components ") + message(STATUS "######################################################") + foreach(comp ${_gr_disabled_components}) + message(STATUS " * ${comp}") + endforeach(comp) + + message(STATUS "") +endfunction(GR_PRINT_COMPONENT_SUMMARY) diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index 94a5986..6cfe5af 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -16,9 +16,12 @@ # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. + +list_cond_append(ENABLE_GLFW fosphor_grc fosphor_glfw_sink_c.xml) +list_cond_append(ENABLE_QT fosphor_grc fosphor_qt_sink_c.xml) +list_cond_append(ENABLE_WX fosphor_grc fosphor_wx_sink_c.xml) + install(FILES - fosphor_glfw_sink_c.xml - fosphor_qt_sink_c.xml - fosphor_wx_sink_c.xml + ${fosphor_grc} DESTINATION share/gnuradio/grc/blocks ) diff --git a/include/gnuradio/fosphor/CMakeLists.txt b/include/gnuradio/fosphor/CMakeLists.txt index 1d6f9b9..201bcfa 100644 --- a/include/gnuradio/fosphor/CMakeLists.txt +++ b/include/gnuradio/fosphor/CMakeLists.txt @@ -20,11 +20,16 @@ ######################################################################## # Install public header files ######################################################################## -install(FILES +list(APPEND fosphor_headers api.h base_sink_c.h - glfw_sink_c.h - qt_sink_c.h - wx_core_sink_c.h +) + +list_cond_append(ENABLE_GLFW fosphor_headers glfw_sink_c.h) +list_cond_append(ENABLE_QT fosphor_headers qt_sink_c.h) +list_cond_append(ENABLE_WX fosphor_headers wx_core_sink_c.h) + +install(FILES + ${fosphor_headers} DESTINATION include/gnuradio/fosphor ) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 29e55ae..a68c3e7 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -23,7 +23,6 @@ include(GrPlatform) #define LIB_SUFFIX include(GrMiscUtils) -find_package(PythonLibs 2) find_package(PythonInterp 2) add_custom_command( @@ -36,22 +35,31 @@ add_custom_command( include_directories( ${OPENGL_INCLUDE_DIRS} - ${GLFW3_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS} ${FREETYPE2_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} - ${PYTHON_INCLUDE_DIRS} - ${QT_INCLUDE_DIRS} ) link_directories( ${OPENGL_LIBRARY_DIRS} - ${GLFW3_LIBRARY_DIRS} ${OPENCL_LIBRARY_DIRS} ${FREETYPE2_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS} ) -set(CMAKE_AUTOMOC ON) +if(ENABLE_PYTHON) + add_definitions(-DENABLE_PYTHON) + include_directories(${PYTHON_INCLUDE_DIRS}) +endif(ENABLE_PYTHON) + +if(ENABLE_GLFW) + include_directories(${GLFW3_INCLUDE_DIRS}) + link_directories(${GLFW3_LIBRARY_DIRS}) +endif(ENABLE_GLFW) + +if(ENABLE_QT) + set(CMAKE_AUTOMOC ON) + include_directories(${QT_INCLUDE_DIRS}) +endif(ENABLE_QT) list(APPEND fosphor_sources fosphor/cl.c @@ -63,23 +71,26 @@ list(APPEND fosphor_sources fosphor/resource.c fosphor/resource_data.c fifo.cc - QGLSurface.cc base_sink_c_impl.cc - glfw_sink_c_impl.cc - qt_sink_c_impl.cc - wx_core_sink_c_impl.cc ) -add_library(gnuradio-fosphor SHARED ${fosphor_sources}) -target_link_libraries(gnuradio-fosphor +list_cond_append(ENABLE_GLFW fosphor_sources glfw_sink_c_impl.cc) +list_cond_append(ENABLE_QT fosphor_sources QGLSurface.cc qt_sink_c_impl.cc) +list_cond_append(ENABLE_WX fosphor_sources wx_core_sink_c_impl.cc) + +list(APPEND fosphor_libraries ${OPENGL_LIBRARIES} - ${GLFW3_LIBRARIES} ${OPENCL_LIBRARIES} ${FREETYPE2_LIBRARIES} ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} - ${QT_LIBRARIES} ) + +list_cond_append(ENABLE_GLFW fosphor_libraries ${GLFW3_LIBRARIES}) +list_cond_append(ENABLE_QT fosphor_libraries ${QT_LIBRARIES}) + +add_library(gnuradio-fosphor SHARED ${fosphor_sources}) +target_link_libraries(gnuradio-fosphor ${fosphor_libraries}) set_target_properties(gnuradio-fosphor PROPERTIES DEFINE_SYMBOL "gnuradio_fosphor_EXPORTS") GR_LIBRARY_FOO(gnuradio-fosphor) diff --git a/lib/qt_sink_c_impl.cc b/lib/qt_sink_c_impl.cc index d53feec..aa651e5 100644 --- a/lib/qt_sink_c_impl.cc +++ b/lib/qt_sink_c_impl.cc @@ -18,7 +18,9 @@ * Boston, MA 02110-1301, USA. */ -#include +#ifdef ENABLE_PYTHON +# include +#endif #ifdef HAVE_CONFIG_H #include "config.h" @@ -85,6 +87,7 @@ qt_sink_c_impl::glctx_fini() } +#ifdef ENABLE_PYTHON PyObject* qt_sink_c_impl::pyqwidget() { @@ -92,6 +95,13 @@ qt_sink_c_impl::pyqwidget() PyObject *retarg = Py_BuildValue("N", w); return retarg; } +#else +void* +qt_sink_c_impl::pyqwidget() +{ + return NULL; +} +#endif } /* namespace fosphor */ } /* namespace gr */ diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index c09a23d..7530656 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -28,10 +28,15 @@ endif() ######################################################################## # Install python sources ######################################################################## +list(APPEND fosphor_python + __init__.py +) + +list_cond_append(ENABLE_WX fosphor_python wx_sink_c.py) + GR_PYTHON_INSTALL( FILES - __init__.py - wx_sink_c.py + ${fosphor_python} DESTINATION ${GR_PYTHON_DIR}/gnuradio/fosphor ) diff --git a/python/__init__.py b/python/__init__.py index fbe4be3..e28bfb1 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -45,7 +45,11 @@ if _RTLD_GLOBAL != 0: from fosphor_swig import * # import any pure python here -from wx_sink_c import wx_sink_c +try: + from wx_sink_c import wx_sink_c +except ImportError: + # No WX support most likely + pass # # ---------------------------------------------------------------- diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index 816a047..b72ec66 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -39,6 +39,10 @@ set(GR_SWIG_LIBRARIES gnuradio-fosphor) set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/fosphor_swig_doc.i) set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include/gnuradio/fosphor) +list_cond_append(ENABLE_GLFW GR_SWIG_FLAGS -DENABLE_GLFW) +list_cond_append(ENABLE_QT GR_SWIG_FLAGS -DENABLE_QT) +list_cond_append(ENABLE_WX GR_SWIG_FLAGS -DENABLE_WX) + GR_SWIG_MAKE(fosphor_swig fosphor_swig.i) ######################################################################## diff --git a/swig/fosphor_swig.i b/swig/fosphor_swig.i index 342dda1..f908756 100644 --- a/swig/fosphor_swig.i +++ b/swig/fosphor_swig.i @@ -16,12 +16,18 @@ %include "gnuradio/fosphor/base_sink_c.h" +#ifdef ENABLE_GLFW %nodefaultctor gr::fosphor::glfw_sink_c; // bug workaround %include "gnuradio/fosphor/glfw_sink_c.h" GR_SWIG_BLOCK_MAGIC2(fosphor, glfw_sink_c); +#endif +#ifdef ENABLE_QT %include "gnuradio/fosphor/qt_sink_c.h" GR_SWIG_BLOCK_MAGIC2(fosphor, qt_sink_c); +#endif +#ifdef ENABLE_WX %include "gnuradio/fosphor/wx_core_sink_c.h" GR_SWIG_BLOCK_MAGIC2(fosphor, wx_core_sink_c); +#endif