mirror of
https://github.com/hb9fxq/gr-digitalhf
synced 2024-12-22 07:09:59 +00:00
intermediate
This commit is contained in:
parent
4dbcd47724
commit
37d98db318
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
build/
|
||||||
|
*~
|
||||||
|
*.pyc
|
227
CMakeLists.txt
Normal file
227
CMakeLists.txt
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
# Copyright 2011,2012,2014,2016 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Project setup
|
||||||
|
########################################################################
|
||||||
|
cmake_minimum_required(VERSION 2.6)
|
||||||
|
project(gr-digitalhf CXX C)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
#install to PyBOMBS target prefix if defined
|
||||||
|
if(DEFINED ENV{PYBOMBS_PREFIX})
|
||||||
|
set(CMAKE_INSTALL_PREFIX $ENV{PYBOMBS_PREFIX})
|
||||||
|
message(STATUS "PyBOMBS installed GNU Radio. Setting CMAKE_INSTALL_PREFIX to $ENV{PYBOMBS_PREFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#select the release build type by default to get optimization flags
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE "Release")
|
||||||
|
message(STATUS "Build type not specified: defaulting to release.")
|
||||||
|
endif(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
||||||
|
|
||||||
|
#make sure our local CMake Modules path comes first
|
||||||
|
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||||
|
|
||||||
|
# Set the version information here
|
||||||
|
set(VERSION_INFO_MAJOR_VERSION 1)
|
||||||
|
set(VERSION_INFO_API_COMPAT 0)
|
||||||
|
set(VERSION_INFO_MINOR_VERSION 0)
|
||||||
|
set(VERSION_INFO_MAINT_VERSION git)
|
||||||
|
|
||||||
|
# Set cmake policies.
|
||||||
|
# This will suppress developer warnings during the cmake process that can occur
|
||||||
|
# if a newer cmake version than the minimum is used.
|
||||||
|
|
||||||
|
if(POLICY CMP0026)
|
||||||
|
cmake_policy(SET CMP0026 OLD)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0043)
|
||||||
|
cmake_policy(SET CMP0043 OLD)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0045)
|
||||||
|
cmake_policy(SET CMP0045 OLD)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0046)
|
||||||
|
cmake_policy(SET CMP0046 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Compiler specific setup
|
||||||
|
########################################################################
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
||||||
|
#http://gcc.gnu.org/wiki/Visibility
|
||||||
|
add_definitions(-fvisibility=hidden)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#include(GrPython)
|
||||||
|
find_package(PythonInterp)
|
||||||
|
if(NOT PYTHONINTERP_FOUND)
|
||||||
|
message(FATAL_ERROR "Python interpreter required by the build system.")
|
||||||
|
endif(NOT PYTHONINTERP_FOUND)
|
||||||
|
# locate python
|
||||||
|
include(FindPythonLibs)
|
||||||
|
MESSAGE("YYY ${PYTHON_LIBRARIES}")
|
||||||
|
#)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Find boost
|
||||||
|
########################################################################
|
||||||
|
if(UNIX AND EXISTS "/usr/lib64")
|
||||||
|
list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
|
||||||
|
endif(UNIX AND EXISTS "/usr/lib64")
|
||||||
|
set(Boost_ADDITIONAL_VERSIONS
|
||||||
|
"1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39"
|
||||||
|
"1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
|
||||||
|
"1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49"
|
||||||
|
"1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54"
|
||||||
|
"1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
|
||||||
|
"1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
|
||||||
|
"1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
|
||||||
|
)
|
||||||
|
find_package(Boost "1.35" COMPONENTS filesystem system python numpy)
|
||||||
|
|
||||||
|
if(NOT Boost_FOUND)
|
||||||
|
message(FATAL_ERROR "Boost required to compile digitalhf")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install directories
|
||||||
|
########################################################################
|
||||||
|
include(GrPlatform) #define LIB_SUFFIX
|
||||||
|
set(GR_RUNTIME_DIR bin)
|
||||||
|
set(GR_LIBRARY_DIR lib${LIB_SUFFIX})
|
||||||
|
set(GR_INCLUDE_DIR include/digitalhf)
|
||||||
|
set(GR_DATA_DIR share)
|
||||||
|
set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
|
set(GR_DOC_DIR ${GR_DATA_DIR}/doc)
|
||||||
|
set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
|
set(GR_CONF_DIR etc)
|
||||||
|
set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
|
||||||
|
set(GR_LIBEXEC_DIR libexec)
|
||||||
|
set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
|
set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# On Apple only, set install name and use rpath correctly, if not already set
|
||||||
|
########################################################################
|
||||||
|
if(APPLE)
|
||||||
|
if(NOT CMAKE_INSTALL_NAME_DIR)
|
||||||
|
set(CMAKE_INSTALL_NAME_DIR
|
||||||
|
${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
|
||||||
|
PATH "Library Install Name Destination Directory" FORCE)
|
||||||
|
endif(NOT CMAKE_INSTALL_NAME_DIR)
|
||||||
|
if(NOT CMAKE_INSTALL_RPATH)
|
||||||
|
set(CMAKE_INSTALL_RPATH
|
||||||
|
${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
|
||||||
|
PATH "Library Install RPath" FORCE)
|
||||||
|
endif(NOT CMAKE_INSTALL_RPATH)
|
||||||
|
if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
||||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE
|
||||||
|
BOOL "Do Build Using Library Install RPath" FORCE)
|
||||||
|
endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Find gnuradio build dependencies
|
||||||
|
########################################################################
|
||||||
|
find_package(CppUnit)
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
# Search for GNU Radio and its components and versions. Add any
|
||||||
|
# components required to the list of GR_REQUIRED_COMPONENTS (in all
|
||||||
|
# caps such as FILTER or FFT) and change the version to the minimum
|
||||||
|
# API compatible version required.
|
||||||
|
set(GR_REQUIRED_COMPONENTS RUNTIME)
|
||||||
|
find_package(Gnuradio "3.7.2" REQUIRED)
|
||||||
|
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||||
|
include(GrVersion)
|
||||||
|
|
||||||
|
if(NOT CPPUNIT_FOUND)
|
||||||
|
message(FATAL_ERROR "CppUnit required to compile digitalhf")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup doxygen option
|
||||||
|
########################################################################
|
||||||
|
if(DOXYGEN_FOUND)
|
||||||
|
option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
|
||||||
|
else(DOXYGEN_FOUND)
|
||||||
|
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
|
||||||
|
endif(DOXYGEN_FOUND)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup the include and linker paths
|
||||||
|
########################################################################
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_SOURCE_DIR}/lib
|
||||||
|
${CMAKE_SOURCE_DIR}/include
|
||||||
|
${CMAKE_BINARY_DIR}/lib
|
||||||
|
${CMAKE_BINARY_DIR}/include
|
||||||
|
${PYTHON_INCLUDE_DIR}
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${CPPUNIT_INCLUDE_DIRS}
|
||||||
|
${GNURADIO_ALL_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
link_directories(
|
||||||
|
${Boost_LIBRARY_DIRS}
|
||||||
|
${CPPUNIT_LIBRARY_DIRS}
|
||||||
|
${GNURADIO_RUNTIME_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Set component parameters
|
||||||
|
set(GR_DIGITALHF_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
|
||||||
|
set(GR_DIGITALHF_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Create uninstall target
|
||||||
|
########################################################################
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
||||||
|
@ONLY)
|
||||||
|
|
||||||
|
add_custom_target(uninstall
|
||||||
|
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
||||||
|
)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Add subdirectories
|
||||||
|
########################################################################
|
||||||
|
add_subdirectory(include/digitalhf)
|
||||||
|
add_subdirectory(lib)
|
||||||
|
add_subdirectory(swig)
|
||||||
|
add_subdirectory(python)
|
||||||
|
add_subdirectory(grc)
|
||||||
|
add_subdirectory(apps)
|
||||||
|
add_subdirectory(docs)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install cmake search helper for this library
|
||||||
|
########################################################################
|
||||||
|
if(NOT CMAKE_MODULES_DIR)
|
||||||
|
set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
|
||||||
|
endif(NOT CMAKE_MODULES_DIR)
|
||||||
|
|
||||||
|
install(FILES cmake/Modules/digitalhfConfig.cmake
|
||||||
|
DESTINATION ${CMAKE_MODULES_DIR}/digitalhf
|
||||||
|
)
|
674
LICENSE
674
LICENSE
|
@ -1,674 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program 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 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
16
MANIFEST.md
Normal file
16
MANIFEST.md
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
title: The DIGITALHF OOT Module
|
||||||
|
brief: Short description of gr-digitalhf
|
||||||
|
tags: # Tags are arbitrary, but look at CGRAN what other authors are using
|
||||||
|
- sdr
|
||||||
|
author:
|
||||||
|
- Author Name <authors@email.address>
|
||||||
|
copyright_owner:
|
||||||
|
- Copyright Owner 1
|
||||||
|
license:
|
||||||
|
#repo: # Put the URL of the repository here, or leave blank for default
|
||||||
|
#website: <module_website> # If you have a separate project website, put it here
|
||||||
|
#icon: <icon_url> # Put a URL to a square image here that will be used as an icon on CGRAN
|
||||||
|
---
|
||||||
|
A longer, multi-line description of gr-digitalhf.
|
||||||
|
You may use some *basic* Markdown here.
|
||||||
|
If left empty, it will try to find a README file instead.
|
26
apps/CMakeLists.txt
Normal file
26
apps/CMakeLists.txt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
GR_PYTHON_INSTALL(
|
||||||
|
PROGRAMS
|
||||||
|
DESTINATION bin
|
||||||
|
)
|
138
cmake/Modules/CMakeParseArgumentsCopy.cmake
Normal file
138
cmake/Modules/CMakeParseArgumentsCopy.cmake
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> <multi_value_keywords> args...)
|
||||||
|
#
|
||||||
|
# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions for
|
||||||
|
# parsing the arguments given to that macro or function.
|
||||||
|
# It processes the arguments and defines a set of variables which hold the
|
||||||
|
# values of the respective options.
|
||||||
|
#
|
||||||
|
# The <options> argument contains all options for the respective macro,
|
||||||
|
# i.e. keywords which can be used when calling the macro without any value
|
||||||
|
# following, like e.g. the OPTIONAL keyword of the install() command.
|
||||||
|
#
|
||||||
|
# The <one_value_keywords> argument contains all keywords for this macro
|
||||||
|
# which are followed by one value, like e.g. DESTINATION keyword of the
|
||||||
|
# install() command.
|
||||||
|
#
|
||||||
|
# The <multi_value_keywords> argument contains all keywords for this macro
|
||||||
|
# which can be followed by more than one value, like e.g. the TARGETS or
|
||||||
|
# FILES keywords of the install() command.
|
||||||
|
#
|
||||||
|
# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
|
||||||
|
# keywords listed in <options>, <one_value_keywords> and
|
||||||
|
# <multi_value_keywords> a variable composed of the given <prefix>
|
||||||
|
# followed by "_" and the name of the respective keyword.
|
||||||
|
# These variables will then hold the respective value from the argument list.
|
||||||
|
# For the <options> keywords this will be TRUE or FALSE.
|
||||||
|
#
|
||||||
|
# All remaining arguments are collected in a variable
|
||||||
|
# <prefix>_UNPARSED_ARGUMENTS, this can be checked afterwards to see whether
|
||||||
|
# your macro was called with unrecognized parameters.
|
||||||
|
#
|
||||||
|
# As an example here a my_install() macro, which takes similar arguments as the
|
||||||
|
# real install() command:
|
||||||
|
#
|
||||||
|
# function(MY_INSTALL)
|
||||||
|
# set(options OPTIONAL FAST)
|
||||||
|
# set(oneValueArgs DESTINATION RENAME)
|
||||||
|
# set(multiValueArgs TARGETS CONFIGURATIONS)
|
||||||
|
# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
|
||||||
|
# ...
|
||||||
|
#
|
||||||
|
# Assume my_install() has been called like this:
|
||||||
|
# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
|
||||||
|
#
|
||||||
|
# After the cmake_parse_arguments() call the macro will have set the following
|
||||||
|
# variables:
|
||||||
|
# MY_INSTALL_OPTIONAL = TRUE
|
||||||
|
# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
|
||||||
|
# MY_INSTALL_DESTINATION = "bin"
|
||||||
|
# MY_INSTALL_RENAME = "" (was not used)
|
||||||
|
# MY_INSTALL_TARGETS = "foo;bar"
|
||||||
|
# MY_INSTALL_CONFIGURATIONS = "" (was not used)
|
||||||
|
# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
|
||||||
|
#
|
||||||
|
# You can the continue and process these variables.
|
||||||
|
#
|
||||||
|
# Keywords terminate lists of values, e.g. if directly after a one_value_keyword
|
||||||
|
# another recognized keyword follows, this is interpreted as the beginning of
|
||||||
|
# the new option.
|
||||||
|
# E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
|
||||||
|
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
|
||||||
|
# be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefore.
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2010 Alexander Neundorf <neundorf@kde.org>
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
|
||||||
|
if(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)
|
||||||
|
|
||||||
|
|
||||||
|
function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
|
||||||
|
# first set all result variables to empty/FALSE
|
||||||
|
foreach(arg_name ${_singleArgNames} ${_multiArgNames})
|
||||||
|
set(${prefix}_${arg_name})
|
||||||
|
endforeach(arg_name)
|
||||||
|
|
||||||
|
foreach(option ${_optionNames})
|
||||||
|
set(${prefix}_${option} FALSE)
|
||||||
|
endforeach(option)
|
||||||
|
|
||||||
|
set(${prefix}_UNPARSED_ARGUMENTS)
|
||||||
|
|
||||||
|
set(insideValues FALSE)
|
||||||
|
set(currentArgName)
|
||||||
|
|
||||||
|
# now iterate over all arguments and fill the result variables
|
||||||
|
foreach(currentArg ${ARGN})
|
||||||
|
list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
|
||||||
|
list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
|
||||||
|
list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword
|
||||||
|
|
||||||
|
if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
|
||||||
|
if(insideValues)
|
||||||
|
if("${insideValues}" STREQUAL "SINGLE")
|
||||||
|
set(${prefix}_${currentArgName} ${currentArg})
|
||||||
|
set(insideValues FALSE)
|
||||||
|
elseif("${insideValues}" STREQUAL "MULTI")
|
||||||
|
list(APPEND ${prefix}_${currentArgName} ${currentArg})
|
||||||
|
endif()
|
||||||
|
else(insideValues)
|
||||||
|
list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
|
||||||
|
endif(insideValues)
|
||||||
|
else()
|
||||||
|
if(NOT ${optionIndex} EQUAL -1)
|
||||||
|
set(${prefix}_${currentArg} TRUE)
|
||||||
|
set(insideValues FALSE)
|
||||||
|
elseif(NOT ${singleArgIndex} EQUAL -1)
|
||||||
|
set(currentArgName ${currentArg})
|
||||||
|
set(${prefix}_${currentArgName})
|
||||||
|
set(insideValues "SINGLE")
|
||||||
|
elseif(NOT ${multiArgIndex} EQUAL -1)
|
||||||
|
set(currentArgName ${currentArg})
|
||||||
|
set(${prefix}_${currentArgName})
|
||||||
|
set(insideValues "MULTI")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endforeach(currentArg)
|
||||||
|
|
||||||
|
# propagate the result variables to the caller:
|
||||||
|
foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
|
||||||
|
set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
|
||||||
|
endforeach(arg_name)
|
||||||
|
set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)
|
||||||
|
|
||||||
|
endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs)
|
39
cmake/Modules/FindCppUnit.cmake
Normal file
39
cmake/Modules/FindCppUnit.cmake
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# http://www.cmake.org/pipermail/cmake/2006-October/011446.html
|
||||||
|
# Modified to use pkg config and use standard var names
|
||||||
|
|
||||||
|
#
|
||||||
|
# Find the CppUnit includes and library
|
||||||
|
#
|
||||||
|
# This module defines
|
||||||
|
# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
|
||||||
|
# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
|
||||||
|
# CPPUNIT_FOUND, If false, do not try to use CppUnit.
|
||||||
|
|
||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
|
||||||
|
|
||||||
|
FIND_PATH(CPPUNIT_INCLUDE_DIRS
|
||||||
|
NAMES cppunit/TestCase.h
|
||||||
|
HINTS ${PC_CPPUNIT_INCLUDE_DIR}
|
||||||
|
${CMAKE_INSTALL_PREFIX}/include
|
||||||
|
PATHS
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(CPPUNIT_LIBRARIES
|
||||||
|
NAMES cppunit
|
||||||
|
HINTS ${PC_CPPUNIT_LIBDIR}
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib64
|
||||||
|
PATHS
|
||||||
|
${CPPUNIT_INCLUDE_DIRS}/../lib
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
|
||||||
|
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
|
||||||
|
MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
|
36
cmake/Modules/FindGnuradioRuntime.cmake
Normal file
36
cmake/Modules/FindGnuradioRuntime.cmake
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime)
|
||||||
|
|
||||||
|
if(PC_GNURADIO_RUNTIME_FOUND)
|
||||||
|
# look for include files
|
||||||
|
FIND_PATH(
|
||||||
|
GNURADIO_RUNTIME_INCLUDE_DIRS
|
||||||
|
NAMES gnuradio/top_block.h
|
||||||
|
HINTS $ENV{GNURADIO_RUNTIME_DIR}/include
|
||||||
|
${PC_GNURADIO_RUNTIME_INCLUDE_DIRS}
|
||||||
|
${CMAKE_INSTALL_PREFIX}/include
|
||||||
|
PATHS /usr/local/include
|
||||||
|
/usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
# look for libs
|
||||||
|
FIND_LIBRARY(
|
||||||
|
GNURADIO_RUNTIME_LIBRARIES
|
||||||
|
NAMES gnuradio-runtime
|
||||||
|
HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib
|
||||||
|
${PC_GNURADIO_RUNTIME_LIBDIR}
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib/
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib64/
|
||||||
|
PATHS /usr/local/lib
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/lib
|
||||||
|
/usr/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND})
|
||||||
|
endif(PC_GNURADIO_RUNTIME_FOUND)
|
||||||
|
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
# do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path is used.
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES)
|
||||||
|
MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS)
|
529
cmake/Modules/GrMiscUtils.cmake
Normal file
529
cmake/Modules/GrMiscUtils.cmake
Normal file
|
@ -0,0 +1,529 @@
|
||||||
|
# Copyright 2010-2011,2014 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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_MISC_UTILS_CMAKE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Set global variable macro.
|
||||||
|
# Used for subdirectories to export settings.
|
||||||
|
# Example: include and library paths.
|
||||||
|
########################################################################
|
||||||
|
function(GR_SET_GLOBAL var)
|
||||||
|
set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
|
||||||
|
endfunction(GR_SET_GLOBAL)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Set the pre-processor definition if the condition is true.
|
||||||
|
# - def the pre-processor definition to set and condition name
|
||||||
|
########################################################################
|
||||||
|
function(GR_ADD_COND_DEF def)
|
||||||
|
if(${def})
|
||||||
|
add_definitions(-D${def})
|
||||||
|
endif(${def})
|
||||||
|
endfunction(GR_ADD_COND_DEF)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check for a header and conditionally set a compile define.
|
||||||
|
# - hdr the relative path to the header file
|
||||||
|
# - def the pre-processor definition to set
|
||||||
|
########################################################################
|
||||||
|
function(GR_CHECK_HDR_N_DEF hdr def)
|
||||||
|
include(CheckIncludeFileCXX)
|
||||||
|
CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
|
||||||
|
GR_ADD_COND_DEF(${def})
|
||||||
|
endfunction(GR_CHECK_HDR_N_DEF)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Include subdirectory macro.
|
||||||
|
# Sets the CMake directory variables,
|
||||||
|
# includes the subdirectory CMakeLists.txt,
|
||||||
|
# resets the CMake directory variables.
|
||||||
|
#
|
||||||
|
# This macro includes subdirectories rather than adding them
|
||||||
|
# so that the subdirectory can affect variables in the level above.
|
||||||
|
# This provides a work-around for the lack of convenience libraries.
|
||||||
|
# This way a subdirectory can append to the list of library sources.
|
||||||
|
########################################################################
|
||||||
|
macro(GR_INCLUDE_SUBDIRECTORY subdir)
|
||||||
|
#insert the current directories on the front of the list
|
||||||
|
list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
#set the current directories to the names of the subdirs
|
||||||
|
set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
|
||||||
|
set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
|
||||||
|
|
||||||
|
#include the subdirectory CMakeLists to run it
|
||||||
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
|
||||||
|
|
||||||
|
#reset the value of the current directories
|
||||||
|
list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
|
||||||
|
list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
|
||||||
|
|
||||||
|
#pop the subdir names of the front of the list
|
||||||
|
list(REMOVE_AT _cmake_source_dirs 0)
|
||||||
|
list(REMOVE_AT _cmake_binary_dirs 0)
|
||||||
|
endmacro(GR_INCLUDE_SUBDIRECTORY)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check if a compiler flag works and conditionally set a compile define.
|
||||||
|
# - flag the compiler flag to check for
|
||||||
|
# - have the variable to set with result
|
||||||
|
########################################################################
|
||||||
|
macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
CHECK_CXX_COMPILER_FLAG(${flag} ${have})
|
||||||
|
if(${have})
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
|
||||||
|
STRING(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_dup)
|
||||||
|
if(${flag_dup} EQUAL -1)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
|
||||||
|
endif(${flag_dup} EQUAL -1)
|
||||||
|
endif(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
|
||||||
|
endif(${have})
|
||||||
|
endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Generates the .la libtool file
|
||||||
|
# This appears to generate libtool files that cannot be used by auto*.
|
||||||
|
# Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
|
||||||
|
# Notice: there is not COMPONENT option, these will not get distributed.
|
||||||
|
########################################################################
|
||||||
|
function(GR_LIBTOOL)
|
||||||
|
if(NOT DEFINED GENERATE_LIBTOOL)
|
||||||
|
set(GENERATE_LIBTOOL OFF) #disabled by default
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GENERATE_LIBTOOL)
|
||||||
|
include(CMakeParseArgumentsCopy)
|
||||||
|
CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
|
||||||
|
|
||||||
|
find_program(LIBTOOL libtool)
|
||||||
|
if(LIBTOOL)
|
||||||
|
include(CMakeMacroLibtoolFile)
|
||||||
|
CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
|
||||||
|
endif(LIBTOOL)
|
||||||
|
endif(GENERATE_LIBTOOL)
|
||||||
|
|
||||||
|
endfunction(GR_LIBTOOL)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Do standard things to the library target
|
||||||
|
# - set target properties
|
||||||
|
# - make install rules
|
||||||
|
# Also handle gnuradio custom naming conventions w/ extras mode.
|
||||||
|
########################################################################
|
||||||
|
function(GR_LIBRARY_FOO target)
|
||||||
|
#parse the arguments for component names
|
||||||
|
include(CMakeParseArgumentsCopy)
|
||||||
|
CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
|
||||||
|
|
||||||
|
#set additional target properties
|
||||||
|
set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
|
||||||
|
|
||||||
|
#install the generated files like so...
|
||||||
|
install(TARGETS ${target}
|
||||||
|
LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
|
||||||
|
ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file
|
||||||
|
RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
|
||||||
|
)
|
||||||
|
|
||||||
|
#extras mode enabled automatically on linux
|
||||||
|
if(NOT DEFINED LIBRARY_EXTRAS)
|
||||||
|
set(LIBRARY_EXTRAS ${LINUX})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#special extras mode to enable alternative naming conventions
|
||||||
|
if(LIBRARY_EXTRAS)
|
||||||
|
|
||||||
|
#create .la file before changing props
|
||||||
|
GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
|
||||||
|
|
||||||
|
#give the library a special name with ultra-zero soversion
|
||||||
|
set_target_properties(${target} PROPERTIES OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
|
||||||
|
set(target_name lib${target}-${LIBVER}.so.0.0.0)
|
||||||
|
|
||||||
|
#custom command to generate symlinks
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
|
||||||
|
)
|
||||||
|
|
||||||
|
#and install the extra symlinks
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
|
||||||
|
DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
|
||||||
|
)
|
||||||
|
|
||||||
|
endif(LIBRARY_EXTRAS)
|
||||||
|
endfunction(GR_LIBRARY_FOO)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Create a dummy custom command that depends on other targets.
|
||||||
|
# Usage:
|
||||||
|
# GR_GEN_TARGET_DEPS(unique_name target_deps <target1> <target2> ...)
|
||||||
|
# ADD_CUSTOM_COMMAND(<the usual args> ${target_deps})
|
||||||
|
#
|
||||||
|
# Custom command can't depend on targets, but can depend on executables,
|
||||||
|
# and executables can depend on targets. So this is the process:
|
||||||
|
########################################################################
|
||||||
|
function(GR_GEN_TARGET_DEPS name var)
|
||||||
|
file(
|
||||||
|
WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
|
||||||
|
"int main(void){return 0;}\n"
|
||||||
|
)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
|
||||||
|
)
|
||||||
|
add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
|
||||||
|
if(ARGN)
|
||||||
|
add_dependencies(${name} ${ARGN})
|
||||||
|
endif(ARGN)
|
||||||
|
|
||||||
|
if(CMAKE_CROSSCOMPILING)
|
||||||
|
set(${var} "DEPENDS;${name}" PARENT_SCOPE) #can't call command when cross
|
||||||
|
else()
|
||||||
|
set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction(GR_GEN_TARGET_DEPS)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Control use of gr_logger
|
||||||
|
# Usage:
|
||||||
|
# GR_LOGGING()
|
||||||
|
#
|
||||||
|
# Will set ENABLE_GR_LOG to 1 by default.
|
||||||
|
# Can manually set with -DENABLE_GR_LOG=0|1
|
||||||
|
########################################################################
|
||||||
|
function(GR_LOGGING)
|
||||||
|
find_package(Log4cpp)
|
||||||
|
|
||||||
|
OPTION(ENABLE_GR_LOG "Use gr_logger" ON)
|
||||||
|
if(ENABLE_GR_LOG)
|
||||||
|
# If gr_logger is enabled, make it usable
|
||||||
|
add_definitions( -DENABLE_GR_LOG )
|
||||||
|
|
||||||
|
# also test LOG4CPP; if we have it, use this version of the logger
|
||||||
|
# otherwise, default to the stdout/stderr model.
|
||||||
|
if(LOG4CPP_FOUND)
|
||||||
|
SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE)
|
||||||
|
add_definitions( -DHAVE_LOG4CPP )
|
||||||
|
else(not LOG4CPP_FOUND)
|
||||||
|
SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
|
||||||
|
endif(LOG4CPP_FOUND)
|
||||||
|
|
||||||
|
SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE)
|
||||||
|
|
||||||
|
else(ENABLE_GR_LOG)
|
||||||
|
SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
|
||||||
|
SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
|
||||||
|
endif(ENABLE_GR_LOG)
|
||||||
|
|
||||||
|
message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.")
|
||||||
|
message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.")
|
||||||
|
message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.")
|
||||||
|
|
||||||
|
endfunction(GR_LOGGING)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Run GRCC to compile .grc files into .py files.
|
||||||
|
#
|
||||||
|
# Usage: GRCC(filename, directory)
|
||||||
|
# - filenames: List of file name of .grc file
|
||||||
|
# - directory: directory of built .py file - usually in
|
||||||
|
# ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
# - Sets PYFILES: output converted GRC file names to Python files.
|
||||||
|
########################################################################
|
||||||
|
function(GRCC)
|
||||||
|
# Extract directory from list of args, remove it for the list of filenames.
|
||||||
|
list(GET ARGV -1 directory)
|
||||||
|
list(REMOVE_AT ARGV -1)
|
||||||
|
set(filenames ${ARGV})
|
||||||
|
file(MAKE_DIRECTORY ${directory})
|
||||||
|
|
||||||
|
SET(GRCC_COMMAND ${CMAKE_SOURCE_DIR}/gr-utils/python/grcc)
|
||||||
|
|
||||||
|
# GRCC uses some stuff in grc and gnuradio-runtime, so we force
|
||||||
|
# the known paths here
|
||||||
|
list(APPEND PYTHONPATHS
|
||||||
|
${CMAKE_SOURCE_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/gnuradio-runtime/python
|
||||||
|
${CMAKE_SOURCE_DIR}/gnuradio-runtime/lib/swig
|
||||||
|
${CMAKE_BINARY_DIR}/gnuradio-runtime/lib/swig
|
||||||
|
)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
#SWIG generates the python library files into a subdirectory.
|
||||||
|
#Therefore, we must append this subdirectory into PYTHONPATH.
|
||||||
|
#Only do this for the python directories matching the following:
|
||||||
|
foreach(pydir ${PYTHONPATHS})
|
||||||
|
get_filename_component(name ${pydir} NAME)
|
||||||
|
if(name MATCHES "^(swig|lib|src)$")
|
||||||
|
list(APPEND PYTHONPATHS ${pydir}/${CMAKE_BUILD_TYPE})
|
||||||
|
endif()
|
||||||
|
endforeach(pydir)
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
file(TO_NATIVE_PATH "${PYTHONPATHS}" pypath)
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
list(APPEND pypath "$PYTHONPATH")
|
||||||
|
string(REPLACE ";" ":" pypath "${pypath}")
|
||||||
|
set(ENV{PYTHONPATH} ${pypath})
|
||||||
|
endif(UNIX)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
list(APPEND pypath "%PYTHONPATH%")
|
||||||
|
string(REPLACE ";" "\\;" pypath "${pypath}")
|
||||||
|
#list(APPEND environs "PYTHONPATH=${pypath}")
|
||||||
|
set(ENV{PYTHONPATH} ${pypath})
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
foreach(f ${filenames})
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GRCC_COMMAND} -d ${directory} ${f}
|
||||||
|
)
|
||||||
|
string(REPLACE ".grc" ".py" pyfile "${f}")
|
||||||
|
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" pyfile "${pyfile}")
|
||||||
|
list(APPEND pyfiles ${pyfile})
|
||||||
|
endforeach(f)
|
||||||
|
|
||||||
|
set(PYFILES ${pyfiles} PARENT_SCOPE)
|
||||||
|
endfunction(GRCC)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check if HAVE_PTHREAD_SETSCHEDPARAM and HAVE_SCHED_SETSCHEDULER
|
||||||
|
# should be defined
|
||||||
|
########################################################################
|
||||||
|
macro(GR_CHECK_LINUX_SCHED_AVAIL)
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES -lpthread)
|
||||||
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
|
#include <pthread.h>
|
||||||
|
int main(){
|
||||||
|
pthread_t pthread;
|
||||||
|
pthread_setschedparam(pthread, 0, 0);
|
||||||
|
return 0;
|
||||||
|
} " HAVE_PTHREAD_SETSCHEDPARAM
|
||||||
|
)
|
||||||
|
GR_ADD_COND_DEF(HAVE_PTHREAD_SETSCHEDPARAM)
|
||||||
|
|
||||||
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
|
#include <sched.h>
|
||||||
|
int main(){
|
||||||
|
pid_t pid;
|
||||||
|
sched_setscheduler(pid, 0, 0);
|
||||||
|
return 0;
|
||||||
|
} " HAVE_SCHED_SETSCHEDULER
|
||||||
|
)
|
||||||
|
GR_ADD_COND_DEF(HAVE_SCHED_SETSCHEDULER)
|
||||||
|
endmacro(GR_CHECK_LINUX_SCHED_AVAIL)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Macros to generate source and header files from template
|
||||||
|
########################################################################
|
||||||
|
macro(GR_EXPAND_X_H component root)
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
"#!${PYTHON_EXECUTABLE}
|
||||||
|
|
||||||
|
import sys, os, re
|
||||||
|
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
||||||
|
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
||||||
|
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
||||||
|
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import build_utils
|
||||||
|
root, inp = sys.argv[1:3]
|
||||||
|
for sig in sys.argv[3:]:
|
||||||
|
name = re.sub ('X+', sig, root)
|
||||||
|
d = build_utils.standard_dict2(name, sig, '${component}')
|
||||||
|
build_utils.expand_template(d, inp)
|
||||||
|
")
|
||||||
|
|
||||||
|
#make a list of all the generated headers
|
||||||
|
unset(expanded_files_h)
|
||||||
|
foreach(sig ${ARGN})
|
||||||
|
string(REGEX REPLACE "X+" ${sig} name ${root})
|
||||||
|
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
|
||||||
|
endforeach(sig)
|
||||||
|
unset(name)
|
||||||
|
|
||||||
|
#create a command to generate the headers
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${expanded_files_h}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
${root} ${root}.h.t ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
#install rules for the generated headers
|
||||||
|
list(APPEND generated_includes ${expanded_files_h})
|
||||||
|
|
||||||
|
endmacro(GR_EXPAND_X_H)
|
||||||
|
|
||||||
|
macro(GR_EXPAND_X_CC_H component root)
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
"#!${PYTHON_EXECUTABLE}
|
||||||
|
|
||||||
|
import sys, os, re
|
||||||
|
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
||||||
|
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
||||||
|
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
||||||
|
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import build_utils
|
||||||
|
root, inp = sys.argv[1:3]
|
||||||
|
for sig in sys.argv[3:]:
|
||||||
|
name = re.sub ('X+', sig, root)
|
||||||
|
d = build_utils.standard_impl_dict2(name, sig, '${component}')
|
||||||
|
build_utils.expand_template(d, inp)
|
||||||
|
")
|
||||||
|
|
||||||
|
#make a list of all the generated files
|
||||||
|
unset(expanded_files_cc)
|
||||||
|
unset(expanded_files_h)
|
||||||
|
foreach(sig ${ARGN})
|
||||||
|
string(REGEX REPLACE "X+" ${sig} name ${root})
|
||||||
|
list(APPEND expanded_files_cc ${CMAKE_CURRENT_BINARY_DIR}/${name}.cc)
|
||||||
|
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
|
||||||
|
endforeach(sig)
|
||||||
|
unset(name)
|
||||||
|
|
||||||
|
#create a command to generate the source files
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${expanded_files_cc}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.cc.t
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
${root} ${root}.cc.t ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
#create a command to generate the header files
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${expanded_files_h}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
${root} ${root}.h.t ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
#make source files depends on headers to force generation
|
||||||
|
set_source_files_properties(${expanded_files_cc}
|
||||||
|
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
||||||
|
)
|
||||||
|
|
||||||
|
#install rules for the generated files
|
||||||
|
list(APPEND generated_sources ${expanded_files_cc})
|
||||||
|
list(APPEND generated_headers ${expanded_files_h})
|
||||||
|
|
||||||
|
endmacro(GR_EXPAND_X_CC_H)
|
||||||
|
|
||||||
|
macro(GR_EXPAND_X_CC_H_IMPL component root)
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
"#!${PYTHON_EXECUTABLE}
|
||||||
|
|
||||||
|
import sys, os, re
|
||||||
|
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
||||||
|
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
||||||
|
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
||||||
|
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import build_utils
|
||||||
|
root, inp = sys.argv[1:3]
|
||||||
|
for sig in sys.argv[3:]:
|
||||||
|
name = re.sub ('X+', sig, root)
|
||||||
|
d = build_utils.standard_dict(name, sig, '${component}')
|
||||||
|
build_utils.expand_template(d, inp, '_impl')
|
||||||
|
")
|
||||||
|
|
||||||
|
#make a list of all the generated files
|
||||||
|
unset(expanded_files_cc_impl)
|
||||||
|
unset(expanded_files_h_impl)
|
||||||
|
unset(expanded_files_h)
|
||||||
|
foreach(sig ${ARGN})
|
||||||
|
string(REGEX REPLACE "X+" ${sig} name ${root})
|
||||||
|
list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
|
||||||
|
list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
|
||||||
|
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/gnuradio/${component}/${name}.h)
|
||||||
|
endforeach(sig)
|
||||||
|
unset(name)
|
||||||
|
|
||||||
|
#create a command to generate the _impl.cc files
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${expanded_files_cc_impl}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
${root} ${root}_impl.cc.t ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
#create a command to generate the _impl.h files
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${expanded_files_h_impl}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
||||||
|
${root} ${root}_impl.h.t ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
#make _impl.cc source files depend on _impl.h to force generation
|
||||||
|
set_source_files_properties(${expanded_files_cc_impl}
|
||||||
|
PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
|
||||||
|
)
|
||||||
|
|
||||||
|
#make _impl.h source files depend on headers to force generation
|
||||||
|
set_source_files_properties(${expanded_files_h_impl}
|
||||||
|
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
||||||
|
)
|
||||||
|
|
||||||
|
#install rules for the generated files
|
||||||
|
list(APPEND generated_sources ${expanded_files_cc_impl})
|
||||||
|
list(APPEND generated_headers ${expanded_files_h_impl})
|
||||||
|
|
||||||
|
endmacro(GR_EXPAND_X_CC_H_IMPL)
|
63
cmake/Modules/GrPlatform.cmake
Normal file
63
cmake/Modules/GrPlatform.cmake
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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_PLATFORM_CMAKE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup additional defines for OS types
|
||||||
|
########################################################################
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set(LINUX TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/debian_version")
|
||||||
|
set(DEBIAN TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/redhat-release")
|
||||||
|
set(REDHAT TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/slackware-version")
|
||||||
|
set(SLACKWARE TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# when the library suffix should be 64 (applies to redhat linux family)
|
||||||
|
########################################################################
|
||||||
|
if (REDHAT OR SLACKWARE)
|
||||||
|
set(LIB64_CONVENTION TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
|
||||||
|
set(LIB_SUFFIX 64)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Detect /lib versus /lib64
|
||||||
|
########################################################################
|
||||||
|
if (CMAKE_INSTALL_LIBDIR MATCHES lib64)
|
||||||
|
set(LIB_SUFFIX 64)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
|
242
cmake/Modules/GrPython.cmake
Normal file
242
cmake/Modules/GrPython.cmake
Normal file
|
@ -0,0 +1,242 @@
|
||||||
|
# Copyright 2010-2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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_PYTHON_CMAKE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup the python interpreter:
|
||||||
|
# This allows the user to specify a specific interpreter,
|
||||||
|
# or finds the interpreter via the built-in cmake module.
|
||||||
|
########################################################################
|
||||||
|
#this allows the user to override PYTHON_EXECUTABLE
|
||||||
|
if(PYTHON_EXECUTABLE)
|
||||||
|
|
||||||
|
set(PYTHONINTERP_FOUND TRUE)
|
||||||
|
|
||||||
|
#otherwise if not set, try to automatically find it
|
||||||
|
else(PYTHON_EXECUTABLE)
|
||||||
|
|
||||||
|
#use the built-in find script
|
||||||
|
find_package(PythonInterp 2)
|
||||||
|
|
||||||
|
#and if that fails use the find program routine
|
||||||
|
if(NOT PYTHONINTERP_FOUND)
|
||||||
|
find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5)
|
||||||
|
if(PYTHON_EXECUTABLE)
|
||||||
|
set(PYTHONINTERP_FOUND TRUE)
|
||||||
|
endif(PYTHON_EXECUTABLE)
|
||||||
|
endif(NOT PYTHONINTERP_FOUND)
|
||||||
|
|
||||||
|
endif(PYTHON_EXECUTABLE)
|
||||||
|
|
||||||
|
if (CMAKE_CROSSCOMPILING)
|
||||||
|
set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
|
||||||
|
else (CMAKE_CROSSCOMPILING)
|
||||||
|
set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
|
||||||
|
endif(CMAKE_CROSSCOMPILING)
|
||||||
|
|
||||||
|
#make the path to the executable appear in the cmake gui
|
||||||
|
set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
|
||||||
|
set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
|
||||||
|
|
||||||
|
#make sure we can use -B with python (introduced in 2.6)
|
||||||
|
if(PYTHON_EXECUTABLE)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} -B -c ""
|
||||||
|
OUTPUT_QUIET ERROR_QUIET
|
||||||
|
RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
|
||||||
|
)
|
||||||
|
if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
|
||||||
|
set(PYTHON_DASH_B "-B")
|
||||||
|
endif()
|
||||||
|
endif(PYTHON_EXECUTABLE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check for the existence of a python module:
|
||||||
|
# - desc a string description of the check
|
||||||
|
# - mod the name of the module to import
|
||||||
|
# - cmd an additional command to run
|
||||||
|
# - have the result variable to set
|
||||||
|
########################################################################
|
||||||
|
macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
|
||||||
|
message(STATUS "")
|
||||||
|
message(STATUS "Python checking for ${desc}")
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} -c "
|
||||||
|
#########################################
|
||||||
|
try:
|
||||||
|
import ${mod}
|
||||||
|
assert ${cmd}
|
||||||
|
except ImportError, AssertionError: exit(-1)
|
||||||
|
except: pass
|
||||||
|
#########################################"
|
||||||
|
RESULT_VARIABLE ${have}
|
||||||
|
)
|
||||||
|
if(${have} EQUAL 0)
|
||||||
|
message(STATUS "Python checking for ${desc} - found")
|
||||||
|
set(${have} TRUE)
|
||||||
|
else(${have} EQUAL 0)
|
||||||
|
message(STATUS "Python checking for ${desc} - not found")
|
||||||
|
set(${have} FALSE)
|
||||||
|
endif(${have} EQUAL 0)
|
||||||
|
endmacro(GR_PYTHON_CHECK_MODULE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Sets the python installation directory GR_PYTHON_DIR
|
||||||
|
########################################################################
|
||||||
|
if(NOT DEFINED GR_PYTHON_DIR)
|
||||||
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
|
||||||
|
from distutils import sysconfig
|
||||||
|
print sysconfig.get_python_lib(plat_specific=True, prefix='')
|
||||||
|
" OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Create an always-built target with a unique name
|
||||||
|
# Usage: GR_UNIQUE_TARGET(<description> <dependencies list>)
|
||||||
|
########################################################################
|
||||||
|
function(GR_UNIQUE_TARGET desc)
|
||||||
|
file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
|
||||||
|
unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
|
||||||
|
print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
|
||||||
|
OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
add_custom_target(${_target} ALL DEPENDS ${ARGN})
|
||||||
|
endfunction(GR_UNIQUE_TARGET)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install python sources (also builds and installs byte-compiled python)
|
||||||
|
########################################################################
|
||||||
|
function(GR_PYTHON_INSTALL)
|
||||||
|
include(CMakeParseArgumentsCopy)
|
||||||
|
CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
|
||||||
|
|
||||||
|
####################################################################
|
||||||
|
if(GR_PYTHON_INSTALL_FILES)
|
||||||
|
####################################################################
|
||||||
|
install(${ARGN}) #installs regular python files
|
||||||
|
|
||||||
|
#create a list of all generated files
|
||||||
|
unset(pysrcfiles)
|
||||||
|
unset(pycfiles)
|
||||||
|
unset(pyofiles)
|
||||||
|
foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
|
||||||
|
get_filename_component(pyfile ${pyfile} ABSOLUTE)
|
||||||
|
list(APPEND pysrcfiles ${pyfile})
|
||||||
|
|
||||||
|
#determine if this file is in the source or binary directory
|
||||||
|
file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
|
||||||
|
string(LENGTH "${source_rel_path}" source_rel_path_len)
|
||||||
|
file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
|
||||||
|
string(LENGTH "${binary_rel_path}" binary_rel_path_len)
|
||||||
|
|
||||||
|
#and set the generated path appropriately
|
||||||
|
if(${source_rel_path_len} GREATER ${binary_rel_path_len})
|
||||||
|
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
|
||||||
|
else()
|
||||||
|
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
|
||||||
|
endif()
|
||||||
|
list(APPEND pycfiles ${pygenfile}c)
|
||||||
|
list(APPEND pyofiles ${pygenfile}o)
|
||||||
|
|
||||||
|
#ensure generation path exists
|
||||||
|
get_filename_component(pygen_path ${pygenfile} PATH)
|
||||||
|
file(MAKE_DIRECTORY ${pygen_path})
|
||||||
|
|
||||||
|
endforeach(pyfile)
|
||||||
|
|
||||||
|
#the command to generate the pyc files
|
||||||
|
add_custom_command(
|
||||||
|
DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
|
||||||
|
)
|
||||||
|
|
||||||
|
#the command to generate the pyo files
|
||||||
|
add_custom_command(
|
||||||
|
DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
|
||||||
|
)
|
||||||
|
|
||||||
|
#create install rule and add generated files to target list
|
||||||
|
set(python_install_gen_targets ${pycfiles} ${pyofiles})
|
||||||
|
install(FILES ${python_install_gen_targets}
|
||||||
|
DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
|
||||||
|
COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
|
||||||
|
)
|
||||||
|
|
||||||
|
####################################################################
|
||||||
|
elseif(GR_PYTHON_INSTALL_PROGRAMS)
|
||||||
|
####################################################################
|
||||||
|
file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
|
||||||
|
|
||||||
|
if (CMAKE_CROSSCOMPILING)
|
||||||
|
set(pyexe_native "/usr/bin/env python")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
|
||||||
|
get_filename_component(pyfile_name ${pyfile} NAME)
|
||||||
|
get_filename_component(pyfile ${pyfile} ABSOLUTE)
|
||||||
|
string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
|
||||||
|
list(APPEND python_install_gen_targets ${pyexefile})
|
||||||
|
|
||||||
|
get_filename_component(pyexefile_path ${pyexefile} PATH)
|
||||||
|
file(MAKE_DIRECTORY ${pyexefile_path})
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${pyexefile} DEPENDS ${pyfile}
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} -c
|
||||||
|
"import re; R=re.compile('^\#!.*$\\n',flags=re.MULTILINE); open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+R.sub('',open('${pyfile}','r').read()))"
|
||||||
|
COMMENT "Shebangin ${pyfile_name}"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
#on windows, python files need an extension to execute
|
||||||
|
get_filename_component(pyfile_ext ${pyfile} EXT)
|
||||||
|
if(WIN32 AND NOT pyfile_ext)
|
||||||
|
set(pyfile_name "${pyfile_name}.py")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
|
||||||
|
DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
|
||||||
|
COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
|
||||||
|
)
|
||||||
|
endforeach(pyfile)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
|
||||||
|
|
||||||
|
endfunction(GR_PYTHON_INSTALL)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Write the python helper script that generates byte code files
|
||||||
|
########################################################################
|
||||||
|
file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
|
||||||
|
import sys, py_compile
|
||||||
|
files = sys.argv[1:]
|
||||||
|
srcs, gens = files[:len(files)/2], files[len(files)/2:]
|
||||||
|
for src, gen in zip(srcs, gens):
|
||||||
|
py_compile.compile(file=src, cfile=gen, doraise=True)
|
||||||
|
")
|
257
cmake/Modules/GrSwig.cmake
Normal file
257
cmake/Modules/GrSwig.cmake
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
# Copyright 2010-2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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_SWIG_CMAKE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__INCLUDED_GR_SWIG_CMAKE TRUE)
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Builds a swig documentation file to be generated into python docstrings
|
||||||
|
# Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
|
||||||
|
#
|
||||||
|
# Set the following variable to specify extra dependent targets:
|
||||||
|
# - GR_SWIG_DOCS_SOURCE_DEPS
|
||||||
|
# - GR_SWIG_DOCS_TARGET_DEPS
|
||||||
|
########################################################################
|
||||||
|
function(GR_SWIG_MAKE_DOCS output_file)
|
||||||
|
if(ENABLE_DOXYGEN)
|
||||||
|
|
||||||
|
#setup the input files variable list, quote formatted
|
||||||
|
set(input_files)
|
||||||
|
unset(INPUT_PATHS)
|
||||||
|
foreach(input_path ${ARGN})
|
||||||
|
if(IS_DIRECTORY ${input_path}) #when input path is a directory
|
||||||
|
file(GLOB input_path_h_files ${input_path}/*.h)
|
||||||
|
else() #otherwise its just a file, no glob
|
||||||
|
set(input_path_h_files ${input_path})
|
||||||
|
endif()
|
||||||
|
list(APPEND input_files ${input_path_h_files})
|
||||||
|
set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
|
||||||
|
endforeach(input_path)
|
||||||
|
|
||||||
|
#determine the output directory
|
||||||
|
get_filename_component(name ${output_file} NAME_WE)
|
||||||
|
get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
|
||||||
|
set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
|
||||||
|
make_directory(${OUTPUT_DIRECTORY})
|
||||||
|
|
||||||
|
#generate the Doxyfile used by doxygen
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
|
||||||
|
${OUTPUT_DIRECTORY}/Doxyfile
|
||||||
|
@ONLY)
|
||||||
|
|
||||||
|
#Create a dummy custom command that depends on other targets
|
||||||
|
include(GrMiscUtils)
|
||||||
|
GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
|
||||||
|
|
||||||
|
#call doxygen on the Doxyfile + input headers
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
|
||||||
|
DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
|
||||||
|
COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
|
||||||
|
COMMENT "Generating doxygen xml for ${name} docs"
|
||||||
|
)
|
||||||
|
|
||||||
|
#call the swig_doc script on the xml files
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${output_file}
|
||||||
|
DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
||||||
|
${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
|
||||||
|
${OUTPUT_DIRECTORY}/xml
|
||||||
|
${output_file}
|
||||||
|
COMMENT "Generating python docstrings for ${name}"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
|
||||||
|
)
|
||||||
|
|
||||||
|
else(ENABLE_DOXYGEN)
|
||||||
|
file(WRITE ${output_file} "\n") #no doxygen -> empty file
|
||||||
|
endif(ENABLE_DOXYGEN)
|
||||||
|
endfunction(GR_SWIG_MAKE_DOCS)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Build a swig target for the common gnuradio use case. Usage:
|
||||||
|
# GR_SWIG_MAKE(target ifile ifile ifile...)
|
||||||
|
#
|
||||||
|
# Set the following variables before calling:
|
||||||
|
# - GR_SWIG_FLAGS
|
||||||
|
# - GR_SWIG_INCLUDE_DIRS
|
||||||
|
# - GR_SWIG_LIBRARIES
|
||||||
|
# - GR_SWIG_SOURCE_DEPS
|
||||||
|
# - GR_SWIG_TARGET_DEPS
|
||||||
|
# - GR_SWIG_DOC_FILE
|
||||||
|
# - GR_SWIG_DOC_DIRS
|
||||||
|
########################################################################
|
||||||
|
macro(GR_SWIG_MAKE name)
|
||||||
|
set(ifiles ${ARGN})
|
||||||
|
|
||||||
|
# Shimming this in here to take care of a SWIG bug with handling
|
||||||
|
# vector<size_t> and vector<unsigned int> (on 32-bit machines) and
|
||||||
|
# vector<long unsigned int> (on 64-bit machines). Use this to test
|
||||||
|
# the size of size_t, then set SIZE_T_32 if it's a 32-bit machine
|
||||||
|
# or not if it's 64-bit. The logic in gr_type.i handles the rest.
|
||||||
|
INCLUDE(CheckTypeSize)
|
||||||
|
CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
|
||||||
|
CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
|
||||||
|
if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
|
||||||
|
list(APPEND GR_SWIG_FLAGS -DSIZE_T_32)
|
||||||
|
endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
|
||||||
|
|
||||||
|
#do swig doc generation if specified
|
||||||
|
if(GR_SWIG_DOC_FILE)
|
||||||
|
set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
|
||||||
|
list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS})
|
||||||
|
GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
|
||||||
|
add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE})
|
||||||
|
list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#append additional include directories
|
||||||
|
find_package(PythonLibs 2)
|
||||||
|
list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
|
||||||
|
list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
#prepend local swig directories
|
||||||
|
list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
#determine include dependencies for swig file
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE}
|
||||||
|
${CMAKE_BINARY_DIR}/get_swig_deps.py
|
||||||
|
"${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
#Create a dummy custom command that depends on other targets
|
||||||
|
include(GrMiscUtils)
|
||||||
|
GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
|
||||||
|
set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${tag_file}
|
||||||
|
DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
|
||||||
|
)
|
||||||
|
|
||||||
|
#append the specified include directories
|
||||||
|
include_directories(${GR_SWIG_INCLUDE_DIRS})
|
||||||
|
list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
|
||||||
|
|
||||||
|
#setup the swig flags with flags and include directories
|
||||||
|
set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
|
||||||
|
foreach(dir ${GR_SWIG_INCLUDE_DIRS})
|
||||||
|
list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
|
||||||
|
endforeach(dir)
|
||||||
|
|
||||||
|
#set the C++ property on the swig .i file so it builds
|
||||||
|
set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
|
||||||
|
|
||||||
|
#setup the actual swig library target to be built
|
||||||
|
include(UseSWIG)
|
||||||
|
SWIG_ADD_MODULE(${name} python ${ifiles})
|
||||||
|
if(APPLE)
|
||||||
|
set(PYTHON_LINK_OPTIONS "-undefined dynamic_lookup")
|
||||||
|
else()
|
||||||
|
set(PYTHON_LINK_OPTIONS ${PYTHON_LIBRARIES})
|
||||||
|
endif(APPLE)
|
||||||
|
SWIG_LINK_LIBRARIES(${name} ${PYTHON_LINK_OPTIONS} ${GR_SWIG_LIBRARIES})
|
||||||
|
if(${name} STREQUAL "runtime_swig")
|
||||||
|
SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS")
|
||||||
|
endif(${name} STREQUAL "runtime_swig")
|
||||||
|
|
||||||
|
endmacro(GR_SWIG_MAKE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install swig targets generated by GR_SWIG_MAKE. Usage:
|
||||||
|
# GR_SWIG_INSTALL(
|
||||||
|
# TARGETS target target target...
|
||||||
|
# [DESTINATION destination]
|
||||||
|
# [COMPONENT component]
|
||||||
|
# )
|
||||||
|
########################################################################
|
||||||
|
macro(GR_SWIG_INSTALL)
|
||||||
|
|
||||||
|
include(CMakeParseArgumentsCopy)
|
||||||
|
CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
|
||||||
|
|
||||||
|
foreach(name ${GR_SWIG_INSTALL_TARGETS})
|
||||||
|
install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
|
||||||
|
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
||||||
|
COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
|
||||||
|
)
|
||||||
|
|
||||||
|
include(GrPython)
|
||||||
|
GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
|
||||||
|
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
||||||
|
COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
|
||||||
|
)
|
||||||
|
|
||||||
|
GR_LIBTOOL(
|
||||||
|
TARGET ${SWIG_MODULE_${name}_REAL_NAME}
|
||||||
|
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
||||||
|
)
|
||||||
|
|
||||||
|
endforeach(name)
|
||||||
|
|
||||||
|
endmacro(GR_SWIG_INSTALL)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Generate a python file that can determine swig dependencies.
|
||||||
|
# Used by the make macro above to determine extra dependencies.
|
||||||
|
# When you build C++, CMake figures out the header dependencies.
|
||||||
|
# This code essentially performs that logic for swig includes.
|
||||||
|
########################################################################
|
||||||
|
file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
|
||||||
|
|
||||||
|
import os, sys, re
|
||||||
|
|
||||||
|
i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]')
|
||||||
|
h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]')
|
||||||
|
include_dirs = sys.argv[2].split(';')
|
||||||
|
|
||||||
|
def get_swig_incs(file_path):
|
||||||
|
if file_path.endswith('.i'): matcher = i_include_matcher
|
||||||
|
else: matcher = h_include_matcher
|
||||||
|
file_contents = open(file_path, 'r').read()
|
||||||
|
return matcher.findall(file_contents, re.MULTILINE)
|
||||||
|
|
||||||
|
def get_swig_deps(file_path, level):
|
||||||
|
deps = [file_path]
|
||||||
|
if level == 0: return deps
|
||||||
|
for keyword, inc_file in get_swig_incs(file_path):
|
||||||
|
for inc_dir in include_dirs:
|
||||||
|
inc_path = os.path.join(inc_dir, inc_file)
|
||||||
|
if not os.path.exists(inc_path): continue
|
||||||
|
deps.extend(get_swig_deps(inc_path, level-1))
|
||||||
|
break #found, we don't search in lower prio inc dirs
|
||||||
|
return deps
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
ifiles = sys.argv[1].split(';')
|
||||||
|
deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
|
||||||
|
#sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
|
||||||
|
print(';'.join(set(deps)))
|
||||||
|
")
|
144
cmake/Modules/GrTest.cmake
Normal file
144
cmake/Modules/GrTest.cmake
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
# Copyright 2010-2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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_TEST_CMAKE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__INCLUDED_GR_TEST_CMAKE TRUE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Add a unit test and setup the environment for a unit test.
|
||||||
|
# Takes the same arguments as the ADD_TEST function.
|
||||||
|
#
|
||||||
|
# Before calling set the following variables:
|
||||||
|
# GR_TEST_TARGET_DEPS - built targets for the library path
|
||||||
|
# GR_TEST_LIBRARY_DIRS - directories for the library path
|
||||||
|
# GR_TEST_PYTHON_DIRS - directories for the python path
|
||||||
|
# GR_TEST_ENVIRONS - other environment key/value pairs
|
||||||
|
########################################################################
|
||||||
|
function(GR_ADD_TEST test_name)
|
||||||
|
|
||||||
|
#Ensure that the build exe also appears in the PATH.
|
||||||
|
list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
|
||||||
|
|
||||||
|
#In the land of windows, all libraries must be in the PATH.
|
||||||
|
#Since the dependent libraries are not yet installed,
|
||||||
|
#we must manually set them in the PATH to run tests.
|
||||||
|
#The following appends the path of a target dependency.
|
||||||
|
foreach(target ${GR_TEST_TARGET_DEPS})
|
||||||
|
get_target_property(location ${target} LOCATION)
|
||||||
|
if(location)
|
||||||
|
get_filename_component(path ${location} PATH)
|
||||||
|
string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
|
||||||
|
list(APPEND GR_TEST_LIBRARY_DIRS ${path})
|
||||||
|
endif(location)
|
||||||
|
endforeach(target)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
#SWIG generates the python library files into a subdirectory.
|
||||||
|
#Therefore, we must append this subdirectory into PYTHONPATH.
|
||||||
|
#Only do this for the python directories matching the following:
|
||||||
|
foreach(pydir ${GR_TEST_PYTHON_DIRS})
|
||||||
|
get_filename_component(name ${pydir} NAME)
|
||||||
|
if(name MATCHES "^(swig|lib|src)$")
|
||||||
|
list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
|
||||||
|
endif()
|
||||||
|
endforeach(pydir)
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
|
||||||
|
file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
|
||||||
|
file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
|
||||||
|
|
||||||
|
set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
|
||||||
|
list(APPEND environs ${GR_TEST_ENVIRONS})
|
||||||
|
|
||||||
|
#http://www.cmake.org/pipermail/cmake/2009-May/029464.html
|
||||||
|
#Replaced this add test + set environs code with the shell script generation.
|
||||||
|
#Its nicer to be able to manually run the shell script to diagnose problems.
|
||||||
|
#ADD_TEST(${ARGV})
|
||||||
|
#SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
set(LD_PATH_VAR "LD_LIBRARY_PATH")
|
||||||
|
if(APPLE)
|
||||||
|
set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
|
||||||
|
list(APPEND libpath "$${LD_PATH_VAR}")
|
||||||
|
list(APPEND pypath "$PYTHONPATH")
|
||||||
|
|
||||||
|
#replace list separator with the path separator
|
||||||
|
string(REPLACE ";" ":" libpath "${libpath}")
|
||||||
|
string(REPLACE ";" ":" pypath "${pypath}")
|
||||||
|
list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
|
||||||
|
|
||||||
|
#generate a bat file that sets the environment and runs the test
|
||||||
|
if (CMAKE_CROSSCOMPILING)
|
||||||
|
set(SHELL "/bin/sh")
|
||||||
|
else(CMAKE_CROSSCOMPILING)
|
||||||
|
find_program(SHELL sh)
|
||||||
|
endif(CMAKE_CROSSCOMPILING)
|
||||||
|
set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
|
||||||
|
file(WRITE ${sh_file} "#!${SHELL}\n")
|
||||||
|
#each line sets an environment variable
|
||||||
|
foreach(environ ${environs})
|
||||||
|
file(APPEND ${sh_file} "export ${environ}\n")
|
||||||
|
endforeach(environ)
|
||||||
|
#load the command to run with its arguments
|
||||||
|
foreach(arg ${ARGN})
|
||||||
|
file(APPEND ${sh_file} "${arg} ")
|
||||||
|
endforeach(arg)
|
||||||
|
file(APPEND ${sh_file} "\n")
|
||||||
|
|
||||||
|
#make the shell file executable
|
||||||
|
execute_process(COMMAND chmod +x ${sh_file})
|
||||||
|
|
||||||
|
add_test(${test_name} ${SHELL} ${sh_file})
|
||||||
|
|
||||||
|
endif(UNIX)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
list(APPEND libpath ${DLL_PATHS} "%PATH%")
|
||||||
|
list(APPEND pypath "%PYTHONPATH%")
|
||||||
|
|
||||||
|
#replace list separator with the path separator (escaped)
|
||||||
|
string(REPLACE ";" "\\;" libpath "${libpath}")
|
||||||
|
string(REPLACE ";" "\\;" pypath "${pypath}")
|
||||||
|
list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
|
||||||
|
|
||||||
|
#generate a bat file that sets the environment and runs the test
|
||||||
|
set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
|
||||||
|
file(WRITE ${bat_file} "@echo off\n")
|
||||||
|
#each line sets an environment variable
|
||||||
|
foreach(environ ${environs})
|
||||||
|
file(APPEND ${bat_file} "SET ${environ}\n")
|
||||||
|
endforeach(environ)
|
||||||
|
#load the command to run with its arguments
|
||||||
|
foreach(arg ${ARGN})
|
||||||
|
file(APPEND ${bat_file} "${arg} ")
|
||||||
|
endforeach(arg)
|
||||||
|
file(APPEND ${bat_file} "\n")
|
||||||
|
|
||||||
|
add_test(${test_name} ${bat_file})
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
endfunction(GR_ADD_TEST)
|
304
cmake/Modules/UseSWIG.cmake
Normal file
304
cmake/Modules/UseSWIG.cmake
Normal file
|
@ -0,0 +1,304 @@
|
||||||
|
# - SWIG module for CMake
|
||||||
|
# Defines the following macros:
|
||||||
|
# SWIG_ADD_MODULE(name language [ files ])
|
||||||
|
# - Define swig module with given name and specified language
|
||||||
|
# SWIG_LINK_LIBRARIES(name [ libraries ])
|
||||||
|
# - Link libraries to swig module
|
||||||
|
# All other macros are for internal use only.
|
||||||
|
# To get the actual name of the swig module,
|
||||||
|
# use: ${SWIG_MODULE_${name}_REAL_NAME}.
|
||||||
|
# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
|
||||||
|
# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
|
||||||
|
# special flags to all swig calls.
|
||||||
|
# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
|
||||||
|
# where to write all the swig generated module (swig -outdir option)
|
||||||
|
# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
|
||||||
|
# to specify extra dependencies for the generated modules.
|
||||||
|
# If the source file generated by swig need some special flag you can use
|
||||||
|
# set_source_files_properties( ${swig_generated_file_fullname}
|
||||||
|
# PROPERTIES COMPILE_FLAGS "-bla")
|
||||||
|
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2004-2009 Kitware, Inc.
|
||||||
|
# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
# (To distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
set(SWIG_CXX_EXTENSION "cxx")
|
||||||
|
set(SWIG_EXTRA_LIBRARIES "")
|
||||||
|
|
||||||
|
set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
|
||||||
|
|
||||||
|
#
|
||||||
|
# For given swig module initialize variables associated with it
|
||||||
|
#
|
||||||
|
macro(SWIG_MODULE_INITIALIZE name language)
|
||||||
|
string(TOUPPER "${language}" swig_uppercase_language)
|
||||||
|
string(TOLOWER "${language}" swig_lowercase_language)
|
||||||
|
set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
|
||||||
|
set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
|
||||||
|
|
||||||
|
set(SWIG_MODULE_${name}_REAL_NAME "${name}")
|
||||||
|
if("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "UNKNOWN")
|
||||||
|
message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
|
||||||
|
elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PYTHON")
|
||||||
|
# when swig is used without the -interface it will produce in the module.py
|
||||||
|
# a 'import _modulename' statement, which implies having a corresponding
|
||||||
|
# _modulename.so (*NIX), _modulename.pyd (Win32).
|
||||||
|
set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
|
||||||
|
elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PERL")
|
||||||
|
set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#
|
||||||
|
# For a given language, input file, and output file, determine extra files that
|
||||||
|
# will be generated. This is internal swig macro.
|
||||||
|
#
|
||||||
|
|
||||||
|
macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
|
||||||
|
set(${outfiles} "")
|
||||||
|
get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
|
||||||
|
${infile} SWIG_MODULE_NAME)
|
||||||
|
if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
|
||||||
|
get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
|
||||||
|
endif()
|
||||||
|
foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
|
||||||
|
set(${outfiles} ${${outfiles}}
|
||||||
|
"${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
|
||||||
|
endforeach()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Take swig (*.i) file and add proper custom commands for it
|
||||||
|
#
|
||||||
|
macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
|
||||||
|
set(swig_full_infile ${infile})
|
||||||
|
get_filename_component(swig_source_file_path "${infile}" PATH)
|
||||||
|
get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
|
||||||
|
get_source_file_property(swig_source_file_generated ${infile} GENERATED)
|
||||||
|
get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
|
||||||
|
get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
|
||||||
|
if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
|
||||||
|
set(swig_source_file_flags "")
|
||||||
|
endif()
|
||||||
|
set(swig_source_file_fullname "${infile}")
|
||||||
|
if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
string(REGEX REPLACE
|
||||||
|
"^${CMAKE_CURRENT_SOURCE_DIR}" ""
|
||||||
|
swig_source_file_relative_path
|
||||||
|
"${swig_source_file_path}")
|
||||||
|
else()
|
||||||
|
if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
string(REGEX REPLACE
|
||||||
|
"^${CMAKE_CURRENT_BINARY_DIR}" ""
|
||||||
|
swig_source_file_relative_path
|
||||||
|
"${swig_source_file_path}")
|
||||||
|
set(swig_source_file_generated 1)
|
||||||
|
else()
|
||||||
|
set(swig_source_file_relative_path "${swig_source_file_path}")
|
||||||
|
if(swig_source_file_generated)
|
||||||
|
set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
|
||||||
|
else()
|
||||||
|
set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
if(swig_source_file_relative_path)
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${swig_generated_file_fullname}/${swig_source_file_relative_path}")
|
||||||
|
endif()
|
||||||
|
# If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
|
||||||
|
if(CMAKE_SWIG_OUTDIR)
|
||||||
|
set(swig_outdir ${CMAKE_SWIG_OUTDIR})
|
||||||
|
else()
|
||||||
|
set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
endif()
|
||||||
|
SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
|
||||||
|
swig_extra_generated_files
|
||||||
|
"${swig_outdir}"
|
||||||
|
"${infile}")
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${swig_generated_file_fullname}/${swig_source_file_name_we}")
|
||||||
|
# add the language into the name of the file (i.e. TCL_wrap)
|
||||||
|
# this allows for the same .i file to be wrapped into different languages
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
|
||||||
|
|
||||||
|
if(swig_source_file_cplusplus)
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
|
||||||
|
else()
|
||||||
|
set(swig_generated_file_fullname
|
||||||
|
"${swig_generated_file_fullname}.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Shut up some warnings from poor SWIG code generation that we
|
||||||
|
# can do nothing about, when this flag is available
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
check_cxx_compiler_flag("-Wno-unused-but-set-variable" HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
|
||||||
|
if(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
|
||||||
|
set_source_files_properties(${swig_generated_file_fullname}
|
||||||
|
PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
|
||||||
|
endif(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
|
||||||
|
|
||||||
|
get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
|
||||||
|
set(swig_include_dirs)
|
||||||
|
foreach(it ${cmake_include_directories})
|
||||||
|
set(swig_include_dirs ${swig_include_dirs} "-I${it}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(swig_special_flags)
|
||||||
|
# default is c, so add c++ flag if it is c++
|
||||||
|
if(swig_source_file_cplusplus)
|
||||||
|
set(swig_special_flags ${swig_special_flags} "-c++")
|
||||||
|
endif()
|
||||||
|
set(swig_extra_flags)
|
||||||
|
if(SWIG_MODULE_${name}_EXTRA_FLAGS)
|
||||||
|
set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# hack to work around CMake bug in add_custom_command with multiple OUTPUT files
|
||||||
|
|
||||||
|
file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
|
||||||
|
unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
|
||||||
|
print(re.sub('\\W', '_', '${name} ${reldir} ' + unique))"
|
||||||
|
OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
file(
|
||||||
|
WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
|
||||||
|
"int main(void){return 0;}\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
# create dummy dependencies
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
|
||||||
|
DEPENDS "${swig_source_file_fullname}" ${SWIG_MODULE_${name}_EXTRA_DEPS}
|
||||||
|
COMMENT ""
|
||||||
|
)
|
||||||
|
|
||||||
|
# create the dummy target
|
||||||
|
add_executable(${_target} ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp)
|
||||||
|
|
||||||
|
# add a custom command to the dummy target
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${_target}
|
||||||
|
# Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
|
||||||
|
COMMAND "${SWIG_EXECUTABLE}"
|
||||||
|
ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
|
||||||
|
${swig_source_file_flags}
|
||||||
|
${CMAKE_SWIG_FLAGS}
|
||||||
|
-outdir ${swig_outdir}
|
||||||
|
${swig_special_flags}
|
||||||
|
${swig_extra_flags}
|
||||||
|
${swig_include_dirs}
|
||||||
|
-o "${swig_generated_file_fullname}"
|
||||||
|
"${swig_source_file_fullname}"
|
||||||
|
COMMENT "Swig source"
|
||||||
|
)
|
||||||
|
|
||||||
|
#add dummy independent dependencies from the _target to each file
|
||||||
|
#that will be generated by the SWIG command above
|
||||||
|
|
||||||
|
set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
|
||||||
|
|
||||||
|
foreach(swig_gen_file ${${outfiles}})
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${swig_gen_file}
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -E touch_nocreate "${swig_gen_file}"
|
||||||
|
DEPENDS ${_target}
|
||||||
|
COMMENT "dummy command to show ${_target} dependency of ${swig_gen_file}"
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set_source_files_properties(
|
||||||
|
${outfiles} PROPERTIES GENERATED 1
|
||||||
|
)
|
||||||
|
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create Swig module
|
||||||
|
#
|
||||||
|
macro(SWIG_ADD_MODULE name language)
|
||||||
|
SWIG_MODULE_INITIALIZE(${name} ${language})
|
||||||
|
set(swig_dot_i_sources)
|
||||||
|
set(swig_other_sources)
|
||||||
|
foreach(it ${ARGN})
|
||||||
|
if(${it} MATCHES ".*\\.i$")
|
||||||
|
set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
|
||||||
|
else()
|
||||||
|
set(swig_other_sources ${swig_other_sources} "${it}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(swig_generated_sources)
|
||||||
|
foreach(it ${swig_dot_i_sources})
|
||||||
|
SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
|
||||||
|
set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
|
||||||
|
endforeach()
|
||||||
|
get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
|
||||||
|
set_directory_properties(PROPERTIES
|
||||||
|
ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
|
||||||
|
add_library(${SWIG_MODULE_${name}_REAL_NAME}
|
||||||
|
MODULE
|
||||||
|
${swig_generated_sources}
|
||||||
|
${swig_other_sources})
|
||||||
|
string(TOLOWER "${language}" swig_lowercase_language)
|
||||||
|
if ("${swig_lowercase_language}" STREQUAL "java")
|
||||||
|
if (APPLE)
|
||||||
|
# In java you want:
|
||||||
|
# System.loadLibrary("LIBRARY");
|
||||||
|
# then JNI will look for a library whose name is platform dependent, namely
|
||||||
|
# MacOS : libLIBRARY.jnilib
|
||||||
|
# Windows: LIBRARY.dll
|
||||||
|
# Linux : libLIBRARY.so
|
||||||
|
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
if ("${swig_lowercase_language}" STREQUAL "python")
|
||||||
|
# this is only needed for the python case where a _modulename.so is generated
|
||||||
|
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
|
||||||
|
# Python extension modules on Windows must have the extension ".pyd"
|
||||||
|
# instead of ".dll" as of Python 2.5. Older python versions do support
|
||||||
|
# this suffix.
|
||||||
|
# http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
|
||||||
|
# <quote>
|
||||||
|
# Windows: .dll is no longer supported as a filename extension for extension modules.
|
||||||
|
# .pyd is now the only filename extension that will be searched for.
|
||||||
|
# </quote>
|
||||||
|
if(WIN32 AND NOT CYGWIN)
|
||||||
|
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Like TARGET_LINK_LIBRARIES but for swig modules
|
||||||
|
#
|
||||||
|
macro(SWIG_LINK_LIBRARIES name)
|
||||||
|
if(SWIG_MODULE_${name}_REAL_NAME)
|
||||||
|
target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
|
||||||
|
else()
|
||||||
|
message(SEND_ERROR "Cannot find Swig library \"${name}\".")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
30
cmake/Modules/digitalhfConfig.cmake
Normal file
30
cmake/Modules/digitalhfConfig.cmake
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
PKG_CHECK_MODULES(PC_DIGITALHF digitalhf)
|
||||||
|
|
||||||
|
FIND_PATH(
|
||||||
|
DIGITALHF_INCLUDE_DIRS
|
||||||
|
NAMES digitalhf/api.h
|
||||||
|
HINTS $ENV{DIGITALHF_DIR}/include
|
||||||
|
${PC_DIGITALHF_INCLUDEDIR}
|
||||||
|
PATHS ${CMAKE_INSTALL_PREFIX}/include
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(
|
||||||
|
DIGITALHF_LIBRARIES
|
||||||
|
NAMES gnuradio-digitalhf
|
||||||
|
HINTS $ENV{DIGITALHF_DIR}/lib
|
||||||
|
${PC_DIGITALHF_LIBDIR}
|
||||||
|
PATHS ${CMAKE_INSTALL_PREFIX}/lib
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib64
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/lib
|
||||||
|
/usr/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DIGITALHF DEFAULT_MSG DIGITALHF_LIBRARIES DIGITALHF_INCLUDE_DIRS)
|
||||||
|
MARK_AS_ADVANCED(DIGITALHF_LIBRARIES DIGITALHF_INCLUDE_DIRS)
|
||||||
|
|
32
cmake/cmake_uninstall.cmake.in
Normal file
32
cmake/cmake_uninstall.cmake.in
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
|
||||||
|
|
||||||
|
IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
||||||
|
ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
|
||||||
|
FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||||
|
STRING(REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
FOREACH(file ${files})
|
||||||
|
MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
|
||||||
|
IF(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
EXEC_PROGRAM(
|
||||||
|
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||||
|
OUTPUT_VARIABLE rm_out
|
||||||
|
RETURN_VALUE rm_retval
|
||||||
|
)
|
||||||
|
IF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
|
||||||
|
ENDIF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}")
|
||||||
|
EXEC_PROGRAM(
|
||||||
|
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||||
|
OUTPUT_VARIABLE rm_out
|
||||||
|
RETURN_VALUE rm_retval
|
||||||
|
)
|
||||||
|
IF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
|
||||||
|
ENDIF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
ELSE(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
|
||||||
|
ENDIF(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
ENDFOREACH(file)
|
36
docs/CMakeLists.txt
Normal file
36
docs/CMakeLists.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup dependencies
|
||||||
|
########################################################################
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Begin conditional configuration
|
||||||
|
########################################################################
|
||||||
|
if(ENABLE_DOXYGEN)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Add subdirectories
|
||||||
|
########################################################################
|
||||||
|
add_subdirectory(doxygen)
|
||||||
|
|
||||||
|
endif(ENABLE_DOXYGEN)
|
11
docs/README.digitalhf
Normal file
11
docs/README.digitalhf
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
This is the digitalhf-write-a-block package meant as a guide to building
|
||||||
|
out-of-tree packages. To use the digitalhf blocks, the Python namespaces
|
||||||
|
is in 'digitalhf', which is imported as:
|
||||||
|
|
||||||
|
import digitalhf
|
||||||
|
|
||||||
|
See the Doxygen documentation for details about the blocks available
|
||||||
|
in this package. A quick listing of the details can be found in Python
|
||||||
|
after importing by using:
|
||||||
|
|
||||||
|
help(digitalhf)
|
53
docs/doxygen/CMakeLists.txt
Normal file
53
docs/doxygen/CMakeLists.txt
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Create the doxygen configuration file
|
||||||
|
########################################################################
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
|
||||||
|
|
||||||
|
set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
|
||||||
|
set(enable_html_docs YES)
|
||||||
|
set(enable_latex_docs NO)
|
||||||
|
set(enable_xml_docs YES)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
||||||
|
@ONLY)
|
||||||
|
|
||||||
|
set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Make and install doxygen docs
|
||||||
|
########################################################################
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${BUILT_DIRS}
|
||||||
|
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
COMMENT "Generating documentation with doxygen"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS})
|
||||||
|
|
||||||
|
install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR})
|
1910
docs/doxygen/Doxyfile.in
Normal file
1910
docs/doxygen/Doxyfile.in
Normal file
File diff suppressed because it is too large
Load diff
1878
docs/doxygen/Doxyfile.swig_doc.in
Normal file
1878
docs/doxygen/Doxyfile.swig_doc.in
Normal file
File diff suppressed because it is too large
Load diff
83
docs/doxygen/doxyxml/__init__.py
Normal file
83
docs/doxygen/doxyxml/__init__.py
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Python interface to contents of doxygen xml documentation.
|
||||||
|
|
||||||
|
Example use:
|
||||||
|
See the contents of the example folder for the C++ and
|
||||||
|
doxygen-generated xml used in this example.
|
||||||
|
|
||||||
|
>>> # Parse the doxygen docs.
|
||||||
|
>>> import os
|
||||||
|
>>> this_dir = os.path.dirname(globals()['__file__'])
|
||||||
|
>>> xml_path = this_dir + "/example/xml/"
|
||||||
|
>>> di = DoxyIndex(xml_path)
|
||||||
|
|
||||||
|
Get a list of all top-level objects.
|
||||||
|
|
||||||
|
>>> print([mem.name() for mem in di.members()])
|
||||||
|
[u'Aadvark', u'aadvarky_enough', u'main']
|
||||||
|
|
||||||
|
Get all functions.
|
||||||
|
|
||||||
|
>>> print([mem.name() for mem in di.in_category(DoxyFunction)])
|
||||||
|
[u'aadvarky_enough', u'main']
|
||||||
|
|
||||||
|
Check if an object is present.
|
||||||
|
|
||||||
|
>>> di.has_member(u'Aadvark')
|
||||||
|
True
|
||||||
|
>>> di.has_member(u'Fish')
|
||||||
|
False
|
||||||
|
|
||||||
|
Get an item by name and check its properties.
|
||||||
|
|
||||||
|
>>> aad = di.get_member(u'Aadvark')
|
||||||
|
>>> print(aad.brief_description)
|
||||||
|
Models the mammal Aadvark.
|
||||||
|
>>> print(aad.detailed_description)
|
||||||
|
Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
|
||||||
|
<BLANKLINE>
|
||||||
|
This line is uninformative and is only to test line breaks in the comments.
|
||||||
|
>>> [mem.name() for mem in aad.members()]
|
||||||
|
[u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness']
|
||||||
|
>>> aad.get_member(u'print').brief_description
|
||||||
|
u'Outputs the vital aadvark statistics.'
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
|
||||||
|
|
||||||
|
def _test():
|
||||||
|
import os
|
||||||
|
this_dir = os.path.dirname(globals()['__file__'])
|
||||||
|
xml_path = this_dir + "/example/xml/"
|
||||||
|
di = DoxyIndex(xml_path)
|
||||||
|
# Get the Aadvark class
|
||||||
|
aad = di.get_member('Aadvark')
|
||||||
|
aad.brief_description
|
||||||
|
import doctest
|
||||||
|
return doctest.testmod()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
_test()
|
||||||
|
|
220
docs/doxygen/doxyxml/base.py
Normal file
220
docs/doxygen/doxyxml/base.py
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
A base class is created.
|
||||||
|
|
||||||
|
Classes based upon this are used to make more user-friendly interfaces
|
||||||
|
to the doxygen xml docs than the generated classes provide.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pdb
|
||||||
|
|
||||||
|
from xml.parsers.expat import ExpatError
|
||||||
|
|
||||||
|
from generated import compound
|
||||||
|
|
||||||
|
|
||||||
|
class Base(object):
|
||||||
|
|
||||||
|
class Duplicate(StandardError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoSuchMember(StandardError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ParsingError(StandardError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __init__(self, parse_data, top=None):
|
||||||
|
self._parsed = False
|
||||||
|
self._error = False
|
||||||
|
self._parse_data = parse_data
|
||||||
|
self._members = []
|
||||||
|
self._dict_members = {}
|
||||||
|
self._in_category = {}
|
||||||
|
self._data = {}
|
||||||
|
if top is not None:
|
||||||
|
self._xml_path = top._xml_path
|
||||||
|
# Set up holder of references
|
||||||
|
else:
|
||||||
|
top = self
|
||||||
|
self._refs = {}
|
||||||
|
self._xml_path = parse_data
|
||||||
|
self.top = top
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_refid(cls, refid, top=None):
|
||||||
|
""" Instantiate class from a refid rather than parsing object. """
|
||||||
|
# First check to see if its already been instantiated.
|
||||||
|
if top is not None and refid in top._refs:
|
||||||
|
return top._refs[refid]
|
||||||
|
# Otherwise create a new instance and set refid.
|
||||||
|
inst = cls(None, top=top)
|
||||||
|
inst.refid = refid
|
||||||
|
inst.add_ref(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_parse_data(cls, parse_data, top=None):
|
||||||
|
refid = getattr(parse_data, 'refid', None)
|
||||||
|
if refid is not None and top is not None and refid in top._refs:
|
||||||
|
return top._refs[refid]
|
||||||
|
inst = cls(parse_data, top=top)
|
||||||
|
if refid is not None:
|
||||||
|
inst.refid = refid
|
||||||
|
inst.add_ref(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
def add_ref(self, obj):
|
||||||
|
if hasattr(obj, 'refid'):
|
||||||
|
self.top._refs[obj.refid] = obj
|
||||||
|
|
||||||
|
mem_classes = []
|
||||||
|
|
||||||
|
def get_cls(self, mem):
|
||||||
|
for cls in self.mem_classes:
|
||||||
|
if cls.can_parse(mem):
|
||||||
|
return cls
|
||||||
|
raise StandardError(("Did not find a class for object '%s'." \
|
||||||
|
% (mem.get_name())))
|
||||||
|
|
||||||
|
def convert_mem(self, mem):
|
||||||
|
try:
|
||||||
|
cls = self.get_cls(mem)
|
||||||
|
converted = cls.from_parse_data(mem, self.top)
|
||||||
|
if converted is None:
|
||||||
|
raise StandardError('No class matched this object.')
|
||||||
|
self.add_ref(converted)
|
||||||
|
return converted
|
||||||
|
except StandardError, e:
|
||||||
|
print e
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, inst):
|
||||||
|
return isinstance(inst, cls)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
self._parsed = True
|
||||||
|
|
||||||
|
def _get_dict_members(self, cat=None):
|
||||||
|
"""
|
||||||
|
For given category a dictionary is returned mapping member names to
|
||||||
|
members of that category. For names that are duplicated the name is
|
||||||
|
mapped to None.
|
||||||
|
"""
|
||||||
|
self.confirm_no_error()
|
||||||
|
if cat not in self._dict_members:
|
||||||
|
new_dict = {}
|
||||||
|
for mem in self.in_category(cat):
|
||||||
|
if mem.name() not in new_dict:
|
||||||
|
new_dict[mem.name()] = mem
|
||||||
|
else:
|
||||||
|
new_dict[mem.name()] = self.Duplicate
|
||||||
|
self._dict_members[cat] = new_dict
|
||||||
|
return self._dict_members[cat]
|
||||||
|
|
||||||
|
def in_category(self, cat):
|
||||||
|
self.confirm_no_error()
|
||||||
|
if cat is None:
|
||||||
|
return self._members
|
||||||
|
if cat not in self._in_category:
|
||||||
|
self._in_category[cat] = [mem for mem in self._members
|
||||||
|
if cat.includes(mem)]
|
||||||
|
return self._in_category[cat]
|
||||||
|
|
||||||
|
def get_member(self, name, cat=None):
|
||||||
|
self.confirm_no_error()
|
||||||
|
# Check if it's in a namespace or class.
|
||||||
|
bits = name.split('::')
|
||||||
|
first = bits[0]
|
||||||
|
rest = '::'.join(bits[1:])
|
||||||
|
member = self._get_dict_members(cat).get(first, self.NoSuchMember)
|
||||||
|
# Raise any errors that are returned.
|
||||||
|
if member in set([self.NoSuchMember, self.Duplicate]):
|
||||||
|
raise member()
|
||||||
|
if rest:
|
||||||
|
return member.get_member(rest, cat=cat)
|
||||||
|
return member
|
||||||
|
|
||||||
|
def has_member(self, name, cat=None):
|
||||||
|
try:
|
||||||
|
mem = self.get_member(name, cat=cat)
|
||||||
|
return True
|
||||||
|
except self.NoSuchMember:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def data(self):
|
||||||
|
self.confirm_no_error()
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
def members(self):
|
||||||
|
self.confirm_no_error()
|
||||||
|
return self._members
|
||||||
|
|
||||||
|
def process_memberdefs(self):
|
||||||
|
mdtss = []
|
||||||
|
for sec in self._retrieved_data.compounddef.sectiondef:
|
||||||
|
mdtss += sec.memberdef
|
||||||
|
# At the moment we lose all information associated with sections.
|
||||||
|
# Sometimes a memberdef is in several sectiondef.
|
||||||
|
# We make sure we don't get duplicates here.
|
||||||
|
uniques = set([])
|
||||||
|
for mem in mdtss:
|
||||||
|
converted = self.convert_mem(mem)
|
||||||
|
pair = (mem.name, mem.__class__)
|
||||||
|
if pair not in uniques:
|
||||||
|
uniques.add(pair)
|
||||||
|
self._members.append(converted)
|
||||||
|
|
||||||
|
def retrieve_data(self):
|
||||||
|
filename = os.path.join(self._xml_path, self.refid + '.xml')
|
||||||
|
try:
|
||||||
|
self._retrieved_data = compound.parse(filename)
|
||||||
|
except ExpatError:
|
||||||
|
print('Error in xml in file %s' % filename)
|
||||||
|
self._error = True
|
||||||
|
self._retrieved_data = None
|
||||||
|
|
||||||
|
def check_parsed(self):
|
||||||
|
if not self._parsed:
|
||||||
|
self._parse()
|
||||||
|
|
||||||
|
def confirm_no_error(self):
|
||||||
|
self.check_parsed()
|
||||||
|
if self._error:
|
||||||
|
raise self.ParsingError()
|
||||||
|
|
||||||
|
def error(self):
|
||||||
|
self.check_parsed()
|
||||||
|
return self._error
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
# first see if we can do it without processing.
|
||||||
|
if self._parse_data is not None:
|
||||||
|
return self._parse_data.name
|
||||||
|
self.check_parsed()
|
||||||
|
return self._retrieved_data.compounddef.name
|
302
docs/doxygen/doxyxml/doxyindex.py
Normal file
302
docs/doxygen/doxyxml/doxyindex.py
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Classes providing more user-friendly interfaces to the doxygen xml
|
||||||
|
docs than the generated classes provide.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from generated import index
|
||||||
|
from base import Base
|
||||||
|
from text import description
|
||||||
|
|
||||||
|
class DoxyIndex(Base):
|
||||||
|
"""
|
||||||
|
Parses a doxygen xml directory.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyIndex, self)._parse()
|
||||||
|
self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
|
||||||
|
for mem in self._root.compound:
|
||||||
|
converted = self.convert_mem(mem)
|
||||||
|
# For files and namespaces we want the contents to be
|
||||||
|
# accessible directly from the parent rather than having
|
||||||
|
# to go through the file object.
|
||||||
|
if self.get_cls(mem) == DoxyFile:
|
||||||
|
if mem.name.endswith('.h'):
|
||||||
|
self._members += converted.members()
|
||||||
|
self._members.append(converted)
|
||||||
|
elif self.get_cls(mem) == DoxyNamespace:
|
||||||
|
self._members += converted.members()
|
||||||
|
self._members.append(converted)
|
||||||
|
else:
|
||||||
|
self._members.append(converted)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_swig_doc_i(self):
|
||||||
|
"""
|
||||||
|
%feature("docstring") gr_make_align_on_samplenumbers_ss::align_state "
|
||||||
|
Wraps the C++: gr_align_on_samplenumbers_ss::align_state";
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyCompMem(Base):
|
||||||
|
|
||||||
|
|
||||||
|
kind = None
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(DoxyCompMem, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return obj.kind == cls.kind
|
||||||
|
|
||||||
|
def set_descriptions(self, parse_data):
|
||||||
|
bd = description(getattr(parse_data, 'briefdescription', None))
|
||||||
|
dd = description(getattr(parse_data, 'detaileddescription', None))
|
||||||
|
self._data['brief_description'] = bd
|
||||||
|
self._data['detailed_description'] = dd
|
||||||
|
|
||||||
|
def set_parameters(self, data):
|
||||||
|
vs = [ddc.value for ddc in data.detaileddescription.content_]
|
||||||
|
pls = []
|
||||||
|
for v in vs:
|
||||||
|
if hasattr(v, 'parameterlist'):
|
||||||
|
pls += v.parameterlist
|
||||||
|
pis = []
|
||||||
|
for pl in pls:
|
||||||
|
pis += pl.parameteritem
|
||||||
|
dpis = []
|
||||||
|
for pi in pis:
|
||||||
|
dpi = DoxyParameterItem(pi)
|
||||||
|
dpi._parse()
|
||||||
|
dpis.append(dpi)
|
||||||
|
self._data['params'] = dpis
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyCompound(DoxyCompMem):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DoxyMember(DoxyCompMem):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DoxyFunction(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'function'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyFunction, self)._parse()
|
||||||
|
self.set_descriptions(self._parse_data)
|
||||||
|
self.set_parameters(self._parse_data)
|
||||||
|
if not self._data['params']:
|
||||||
|
# If the params weren't set by a comment then just grab the names.
|
||||||
|
self._data['params'] = []
|
||||||
|
prms = self._parse_data.param
|
||||||
|
for prm in prms:
|
||||||
|
self._data['params'].append(DoxyParam(prm))
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
params = property(lambda self: self.data()['params'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFunction)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyParam(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyParam, self)._parse()
|
||||||
|
self.set_descriptions(self._parse_data)
|
||||||
|
self._data['declname'] = self._parse_data.declname
|
||||||
|
|
||||||
|
@property
|
||||||
|
def description(self):
|
||||||
|
descriptions = []
|
||||||
|
if self.brief_description:
|
||||||
|
descriptions.append(self.brief_description)
|
||||||
|
if self.detailed_description:
|
||||||
|
descriptions.append(self.detailed_description)
|
||||||
|
return '\n\n'.join(descriptions)
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
name = property(lambda self: self.data()['declname'])
|
||||||
|
|
||||||
|
class DoxyParameterItem(DoxyMember):
|
||||||
|
"""A different representation of a parameter in Doxygen."""
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyParameterItem, self)._parse()
|
||||||
|
names = []
|
||||||
|
for nl in self._parse_data.parameternamelist:
|
||||||
|
for pn in nl.parametername:
|
||||||
|
names.append(description(pn))
|
||||||
|
# Just take first name
|
||||||
|
self._data['name'] = names[0]
|
||||||
|
# Get description
|
||||||
|
pd = description(self._parse_data.get_parameterdescription())
|
||||||
|
self._data['description'] = pd
|
||||||
|
|
||||||
|
description = property(lambda self: self.data()['description'])
|
||||||
|
name = property(lambda self: self.data()['name'])
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyClass(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'class'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyClass, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
self.set_parameters(self._retrieved_data.compounddef)
|
||||||
|
# Sectiondef.kind tells about whether private or public.
|
||||||
|
# We just ignore this for now.
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
params = property(lambda self: self.data()['params'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyClass)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyFile(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'file'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyFile, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFile)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyNamespace(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'namespace'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyNamespace, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyNamespace)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyGroup(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'group'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyGroup, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
cdef = self._retrieved_data.compounddef
|
||||||
|
self._data['title'] = description(cdef.title)
|
||||||
|
# Process inner groups
|
||||||
|
grps = cdef.innergroup
|
||||||
|
for grp in grps:
|
||||||
|
converted = DoxyGroup.from_refid(grp.refid, top=self.top)
|
||||||
|
self._members.append(converted)
|
||||||
|
# Process inner classes
|
||||||
|
klasses = cdef.innerclass
|
||||||
|
for kls in klasses:
|
||||||
|
converted = DoxyClass.from_refid(kls.refid, top=self.top)
|
||||||
|
self._members.append(converted)
|
||||||
|
# Process normal members
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
title = property(lambda self: self.data()['title'])
|
||||||
|
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyGroup)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyFriend(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'friend'
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFriend)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyOther(Base):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum',
|
||||||
|
'dir', 'page', 'signal', 'slot', 'property'])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return obj.kind in cls.kinds
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyOther)
|
7
docs/doxygen/doxyxml/generated/__init__.py
Normal file
7
docs/doxygen/doxyxml/generated/__init__.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
"""
|
||||||
|
Contains generated files produced by generateDS.py.
|
||||||
|
|
||||||
|
These do the real work of parsing the doxygen xml files but the
|
||||||
|
resultant classes are not very friendly to navigate so the rest of the
|
||||||
|
doxyxml module processes them further.
|
||||||
|
"""
|
503
docs/doxygen/doxyxml/generated/compound.py
Normal file
503
docs/doxygen/doxyxml/generated/compound.py
Normal file
|
@ -0,0 +1,503 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from string import lower as str_lower
|
||||||
|
from xml.dom import minidom
|
||||||
|
from xml.dom import Node
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import compoundsuper as supermod
|
||||||
|
from compoundsuper import MixedContainer
|
||||||
|
|
||||||
|
|
||||||
|
class DoxygenTypeSub(supermod.DoxygenType):
|
||||||
|
def __init__(self, version=None, compounddef=None):
|
||||||
|
supermod.DoxygenType.__init__(self, version, compounddef)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
return self.compounddef.find(details)
|
||||||
|
|
||||||
|
supermod.DoxygenType.subclass = DoxygenTypeSub
|
||||||
|
# end class DoxygenTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class compounddefTypeSub(supermod.compounddefType):
|
||||||
|
def __init__(self, kind=None, prot=None, id=None, compoundname='', title='', basecompoundref=None, derivedcompoundref=None, includes=None, includedby=None, incdepgraph=None, invincdepgraph=None, innerdir=None, innerfile=None, innerclass=None, innernamespace=None, innerpage=None, innergroup=None, templateparamlist=None, sectiondef=None, briefdescription=None, detaileddescription=None, inheritancegraph=None, collaborationgraph=None, programlisting=None, location=None, listofallmembers=None):
|
||||||
|
supermod.compounddefType.__init__(self, kind, prot, id, compoundname, title, basecompoundref, derivedcompoundref, includes, includedby, incdepgraph, invincdepgraph, innerdir, innerfile, innerclass, innernamespace, innerpage, innergroup, templateparamlist, sectiondef, briefdescription, detaileddescription, inheritancegraph, collaborationgraph, programlisting, location, listofallmembers)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
if self.id == details.refid:
|
||||||
|
return self
|
||||||
|
|
||||||
|
for sectiondef in self.sectiondef:
|
||||||
|
result = sectiondef.find(details)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
supermod.compounddefType.subclass = compounddefTypeSub
|
||||||
|
# end class compounddefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class listofallmembersTypeSub(supermod.listofallmembersType):
|
||||||
|
def __init__(self, member=None):
|
||||||
|
supermod.listofallmembersType.__init__(self, member)
|
||||||
|
supermod.listofallmembersType.subclass = listofallmembersTypeSub
|
||||||
|
# end class listofallmembersTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class memberRefTypeSub(supermod.memberRefType):
|
||||||
|
def __init__(self, virt=None, prot=None, refid=None, ambiguityscope=None, scope='', name=''):
|
||||||
|
supermod.memberRefType.__init__(self, virt, prot, refid, ambiguityscope, scope, name)
|
||||||
|
supermod.memberRefType.subclass = memberRefTypeSub
|
||||||
|
# end class memberRefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class compoundRefTypeSub(supermod.compoundRefType):
|
||||||
|
def __init__(self, virt=None, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.compoundRefType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.compoundRefType.subclass = compoundRefTypeSub
|
||||||
|
# end class compoundRefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class reimplementTypeSub(supermod.reimplementType):
|
||||||
|
def __init__(self, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.reimplementType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.reimplementType.subclass = reimplementTypeSub
|
||||||
|
# end class reimplementTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class incTypeSub(supermod.incType):
|
||||||
|
def __init__(self, local=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.incType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.incType.subclass = incTypeSub
|
||||||
|
# end class incTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class refTypeSub(supermod.refType):
|
||||||
|
def __init__(self, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.refType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.refType.subclass = refTypeSub
|
||||||
|
# end class refTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class refTextTypeSub(supermod.refTextType):
|
||||||
|
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.refTextType.__init__(self, mixedclass_, content_)
|
||||||
|
|
||||||
|
supermod.refTextType.subclass = refTextTypeSub
|
||||||
|
# end class refTextTypeSub
|
||||||
|
|
||||||
|
class sectiondefTypeSub(supermod.sectiondefType):
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, kind=None, header='', description=None, memberdef=None):
|
||||||
|
supermod.sectiondefType.__init__(self, kind, header, description, memberdef)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
for memberdef in self.memberdef:
|
||||||
|
if memberdef.id == details.refid:
|
||||||
|
return memberdef
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
supermod.sectiondefType.subclass = sectiondefTypeSub
|
||||||
|
# end class sectiondefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class memberdefTypeSub(supermod.memberdefType):
|
||||||
|
def __init__(self, initonly=None, kind=None, volatile=None, const=None, raise_=None, virt=None, readable=None, prot=None, explicit=None, new=None, final=None, writable=None, add=None, static=None, remove=None, sealed=None, mutable=None, gettable=None, inline=None, settable=None, id=None, templateparamlist=None, type_=None, definition='', argsstring='', name='', read='', write='', bitfield='', reimplements=None, reimplementedby=None, param=None, enumvalue=None, initializer=None, exceptions=None, briefdescription=None, detaileddescription=None, inbodydescription=None, location=None, references=None, referencedby=None):
|
||||||
|
supermod.memberdefType.__init__(self, initonly, kind, volatile, const, raise_, virt, readable, prot, explicit, new, final, writable, add, static, remove, sealed, mutable, gettable, inline, settable, id, templateparamlist, type_, definition, argsstring, name, read, write, bitfield, reimplements, reimplementedby, param, enumvalue, initializer, exceptions, briefdescription, detaileddescription, inbodydescription, location, references, referencedby)
|
||||||
|
supermod.memberdefType.subclass = memberdefTypeSub
|
||||||
|
# end class memberdefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class descriptionTypeSub(supermod.descriptionType):
|
||||||
|
def __init__(self, title='', para=None, sect1=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.descriptionType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.descriptionType.subclass = descriptionTypeSub
|
||||||
|
# end class descriptionTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class enumvalueTypeSub(supermod.enumvalueType):
|
||||||
|
def __init__(self, prot=None, id=None, name='', initializer=None, briefdescription=None, detaileddescription=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.enumvalueType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.enumvalueType.subclass = enumvalueTypeSub
|
||||||
|
# end class enumvalueTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class templateparamlistTypeSub(supermod.templateparamlistType):
|
||||||
|
def __init__(self, param=None):
|
||||||
|
supermod.templateparamlistType.__init__(self, param)
|
||||||
|
supermod.templateparamlistType.subclass = templateparamlistTypeSub
|
||||||
|
# end class templateparamlistTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class paramTypeSub(supermod.paramType):
|
||||||
|
def __init__(self, type_=None, declname='', defname='', array='', defval=None, briefdescription=None):
|
||||||
|
supermod.paramType.__init__(self, type_, declname, defname, array, defval, briefdescription)
|
||||||
|
supermod.paramType.subclass = paramTypeSub
|
||||||
|
# end class paramTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class linkedTextTypeSub(supermod.linkedTextType):
|
||||||
|
def __init__(self, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.linkedTextType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.linkedTextType.subclass = linkedTextTypeSub
|
||||||
|
# end class linkedTextTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class graphTypeSub(supermod.graphType):
|
||||||
|
def __init__(self, node=None):
|
||||||
|
supermod.graphType.__init__(self, node)
|
||||||
|
supermod.graphType.subclass = graphTypeSub
|
||||||
|
# end class graphTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class nodeTypeSub(supermod.nodeType):
|
||||||
|
def __init__(self, id=None, label='', link=None, childnode=None):
|
||||||
|
supermod.nodeType.__init__(self, id, label, link, childnode)
|
||||||
|
supermod.nodeType.subclass = nodeTypeSub
|
||||||
|
# end class nodeTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class childnodeTypeSub(supermod.childnodeType):
|
||||||
|
def __init__(self, relation=None, refid=None, edgelabel=None):
|
||||||
|
supermod.childnodeType.__init__(self, relation, refid, edgelabel)
|
||||||
|
supermod.childnodeType.subclass = childnodeTypeSub
|
||||||
|
# end class childnodeTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class linkTypeSub(supermod.linkType):
|
||||||
|
def __init__(self, refid=None, external=None, valueOf_=''):
|
||||||
|
supermod.linkType.__init__(self, refid, external)
|
||||||
|
supermod.linkType.subclass = linkTypeSub
|
||||||
|
# end class linkTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class listingTypeSub(supermod.listingType):
|
||||||
|
def __init__(self, codeline=None):
|
||||||
|
supermod.listingType.__init__(self, codeline)
|
||||||
|
supermod.listingType.subclass = listingTypeSub
|
||||||
|
# end class listingTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class codelineTypeSub(supermod.codelineType):
|
||||||
|
def __init__(self, external=None, lineno=None, refkind=None, refid=None, highlight=None):
|
||||||
|
supermod.codelineType.__init__(self, external, lineno, refkind, refid, highlight)
|
||||||
|
supermod.codelineType.subclass = codelineTypeSub
|
||||||
|
# end class codelineTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class highlightTypeSub(supermod.highlightType):
|
||||||
|
def __init__(self, class_=None, sp=None, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.highlightType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.highlightType.subclass = highlightTypeSub
|
||||||
|
# end class highlightTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class referenceTypeSub(supermod.referenceType):
|
||||||
|
def __init__(self, endline=None, startline=None, refid=None, compoundref=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.referenceType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.referenceType.subclass = referenceTypeSub
|
||||||
|
# end class referenceTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class locationTypeSub(supermod.locationType):
|
||||||
|
def __init__(self, bodystart=None, line=None, bodyend=None, bodyfile=None, file=None, valueOf_=''):
|
||||||
|
supermod.locationType.__init__(self, bodystart, line, bodyend, bodyfile, file)
|
||||||
|
supermod.locationType.subclass = locationTypeSub
|
||||||
|
# end class locationTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect1TypeSub(supermod.docSect1Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect2=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect1Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect1Type.subclass = docSect1TypeSub
|
||||||
|
# end class docSect1TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect2TypeSub(supermod.docSect2Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect3=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect2Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect2Type.subclass = docSect2TypeSub
|
||||||
|
# end class docSect2TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect3TypeSub(supermod.docSect3Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect4=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect3Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect3Type.subclass = docSect3TypeSub
|
||||||
|
# end class docSect3TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect4TypeSub(supermod.docSect4Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect4Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect4Type.subclass = docSect4TypeSub
|
||||||
|
# end class docSect4TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalTypeSub(supermod.docInternalType):
|
||||||
|
def __init__(self, para=None, sect1=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalType.subclass = docInternalTypeSub
|
||||||
|
# end class docInternalTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS1TypeSub(supermod.docInternalS1Type):
|
||||||
|
def __init__(self, para=None, sect2=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS1Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS1Type.subclass = docInternalS1TypeSub
|
||||||
|
# end class docInternalS1TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS2TypeSub(supermod.docInternalS2Type):
|
||||||
|
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS2Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS2Type.subclass = docInternalS2TypeSub
|
||||||
|
# end class docInternalS2TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS3TypeSub(supermod.docInternalS3Type):
|
||||||
|
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS3Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS3Type.subclass = docInternalS3TypeSub
|
||||||
|
# end class docInternalS3TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS4TypeSub(supermod.docInternalS4Type):
|
||||||
|
def __init__(self, para=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS4Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS4Type.subclass = docInternalS4TypeSub
|
||||||
|
# end class docInternalS4TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docURLLinkSub(supermod.docURLLink):
|
||||||
|
def __init__(self, url=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docURLLink.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docURLLink.subclass = docURLLinkSub
|
||||||
|
# end class docURLLinkSub
|
||||||
|
|
||||||
|
|
||||||
|
class docAnchorTypeSub(supermod.docAnchorType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docAnchorType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docAnchorType.subclass = docAnchorTypeSub
|
||||||
|
# end class docAnchorTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docFormulaTypeSub(supermod.docFormulaType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docFormulaType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docFormulaType.subclass = docFormulaTypeSub
|
||||||
|
# end class docFormulaTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docIndexEntryTypeSub(supermod.docIndexEntryType):
|
||||||
|
def __init__(self, primaryie='', secondaryie=''):
|
||||||
|
supermod.docIndexEntryType.__init__(self, primaryie, secondaryie)
|
||||||
|
supermod.docIndexEntryType.subclass = docIndexEntryTypeSub
|
||||||
|
# end class docIndexEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docListTypeSub(supermod.docListType):
|
||||||
|
def __init__(self, listitem=None):
|
||||||
|
supermod.docListType.__init__(self, listitem)
|
||||||
|
supermod.docListType.subclass = docListTypeSub
|
||||||
|
# end class docListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docListItemTypeSub(supermod.docListItemType):
|
||||||
|
def __init__(self, para=None):
|
||||||
|
supermod.docListItemType.__init__(self, para)
|
||||||
|
supermod.docListItemType.subclass = docListItemTypeSub
|
||||||
|
# end class docListItemTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSimpleSectTypeSub(supermod.docSimpleSectType):
|
||||||
|
def __init__(self, kind=None, title=None, para=None):
|
||||||
|
supermod.docSimpleSectType.__init__(self, kind, title, para)
|
||||||
|
supermod.docSimpleSectType.subclass = docSimpleSectTypeSub
|
||||||
|
# end class docSimpleSectTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docVarListEntryTypeSub(supermod.docVarListEntryType):
|
||||||
|
def __init__(self, term=None):
|
||||||
|
supermod.docVarListEntryType.__init__(self, term)
|
||||||
|
supermod.docVarListEntryType.subclass = docVarListEntryTypeSub
|
||||||
|
# end class docVarListEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docRefTextTypeSub(supermod.docRefTextType):
|
||||||
|
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docRefTextType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docRefTextType.subclass = docRefTextTypeSub
|
||||||
|
# end class docRefTextTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTableTypeSub(supermod.docTableType):
|
||||||
|
def __init__(self, rows=None, cols=None, row=None, caption=None):
|
||||||
|
supermod.docTableType.__init__(self, rows, cols, row, caption)
|
||||||
|
supermod.docTableType.subclass = docTableTypeSub
|
||||||
|
# end class docTableTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docRowTypeSub(supermod.docRowType):
|
||||||
|
def __init__(self, entry=None):
|
||||||
|
supermod.docRowType.__init__(self, entry)
|
||||||
|
supermod.docRowType.subclass = docRowTypeSub
|
||||||
|
# end class docRowTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docEntryTypeSub(supermod.docEntryType):
|
||||||
|
def __init__(self, thead=None, para=None):
|
||||||
|
supermod.docEntryType.__init__(self, thead, para)
|
||||||
|
supermod.docEntryType.subclass = docEntryTypeSub
|
||||||
|
# end class docEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docHeadingTypeSub(supermod.docHeadingType):
|
||||||
|
def __init__(self, level=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docHeadingType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docHeadingType.subclass = docHeadingTypeSub
|
||||||
|
# end class docHeadingTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docImageTypeSub(supermod.docImageType):
|
||||||
|
def __init__(self, width=None, type_=None, name=None, height=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docImageType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docImageType.subclass = docImageTypeSub
|
||||||
|
# end class docImageTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docDotFileTypeSub(supermod.docDotFileType):
|
||||||
|
def __init__(self, name=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docDotFileType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docDotFileType.subclass = docDotFileTypeSub
|
||||||
|
# end class docDotFileTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTocItemTypeSub(supermod.docTocItemType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docTocItemType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docTocItemType.subclass = docTocItemTypeSub
|
||||||
|
# end class docTocItemTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTocListTypeSub(supermod.docTocListType):
|
||||||
|
def __init__(self, tocitem=None):
|
||||||
|
supermod.docTocListType.__init__(self, tocitem)
|
||||||
|
supermod.docTocListType.subclass = docTocListTypeSub
|
||||||
|
# end class docTocListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docLanguageTypeSub(supermod.docLanguageType):
|
||||||
|
def __init__(self, langid=None, para=None):
|
||||||
|
supermod.docLanguageType.__init__(self, langid, para)
|
||||||
|
supermod.docLanguageType.subclass = docLanguageTypeSub
|
||||||
|
# end class docLanguageTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamListTypeSub(supermod.docParamListType):
|
||||||
|
def __init__(self, kind=None, parameteritem=None):
|
||||||
|
supermod.docParamListType.__init__(self, kind, parameteritem)
|
||||||
|
supermod.docParamListType.subclass = docParamListTypeSub
|
||||||
|
# end class docParamListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamListItemSub(supermod.docParamListItem):
|
||||||
|
def __init__(self, parameternamelist=None, parameterdescription=None):
|
||||||
|
supermod.docParamListItem.__init__(self, parameternamelist, parameterdescription)
|
||||||
|
supermod.docParamListItem.subclass = docParamListItemSub
|
||||||
|
# end class docParamListItemSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamNameListSub(supermod.docParamNameList):
|
||||||
|
def __init__(self, parametername=None):
|
||||||
|
supermod.docParamNameList.__init__(self, parametername)
|
||||||
|
supermod.docParamNameList.subclass = docParamNameListSub
|
||||||
|
# end class docParamNameListSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamNameSub(supermod.docParamName):
|
||||||
|
def __init__(self, direction=None, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docParamName.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docParamName.subclass = docParamNameSub
|
||||||
|
# end class docParamNameSub
|
||||||
|
|
||||||
|
|
||||||
|
class docXRefSectTypeSub(supermod.docXRefSectType):
|
||||||
|
def __init__(self, id=None, xreftitle=None, xrefdescription=None):
|
||||||
|
supermod.docXRefSectType.__init__(self, id, xreftitle, xrefdescription)
|
||||||
|
supermod.docXRefSectType.subclass = docXRefSectTypeSub
|
||||||
|
# end class docXRefSectTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docCopyTypeSub(supermod.docCopyType):
|
||||||
|
def __init__(self, link=None, para=None, sect1=None, internal=None):
|
||||||
|
supermod.docCopyType.__init__(self, link, para, sect1, internal)
|
||||||
|
supermod.docCopyType.subclass = docCopyTypeSub
|
||||||
|
# end class docCopyTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docCharTypeSub(supermod.docCharType):
|
||||||
|
def __init__(self, char=None, valueOf_=''):
|
||||||
|
supermod.docCharType.__init__(self, char)
|
||||||
|
supermod.docCharType.subclass = docCharTypeSub
|
||||||
|
# end class docCharTypeSub
|
||||||
|
|
||||||
|
class docParaTypeSub(supermod.docParaType):
|
||||||
|
def __init__(self, char=None, valueOf_=''):
|
||||||
|
supermod.docParaType.__init__(self, char)
|
||||||
|
|
||||||
|
self.parameterlist = []
|
||||||
|
self.simplesects = []
|
||||||
|
self.content = []
|
||||||
|
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
supermod.docParaType.buildChildren(self, child_, nodeName_)
|
||||||
|
|
||||||
|
if child_.nodeType == Node.TEXT_NODE:
|
||||||
|
obj_ = self.mixedclass_(MixedContainer.CategoryText,
|
||||||
|
MixedContainer.TypeNone, '', child_.nodeValue)
|
||||||
|
self.content.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == "ref":
|
||||||
|
obj_ = supermod.docRefTextType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.content.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'parameterlist':
|
||||||
|
obj_ = supermod.docParamListType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.parameterlist.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'simplesect':
|
||||||
|
obj_ = supermod.docSimpleSectType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.simplesects.append(obj_)
|
||||||
|
|
||||||
|
|
||||||
|
supermod.docParaType.subclass = docParaTypeSub
|
||||||
|
# end class docParaTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFilename):
|
||||||
|
doc = minidom.parse(inFilename)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = supermod.DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
8342
docs/doxygen/doxyxml/generated/compoundsuper.py
Normal file
8342
docs/doxygen/doxyxml/generated/compoundsuper.py
Normal file
File diff suppressed because it is too large
Load diff
77
docs/doxygen/doxyxml/generated/index.py
Normal file
77
docs/doxygen/doxyxml/generated/index.py
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import compound
|
||||||
|
|
||||||
|
import indexsuper as supermod
|
||||||
|
|
||||||
|
class DoxygenTypeSub(supermod.DoxygenType):
|
||||||
|
def __init__(self, version=None, compound=None):
|
||||||
|
supermod.DoxygenType.__init__(self, version, compound)
|
||||||
|
|
||||||
|
def find_compounds_and_members(self, details):
|
||||||
|
"""
|
||||||
|
Returns a list of all compounds and their members which match details
|
||||||
|
"""
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for compound in self.compound:
|
||||||
|
members = compound.find_members(details)
|
||||||
|
if members:
|
||||||
|
results.append([compound, members])
|
||||||
|
else:
|
||||||
|
if details.match(compound):
|
||||||
|
results.append([compound, []])
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
supermod.DoxygenType.subclass = DoxygenTypeSub
|
||||||
|
# end class DoxygenTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class CompoundTypeSub(supermod.CompoundType):
|
||||||
|
def __init__(self, kind=None, refid=None, name='', member=None):
|
||||||
|
supermod.CompoundType.__init__(self, kind, refid, name, member)
|
||||||
|
|
||||||
|
def find_members(self, details):
|
||||||
|
"""
|
||||||
|
Returns a list of all members which match details
|
||||||
|
"""
|
||||||
|
|
||||||
|
results = []
|
||||||
|
|
||||||
|
for member in self.member:
|
||||||
|
if details.match(member):
|
||||||
|
results.append(member)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
supermod.CompoundType.subclass = CompoundTypeSub
|
||||||
|
# end class CompoundTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class MemberTypeSub(supermod.MemberType):
|
||||||
|
|
||||||
|
def __init__(self, kind=None, refid=None, name=''):
|
||||||
|
supermod.MemberType.__init__(self, kind, refid, name)
|
||||||
|
|
||||||
|
supermod.MemberType.subclass = MemberTypeSub
|
||||||
|
# end class MemberTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFilename):
|
||||||
|
|
||||||
|
doc = minidom.parse(inFilename)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = supermod.DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
|
||||||
|
return rootObj
|
||||||
|
|
523
docs/doxygen/doxyxml/generated/indexsuper.py
Normal file
523
docs/doxygen/doxyxml/generated/indexsuper.py
Normal file
|
@ -0,0 +1,523 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
from string import lower as str_lower
|
||||||
|
from xml.dom import minidom
|
||||||
|
from xml.dom import Node
|
||||||
|
|
||||||
|
#
|
||||||
|
# User methods
|
||||||
|
#
|
||||||
|
# Calls to the methods in these classes are generated by generateDS.py.
|
||||||
|
# You can replace these methods by re-implementing the following class
|
||||||
|
# in a module named generatedssuper.py.
|
||||||
|
|
||||||
|
try:
|
||||||
|
from generatedssuper import GeneratedsSuper
|
||||||
|
except ImportError, exp:
|
||||||
|
|
||||||
|
class GeneratedsSuper:
|
||||||
|
def format_string(self, input_data, input_name=''):
|
||||||
|
return input_data
|
||||||
|
def format_integer(self, input_data, input_name=''):
|
||||||
|
return '%d' % input_data
|
||||||
|
def format_float(self, input_data, input_name=''):
|
||||||
|
return '%f' % input_data
|
||||||
|
def format_double(self, input_data, input_name=''):
|
||||||
|
return '%e' % input_data
|
||||||
|
def format_boolean(self, input_data, input_name=''):
|
||||||
|
return '%s' % input_data
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you have installed IPython you can uncomment and use the following.
|
||||||
|
# IPython is available from http://ipython.scipy.org/.
|
||||||
|
#
|
||||||
|
|
||||||
|
## from IPython.Shell import IPShellEmbed
|
||||||
|
## args = ''
|
||||||
|
## ipshell = IPShellEmbed(args,
|
||||||
|
## banner = 'Dropping into IPython',
|
||||||
|
## exit_msg = 'Leaving Interpreter, back to program.')
|
||||||
|
|
||||||
|
# Then use the following line where and when you want to drop into the
|
||||||
|
# IPython shell:
|
||||||
|
# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
|
||||||
|
|
||||||
|
#
|
||||||
|
# Globals
|
||||||
|
#
|
||||||
|
|
||||||
|
ExternalEncoding = 'ascii'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Support/utility functions.
|
||||||
|
#
|
||||||
|
|
||||||
|
def showIndent(outfile, level):
|
||||||
|
for idx in range(level):
|
||||||
|
outfile.write(' ')
|
||||||
|
|
||||||
|
def quote_xml(inStr):
|
||||||
|
s1 = (isinstance(inStr, basestring) and inStr or
|
||||||
|
'%s' % inStr)
|
||||||
|
s1 = s1.replace('&', '&')
|
||||||
|
s1 = s1.replace('<', '<')
|
||||||
|
s1 = s1.replace('>', '>')
|
||||||
|
return s1
|
||||||
|
|
||||||
|
def quote_attrib(inStr):
|
||||||
|
s1 = (isinstance(inStr, basestring) and inStr or
|
||||||
|
'%s' % inStr)
|
||||||
|
s1 = s1.replace('&', '&')
|
||||||
|
s1 = s1.replace('<', '<')
|
||||||
|
s1 = s1.replace('>', '>')
|
||||||
|
if '"' in s1:
|
||||||
|
if "'" in s1:
|
||||||
|
s1 = '"%s"' % s1.replace('"', """)
|
||||||
|
else:
|
||||||
|
s1 = "'%s'" % s1
|
||||||
|
else:
|
||||||
|
s1 = '"%s"' % s1
|
||||||
|
return s1
|
||||||
|
|
||||||
|
def quote_python(inStr):
|
||||||
|
s1 = inStr
|
||||||
|
if s1.find("'") == -1:
|
||||||
|
if s1.find('\n') == -1:
|
||||||
|
return "'%s'" % s1
|
||||||
|
else:
|
||||||
|
return "'''%s'''" % s1
|
||||||
|
else:
|
||||||
|
if s1.find('"') != -1:
|
||||||
|
s1 = s1.replace('"', '\\"')
|
||||||
|
if s1.find('\n') == -1:
|
||||||
|
return '"%s"' % s1
|
||||||
|
else:
|
||||||
|
return '"""%s"""' % s1
|
||||||
|
|
||||||
|
|
||||||
|
class MixedContainer:
|
||||||
|
# Constants for category:
|
||||||
|
CategoryNone = 0
|
||||||
|
CategoryText = 1
|
||||||
|
CategorySimple = 2
|
||||||
|
CategoryComplex = 3
|
||||||
|
# Constants for content_type:
|
||||||
|
TypeNone = 0
|
||||||
|
TypeText = 1
|
||||||
|
TypeString = 2
|
||||||
|
TypeInteger = 3
|
||||||
|
TypeFloat = 4
|
||||||
|
TypeDecimal = 5
|
||||||
|
TypeDouble = 6
|
||||||
|
TypeBoolean = 7
|
||||||
|
def __init__(self, category, content_type, name, value):
|
||||||
|
self.category = category
|
||||||
|
self.content_type = content_type
|
||||||
|
self.name = name
|
||||||
|
self.value = value
|
||||||
|
def getCategory(self):
|
||||||
|
return self.category
|
||||||
|
def getContenttype(self, content_type):
|
||||||
|
return self.content_type
|
||||||
|
def getValue(self):
|
||||||
|
return self.value
|
||||||
|
def getName(self):
|
||||||
|
return self.name
|
||||||
|
def export(self, outfile, level, name, namespace):
|
||||||
|
if self.category == MixedContainer.CategoryText:
|
||||||
|
outfile.write(self.value)
|
||||||
|
elif self.category == MixedContainer.CategorySimple:
|
||||||
|
self.exportSimple(outfile, level, name)
|
||||||
|
else: # category == MixedContainer.CategoryComplex
|
||||||
|
self.value.export(outfile, level, namespace,name)
|
||||||
|
def exportSimple(self, outfile, level, name):
|
||||||
|
if self.content_type == MixedContainer.TypeString:
|
||||||
|
outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeInteger or \
|
||||||
|
self.content_type == MixedContainer.TypeBoolean:
|
||||||
|
outfile.write('<%s>%d</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeFloat or \
|
||||||
|
self.content_type == MixedContainer.TypeDecimal:
|
||||||
|
outfile.write('<%s>%f</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeDouble:
|
||||||
|
outfile.write('<%s>%g</%s>' % (self.name, self.value, self.name))
|
||||||
|
def exportLiteral(self, outfile, level, name):
|
||||||
|
if self.category == MixedContainer.CategoryText:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
||||||
|
(self.category, self.content_type, self.name, self.value))
|
||||||
|
elif self.category == MixedContainer.CategorySimple:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
||||||
|
(self.category, self.content_type, self.name, self.value))
|
||||||
|
else: # category == MixedContainer.CategoryComplex
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s",\n' % \
|
||||||
|
(self.category, self.content_type, self.name,))
|
||||||
|
self.value.exportLiteral(outfile, level + 1)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write(')\n')
|
||||||
|
|
||||||
|
|
||||||
|
class _MemberSpec(object):
|
||||||
|
def __init__(self, name='', data_type='', container=0):
|
||||||
|
self.name = name
|
||||||
|
self.data_type = data_type
|
||||||
|
self.container = container
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_data_type(self, data_type): self.data_type = data_type
|
||||||
|
def get_data_type(self): return self.data_type
|
||||||
|
def set_container(self, container): self.container = container
|
||||||
|
def get_container(self): return self.container
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Data representation classes.
|
||||||
|
#
|
||||||
|
|
||||||
|
class DoxygenType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, version=None, compound=None):
|
||||||
|
self.version = version
|
||||||
|
if compound is None:
|
||||||
|
self.compound = []
|
||||||
|
else:
|
||||||
|
self.compound = compound
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if DoxygenType.subclass:
|
||||||
|
return DoxygenType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return DoxygenType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_compound(self): return self.compound
|
||||||
|
def set_compound(self, compound): self.compound = compound
|
||||||
|
def add_compound(self, value): self.compound.append(value)
|
||||||
|
def insert_compound(self, index, value): self.compound[index] = value
|
||||||
|
def get_version(self): return self.version
|
||||||
|
def set_version(self, version): self.version = version
|
||||||
|
def export(self, outfile, level, namespace_='', name_='DoxygenType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='DoxygenType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='DoxygenType'):
|
||||||
|
outfile.write(' version=%s' % (self.format_string(quote_attrib(self.version).encode(ExternalEncoding), input_name='version'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='DoxygenType'):
|
||||||
|
for compound_ in self.compound:
|
||||||
|
compound_.export(outfile, level, namespace_, name_='compound')
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.compound is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='DoxygenType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.version is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('version = %s,\n' % (self.version,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('compound=[\n')
|
||||||
|
level += 1
|
||||||
|
for compound in self.compound:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('model_.compound(\n')
|
||||||
|
compound.exportLiteral(outfile, level, name_='compound')
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('),\n')
|
||||||
|
level -= 1
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('],\n')
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('version'):
|
||||||
|
self.version = attrs.get('version').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'compound':
|
||||||
|
obj_ = CompoundType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.compound.append(obj_)
|
||||||
|
# end class DoxygenType
|
||||||
|
|
||||||
|
|
||||||
|
class CompoundType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, kind=None, refid=None, name=None, member=None):
|
||||||
|
self.kind = kind
|
||||||
|
self.refid = refid
|
||||||
|
self.name = name
|
||||||
|
if member is None:
|
||||||
|
self.member = []
|
||||||
|
else:
|
||||||
|
self.member = member
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if CompoundType.subclass:
|
||||||
|
return CompoundType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return CompoundType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_member(self): return self.member
|
||||||
|
def set_member(self, member): self.member = member
|
||||||
|
def add_member(self, value): self.member.append(value)
|
||||||
|
def insert_member(self, index, value): self.member[index] = value
|
||||||
|
def get_kind(self): return self.kind
|
||||||
|
def set_kind(self, kind): self.kind = kind
|
||||||
|
def get_refid(self): return self.refid
|
||||||
|
def set_refid(self, refid): self.refid = refid
|
||||||
|
def export(self, outfile, level, namespace_='', name_='CompoundType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='CompoundType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='CompoundType'):
|
||||||
|
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
||||||
|
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='CompoundType'):
|
||||||
|
if self.name is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
||||||
|
for member_ in self.member:
|
||||||
|
member_.export(outfile, level, namespace_, name_='member')
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.name is not None or
|
||||||
|
self.member is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='CompoundType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.kind is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('kind = "%s",\n' % (self.kind,))
|
||||||
|
if self.refid is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('refid = %s,\n' % (self.refid,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('member=[\n')
|
||||||
|
level += 1
|
||||||
|
for member in self.member:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('model_.member(\n')
|
||||||
|
member.exportLiteral(outfile, level, name_='member')
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('),\n')
|
||||||
|
level -= 1
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('],\n')
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('kind'):
|
||||||
|
self.kind = attrs.get('kind').value
|
||||||
|
if attrs.get('refid'):
|
||||||
|
self.refid = attrs.get('refid').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'name':
|
||||||
|
name_ = ''
|
||||||
|
for text__content_ in child_.childNodes:
|
||||||
|
name_ += text__content_.nodeValue
|
||||||
|
self.name = name_
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'member':
|
||||||
|
obj_ = MemberType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.member.append(obj_)
|
||||||
|
# end class CompoundType
|
||||||
|
|
||||||
|
|
||||||
|
class MemberType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, kind=None, refid=None, name=None):
|
||||||
|
self.kind = kind
|
||||||
|
self.refid = refid
|
||||||
|
self.name = name
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if MemberType.subclass:
|
||||||
|
return MemberType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return MemberType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_kind(self): return self.kind
|
||||||
|
def set_kind(self, kind): self.kind = kind
|
||||||
|
def get_refid(self): return self.refid
|
||||||
|
def set_refid(self, refid): self.refid = refid
|
||||||
|
def export(self, outfile, level, namespace_='', name_='MemberType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='MemberType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='MemberType'):
|
||||||
|
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
||||||
|
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='MemberType'):
|
||||||
|
if self.name is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.name is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='MemberType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.kind is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('kind = "%s",\n' % (self.kind,))
|
||||||
|
if self.refid is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('refid = %s,\n' % (self.refid,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('kind'):
|
||||||
|
self.kind = attrs.get('kind').value
|
||||||
|
if attrs.get('refid'):
|
||||||
|
self.refid = attrs.get('refid').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'name':
|
||||||
|
name_ = ''
|
||||||
|
for text__content_ in child_.childNodes:
|
||||||
|
name_ += text__content_.nodeValue
|
||||||
|
self.name = name_
|
||||||
|
# end class MemberType
|
||||||
|
|
||||||
|
|
||||||
|
USAGE_TEXT = """
|
||||||
|
Usage: python <Parser>.py [ -s ] <in_xml_file>
|
||||||
|
Options:
|
||||||
|
-s Use the SAX parser, not the minidom parser.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print USAGE_TEXT
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFileName):
|
||||||
|
doc = minidom.parse(inFileName)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('<?xml version="1.0" ?>\n')
|
||||||
|
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
||||||
|
namespacedef_='')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def parseString(inString):
|
||||||
|
doc = minidom.parseString(inString)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('<?xml version="1.0" ?>\n')
|
||||||
|
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
||||||
|
namespacedef_='')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def parseLiteral(inFileName):
|
||||||
|
doc = minidom.parse(inFileName)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('from index import *\n\n')
|
||||||
|
sys.stdout.write('rootObj = doxygenindex(\n')
|
||||||
|
rootObj.exportLiteral(sys.stdout, 0, name_="doxygenindex")
|
||||||
|
sys.stdout.write(')\n')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if len(args) == 1:
|
||||||
|
parse(args[0])
|
||||||
|
else:
|
||||||
|
usage()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
#import pdb
|
||||||
|
#pdb.run('main()')
|
||||||
|
|
57
docs/doxygen/doxyxml/text.py
Normal file
57
docs/doxygen/doxyxml/text.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Utilities for extracting text from generated classes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def is_string(txt):
|
||||||
|
if isinstance(txt, str):
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
if isinstance(txt, unicode):
|
||||||
|
return True
|
||||||
|
except NameError:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
|
def description(obj):
|
||||||
|
if obj is None:
|
||||||
|
return None
|
||||||
|
return description_bit(obj).strip()
|
||||||
|
|
||||||
|
def description_bit(obj):
|
||||||
|
if hasattr(obj, 'content'):
|
||||||
|
contents = [description_bit(item) for item in obj.content]
|
||||||
|
result = ''.join(contents)
|
||||||
|
elif hasattr(obj, 'content_'):
|
||||||
|
contents = [description_bit(item) for item in obj.content_]
|
||||||
|
result = ''.join(contents)
|
||||||
|
elif hasattr(obj, 'value'):
|
||||||
|
result = description_bit(obj.value)
|
||||||
|
elif is_string(obj):
|
||||||
|
return obj
|
||||||
|
else:
|
||||||
|
raise StandardError('Expecting a string or something with content, content_ or value attribute')
|
||||||
|
# If this bit is a paragraph then add one some line breaks.
|
||||||
|
if hasattr(obj, 'name') and obj.name == 'para':
|
||||||
|
result += "\n\n"
|
||||||
|
return result
|
7
docs/doxygen/other/group_defs.dox
Normal file
7
docs/doxygen/other/group_defs.dox
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*!
|
||||||
|
* \defgroup block GNU Radio DIGITALHF C++ Signal Processing Blocks
|
||||||
|
* \brief All C++ blocks that can be used from the DIGITALHF GNU Radio
|
||||||
|
* module are listed here or in the subcategories below.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
10
docs/doxygen/other/main_page.dox
Normal file
10
docs/doxygen/other/main_page.dox
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*! \mainpage
|
||||||
|
|
||||||
|
Welcome to the GNU Radio DIGITALHF Block
|
||||||
|
|
||||||
|
This is the intro page for the Doxygen manual generated for the DIGITALHF
|
||||||
|
block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
|
||||||
|
documentation about the new GNU Radio modules contained in this
|
||||||
|
project.
|
||||||
|
|
||||||
|
*/
|
329
docs/doxygen/swig_doc.py
Normal file
329
docs/doxygen/swig_doc.py
Normal file
|
@ -0,0 +1,329 @@
|
||||||
|
#
|
||||||
|
# Copyright 2010-2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Creates the swig_doc.i SWIG interface file.
|
||||||
|
Execute using: python swig_doc.py xml_path outputfilename
|
||||||
|
|
||||||
|
The file instructs SWIG to transfer the doxygen comments into the
|
||||||
|
python docstrings.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys, time
|
||||||
|
|
||||||
|
from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile
|
||||||
|
from doxyxml import DoxyOther, base
|
||||||
|
|
||||||
|
def py_name(name):
|
||||||
|
bits = name.split('_')
|
||||||
|
return '_'.join(bits[1:])
|
||||||
|
|
||||||
|
def make_name(name):
|
||||||
|
bits = name.split('_')
|
||||||
|
return bits[0] + '_make_' + '_'.join(bits[1:])
|
||||||
|
|
||||||
|
|
||||||
|
class Block(object):
|
||||||
|
"""
|
||||||
|
Checks if doxyxml produced objects correspond to a gnuradio block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, item):
|
||||||
|
if not isinstance(item, DoxyClass):
|
||||||
|
return False
|
||||||
|
# Check for a parsing error.
|
||||||
|
if item.error():
|
||||||
|
return False
|
||||||
|
friendname = make_name(item.name())
|
||||||
|
is_a_block = item.has_member(friendname, DoxyFriend)
|
||||||
|
# But now sometimes the make function isn't a friend so check again.
|
||||||
|
if not is_a_block:
|
||||||
|
is_a_block = di.has_member(friendname, DoxyFunction)
|
||||||
|
return is_a_block
|
||||||
|
|
||||||
|
class Block2(object):
|
||||||
|
"""
|
||||||
|
Checks if doxyxml produced objects correspond to a new style
|
||||||
|
gnuradio block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, item):
|
||||||
|
if not isinstance(item, DoxyClass):
|
||||||
|
return False
|
||||||
|
# Check for a parsing error.
|
||||||
|
if item.error():
|
||||||
|
return False
|
||||||
|
is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther)
|
||||||
|
return is_a_block2
|
||||||
|
|
||||||
|
|
||||||
|
def utoascii(text):
|
||||||
|
"""
|
||||||
|
Convert unicode text into ascii and escape quotes.
|
||||||
|
"""
|
||||||
|
if text is None:
|
||||||
|
return ''
|
||||||
|
out = text.encode('ascii', 'replace')
|
||||||
|
out = out.replace('"', '\\"')
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def combine_descriptions(obj):
|
||||||
|
"""
|
||||||
|
Combines the brief and detailed descriptions of an object together.
|
||||||
|
"""
|
||||||
|
description = []
|
||||||
|
bd = obj.brief_description.strip()
|
||||||
|
dd = obj.detailed_description.strip()
|
||||||
|
if bd:
|
||||||
|
description.append(bd)
|
||||||
|
if dd:
|
||||||
|
description.append(dd)
|
||||||
|
return utoascii('\n\n'.join(description)).strip()
|
||||||
|
|
||||||
|
def format_params(parameteritems):
|
||||||
|
output = ['Args:']
|
||||||
|
template = ' {0} : {1}'
|
||||||
|
for pi in parameteritems:
|
||||||
|
output.append(template.format(pi.name, pi.description))
|
||||||
|
return '\n'.join(output)
|
||||||
|
|
||||||
|
entry_templ = '%feature("docstring") {name} "{docstring}"'
|
||||||
|
def make_entry(obj, name=None, templ="{description}", description=None, params=[]):
|
||||||
|
"""
|
||||||
|
Create a docstring entry for a swig interface file.
|
||||||
|
|
||||||
|
obj - a doxyxml object from which documentation will be extracted.
|
||||||
|
name - the name of the C object (defaults to obj.name())
|
||||||
|
templ - an optional template for the docstring containing only one
|
||||||
|
variable named 'description'.
|
||||||
|
description - if this optional variable is set then it's value is
|
||||||
|
used as the description instead of extracting it from obj.
|
||||||
|
"""
|
||||||
|
if name is None:
|
||||||
|
name=obj.name()
|
||||||
|
if "operator " in name:
|
||||||
|
return ''
|
||||||
|
if description is None:
|
||||||
|
description = combine_descriptions(obj)
|
||||||
|
if params:
|
||||||
|
description += '\n\n'
|
||||||
|
description += utoascii(format_params(params))
|
||||||
|
docstring = templ.format(description=description)
|
||||||
|
if not docstring:
|
||||||
|
return ''
|
||||||
|
return entry_templ.format(
|
||||||
|
name=name,
|
||||||
|
docstring=docstring,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def make_func_entry(func, name=None, description=None, params=None):
|
||||||
|
"""
|
||||||
|
Create a function docstring entry for a swig interface file.
|
||||||
|
|
||||||
|
func - a doxyxml object from which documentation will be extracted.
|
||||||
|
name - the name of the C object (defaults to func.name())
|
||||||
|
description - if this optional variable is set then it's value is
|
||||||
|
used as the description instead of extracting it from func.
|
||||||
|
params - a parameter list that overrides using func.params.
|
||||||
|
"""
|
||||||
|
#if params is None:
|
||||||
|
# params = func.params
|
||||||
|
#params = [prm.declname for prm in params]
|
||||||
|
#if params:
|
||||||
|
# sig = "Params: (%s)" % ", ".join(params)
|
||||||
|
#else:
|
||||||
|
# sig = "Params: (NONE)"
|
||||||
|
#templ = "{description}\n\n" + sig
|
||||||
|
#return make_entry(func, name=name, templ=utoascii(templ),
|
||||||
|
# description=description)
|
||||||
|
return make_entry(func, name=name, description=description, params=params)
|
||||||
|
|
||||||
|
|
||||||
|
def make_class_entry(klass, description=None, ignored_methods=[], params=None):
|
||||||
|
"""
|
||||||
|
Create a class docstring for a swig interface file.
|
||||||
|
"""
|
||||||
|
if params is None:
|
||||||
|
params = klass.params
|
||||||
|
output = []
|
||||||
|
output.append(make_entry(klass, description=description, params=params))
|
||||||
|
for func in klass.in_category(DoxyFunction):
|
||||||
|
if func.name() not in ignored_methods:
|
||||||
|
name = klass.name() + '::' + func.name()
|
||||||
|
output.append(make_func_entry(func, name=name))
|
||||||
|
return "\n\n".join(output)
|
||||||
|
|
||||||
|
|
||||||
|
def make_block_entry(di, block):
|
||||||
|
"""
|
||||||
|
Create class and function docstrings of a gnuradio block for a
|
||||||
|
swig interface file.
|
||||||
|
"""
|
||||||
|
descriptions = []
|
||||||
|
# Get the documentation associated with the class.
|
||||||
|
class_desc = combine_descriptions(block)
|
||||||
|
if class_desc:
|
||||||
|
descriptions.append(class_desc)
|
||||||
|
# Get the documentation associated with the make function
|
||||||
|
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
||||||
|
make_func_desc = combine_descriptions(make_func)
|
||||||
|
if make_func_desc:
|
||||||
|
descriptions.append(make_func_desc)
|
||||||
|
# Get the documentation associated with the file
|
||||||
|
try:
|
||||||
|
block_file = di.get_member(block.name() + ".h", DoxyFile)
|
||||||
|
file_desc = combine_descriptions(block_file)
|
||||||
|
if file_desc:
|
||||||
|
descriptions.append(file_desc)
|
||||||
|
except base.Base.NoSuchMember:
|
||||||
|
# Don't worry if we can't find a matching file.
|
||||||
|
pass
|
||||||
|
# And join them all together to make a super duper description.
|
||||||
|
super_description = "\n\n".join(descriptions)
|
||||||
|
# Associate the combined description with the class and
|
||||||
|
# the make function.
|
||||||
|
output = []
|
||||||
|
output.append(make_class_entry(block, description=super_description))
|
||||||
|
output.append(make_func_entry(make_func, description=super_description,
|
||||||
|
params=block.params))
|
||||||
|
return "\n\n".join(output)
|
||||||
|
|
||||||
|
def make_block2_entry(di, block):
|
||||||
|
"""
|
||||||
|
Create class and function docstrings of a new style gnuradio block for a
|
||||||
|
swig interface file.
|
||||||
|
"""
|
||||||
|
descriptions = []
|
||||||
|
# For new style blocks all the relevant documentation should be
|
||||||
|
# associated with the 'make' method.
|
||||||
|
class_description = combine_descriptions(block)
|
||||||
|
make_func = block.get_member('make', DoxyFunction)
|
||||||
|
make_description = combine_descriptions(make_func)
|
||||||
|
description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description
|
||||||
|
# Associate the combined description with the class and
|
||||||
|
# the make function.
|
||||||
|
output = []
|
||||||
|
output.append(make_class_entry(
|
||||||
|
block, description=description,
|
||||||
|
ignored_methods=['make'], params=make_func.params))
|
||||||
|
makename = block.name() + '::make'
|
||||||
|
output.append(make_func_entry(
|
||||||
|
make_func, name=makename, description=description,
|
||||||
|
params=make_func.params))
|
||||||
|
return "\n\n".join(output)
|
||||||
|
|
||||||
|
def make_swig_interface_file(di, swigdocfilename, custom_output=None):
|
||||||
|
|
||||||
|
output = ["""
|
||||||
|
/*
|
||||||
|
* This file was automatically generated using swig_doc.py.
|
||||||
|
*
|
||||||
|
* Any changes to it will be lost next time it is regenerated.
|
||||||
|
*/
|
||||||
|
"""]
|
||||||
|
|
||||||
|
if custom_output is not None:
|
||||||
|
output.append(custom_output)
|
||||||
|
|
||||||
|
# Create docstrings for the blocks.
|
||||||
|
blocks = di.in_category(Block)
|
||||||
|
blocks2 = di.in_category(Block2)
|
||||||
|
|
||||||
|
make_funcs = set([])
|
||||||
|
for block in blocks:
|
||||||
|
try:
|
||||||
|
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
||||||
|
# Don't want to risk writing to output twice.
|
||||||
|
if make_func.name() not in make_funcs:
|
||||||
|
make_funcs.add(make_func.name())
|
||||||
|
output.append(make_block_entry(di, block))
|
||||||
|
except block.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
|
||||||
|
raise
|
||||||
|
|
||||||
|
for block in blocks2:
|
||||||
|
try:
|
||||||
|
make_func = block.get_member('make', DoxyFunction)
|
||||||
|
make_func_name = block.name() +'::make'
|
||||||
|
# Don't want to risk writing to output twice.
|
||||||
|
if make_func_name not in make_funcs:
|
||||||
|
make_funcs.add(make_func_name)
|
||||||
|
output.append(make_block2_entry(di, block))
|
||||||
|
except block.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Create docstrings for functions
|
||||||
|
# Don't include the make functions since they have already been dealt with.
|
||||||
|
funcs = [f for f in di.in_category(DoxyFunction)
|
||||||
|
if f.name() not in make_funcs and not f.name().startswith('std::')]
|
||||||
|
for f in funcs:
|
||||||
|
try:
|
||||||
|
output.append(make_func_entry(f))
|
||||||
|
except f.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for function {0}\n'.format(f.name()))
|
||||||
|
|
||||||
|
# Create docstrings for classes
|
||||||
|
block_names = [block.name() for block in blocks]
|
||||||
|
block_names += [block.name() for block in blocks2]
|
||||||
|
klasses = [k for k in di.in_category(DoxyClass)
|
||||||
|
if k.name() not in block_names and not k.name().startswith('std::')]
|
||||||
|
for k in klasses:
|
||||||
|
try:
|
||||||
|
output.append(make_class_entry(k))
|
||||||
|
except k.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for class {0}\n'.format(k.name()))
|
||||||
|
|
||||||
|
# Docstrings are not created for anything that is not a function or a class.
|
||||||
|
# If this excludes anything important please add it here.
|
||||||
|
|
||||||
|
output = "\n\n".join(output)
|
||||||
|
|
||||||
|
swig_doc = file(swigdocfilename, 'w')
|
||||||
|
swig_doc.write(output)
|
||||||
|
swig_doc.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Parse command line options and set up doxyxml.
|
||||||
|
err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
raise StandardError(err_msg)
|
||||||
|
xml_path = sys.argv[1]
|
||||||
|
swigdocfilename = sys.argv[2]
|
||||||
|
di = DoxyIndex(xml_path)
|
||||||
|
|
||||||
|
# gnuradio.gr.msq_queue.insert_tail and delete_head create errors unless docstrings are defined!
|
||||||
|
# This is presumably a bug in SWIG.
|
||||||
|
#msg_q = di.get_member(u'gr_msg_queue', DoxyClass)
|
||||||
|
#insert_tail = msg_q.get_member(u'insert_tail', DoxyFunction)
|
||||||
|
#delete_head = msg_q.get_member(u'delete_head', DoxyFunction)
|
||||||
|
output = []
|
||||||
|
#output.append(make_func_entry(insert_tail, name='gr_py_msg_queue__insert_tail'))
|
||||||
|
#output.append(make_func_entry(delete_head, name='gr_py_msg_queue__delete_head'))
|
||||||
|
custom_output = "\n\n".join(output)
|
||||||
|
|
||||||
|
# Generate the docstrings interface file.
|
||||||
|
make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
|
431
examples/1st.grc
Normal file
431
examples/1st.grc
Normal file
|
@ -0,0 +1,431 @@
|
||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<?grc format='1' created='3.7.12'?>
|
||||||
|
<flow_graph>
|
||||||
|
<timestamp>Wed Oct 24 10:55:34 2018</timestamp>
|
||||||
|
<block>
|
||||||
|
<key>options</key>
|
||||||
|
<param>
|
||||||
|
<key>author</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>window_size</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>category</key>
|
||||||
|
<value>[GRC Hier Blocks]</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>copyright</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>description</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(8, 8)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>generate_options</key>
|
||||||
|
<value>qt_gui</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>hier_block_src_path</key>
|
||||||
|
<value>.:</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>top_block</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>max_nouts</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>qt_qss_theme</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>realtime_scheduling</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>run_command</key>
|
||||||
|
<value>{python} -u {filename}</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>run_options</key>
|
||||||
|
<value>prompt</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>run</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>sizing_mode</key>
|
||||||
|
<value>fixed</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>thread_safe_setters</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>title</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>placement</key>
|
||||||
|
<value>(0,0)</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(320, 26)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>nB</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>10*sps</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(394, 26)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>nF</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>5*sps</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(469, 26)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>nW</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>5</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(586, 26)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>py_obj_name</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>'PhysicalLayer'</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(8, 160)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>samp_rate</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>12000</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>variable</key>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(245, 26)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>sps</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>value</key>
|
||||||
|
<value>5</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>analog_noise_source_x</key>
|
||||||
|
<param>
|
||||||
|
<key>amp</key>
|
||||||
|
<value>1</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>alias</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>affinity</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(149, 186)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>analog_noise_source_x_0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>maxoutbuf</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>minoutbuf</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>noise_type</key>
|
||||||
|
<value>analog.GR_GAUSSIAN</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>type</key>
|
||||||
|
<value>complex</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>seed</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>blocks_throttle</key>
|
||||||
|
<param>
|
||||||
|
<key>alias</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>affinity</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(362, 197)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>blocks_throttle_0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>ignoretag</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>maxoutbuf</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>minoutbuf</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>samples_per_second</key>
|
||||||
|
<value>samp_rate</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>type</key>
|
||||||
|
<value>complex</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>vlen</key>
|
||||||
|
<value>1</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<block>
|
||||||
|
<key>digitalhf_adaptive_dfe</key>
|
||||||
|
<param>
|
||||||
|
<key>alias</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>comment</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>affinity</key>
|
||||||
|
<value></value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_enabled</key>
|
||||||
|
<value>True</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_coordinate</key>
|
||||||
|
<value>(576, 176)</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>_rotation</key>
|
||||||
|
<value>0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>id</key>
|
||||||
|
<value>digitalhf_adaptive_dfe_0</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>sps</key>
|
||||||
|
<value>sps</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>nB</key>
|
||||||
|
<value>nB</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>nF</key>
|
||||||
|
<value>nF</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>nW</key>
|
||||||
|
<value>nW</value>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<key>py_obj_name</key>
|
||||||
|
<value>/Users/chm/Software/gr-digitalhf/examples/s4285.py</value>
|
||||||
|
</param>
|
||||||
|
</block>
|
||||||
|
<connection>
|
||||||
|
<source_block_id>analog_noise_source_x_0</source_block_id>
|
||||||
|
<sink_block_id>blocks_throttle_0</sink_block_id>
|
||||||
|
<source_key>0</source_key>
|
||||||
|
<sink_key>0</sink_key>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<source_block_id>blocks_throttle_0</source_block_id>
|
||||||
|
<sink_block_id>digitalhf_adaptive_dfe_0</sink_block_id>
|
||||||
|
<source_key>0</source_key>
|
||||||
|
<sink_key>0</sink_key>
|
||||||
|
</connection>
|
||||||
|
</flow_graph>
|
4
examples/README
Normal file
4
examples/README
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
It is considered good practice to add examples in here to demonstrate the
|
||||||
|
functionality of your OOT module. Python scripts, GRC flow graphs or other
|
||||||
|
code can go here.
|
||||||
|
|
71
examples/s4285.py
Normal file
71
examples/s4285.py
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
## -*- python -*-
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from gnuradio import digital
|
||||||
|
|
||||||
|
class PhysicalLayer(object):
|
||||||
|
"""Physical layer description for STANAG 4285"""
|
||||||
|
|
||||||
|
def __init__(self, mode=0):
|
||||||
|
"""For STANAG 4258 the mode has to be set manually: mode=0 -> BPSK, mode=1 -> QPSK, mode=2 -> 8PSK"""
|
||||||
|
print('Hello from PhysicalLayer!\n')
|
||||||
|
self._preamble = [get_preamble(), digital.constellation_bpsk()]
|
||||||
|
self._constellations = [digital.constellation_bpsk(),
|
||||||
|
digital.constellation_qpsk(),
|
||||||
|
digital.constellation_8psk()]
|
||||||
|
self._data = [get_data(), self._constellations[mode]]
|
||||||
|
self._counter = 0
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
print('Bye from PhysicalLayer!\n')
|
||||||
|
|
||||||
|
def set_mode(self):
|
||||||
|
"""For STANAG 4258 the mode has to be set manually: mode=0 -> BPSK, mode=1 -> QPSK, mode=2 -> 8PSK"""
|
||||||
|
self._data[1] = self._constellations[mode];
|
||||||
|
|
||||||
|
def get_frame(self):
|
||||||
|
"""returns the known+unknown symbols and scrambling"""
|
||||||
|
print('get_frame', self._counter, self._preamble, self._preamble[1].__deref__())
|
||||||
|
if self._counter == 0:
|
||||||
|
return self._preamble
|
||||||
|
else:
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
def get_doppler(self, symbols):
|
||||||
|
"""used for doppler shift update, for determining which frame to provide next,
|
||||||
|
and for stopping at end of data/when the signal quality is too low"""
|
||||||
|
self._counter = (self._counter+1)&2
|
||||||
|
## TODO: doppler calculations
|
||||||
|
doppler = 0.0
|
||||||
|
return [True, doppler]
|
||||||
|
|
||||||
|
def get_preamble():
|
||||||
|
"""preamble symbols + scrambler(=1)"""
|
||||||
|
state = np.array([1,1,0,1,0], dtype='b')
|
||||||
|
taps = np.array([0,0,1,0,1], dtype='b')
|
||||||
|
p = np.zeros(80, dtype='f')
|
||||||
|
for i in range(80):
|
||||||
|
p[i] = state[-1];
|
||||||
|
state = np.concatenate(([np.sum(state&taps)&1], state[0:-1]))
|
||||||
|
a = np.zeros(80, dtype=[('symb','c'), ('scramble', 'c')])
|
||||||
|
## BPSK modulation
|
||||||
|
a['symb'] = np.exp(np.pi*1j*p)
|
||||||
|
a['scramble'] = 1;
|
||||||
|
return a
|
||||||
|
|
||||||
|
def get_data():
|
||||||
|
"""data symbols + scrambler; for unknown symbols 'symb'=0"""
|
||||||
|
state = np.array([1,1,1,1,1,1,1,1,1], dtype='b')
|
||||||
|
taps = np.array([0,0,0,0,1,0,0,0,1], dtype='b')
|
||||||
|
p = np.zeros(176, dtype='f')
|
||||||
|
for i in range(176):
|
||||||
|
p[i] = np.sum(state[-3:]*[4,2,1]);
|
||||||
|
for j in range(3):
|
||||||
|
state = np.concatenate(([np.sum(state&taps)&1], state[0:-1]))
|
||||||
|
a=np.zeros(176, dtype=[('symb','c'), ('scramble', 'c')])
|
||||||
|
## PSK-8 modulation
|
||||||
|
a['scramble'] = np.exp(np.pi*1j*p/4)
|
||||||
|
a['symb'][ 32: 48] = 1; ## mini-probe 1
|
||||||
|
a['symb'][ 80: 96] = 1; ## mini-probe 2
|
||||||
|
a['symb'][128:144] = 1; ## mini-probe 3
|
||||||
|
return a
|
22
grc/CMakeLists.txt
Normal file
22
grc/CMakeLists.txt
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
install(FILES
|
||||||
|
digitalhf_adaptive_dfe.xml DESTINATION share/gnuradio/grc/blocks
|
||||||
|
)
|
58
grc/digitalhf_adaptive_dfe.xml
Normal file
58
grc/digitalhf_adaptive_dfe.xml
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<block>
|
||||||
|
<name>adaptive_dfe</name>
|
||||||
|
<key>digitalhf_adaptive_dfe</key>
|
||||||
|
<category>[digitalhf]</category>
|
||||||
|
<import>import digitalhf</import>
|
||||||
|
<make>digitalhf.adaptive_dfe($sps,$nB,$nF,$nW,$py_obj_name)</make>
|
||||||
|
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
|
||||||
|
Sub-nodes:
|
||||||
|
* name
|
||||||
|
* key (makes the value accessible as $keyname, e.g. in the make node)
|
||||||
|
* type -->
|
||||||
|
<param>
|
||||||
|
<name>SPS</name>
|
||||||
|
<key>sps</key>
|
||||||
|
<type>int</type>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>nB</name>
|
||||||
|
<key>nB</key>
|
||||||
|
<type>int</type>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>nF</name>
|
||||||
|
<key>nF</key>
|
||||||
|
<type>int</type>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>nW</name>
|
||||||
|
<key>nW</key>
|
||||||
|
<type>int</type>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>py_obj_name</name>
|
||||||
|
<key>py_obj_name</key>
|
||||||
|
<type>string</type>
|
||||||
|
</param>
|
||||||
|
|
||||||
|
<!-- Make one 'sink' node per input. Sub-nodes:
|
||||||
|
* name (an identifier for the GUI)
|
||||||
|
* type
|
||||||
|
* vlen
|
||||||
|
* optional (set to 1 for optional inputs) -->
|
||||||
|
<sink>
|
||||||
|
<name>in</name>
|
||||||
|
<type>complex</type>
|
||||||
|
</sink>
|
||||||
|
|
||||||
|
<!-- Make one 'source' node per output. Sub-nodes:
|
||||||
|
* name (an identifier for the GUI)
|
||||||
|
* type
|
||||||
|
* vlen
|
||||||
|
* optional (set to 1 for optional inputs) -->
|
||||||
|
<!-- <source> -->
|
||||||
|
<!-- <name>out</name> -->
|
||||||
|
<!-- <type><!-\- e.g. int, float, complex, byte, short, xxx_vector, ...-\-></type> -->
|
||||||
|
<!-- </source> -->
|
||||||
|
</block>
|
27
include/digitalhf/CMakeLists.txt
Normal file
27
include/digitalhf/CMakeLists.txt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Copyright 2011,2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install public header files
|
||||||
|
########################################################################
|
||||||
|
install(FILES
|
||||||
|
api.h
|
||||||
|
adaptive_dfe.h DESTINATION include/digitalhf
|
||||||
|
)
|
60
include/digitalhf/adaptive_dfe.h
Normal file
60
include/digitalhf/adaptive_dfe.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2018 hcab14@mail.com.
|
||||||
|
*
|
||||||
|
* This 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.
|
||||||
|
*
|
||||||
|
* This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef INCLUDED_DIGITALHF_ADAPTIVE_DFE_H
|
||||||
|
#define INCLUDED_DIGITALHF_ADAPTIVE_DFE_H
|
||||||
|
|
||||||
|
#include <digitalhf/api.h>
|
||||||
|
#include <gnuradio/block.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace digitalhf {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief <+description of block+>
|
||||||
|
* \ingroup digitalhf
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class DIGITALHF_API adaptive_dfe : virtual public gr::block
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<adaptive_dfe> sptr;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Return a shared_ptr to a new instance of digitalhf::adaptive_dfe.
|
||||||
|
*
|
||||||
|
* To avoid accidental use of raw pointers, digitalhf::adaptive_dfe's
|
||||||
|
* constructor is in a private implementation
|
||||||
|
* class. digitalhf::adaptive_dfe::make is the public interface for
|
||||||
|
* creating new instances.
|
||||||
|
*/
|
||||||
|
static sptr make(int sps, // samples per symbol
|
||||||
|
int nB, // number of forward FIR taps
|
||||||
|
int nF, // number of backward FIR taps
|
||||||
|
int nW, // number of feedback taps
|
||||||
|
std::string py_file_name);
|
||||||
|
|
||||||
|
} ;
|
||||||
|
|
||||||
|
} // namespace digitalhf
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_DIGITALHF_ADAPTIVE_DFE_H */
|
34
include/digitalhf/api.h
Normal file
34
include/digitalhf/api.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
* This file is a part of gr-digitalhf
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDED_DIGITALHF_API_H
|
||||||
|
#define INCLUDED_DIGITALHF_API_H
|
||||||
|
|
||||||
|
#include <gnuradio/attributes.h>
|
||||||
|
|
||||||
|
#ifdef gnuradio_digitalhf_EXPORTS
|
||||||
|
# define DIGITALHF_API __GR_ATTR_EXPORT
|
||||||
|
#else
|
||||||
|
# define DIGITALHF_API __GR_ATTR_IMPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* INCLUDED_DIGITALHF_API_H */
|
83
lib/CMakeLists.txt
Normal file
83
lib/CMakeLists.txt
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# Copyright 2011,2012,2016 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup library
|
||||||
|
########################################################################
|
||||||
|
include(GrPlatform) #define LIB_SUFFIX
|
||||||
|
|
||||||
|
include_directories(${Boost_INCLUDE_DIR})
|
||||||
|
link_directories(${Boost_LIBRARY_DIRS})
|
||||||
|
list(APPEND digitalhf_sources
|
||||||
|
adaptive_dfe_impl.cc )
|
||||||
|
|
||||||
|
set(digitalhf_sources "${digitalhf_sources}" PARENT_SCOPE)
|
||||||
|
if(NOT digitalhf_sources)
|
||||||
|
MESSAGE(STATUS "No C++ sources... skipping lib/")
|
||||||
|
return()
|
||||||
|
endif(NOT digitalhf_sources)
|
||||||
|
|
||||||
|
add_library(gnuradio-digitalhf SHARED ${digitalhf_sources})
|
||||||
|
target_link_libraries(gnuradio-digitalhf ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES} ${PYTHON_LIBRARIES})
|
||||||
|
set_target_properties(gnuradio-digitalhf PROPERTIES DEFINE_SYMBOL "gnuradio_digitalhf_EXPORTS")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set_target_properties(gnuradio-digitalhf PROPERTIES
|
||||||
|
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
|
||||||
|
)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install built library files
|
||||||
|
########################################################################
|
||||||
|
include(GrMiscUtils)
|
||||||
|
GR_LIBRARY_FOO(gnuradio-digitalhf RUNTIME_COMPONENT "digitalhf_runtime" DEVEL_COMPONENT "digitalhf_devel")
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Build and register unit test
|
||||||
|
########################################################################
|
||||||
|
include(GrTest)
|
||||||
|
|
||||||
|
include_directories(${CPPUNIT_INCLUDE_DIRS})
|
||||||
|
list(APPEND test_digitalhf_sources
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/test_digitalhf.cc
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/qa_digitalhf.cc
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/qa_adaptive_dfe.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(test-digitalhf ${test_digitalhf_sources})
|
||||||
|
|
||||||
|
target_link_libraries(
|
||||||
|
test-digitalhf
|
||||||
|
${PYTHON_LIBRARIES}
|
||||||
|
${GNURADIO_RUNTIME_LIBRARIES}
|
||||||
|
${Boost_LIBRARIES}
|
||||||
|
${CPPUNIT_LIBRARIES}
|
||||||
|
gnuradio-digitalhf
|
||||||
|
)
|
||||||
|
MESSAGE("XXX ${PYTHON_LIBRARIES}")
|
||||||
|
GR_ADD_TEST(test_digitalhf test-digitalhf)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Print summary
|
||||||
|
########################################################################
|
||||||
|
message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||||
|
message(STATUS "Building for version: ${VERSION} / ${LIBVER}")
|
||||||
|
|
162
lib/adaptive_dfe_impl.cc
Normal file
162
lib/adaptive_dfe_impl.cc
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2018 hcab14@mail.com.
|
||||||
|
*
|
||||||
|
* This 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.
|
||||||
|
*
|
||||||
|
* This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <gnuradio/digital/constellation.h>
|
||||||
|
#include "adaptive_dfe_impl.h"
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace digitalhf {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class GILLock {
|
||||||
|
PyGILState_STATE _state;
|
||||||
|
public:
|
||||||
|
GILLock()
|
||||||
|
:_state(PyGILState_Ensure()) {}
|
||||||
|
~GILLock() {
|
||||||
|
PyGILState_Release(_state);
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
}
|
||||||
|
adaptive_dfe::sptr
|
||||||
|
adaptive_dfe::make(int sps, // samples per symbol
|
||||||
|
int nB, // number of forward FIR taps
|
||||||
|
int nF, // number of backward FIR taps
|
||||||
|
int nW, // number of feedback taps
|
||||||
|
std::string python_file_name)
|
||||||
|
{
|
||||||
|
return gnuradio::get_initial_sptr
|
||||||
|
(new adaptive_dfe_impl(sps, nB, nF, nW, python_file_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The private constructor
|
||||||
|
*/
|
||||||
|
adaptive_dfe_impl::adaptive_dfe_impl(int sps, // samples per symbol
|
||||||
|
int nB, // number of forward FIR taps
|
||||||
|
int nF, // number of backward FIR taps
|
||||||
|
int nW, // number of feedback taps
|
||||||
|
std::string python_file_name)
|
||||||
|
: gr::block("adaptive_dfe",
|
||||||
|
gr::io_signature::make(1, 1, sizeof(gr_complex)),
|
||||||
|
gr::io_signature::make(0, 0, sizeof(gr_complex)))
|
||||||
|
, _sps(sps)
|
||||||
|
, _nB(nB)
|
||||||
|
, _nF(nF)
|
||||||
|
, _nW(nW)
|
||||||
|
, _py_file_name(python_file_name)
|
||||||
|
, _physicalLayer()
|
||||||
|
, _taps_samples(nB+nF+1)
|
||||||
|
, _taps_symbols(nW) {
|
||||||
|
// make sure python is ready for threading
|
||||||
|
if( Py_IsInitialized() ){
|
||||||
|
if(PyEval_ThreadsInitialized() != 1 ){
|
||||||
|
PyEval_InitThreads();
|
||||||
|
}
|
||||||
|
boost::python::numpy::initialize();
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error("dont use es_pyhandler without python!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Our virtual destructor.
|
||||||
|
*/
|
||||||
|
adaptive_dfe_impl::~adaptive_dfe_impl()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
adaptive_dfe_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
|
||||||
|
{
|
||||||
|
/* <+forecast+> e.g. ninput_items_required[0] = noutput_items */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
adaptive_dfe_impl::general_work(int noutput_items,
|
||||||
|
gr_vector_int &ninput_items,
|
||||||
|
gr_vector_const_void_star &input_items,
|
||||||
|
gr_vector_void_star &output_items)
|
||||||
|
{
|
||||||
|
const gr_complex *in = (const gr_complex *) input_items[0];
|
||||||
|
|
||||||
|
get_next_frame();
|
||||||
|
GILLock lock;
|
||||||
|
std::cout << "bits_per_symbol: " << boost::python::extract<int>(_constellation.attr("bits_per_symbol")()) << std::endl;
|
||||||
|
|
||||||
|
consume_each (noutput_items);
|
||||||
|
|
||||||
|
// Tell runtime system how many output items we produced.
|
||||||
|
return noutput_items;
|
||||||
|
}
|
||||||
|
|
||||||
|
void adaptive_dfe_impl::get_next_frame()
|
||||||
|
{
|
||||||
|
GILLock lock;
|
||||||
|
boost::python::object const& obj = _physicalLayer.attr("get_frame")();
|
||||||
|
std::cout << "get_frame" << std::endl;
|
||||||
|
boost::python::numpy::ndarray symbols = boost::python::numpy::array(obj[0]);
|
||||||
|
_constellation = obj[1];
|
||||||
|
}
|
||||||
|
boost::python::object import(const std::string& module, const std::string& path, boost::python::object& globals)
|
||||||
|
{
|
||||||
|
boost::python::dict locals;
|
||||||
|
locals["module_name"] = module;
|
||||||
|
locals["path"] = path;
|
||||||
|
|
||||||
|
boost::python::exec("import imp\n"
|
||||||
|
"new_module = imp.load_module(module_name, open(path), path, ('py', 'U', imp.PY_SOURCE))\n",
|
||||||
|
globals,
|
||||||
|
locals);
|
||||||
|
return locals["new_module"];
|
||||||
|
}
|
||||||
|
bool adaptive_dfe_impl::start()
|
||||||
|
{
|
||||||
|
std::cout << "adaptive_dfe_impl::start()" << std::endl;
|
||||||
|
GILLock lock;
|
||||||
|
try {
|
||||||
|
boost::python::object main = boost::python::import("__main__");
|
||||||
|
boost::python::object globals = main.attr("__dict__");
|
||||||
|
boost::python::object module = import("physicalLayer", _py_file_name, globals);
|
||||||
|
boost::python::object PhysicalLayer = module.attr("PhysicalLayer");
|
||||||
|
_physicalLayer = PhysicalLayer();
|
||||||
|
|
||||||
|
_physicalLayer.attr("get_frame")();
|
||||||
|
} catch (const boost::python::error_already_set& ) {
|
||||||
|
PyErr_Print();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool adaptive_dfe_impl::stop()
|
||||||
|
{
|
||||||
|
std::cout << "adaptive_dfe_impl::stop()" << std::endl;
|
||||||
|
GILLock lock;
|
||||||
|
_physicalLayer = boost::python::object();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace digitalhf */
|
||||||
|
} /* namespace gr */
|
72
lib/adaptive_dfe_impl.h
Normal file
72
lib/adaptive_dfe_impl.h
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2018 hcab14@mail.com.
|
||||||
|
*
|
||||||
|
* This 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.
|
||||||
|
*
|
||||||
|
* This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDED_DIGITALHF_ADAPTIVE_DFE_IMPL_H
|
||||||
|
#define INCLUDED_DIGITALHF_ADAPTIVE_DFE_IMPL_H
|
||||||
|
|
||||||
|
#include <digitalhf/adaptive_dfe.h>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/numpy.hpp>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace digitalhf {
|
||||||
|
|
||||||
|
class adaptive_dfe_impl : public adaptive_dfe {
|
||||||
|
private:
|
||||||
|
int _sps;
|
||||||
|
int _nB, _nF, _nW;
|
||||||
|
|
||||||
|
std::string _py_file_name;
|
||||||
|
boost::python::object _physicalLayer;
|
||||||
|
|
||||||
|
std::vector<gr_complex> _taps_samples;
|
||||||
|
std::vector<gr_complex> _taps_symbols;
|
||||||
|
|
||||||
|
// boost::python::numpy::ndarray _symbols;
|
||||||
|
boost::python::object _constellation;
|
||||||
|
|
||||||
|
void get_next_frame();
|
||||||
|
|
||||||
|
public:
|
||||||
|
adaptive_dfe_impl(int sps, // samples per symbol
|
||||||
|
int nB, // number of forward FIR taps
|
||||||
|
int nF, // number of backward FIR taps
|
||||||
|
int nW, // number of symbol taps
|
||||||
|
std::string python_file_name);
|
||||||
|
virtual ~adaptive_dfe_impl();
|
||||||
|
|
||||||
|
// Where all the action really happens
|
||||||
|
void forecast (int noutput_items, gr_vector_int &ninput_items_required);
|
||||||
|
|
||||||
|
virtual bool start();
|
||||||
|
virtual bool stop();
|
||||||
|
|
||||||
|
virtual int general_work(int noutput_items,
|
||||||
|
gr_vector_int &ninput_items,
|
||||||
|
gr_vector_const_void_star &input_items,
|
||||||
|
gr_vector_void_star &output_items);
|
||||||
|
|
||||||
|
} ;
|
||||||
|
|
||||||
|
} // namespace digitalhf
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_DIGITALHF_ADAPTIVE_DFE_IMPL_H */
|
38
lib/qa_adaptive_dfe.cc
Normal file
38
lib/qa_adaptive_dfe.cc
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2018 hcab14@mail.com.
|
||||||
|
*
|
||||||
|
* This 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.
|
||||||
|
*
|
||||||
|
* This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <gnuradio/attributes.h>
|
||||||
|
#include <cppunit/TestAssert.h>
|
||||||
|
#include "qa_adaptive_dfe.h"
|
||||||
|
#include <digitalhf/adaptive_dfe.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace digitalhf {
|
||||||
|
|
||||||
|
void
|
||||||
|
qa_adaptive_dfe::t1()
|
||||||
|
{
|
||||||
|
// Put test here
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace digitalhf */
|
||||||
|
} /* namespace gr */
|
||||||
|
|
46
lib/qa_adaptive_dfe.h
Normal file
46
lib/qa_adaptive_dfe.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2018 hcab14@mail.com.
|
||||||
|
*
|
||||||
|
* This 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.
|
||||||
|
*
|
||||||
|
* This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _QA_ADAPTIVE_DFE_H_
|
||||||
|
#define _QA_ADAPTIVE_DFE_H_
|
||||||
|
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
#include <cppunit/TestCase.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace digitalhf {
|
||||||
|
|
||||||
|
class qa_adaptive_dfe : public CppUnit::TestCase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CPPUNIT_TEST_SUITE(qa_adaptive_dfe);
|
||||||
|
CPPUNIT_TEST(t1);
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void t1();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace digitalhf */
|
||||||
|
} /* namespace gr */
|
||||||
|
|
||||||
|
#endif /* _QA_ADAPTIVE_DFE_H_ */
|
||||||
|
|
39
lib/qa_digitalhf.cc
Normal file
39
lib/qa_digitalhf.cc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
* This file is a part of gr-digitalhf
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class gathers together all the test cases for the gr-filter
|
||||||
|
* directory into a single test suite. As you create new test cases,
|
||||||
|
* add them here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qa_digitalhf.h"
|
||||||
|
#include "qa_adaptive_dfe.h"
|
||||||
|
|
||||||
|
CppUnit::TestSuite *
|
||||||
|
qa_digitalhf::suite()
|
||||||
|
{
|
||||||
|
CppUnit::TestSuite *s = new CppUnit::TestSuite("digitalhf");
|
||||||
|
s->addTest(gr::digitalhf::qa_adaptive_dfe::suite());
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
39
lib/qa_digitalhf.h
Normal file
39
lib/qa_digitalhf.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
* This file is a part of gr-digitalhf
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _QA_DIGITALHF_H_
|
||||||
|
#define _QA_DIGITALHF_H_
|
||||||
|
|
||||||
|
#include <gnuradio/attributes.h>
|
||||||
|
#include <cppunit/TestSuite.h>
|
||||||
|
|
||||||
|
//! collect all the tests for the gr-filter directory
|
||||||
|
|
||||||
|
class __GR_ATTR_EXPORT qa_digitalhf
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! return suite of tests for all of gr-filter directory
|
||||||
|
static CppUnit::TestSuite *suite();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _QA_DIGITALHF_H_ */
|
49
lib/test_digitalhf.cc
Normal file
49
lib/test_digitalhf.cc
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
* This file is a part of gr-digitalhf
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cppunit/TextTestRunner.h>
|
||||||
|
#include <cppunit/XmlOutputter.h>
|
||||||
|
|
||||||
|
#include <gnuradio/unittests.h>
|
||||||
|
#include "qa_digitalhf.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
CppUnit::TextTestRunner runner;
|
||||||
|
std::ofstream xmlfile(get_unittest_path("digitalhf.xml").c_str());
|
||||||
|
CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile);
|
||||||
|
|
||||||
|
runner.addTest(qa_digitalhf::suite());
|
||||||
|
runner.setOutputter(xmlout);
|
||||||
|
|
||||||
|
bool was_successful = runner.run("", false);
|
||||||
|
|
||||||
|
return was_successful ? 0 : 1;
|
||||||
|
}
|
45
python/CMakeLists.txt
Normal file
45
python/CMakeLists.txt
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Include python install macros
|
||||||
|
########################################################################
|
||||||
|
include(GrPython)
|
||||||
|
if(NOT PYTHONINTERP_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install python sources
|
||||||
|
########################################################################
|
||||||
|
GR_PYTHON_INSTALL(
|
||||||
|
FILES
|
||||||
|
__init__.py
|
||||||
|
DESTINATION ${GR_PYTHON_DIR}/digitalhf
|
||||||
|
)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Handle the unit tests
|
||||||
|
########################################################################
|
||||||
|
include(GrTest)
|
||||||
|
|
||||||
|
set(GR_TEST_TARGET_DEPS gnuradio-digitalhf)
|
||||||
|
set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
|
||||||
|
GR_ADD_TEST(qa_adaptive_dfe ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_adaptive_dfe.py)
|
34
python/__init__.py
Normal file
34
python/__init__.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#
|
||||||
|
# Copyright 2008,2009 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This application 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.
|
||||||
|
#
|
||||||
|
# This application 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 this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
#
|
||||||
|
|
||||||
|
# The presence of this file turns this directory into a Python package
|
||||||
|
|
||||||
|
'''
|
||||||
|
This is the GNU Radio DIGITALHF module. Place your Python package
|
||||||
|
description here (python/__init__.py).
|
||||||
|
'''
|
||||||
|
|
||||||
|
# import swig generated symbols into the digitalhf namespace
|
||||||
|
try:
|
||||||
|
# this might fail if the module is python-only
|
||||||
|
from digitalhf_swig import *
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# import any pure python here
|
||||||
|
#
|
228
python/build_utils.py
Normal file
228
python/build_utils.py
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
#
|
||||||
|
# Copyright 2004,2009,2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
"""Misc utilities used at build time
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
from build_utils_codes import *
|
||||||
|
|
||||||
|
|
||||||
|
# set srcdir to the directory that contains Makefile.am
|
||||||
|
try:
|
||||||
|
srcdir = os.environ['srcdir']
|
||||||
|
except KeyError, e:
|
||||||
|
srcdir = "."
|
||||||
|
srcdir = srcdir + '/'
|
||||||
|
|
||||||
|
# set do_makefile to either true or false dependeing on the environment
|
||||||
|
try:
|
||||||
|
if os.environ['do_makefile'] == '0':
|
||||||
|
do_makefile = False
|
||||||
|
else:
|
||||||
|
do_makefile = True
|
||||||
|
except KeyError, e:
|
||||||
|
do_makefile = False
|
||||||
|
|
||||||
|
# set do_sources to either true or false dependeing on the environment
|
||||||
|
try:
|
||||||
|
if os.environ['do_sources'] == '0':
|
||||||
|
do_sources = False
|
||||||
|
else:
|
||||||
|
do_sources = True
|
||||||
|
except KeyError, e:
|
||||||
|
do_sources = True
|
||||||
|
|
||||||
|
name_dict = {}
|
||||||
|
|
||||||
|
def log_output_name(name):
|
||||||
|
(base, ext) = os.path.splitext(name)
|
||||||
|
ext = ext[1:] # drop the leading '.'
|
||||||
|
|
||||||
|
entry = name_dict.setdefault(ext, [])
|
||||||
|
entry.append(name)
|
||||||
|
|
||||||
|
def open_and_log_name(name, dir):
|
||||||
|
global do_sources
|
||||||
|
if do_sources:
|
||||||
|
f = open(name, dir)
|
||||||
|
else:
|
||||||
|
f = None
|
||||||
|
log_output_name(name)
|
||||||
|
return f
|
||||||
|
|
||||||
|
def expand_template(d, template_filename, extra=""):
|
||||||
|
'''Given a dictionary D and a TEMPLATE_FILENAME, expand template into output file
|
||||||
|
'''
|
||||||
|
global do_sources
|
||||||
|
output_extension = extract_extension(template_filename)
|
||||||
|
template = open_src(template_filename, 'r')
|
||||||
|
output_name = d['NAME'] + extra + '.' + output_extension
|
||||||
|
log_output_name(output_name)
|
||||||
|
if do_sources:
|
||||||
|
output = open(output_name, 'w')
|
||||||
|
do_substitution(d, template, output)
|
||||||
|
output.close()
|
||||||
|
template.close()
|
||||||
|
|
||||||
|
def output_glue(dirname):
|
||||||
|
output_makefile_fragment()
|
||||||
|
output_ifile_include(dirname)
|
||||||
|
|
||||||
|
def output_makefile_fragment():
|
||||||
|
global do_makefile
|
||||||
|
if not do_makefile:
|
||||||
|
return
|
||||||
|
# overwrite the source, which must be writable; this should have been
|
||||||
|
# checked for beforehand in the top-level Makefile.gen.gen .
|
||||||
|
f = open(os.path.join(os.environ.get('gendir', os.environ.get('srcdir', '.')), 'Makefile.gen'), 'w')
|
||||||
|
f.write('#\n# This file is machine generated. All edits will be overwritten\n#\n')
|
||||||
|
output_subfrag(f, 'h')
|
||||||
|
output_subfrag(f, 'i')
|
||||||
|
output_subfrag(f, 'cc')
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def output_ifile_include(dirname):
|
||||||
|
global do_sources
|
||||||
|
if do_sources:
|
||||||
|
f = open('%s_generated.i' % (dirname,), 'w')
|
||||||
|
f.write('//\n// This file is machine generated. All edits will be overwritten\n//\n')
|
||||||
|
files = name_dict.setdefault('i', [])
|
||||||
|
files.sort()
|
||||||
|
f.write('%{\n')
|
||||||
|
for file in files:
|
||||||
|
f.write('#include <%s>\n' % (file[0:-1] + 'h',))
|
||||||
|
f.write('%}\n\n')
|
||||||
|
for file in files:
|
||||||
|
f.write('%%include <%s>\n' % (file,))
|
||||||
|
|
||||||
|
def output_subfrag(f, ext):
|
||||||
|
files = name_dict.setdefault(ext, [])
|
||||||
|
files.sort()
|
||||||
|
f.write("GENERATED_%s =" % (ext.upper()))
|
||||||
|
for file in files:
|
||||||
|
f.write(" \\\n\t%s" % (file,))
|
||||||
|
f.write("\n\n")
|
||||||
|
|
||||||
|
def extract_extension(template_name):
|
||||||
|
# template name is something like: GrFIRfilterXXX.h.t
|
||||||
|
# we return everything between the penultimate . and .t
|
||||||
|
mo = re.search(r'\.([a-z]+)\.t$', template_name)
|
||||||
|
if not mo:
|
||||||
|
raise ValueError, "Incorrectly formed template_name '%s'" % (template_name,)
|
||||||
|
return mo.group(1)
|
||||||
|
|
||||||
|
def open_src(name, mode):
|
||||||
|
global srcdir
|
||||||
|
return open(os.path.join(srcdir, name), mode)
|
||||||
|
|
||||||
|
def do_substitution(d, in_file, out_file):
|
||||||
|
def repl(match_obj):
|
||||||
|
key = match_obj.group(1)
|
||||||
|
# print key
|
||||||
|
return d[key]
|
||||||
|
|
||||||
|
inp = in_file.read()
|
||||||
|
out = re.sub(r"@([a-zA-Z0-9_]+)@", repl, inp)
|
||||||
|
out_file.write(out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
copyright = '''/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2003,2004 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.
|
||||||
|
*/
|
||||||
|
'''
|
||||||
|
|
||||||
|
def is_complex(code3):
|
||||||
|
if i_code(code3) == 'c' or o_code(code3) == 'c':
|
||||||
|
return '1'
|
||||||
|
return '0'
|
||||||
|
|
||||||
|
|
||||||
|
def standard_dict(name, code3, package='gr'):
|
||||||
|
d = {}
|
||||||
|
d['NAME'] = name
|
||||||
|
d['NAME_IMPL'] = name+'_impl'
|
||||||
|
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
|
||||||
|
d['GUARD_NAME_IMPL'] = 'INCLUDED_%s_%s_IMPL_H' % (package.upper(), name.upper())
|
||||||
|
d['BASE_NAME'] = re.sub('^' + package + '_', '', name)
|
||||||
|
d['SPTR_NAME'] = '%s_sptr' % name
|
||||||
|
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
|
||||||
|
d['COPYRIGHT'] = copyright
|
||||||
|
d['TYPE'] = i_type(code3)
|
||||||
|
d['I_TYPE'] = i_type(code3)
|
||||||
|
d['O_TYPE'] = o_type(code3)
|
||||||
|
d['TAP_TYPE'] = tap_type(code3)
|
||||||
|
d['IS_COMPLEX'] = is_complex(code3)
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def standard_dict2(name, code3, package):
|
||||||
|
d = {}
|
||||||
|
d['NAME'] = name
|
||||||
|
d['BASE_NAME'] = name
|
||||||
|
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
|
||||||
|
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
|
||||||
|
d['COPYRIGHT'] = copyright
|
||||||
|
d['TYPE'] = i_type(code3)
|
||||||
|
d['I_TYPE'] = i_type(code3)
|
||||||
|
d['O_TYPE'] = o_type(code3)
|
||||||
|
d['TAP_TYPE'] = tap_type(code3)
|
||||||
|
d['IS_COMPLEX'] = is_complex(code3)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def standard_impl_dict2(name, code3, package):
|
||||||
|
d = {}
|
||||||
|
d['NAME'] = name
|
||||||
|
d['IMPL_NAME'] = name
|
||||||
|
d['BASE_NAME'] = name.rstrip("impl").rstrip("_")
|
||||||
|
d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
|
||||||
|
d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
|
||||||
|
d['COPYRIGHT'] = copyright
|
||||||
|
d['FIR_TYPE'] = "fir_filter_" + code3
|
||||||
|
d['CFIR_TYPE'] = "fir_filter_" + code3[0:2] + 'c'
|
||||||
|
d['TYPE'] = i_type(code3)
|
||||||
|
d['I_TYPE'] = i_type(code3)
|
||||||
|
d['O_TYPE'] = o_type(code3)
|
||||||
|
d['TAP_TYPE'] = tap_type(code3)
|
||||||
|
d['IS_COMPLEX'] = is_complex(code3)
|
||||||
|
return d
|
51
python/build_utils_codes.py
Normal file
51
python/build_utils_codes.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#
|
||||||
|
# Copyright 2004 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
def i_code(code3):
|
||||||
|
return code3[0]
|
||||||
|
|
||||||
|
def o_code(code3):
|
||||||
|
if len(code3) >= 2:
|
||||||
|
return code3[1]
|
||||||
|
return code3[0]
|
||||||
|
|
||||||
|
def tap_code(code3):
|
||||||
|
if len(code3) >= 3:
|
||||||
|
return code3[2]
|
||||||
|
return code3[0]
|
||||||
|
|
||||||
|
def i_type(code3):
|
||||||
|
return char_to_type[i_code(code3)]
|
||||||
|
|
||||||
|
def o_type(code3):
|
||||||
|
return char_to_type[o_code(code3)]
|
||||||
|
|
||||||
|
def tap_type(code3):
|
||||||
|
return char_to_type[tap_code(code3)]
|
||||||
|
|
||||||
|
|
||||||
|
char_to_type = {}
|
||||||
|
char_to_type['s'] = 'short'
|
||||||
|
char_to_type['i'] = 'int'
|
||||||
|
char_to_type['f'] = 'float'
|
||||||
|
char_to_type['c'] = 'gr_complex'
|
||||||
|
char_to_type['b'] = 'unsigned char'
|
41
python/qa_adaptive_dfe.py
Executable file
41
python/qa_adaptive_dfe.py
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright 2018 hcab14@mail.com.
|
||||||
|
#
|
||||||
|
# This 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.
|
||||||
|
#
|
||||||
|
# This software 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 this software; see the file COPYING. If not, write to
|
||||||
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
# Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
|
||||||
|
from gnuradio import gr, gr_unittest
|
||||||
|
from gnuradio import blocks
|
||||||
|
import digitalhf.digitalhf_swig as digitalhf
|
||||||
|
|
||||||
|
|
||||||
|
class qa_adaptive_dfe(gr_unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.tb = gr.top_block()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.tb = None
|
||||||
|
|
||||||
|
def test_001_t(self):
|
||||||
|
# set up fg
|
||||||
|
self.tb.run()
|
||||||
|
# check data
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
gr_unittest.run(qa_adaptive_dfe, "qa_adaptive_dfe.xml")
|
66
swig/CMakeLists.txt
Normal file
66
swig/CMakeLists.txt
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-digitalhf
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check if there is C++ code at all
|
||||||
|
########################################################################
|
||||||
|
if(NOT digitalhf_sources)
|
||||||
|
MESSAGE(STATUS "No C++ sources... skipping swig/")
|
||||||
|
return()
|
||||||
|
endif(NOT digitalhf_sources)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Include swig generation macros
|
||||||
|
########################################################################
|
||||||
|
find_package(SWIG)
|
||||||
|
find_package(PythonLibs 2)
|
||||||
|
if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
include(GrSwig)
|
||||||
|
include(GrPython)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup swig generation
|
||||||
|
########################################################################
|
||||||
|
foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS})
|
||||||
|
list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig)
|
||||||
|
endforeach(incdir)
|
||||||
|
|
||||||
|
set(GR_SWIG_LIBRARIES gnuradio-digitalhf)
|
||||||
|
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/digitalhf_swig_doc.i)
|
||||||
|
set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
||||||
|
|
||||||
|
GR_SWIG_MAKE(digitalhf_swig digitalhf_swig.i)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install the build swig module
|
||||||
|
########################################################################
|
||||||
|
GR_SWIG_INSTALL(TARGETS digitalhf_swig DESTINATION ${GR_PYTHON_DIR}/digitalhf)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install swig .i files for development
|
||||||
|
########################################################################
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
digitalhf_swig.i
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/digitalhf_swig_doc.i
|
||||||
|
DESTINATION ${GR_INCLUDE_DIR}/digitalhf/swig
|
||||||
|
)
|
15
swig/digitalhf_swig.i
Normal file
15
swig/digitalhf_swig.i
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
|
||||||
|
#define DIGITALHF_API
|
||||||
|
|
||||||
|
%include "gnuradio.i" // the common stuff
|
||||||
|
|
||||||
|
//load generated python docstrings
|
||||||
|
%include "digitalhf_swig_doc.i"
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "digitalhf/adaptive_dfe.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%include "digitalhf/adaptive_dfe.h"
|
||||||
|
GR_SWIG_BLOCK_MAGIC2(digitalhf, adaptive_dfe);
|
Loading…
Reference in a new issue