1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-06-24 05:53:16 +00:00

Switch from python Cheetah to Mako and add Python 3 support

This commit introduces two new dependencies: python-mako and python-six. This is based on two facts:

 * Cheetah templates, used by VOLK_GNSSSDR to generate the library, are deprecated (see https://groups.google.com/forum/#!topic/mako-discuss/1UrwjXnQzxU). The original VOLK is switching to python’s Mako template engine + python-six, and also dropping the Cheetah dependency (see https://github.com/gnuradio/volk/pull/94 and https://github.com/gnuradio/volk/pull/102)

 * GNU Radio 3.8 will drop python 2.6 support and will be compatible with Python 3. They are possibly dropping out Cheetah templates, too.

Since it is still not clear to me what dependencies will pull GNU Radio in version 3.8, and the date it will be released, I think the best way to proceed is to already switch from Cheetah to Mako, and to provide support to Python 3 via python-six. However, while the Cheetah templates were required by GNU Radio =< 3.8 and we knew they were already installed, now the new dependencies python-mako and python-six need to be installed by the user.

Instructions in the README files have been updated. In summary:

```
$ sudo apt-get install python-mako python-six
```
This commit is contained in:
Carles Fernandez 2016-12-26 12:44:40 +01:00
commit eaf369bd77
25 changed files with 330 additions and 236 deletions

View File

@ -436,30 +436,65 @@ endif()
# volk_gnsssdr module - GNSS-SDR's own VOLK library
################################################################################
find_package(VolkGnssSdr)
if(ENABLE_PACKAGING)
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
set(STRIP_VOLK_GNSSSDR_PROFILE "-DENABLE_STRIP=ON")
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
endif(ENABLE_PACKAGING)
set(VOLK_GNSSSDR_BUILD_COMMAND "make")
if(PYTHON_EXECUTABLE)
set(USE_THIS_PYTHON "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}")
endif(PYTHON_EXECUTABLE)
if(OS_IS_MACOSX)
if(NOT PYTHON_EXECUTABLE)
find_file(MAC_PYTHON python
PATHS /opt/local/bin
/usr/local/bin )
if(MAC_PYTHON)
set(USE_THIS_PYTHON "-DPYTHON_EXECUTABLE=${MAC_PYTHON}")
endif(MAC_PYTHON)
endif(NOT PYTHON_EXECUTABLE)
if(CMAKE_GENERATOR STREQUAL Xcode)
set(VOLK_GNSSSDR_BUILD_COMMAND "xcodebuild" "-configuration" "Debug" "-target")
endif(CMAKE_GENERATOR STREQUAL Xcode)
endif(OS_IS_MACOSX)
if(NOT VOLK_GNSSSDR_FOUND)
message(STATUS " volk_gnsssdr will be built along with gnss-sdr when doing 'make'")
###############################
# Find Python required modules
###############################
include(SetupPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B
GNSSSDR_PYTHON_CHECK_MODULE("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND)
GNSSSDR_PYTHON_CHECK_MODULE("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
GNSSSDR_PYTHON_CHECK_MODULE("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
if(NOT PYTHON_MIN_VER_FOUND)
message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR")
endif()
# Mako
if(NOT MAKO_FOUND)
message(STATUS "Mako templates not found. See http://www.makotemplates.org/ ")
message(STATUS " You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(STATUS " sudo yum install python-mako")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
message(STATUS " sudo zypper install python-Mako")
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(STATUS " sudo apt-get install python-mako")
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(FATAL_ERROR "Mako templates required to build VOLK_GNSSSDR")
endif(NOT MAKO_FOUND)
# Six
if(NOT SIX_FOUND)
message(STATUS "python-six not found. See https://pythonhosted.org/six/ ")
message(STATUS " You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(STATUS " sudo yum install python-six")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
message(STATUS " sudo zypper install python-six")
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(STATUS " sudo apt-get install python-six")
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
message(FATAL_ERROR "six - python 2 and 3 compatibility library required to build VOLK_GNSSSDR")
endif(NOT SIX_FOUND)
if(ENABLE_PACKAGING)
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
set(STRIP_VOLK_GNSSSDR_PROFILE "-DENABLE_STRIP=ON")
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
endif(ENABLE_PACKAGING)
set(VOLK_GNSSSDR_BUILD_COMMAND "make")
if(PYTHON_EXECUTABLE)
set(USE_THIS_PYTHON "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}")
endif(PYTHON_EXECUTABLE)
if(OS_IS_MACOSX)
if(CMAKE_GENERATOR STREQUAL Xcode)
set(VOLK_GNSSSDR_BUILD_COMMAND "xcodebuild" "-configuration" "Debug" "-target")
endif(CMAKE_GENERATOR STREQUAL Xcode)
endif(OS_IS_MACOSX)
set(CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
if(CMAKE_CROSSCOMPILING)

View File

@ -17,7 +17,7 @@ This section describes how to set up the compilation environment in GNU/Linux or
GNU/Linux
----------
* Tested distributions: Ubuntu 14.04 LTS and above, Debian 8.0 "jessie" and above, Linaro 15.03
* Tested distributions: Ubuntu 14.04 LTS and [above](http://packages.ubuntu.com/search?keywords=gnss-sdr), Debian 8.0 "jessie" and [above](https://packages.debian.org/search?searchon=names&keywords=gnss-sdr), Linaro 15.03
* Known to work but not continually tested: Arch Linux, Fedora, and openSUSE
* Supported microprocessor architectures:
* i386: Intel x86 instruction set (32-bit microprocessors).
@ -46,7 +46,8 @@ $ sudo apt-get install build-essential cmake git libboost-dev libboost-date-time
libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-chrono-dev \
libboost-serialization-dev libboost-program-options-dev libboost-test-dev \
liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-dev \
libarmadillo-dev libgflags-dev libgoogle-glog-dev libgnutls-openssl-dev libgtest-dev
libarmadillo-dev libgflags-dev libgoogle-glog-dev libgnutls-openssl-dev libgtest-dev \
python-mako python-six
~~~~~~
Alternatively, and starting from Ubuntu 16.04 LTS, you can install all the required dependencies by adding the line
@ -441,6 +442,8 @@ $ sudo port install gnuradio
$ sudo port install armadillo
$ sudo port install gnutls
$ sudo port install google-glog +gflags
$ sudo port install py27-mako
$ sudo port install py27-six
~~~~~~
You also might need to activate a Python installation. The list of installed versions can be retrieved with:

View File

@ -0,0 +1,78 @@
########################################################################
# 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
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6)
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 python3)
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(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have)
message(STATUS "Python checking for ${desc}")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "
#########################################
try: import ${mod}
except:
try: ${mod}
except: exit(-1)
try: assert ${cmd}
except: exit(-1)
#########################################"
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(GNSSSDR_PYTHON_CHECK_MODULE)

View File

@ -29,7 +29,7 @@ GNSS-SDR.SUPL_CI=0x31b0
SignalSource.implementation=File_Signal_Source
;#filename: path to file with the captured GNSS signal samples to be processed
SignalSource.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE
SignalSource.filename=/Users/carlesfernandez/Documents/workspace/code2/trunk/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ;/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE
;#item_type: Type and resolution for each of the signal samples.
SignalSource.item_type=ishort

View File

@ -73,8 +73,8 @@ As signal inputs, it accepts:
\li Raw data file captured with a data grabber (digitized at some intermediate frequency or directly at baseband).
\li Any suitable RF configuration that can be driven by the Universal Software Radio Peripheral Hardware Driver (<a href="http://files.ettus.com/uhd_docs/manual/html/" target="_blank">UHD</a>).
This includes all current and future <a href="http://www.ettus.com/">Ettus Research</a> products. The USRP1 + DBSRX 2.2 daughterboard is an example of working configuration for GPS L1 C/A and Galileo E1B and E1C signals.
\li The <a href="http://gnss-sdr.org/documentation/sige-gn3s-sampler-v2-usb-front-end" target="blank">GN3S v2 USB dongle</a> (GN3S v3 might work with small modifications).
\li Experimentally, with some <a href="http://gnss-sdr.org/documentation/gnss-sdr-operation-realtek-rtl2832u-usb-dongle-dvb-t-receiver" target="_blank">USB DVB-T dongles based on the Realtek RTL2832U chipset</a>.
\li The <a href="http://gnss-sdr.org/docs/tutorials/sige-gn3s-sampler-v2-usb-front-end/" target="blank">GN3S v2 USB dongle</a> (GN3S v3 might work with small modifications).
\li Experimentally, with some <a href="http://gnss-sdr.org/docs/tutorials/gnss-sdr-operation-realtek-rtl2832u-usb-dongle-dvb-t-receiver/" target="_blank">USB DVB-T dongles based on the Realtek RTL2832U chipset</a>.
\li For mathematical representations of the targeted signals, check out the \ref the_signal_model page.
As outputs, it provides:
@ -87,7 +87,7 @@ As outputs, it provides:
\section build Building GNSS-SDR
In principle, GNSS-SDR can be built in any Unix-like system. In practice, it depends on being able to install all the required dependencies. See the <a href="http://gnss-sdr.org/documentation/building-guide" target="_blank">building guide</a> page for details about the project's
In principle, GNSS-SDR can be built in any Unix-like system. In practice, it depends on being able to install all the required dependencies. See the <a href="http://gnss-sdr.org/build-and-install/" target="_blank">building guide</a> page for details about the project's
dependencies and build process. Mainly, it consists on installing <a href="http://gnuradio.org/" target="_blank">GNU Radio</a> plus some few more libraries:
\li <a href="http://code.google.com/p/gflags/" target="_blank">Gflags</a>, a library that implements commandline flags processing,
@ -655,12 +655,12 @@ Please ask the Developer Team for a signal sample if you need one, and they will
Another interesting option is working in real-time with a RF front-end. We provide drivers for UHD-compatible hardware (see \ref signal_source), for the GN3S v2 USB dongle
and for some DVB-T USB dongles. Start with a low number of channels and then increase it in order to test how many channels your processor can handle in real-time.
You can find more information at the <a href="http://gnss-sdr.org/documents" target="_blank"><b>GNSS-SDR Documentation page</b></a> or directly asking to the
You can find more information at the <a href="http://gnss-sdr.org/docs/" target="_blank"><b>GNSS-SDR Documentation page</b></a> or directly asking to the
<a href="http://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers" target="_blank"><b>GNSS-SDR Developers mailing list</b></a>.
You are also very welcome to contribute to the project, there are many ways to <a href="http://gnss-sdr.org/participate" target="_blank"><b>participate in GNSS-SDR</b></a>.
You are also very welcome to contribute to the project, there are many ways to <a href="http://gnss-sdr.org/contribute/" target="_blank"><b>participate in GNSS-SDR</b></a>.
If you need some special feature not yet implemented, the Developer Team would love to be hired for developing it.
Please do not hesitate to <a href="http://gnss-sdr.org/contact-us" target="_blank"><b>contact them</b></a>.
Please do not hesitate to <a href="http://gnss-sdr.org/team/" target="_blank"><b>contact them</b></a>.
Enjoy GNSS-SDR!

View File

@ -74,17 +74,24 @@ SET(CROSSCOMPILE_MULTILIB ${CROSSCOMPILE_MULTILIB} CACHE STRING "Define \"true\"
# Python
include(VolkPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B
VOLK_PYTHON_CHECK_MODULE("python >= 2.5" sys "sys.version.split()[0] >= '2.5'" PYTHON_MIN_VER_FOUND)
VOLK_PYTHON_CHECK_MODULE("Cheetah >= 2.0.0" Cheetah "Cheetah.Version >= '2.0.0'" CHEETAH_FOUND)
VOLK_PYTHON_CHECK_MODULE("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND)
VOLK_PYTHON_CHECK_MODULE("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
VOLK_PYTHON_CHECK_MODULE("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
if(NOT PYTHON_MIN_VER_FOUND)
message(FATAL_ERROR "Python 2.5 or greater required to build VOLK_GNSSSDR")
message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR")
endif()
# Cheetah
if(NOT CHEETAH_FOUND)
message(FATAL_ERROR "Cheetah templates required to build VOLK_GNSSSDR")
# Mako
if(NOT MAKO_FOUND)
message(FATAL_ERROR "Mako templates required to build VOLK_GNSSSDR")
endif()
# Six
if(NOT SIX_FOUND)
message(FATAL_ERROR "six - python 2 and 3 compatibility library required to build VOLK")
endif()
# Boost
if(MSVC)

View File

@ -17,7 +17,7 @@ However, you can install and use VOLK_GNSSSDR kernels as you use VOLK's, indepen
First, make sure that the required dependencies are installed in you machine:
~~~~~~
$ sudo apt-get install git subversion cmake python-cheetah libboost-dev libbbost-filesystem
$ sudo apt-get install git cmake python-mako python-six libboost-dev libbbost-filesystem
~~~~~~
In order to build and install the library, go to the base folder of the source code and do:

View File

@ -36,11 +36,12 @@ if(PYTHON_EXECUTABLE)
else(PYTHON_EXECUTABLE)
#use the built-in find script
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6)
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)
find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python3)
if(PYTHON_EXECUTABLE)
set(PYTHONINTERP_FOUND TRUE)
endif(PYTHON_EXECUTABLE)
@ -100,7 +101,7 @@ endmacro(VOLK_PYTHON_CHECK_MODULE)
if(NOT DEFINED VOLK_PYTHON_DIR)
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
from distutils import sysconfig
print sysconfig.get_python_lib(plat_specific=True, prefix='')
print(sysconfig.get_python_lib(plat_specific=True, prefix=''))
" OUTPUT_VARIABLE VOLK_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
@ -113,7 +114,7 @@ file(TO_CMAKE_PATH ${VOLK_PYTHON_DIR} VOLK_PYTHON_DIR)
function(VOLK_UNIQUE_TARGET desc)
file(RELATIVE_PATH reldir ${PROJECT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
unique = hashlib.md5(b'${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})
@ -230,7 +231,7 @@ endfunction(VOLK_PYTHON_INSTALL)
file(WRITE ${PROJECT_BINARY_DIR}/python_compile_helper.py "
import sys, py_compile
files = sys.argv[1:]
srcs, gens = files[:len(files)/2], files[len(files)/2:]
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)
")

View File

@ -18,6 +18,10 @@
# along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import print_function
import six
archs = list()
arch_dict = dict()
@ -81,8 +85,8 @@ for arch_xml in archs_xml:
if not flags.has_key(name): flags[name] = list()
flags[name].append(flag_xml.firstChild.data)
#force kwargs keys to be of type str, not unicode for py25
kwargs = dict((str(k), v) for k, v in kwargs.iteritems())
kwargs = dict((str(k), v) for k, v in six.iteritems(kwargs))
register_arch(flags=flags, checks=checks, **kwargs)
if __name__ == '__main__':
print archs
print(archs)

View File

@ -18,6 +18,8 @@
# along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import print_function
import optparse
import volk_gnsssdr_arch_defs
import volk_gnsssdr_machine_defs
@ -28,7 +30,7 @@ def do_arch_flags_list(compiler):
if not arch.is_supported(compiler): continue
fields = [arch.name] + arch.get_flags(compiler)
output.append(','.join(fields))
print ';'.join(output)
print(';'.join(output))
def do_machines_list(arch_names):
output = list()
@ -36,14 +38,14 @@ def do_machines_list(arch_names):
machine_arch_set = set(machine.arch_names)
if set(arch_names).intersection(machine_arch_set) == machine_arch_set:
output.append(machine.name)
print ';'.join(output)
print(';'.join(output))
def do_machine_flags_list(compiler, machine_name):
output = list()
machine = volk_gnsssdr_machine_defs.machine_dict[machine_name]
for arch in machine.archs:
output.extend(arch.get_flags(compiler))
print ' '.join(output)
print(' '.join(output))
def main():
parser = optparse.OptionParser()

View File

@ -19,6 +19,8 @@
#
from __future__ import print_function
import os
import re
import sys
@ -98,9 +100,9 @@ def split_into_nested_ifdef_sections(code):
def print_sections(sections, indent = ' '):
for header, body in sections:
if header == 'text':
print indent, ('\n'+indent).join(body.splitlines())
print(indent, ('\n'+indent).join(body.splitlines()))
continue
print indent.replace(' ', '-') + '>', header
print(indent.replace(' ', '-') + '>', header)
print_sections(body, indent + ' ')
########################################################################
@ -136,7 +138,7 @@ class impl_class:
arg_type, arg_name = m.groups()
self.args.append((arg_type, arg_name))
except Exception as ex:
raise Exception, 'I cant parse the function prototype from: %s in %s\n%s'%(kern_name, body, ex)
raise Exception('I cant parse the function prototype from: %s in %s\n%s'%(kern_name, body, ex))
assert self.name
self.is_aligned = self.name.startswith('a_')
@ -206,4 +208,4 @@ kernel_files = glob.glob(os.path.join(srcdir, "kernels", "volk_gnsssdr", "*.h"))
kernels = map(kernel_class, kernel_files)
if __name__ == '__main__':
print kernels
print(kernels)

View File

@ -17,6 +17,9 @@
# You should have received a copy of the GNU General Public License
# along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import print_function
import six
from volk_gnsssdr_arch_defs import arch_dict
@ -70,8 +73,8 @@ for machine_xml in machines_xml:
except: pass
kwargs['archs'] = kwargs['archs'].split()
#force kwargs keys to be of type str, not unicode for py25
kwargs = dict((str(k), v) for k, v in kwargs.iteritems())
kwargs = dict((str(k), v) for k, v in six.iteritems(kwargs))
register_machine(**kwargs)
if __name__ == '__main__':
print machines
print(machines)

View File

@ -18,6 +18,8 @@
# along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import print_function
import os
import re
import sys
@ -25,22 +27,7 @@ import optparse
import volk_gnsssdr_arch_defs
import volk_gnsssdr_machine_defs
import volk_gnsssdr_kernel_defs
from Cheetah import Template
def __escape_pre_processor(code):
out = list()
for line in code.splitlines():
m = re.match('^(\s*)#(\s*)(\w+)(.*)$', line)
if m:
p0, p1, fcn, stuff = m.groups()
conly = fcn in ('include', 'define', 'ifdef', 'ifndef', 'endif', 'elif', 'pragma')
both = fcn in ('if', 'else')
istmpl = '$' in stuff
if 'defined' in stuff: istmpl = False
if conly or (both and not istmpl):
line = '%s\\#%s%s%s'%(p0, p1, fcn, stuff)
out.append(line)
return '\n'.join(out)
from mako.template import Template
def __parse_tmpl(_tmpl, **kwargs):
defs = {
@ -51,13 +38,12 @@ def __parse_tmpl(_tmpl, **kwargs):
'kernels': volk_gnsssdr_kernel_defs.kernels,
}
defs.update(kwargs)
_tmpl = __escape_pre_processor(_tmpl)
_tmpl = """
/* this file was generated by volk_gnsssdr template utils, do not edit! */
/* this file was generated by volk_gnsssdr template utils, do not edit! */
""" + _tmpl
return str(Template.Template(_tmpl, defs))
""" + _tmpl
return str(Template(_tmpl).render(**defs))
def main():
parser = optparse.OptionParser()
@ -67,7 +53,7 @@ def main():
output = __parse_tmpl(open(opts.input).read(), args=args)
if opts.output: open(opts.output, 'w').write(output)
else: print output
else: print(output)
if __name__ == '__main__': main()

View File

@ -542,11 +542,8 @@ if(CMAKE_VERSION VERSION_GREATER "2.8.7")
#Create a volk_gnsssdr object library (requires cmake >= 2.8.8)
add_library(volk_gnsssdr_obj OBJECT ${volk_gnsssdr_sources})
if(ENABLE_STATIC_LIBS)
add_library(volk_gnsssdr STATIC $<TARGET_OBJECTS:volk_gnsssdr_obj> ${volk_gnsssdr_sources})
else(ENABLE_STATIC_LIBS)
add_library(volk_gnsssdr SHARED $<TARGET_OBJECTS:volk_gnsssdr_obj> ${volk_gnsssdr_sources})
endif(ENABLE_STATIC_LIBS)
#Add dynamic library
add_library(volk_gnsssdr SHARED $<TARGET_OBJECTS:volk_gnsssdr_obj>)
target_link_libraries(volk_gnsssdr ${volk_gnsssdr_libraries} ${Boost_LIBRARIES})
#Configure target properties

View File

@ -19,6 +19,8 @@
#
#
from __future__ import print_function
import ConfigParser
import sys
import os
@ -70,7 +72,7 @@ class volk_gnsssdr_modtool_config:
elif os.path.exists(default):
icfg.read(default)
else:
print "Initializing config file..."
print("Initializing config file...")
icfg.add_section(self.config_name)
for kn in self.config_defaults:
rv = raw_input("%s: "%(kn))
@ -95,9 +97,3 @@ class volk_gnsssdr_modtool_config:
retval[i[0]] = i[1]
return retval

View File

@ -18,6 +18,7 @@
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
from __future__ import print_function
import os
import glob
@ -225,14 +226,14 @@ class volk_gnsssdr_modtool:
for kernel in search_kernels:
infile = os.path.join(inpath, 'kernels/' + top[:-1] + '/' + top + kernel.pattern + '.h');
print "Removing kernel %s"%(kernel.pattern)
print("Removing kernel %s" % kernel.pattern)
if os.path.exists(infile):
os.remove(infile);
# remove the orc proto-kernels if they exist. There are no puppets here
# so just need to glob for files matching kernel name
print glob.glob(inpath + '/orc/' + top + name + '*.orc');
print(glob.glob(inpath + '/kernel/volk/asm/orc/' + top + name + '*.orc'))
for orcfile in glob.glob(inpath + '/orc/' + top + name + '*.orc'):
print orcfile
print(orcfile)
if(os.path.exists(orcfile)):
os.remove(orcfile);
@ -294,7 +295,7 @@ class volk_gnsssdr_modtool:
open(dest, 'a').write(otherline);
for kernel in search_kernels:
print "Adding kernel %s from module %s"%(kernel.pattern,base)
print("Adding kernel %s from module %s" % (kernel.pattern, base))
infile = open(os.path.join(inpath, 'lib/testqa.cc'));
otherinfile = open(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'lib/testqa.cc'));

View File

@ -110,93 +110,91 @@ bool volk_gnsssdr_is_aligned(const void *ptr)
#define LV_HAVE_GENERIC
#define LV_HAVE_DISPATCHER
#for $kern in $kernels
%for kern in kernels:
#if $kern.has_dispatcher
#include <volk_gnsssdr/$(kern.name).h> //pulls in the dispatcher
#end if
%if kern.has_dispatcher:
#include <volk_gnsssdr/${kern.name}.h> //pulls in the dispatcher
%endif
static inline void __$(kern.name)_d($kern.arglist_full)
static inline void __${kern.name}_d(${kern.arglist_full})
{
#if $kern.has_dispatcher
$(kern.name)_dispatcher($kern.arglist_names);
%if kern.has_dispatcher:
${kern.name}_dispatcher(${kern.arglist_names});
return;
#end if
%endif
if (volk_gnsssdr_is_aligned(
#set $num_open_parens = 0
#for $arg_type, $arg_name in $kern.args
#if '*' in $arg_type
VOLK_OR_PTR($arg_name,
#set $num_open_parens += 1
#end if
#end for
0$(')'*$num_open_parens)
if (volk_gnsssdr_is_aligned(<% num_open_parens = 0 %>
%for arg_type, arg_name in kern.args:
%if '*' in arg_type:
VOLK_OR_PTR(${arg_name},<% num_open_parens += 1 %>
%endif
%endfor
0<% end_open_parens = ')'*num_open_parens %>${end_open_parens}
)){
$(kern.name)_a($kern.arglist_names);
${kern.name}_a(${kern.arglist_names});
}
else{
$(kern.name)_u($kern.arglist_names);
${kern.name}_u(${kern.arglist_names});
}
}
static inline void __init_$(kern.name)(void)
static inline void __init_${kern.name}(void)
{
const char *name = get_machine()->$(kern.name)_name;
const char **impl_names = get_machine()->$(kern.name)_impl_names;
const int *impl_deps = get_machine()->$(kern.name)_impl_deps;
const bool *alignment = get_machine()->$(kern.name)_impl_alignment;
const size_t n_impls = get_machine()->$(kern.name)_n_impls;
const char *name = get_machine()->${kern.name}_name;
const char **impl_names = get_machine()->${kern.name}_impl_names;
const int *impl_deps = get_machine()->${kern.name}_impl_deps;
const bool *alignment = get_machine()->${kern.name}_impl_alignment;
const size_t n_impls = get_machine()->${kern.name}_n_impls;
const size_t index_a = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, true/*aligned*/);
const size_t index_u = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, false/*unaligned*/);
$(kern.name)_a = get_machine()->$(kern.name)_impls[index_a];
$(kern.name)_u = get_machine()->$(kern.name)_impls[index_u];
${kern.name}_a = get_machine()->${kern.name}_impls[index_a];
${kern.name}_u = get_machine()->${kern.name}_impls[index_u];
assert($(kern.name)_a);
assert($(kern.name)_u);
assert(${kern.name}_a);
assert(${kern.name}_u);
$(kern.name) = &__$(kern.name)_d;
${kern.name} = &__${kern.name}_d;
}
static inline void __$(kern.name)_a($kern.arglist_full)
static inline void __${kern.name}_a(${kern.arglist_full})
{
__init_$(kern.name)();
$(kern.name)_a($kern.arglist_names);
__init_${kern.name}();
${kern.name}_a(${kern.arglist_names});
}
static inline void __$(kern.name)_u($kern.arglist_full)
static inline void __${kern.name}_u(${kern.arglist_full})
{
__init_$(kern.name)();
$(kern.name)_u($kern.arglist_names);
__init_${kern.name}();
${kern.name}_u(${kern.arglist_names});
}
static inline void __$(kern.name)($kern.arglist_full)
static inline void __${kern.name}(${kern.arglist_full})
{
__init_$(kern.name)();
$(kern.name)($kern.arglist_names);
__init_${kern.name}();
${kern.name}(${kern.arglist_names});
}
$kern.pname $(kern.name)_a = &__$(kern.name)_a;
$kern.pname $(kern.name)_u = &__$(kern.name)_u;
$kern.pname $(kern.name) = &__$(kern.name);
${kern.pname} ${kern.name}_a = &__${kern.name}_a;
${kern.pname} ${kern.name}_u = &__${kern.name}_u;
${kern.pname} ${kern.name} = &__${kern.name};
void $(kern.name)_manual($kern.arglist_full, const char* impl_name)
void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name)
{
const int index = volk_gnsssdr_get_index(
get_machine()->$(kern.name)_impl_names,
get_machine()->$(kern.name)_n_impls,
get_machine()->${kern.name}_impl_names,
get_machine()->${kern.name}_n_impls,
impl_name
);
get_machine()->$(kern.name)_impls[index](
$kern.arglist_names
get_machine()->${kern.name}_impls[index](
${kern.arglist_names}
);
}
volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void) {
const char **impl_names = get_machine()->$(kern.name)_impl_names;
const int *impl_deps = get_machine()->$(kern.name)_impl_deps;
const bool *alignment = get_machine()->$(kern.name)_impl_alignment;
const size_t n_impls = get_machine()->$(kern.name)_n_impls;
volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void) {
const char **impl_names = get_machine()->${kern.name}_impl_names;
const int *impl_deps = get_machine()->${kern.name}_impl_deps;
const bool *alignment = get_machine()->${kern.name}_impl_alignment;
const size_t n_impls = get_machine()->${kern.name}_n_impls;
volk_gnsssdr_func_desc_t desc = {
impl_names,
impl_deps,
@ -206,4 +204,4 @@ volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void) {
return desc;
}
#end for
%endfor

View File

@ -68,23 +68,23 @@ VOLK_API size_t volk_gnsssdr_get_alignment(void);
*/
VOLK_API bool volk_gnsssdr_is_aligned(const void *ptr);
#for $kern in $kernels
%for kern in kernels:
//! A function pointer to the dispatcher implementation
extern VOLK_API $kern.pname $kern.name;
extern VOLK_API ${kern.pname} ${kern.name};
//! A function pointer to the fastest aligned implementation
extern VOLK_API $kern.pname $(kern.name)_a;
extern VOLK_API ${kern.pname} ${kern.name}_a;
//! A function pointer to the fastest unaligned implementation
extern VOLK_API $kern.pname $(kern.name)_u;
extern VOLK_API ${kern.pname} ${kern.name}_u;
//! Call into a specific implementation given by name
extern VOLK_API void $(kern.name)_manual($kern.arglist_full, const char* impl_name);
extern VOLK_API void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name);
//! Get description paramaters for this kernel
extern VOLK_API volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void);
#end for
extern VOLK_API volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void);
%endfor
__VOLK_DECL_END

View File

@ -19,10 +19,10 @@
#ifndef INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H
#define INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H
#for $i, $arch in enumerate($archs)
#ifndef LV_$(arch.name.upper())
#define LV_$(arch.name.upper()) $i
#endif
#end for
%for i, arch in enumerate(archs):
//#ifndef LV_${arch.name.upper()}
#define LV_${arch.name.upper()} ${i}
//#endif
%endfor
#endif /*INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED*/

View File

@ -147,15 +147,14 @@ static int has_neon(void){
#endif
}
#for $arch in $archs
static int i_can_has_$arch.name (void) {
#for $check, $params in $arch.checks
if ($(check)($(', '.join($params))) == 0) return 0;
#end for
%for arch in archs:
static int i_can_has_${arch.name} (void) {
%for check, params in arch.checks:
if (${check}(<% joined_params = ', '.join(params)%>${joined_params}) == 0) return 0;
%endfor
return 1;
}
#end for
%endfor
#if defined(HAVE_FENV_H)
#if defined(FE_TONEAREST)
@ -182,17 +181,17 @@ static int i_can_has_$arch.name (void) {
#endif
void volk_gnsssdr_cpu_init() {
#for $arch in $archs
volk_gnsssdr_cpu.has_$arch.name = &i_can_has_$arch.name;
#end for
%for arch in archs:
volk_gnsssdr_cpu.has_${arch.name} = &i_can_has_${arch.name};
%endfor
set_float_rounding();
}
unsigned int volk_gnsssdr_get_lvarch() {
unsigned int retval = 0;
volk_gnsssdr_cpu_init();
#for $arch in $archs
retval += volk_gnsssdr_cpu.has_$(arch.name)() << LV_$(arch.name.upper());
#end for
%for arch in archs:
retval += volk_gnsssdr_cpu.has_${arch.name}() << LV_${arch.name.upper()};
%endfor
return retval;
}

View File

@ -24,9 +24,9 @@
__VOLK_DECL_BEGIN
struct VOLK_CPU {
#for $arch in $archs
int (*has_$arch.name) ();
#end for
%for arch in archs:
int (*has_${arch.name}) ();
%endfor
};
extern struct VOLK_CPU volk_gnsssdr_cpu;

View File

@ -16,12 +16,12 @@
* along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
*/
#set $this_machine = $machine_dict[$args[0]]
#set $arch_names = $this_machine.arch_names
<% this_machine = machine_dict[args[0]] %>
<% arch_names = this_machine.arch_names %>
#for $arch in $this_machine.archs
#define LV_HAVE_$(arch.name.upper()) 1
#end for
%for arch in this_machine.archs:
#define LV_HAVE_${arch.name.upper()} 1
%endfor
#include <volk_gnsssdr/volk_gnsssdr_common.h>
#include "volk_gnsssdr_machines.h"
@ -31,46 +31,28 @@
#include "config.h"
#endif
#for $kern in $kernels
#include <volk_gnsssdr/$(kern.name).h>
#end for
%for kern in kernels:
#include <volk_gnsssdr/${kern.name}.h>
%endfor
########################################################################
#def make_arch_have_list($archs)
$(' | '.join(['(1 << LV_%s)'%a.name.upper() for a in $archs]))#slurp
#end def
########################################################################
#def make_impl_name_list($impls)
{$(', '.join(['"%s"'%i.name for i in $impls]))}#slurp
#end def
########################################################################
#def make_impl_align_list($impls)
{$(', '.join(['true' if i.is_aligned else 'false' for i in $impls]))}#slurp
#end def
########################################################################
#def make_impl_deps_list($impls)
{$(', '.join([' | '.join(['(1 << LV_%s)'%d.upper() for d in i.deps]) for i in $impls]))}#slurp
#end def
########################################################################
#def make_impl_fcn_list($name, $impls)
{$(', '.join(['%s_%s'%($name, i.name) for i in $impls]))}#slurp
#end def
struct volk_gnsssdr_machine volk_gnsssdr_machine_$(this_machine.name) = {
$make_arch_have_list($this_machine.archs),
"$this_machine.name",
$this_machine.alignment,
#for $kern in $kernels
#set $impls = $kern.get_impls($arch_names)
"$kern.name", ##//kernel name
$make_impl_name_list($impls), ##//list of kernel implementations by name
$make_impl_deps_list($impls), ##//list of arch dependencies per implementation
$make_impl_align_list($impls), ##//alignment required? for each implementation
$make_impl_fcn_list($kern.name, $impls), ##//pointer to each implementation
$(len($impls)), ##//number of implementations listed here
#end for
struct volk_gnsssdr_machine volk_gnsssdr_machine_${this_machine.name} = {
<% make_arch_have_list = (' | '.join(['(1 << LV_%s)'%a.name.upper() for a in this_machine.archs])) %> ${make_arch_have_list},
<% this_machine_name = "\""+this_machine.name+"\"" %> ${this_machine_name},
${this_machine.alignment},
##//list all kernels
%for kern in kernels:
<% impls = kern.get_impls(arch_names) %>
##//kernel name
<% kern_name = "\""+kern.name+"\"" %> ${kern_name},
##//list of kernel implementations by name
<% make_impl_name_list = "{"+', '.join(['"%s"'%i.name for i in impls])+"}" %> ${make_impl_name_list},
##//list of arch dependencies per implementation
<% make_impl_deps_list = "{"+', '.join([' | '.join(['(1 << LV_%s)'%d.upper() for d in i.deps]) for i in impls])+"}" %> ${make_impl_deps_list},
##//alignment required? for each implementation
<% make_impl_align_list = "{"+', '.join(['true' if i.is_aligned else 'false' for i in impls])+"}" %> ${make_impl_align_list},
##//pointer to each implementation
<% make_impl_fcn_list = "{"+', '.join(['%s_%s'%(kern.name, i.name) for i in impls])+"}" %> ${make_impl_fcn_list},
##//number of implementations listed here
<% len_impls = len(impls) %> ${len_impls},
%endfor
};

View File

@ -21,11 +21,11 @@
#include "volk_gnsssdr_machines.h"
struct volk_gnsssdr_machine *volk_gnsssdr_machines[] = {
#for $machine in $machines
#ifdef LV_MACHINE_$(machine.name.upper())
&volk_gnsssdr_machine_$(machine.name),
%for machine in machines:
#ifdef LV_MACHINE_${machine.name.upper()}
&volk_gnsssdr_machine_${machine.name},
#endif
#end for
%endfor
};
unsigned int n_volk_gnsssdr_machines = sizeof(volk_gnsssdr_machines)/sizeof(*volk_gnsssdr_machines);

View File

@ -31,21 +31,21 @@ struct volk_gnsssdr_machine {
const unsigned int caps; //capabilities (i.e., archs compiled into this machine, in the volk_gnsssdr_get_lvarch format)
const char *name;
const size_t alignment; //the maximum byte alignment required for functions in this library
#for $kern in $kernels
const char *$(kern.name)_name;
const char *$(kern.name)_impl_names[$(len($archs))];
const int $(kern.name)_impl_deps[$(len($archs))];
const bool $(kern.name)_impl_alignment[$(len($archs))];
const $(kern.pname) $(kern.name)_impls[$(len($archs))];
const size_t $(kern.name)_n_impls;
#end for
%for kern in kernels:
const char *${kern.name}_name;
const char *${kern.name}_impl_names[<%len_archs=len(archs)%>${len_archs}];
const int ${kern.name}_impl_deps[${len_archs}];
const bool ${kern.name}_impl_alignment[${len_archs}];
const ${kern.pname} ${kern.name}_impls[${len_archs}];
const size_t ${kern.name}_n_impls;
%endfor
};
#for $machine in $machines
#ifdef LV_MACHINE_$(machine.name.upper())
extern struct volk_gnsssdr_machine volk_gnsssdr_machine_$(machine.name);
%for machine in machines:
#ifdef LV_MACHINE_${machine.name.upper()}
extern struct volk_gnsssdr_machine volk_gnsssdr_machine_${machine.name};
#endif
#end for
%endfor
__VOLK_DECL_END

View File

@ -22,8 +22,8 @@
#include <inttypes.h>
#include <volk_gnsssdr/volk_gnsssdr_complex.h>
#for $kern in $kernels
typedef void (*$(kern.pname))($kern.arglist_types);
#end for
%for kern in kernels:
typedef void (*${kern.pname})(${kern.arglist_types});
%endfor
#endif /*INCLUDED_VOLK_GNSSSDR_TYPEDEFS*/