From 626018eb037808cdc32b5eb1907ae9d5f80d3e55 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Thu, 4 Aug 2011 10:33:49 -0700
Subject: cmake: re-imagining of how to write a block w/ cmake and boost unit
 test

---
 .../cmake/Modules/GrPython.cmake                   | 177 +++++++++++++++++++++
 1 file changed, 177 insertions(+)
 create mode 100644 gr-howto-write-a-block-cmake/cmake/Modules/GrPython.cmake

(limited to 'gr-howto-write-a-block-cmake/cmake/Modules/GrPython.cmake')

diff --git a/gr-howto-write-a-block-cmake/cmake/Modules/GrPython.cmake b/gr-howto-write-a-block-cmake/cmake/Modules/GrPython.cmake
new file mode 100644
index 0000000000..f54dbc9ba7
--- /dev/null
+++ b/gr-howto-write-a-block-cmake/cmake/Modules/GrPython.cmake
@@ -0,0 +1,177 @@
+# Copyright 2010-2011 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+
+IF(DEFINED __INCLUDED_GR_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)
+
+    #and if that fails use the find program routine
+    IF(NOT PYTHONINTERP_FOUND)
+        FIND_PROGRAM(PYTHON_EXECUTABLE NAMES python python2.7 python2.6 python2.5)
+        IF(PYTHON_EXECUTABLE)
+            SET(PYTHONINTERP_FOUND TRUE)
+        ENDIF(PYTHON_EXECUTABLE)
+    ENDIF(NOT PYTHONINTERP_FOUND)
+
+ENDIF(PYTHON_EXECUTABLE)
+
+#make the path to the executable appear in the cmake gui
+SET(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
+
+########################################################################
+# 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}
+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(GR_PYTHON_CHECK_MODULE)
+
+########################################################################
+# Sets the python installation directory 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
+)
+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
+
+        FOREACH(pyfile ${GR_PYTHON_INSTALL_FILES})
+            GET_FILENAME_COMPONENT(pyfile_name ${pyfile} NAME)
+            GET_FILENAME_COMPONENT(pyfile ${pyfile} ABSOLUTE)
+            STRING(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pycfile "${pyfile}c")
+            LIST(APPEND python_install_gen_targets ${pycfile})
+
+            GET_FILENAME_COMPONENT(pycfile_path ${pycfile} PATH)
+            FILE(MAKE_DIRECTORY ${pycfile_path})
+
+            #create a command to generate the byte-compiled pyc file
+            ADD_CUSTOM_COMMAND(
+                OUTPUT ${pycfile} DEPENDS ${pyfile}
+                COMMAND ${PYTHON_EXECUTABLE} -c
+                \"import py_compile\; py_compile.compile(file='${pyfile}', cfile='${pycfile}', doraise=True)\"
+                COMMENT "Byte-compiling ${pyfile_name}"
+            )
+            INSTALL(FILES ${pycfile}
+                DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
+                COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
+            )
+        ENDFOREACH(pyfile)
+
+    ####################################################################
+    ELSEIF(GR_PYTHON_INSTALL_PROGRAMS)
+    ####################################################################
+        FILE(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
+
+        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
+                \"open('${pyexefile}', 'w').write('\#!${pyexe_native}\\n'+open('${pyfile}').read())\"
+                COMMENT "Shebangin ${pyfile_name}"
+            )
+
+            #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)
-- 
cgit v1.2.3