changeset 6:5b128dbd2c17

WIP on the PCI LKM + improve the UseRathaxes CMake "library" to easily build a kernel module from the sources generated by rathaxes
author Louis Opter <louis@lse.epitech.net>
date Thu, 05 Jan 2012 23:27:32 +0100
parents e94d4a9e6bd5
children eead270c9bb6
files maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch series
diffstat 3 files changed, 95 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch	Thu Jan 05 23:27:32 2012 +0100
@@ -0,0 +1,85 @@
+# HG changeset patch
+# Parent d2807f4a86fdd8e40cf6ee1a5f19fefd1d3fccae
+maintainers: add the equivalent of ADD_RATHAXES_EXECUTABLE for kernel modules, only support Linux for now
+
+diff --git a/maintainers/CMakeScripts/Templates/MakefileLKM.in b/maintainers/CMakeScripts/Templates/MakefileLKM.in
+new file mode 100644
+--- /dev/null
++++ b/maintainers/CMakeScripts/Templates/MakefileLKM.in
+@@ -0,0 +1,12 @@
++KDIR =	/lib/modules/$(shell uname -r)/build
++obj-m := @LKM_OBJECTS@
++
++all:
++	$(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) modules
++
++install:
++	$(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) modules_install
++	depmod -a
++clean:
++	rm -rf *~
++	$(MAKE) -C $(KDIR) M=$(PWD) clean
+diff --git a/maintainers/CMakeScripts/UseRathaxes.cmake b/maintainers/CMakeScripts/UseRathaxes.cmake
+--- a/maintainers/CMakeScripts/UseRathaxes.cmake
++++ b/maintainers/CMakeScripts/UseRathaxes.cmake
+@@ -114,6 +114,8 @@
+          "${RATHAXES_SOURCE_DIR}/rathaxes/compiler/rtx*.cw[sp]"
+          "${RATHAXES_SOURCE_DIR}/rathaxes/compiler/rathaxes.cws")
+ 
++    # ADD_CUSTOM_COMMAND + ADD_CUSTOM_TARGET is a CMake idiom to add a target
++    # that should be rebuilt automatically when its sources change.
+     STRING(REPLACE ";" ", " SYSTEMS "${SYSTEMS}")
+     ADD_CUSTOM_COMMAND(OUTPUT ${OUTPUTS}
+                        COMMAND ${_RTX_CODEWORKER_COMMAND} "cache" "clear"
+@@ -160,3 +162,51 @@
+     ADD_EXECUTABLE(${NAME} "${RATHAXES_SOURCE}_${SYSTEM}.c")
+     ADD_DEPENDENCIES(${NAME} ${RATHAXES_SOURCE})
+ ENDFUNCTION(ADD_RATHAXES_EXECUTABLE NAME RATHAXES_SOURCE)
++
++# This function build a native kernel module from a previously generated
++# Rathaxes sources. It works by setting up a build directory and calling the
++# native build tools from there.
++#
++# Usage: ADD_RATHAXES_LKM(NAME RATHAXES_SOURCE [SYSTEM])
++#
++# RATHAXES_SOURCE must corresponds to the first argument of a call to
++# ADD_RATHAXES_SOURCES.
++#
++# The third argument SYSTEM may be used if the target system doesn't correspond
++# to CMAKE_SYSTEM_NAME.
++FUNCTION(ADD_RATHAXES_LKM NAME RATHAXES_SOURCE)
++    IF (${ARGC} EQUAL 2)
++        SET(SYSTEM ${CMAKE_SYSTEM_NAME})
++    ELSE (${ARGC} EQUAL 2)
++        SET(SYSTEM ${ARGV2})
++    ENDIF (${ARGC} EQUAL 2)
++
++    IF (${SYSTEM} MATCHES "Linux")
++        # Create a little build space for the native Linux build-chain.
++        SET(MODULE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${NAME}.dir/${SYSTEM}Build/")
++
++        # Generate the Linux Makefile to build a Linux kernel module
++        SET(MODULE_MAKEFILE "${MODULE_BUILD_DIR}/Makefile")
++        SET(LKM_OBJECTS "${RATHAXES_SOURCE}_${SYSTEM}.o")
++        CONFIGURE_FILE("${RATHAXES_SOURCE_DIR}/maintainers/CMakeScripts/Templates/MakefileLKM.in"
++                       "${MODULE_MAKEFILE}")
++
++        SET(KERNEL_OBJECT_NAME "${RATHAXES_SOURCE}_${SYSTEM}.ko")
++        ADD_CUSTOM_COMMAND(OUTPUT "${KERNEL_OBJECT_NAME}"
++                           # The linux Makefile to build kernel module is quite
++                           # picky about file location and its own name. Let's
++                           # copy our source side by side with the Makefile:
++                           COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${RATHAXES_SOURCE}_${SYSTEM}.c" "${MODULE_BUILD_DIR}"
++                           # Then call make in the little build space we created
++                           COMMAND "${CMAKE_COMMAND}" "-E" "chdir" "${MODULE_BUILD_DIR}" "${CMAKE_BUILD_TOOL}"
++                           # Finally copy the generated .ko back into the current binary dir
++                           COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${MODULE_BUILD_DIR}/${KERNEL_OBJECT_NAME}" "${CMAKE_CURRENT_BINARY_DIR}"
++                           COMMENT "Building Rathaxes Linux LKM for ${NAME}"
++                           VERBATIM
++                           DEPENDS "${RATHAXES_SOURCE}_${SYSTEM}.c")
++
++        ADD_CUSTOM_TARGET("${NAME}" ALL DEPENDS "${KERNEL_OBJECT_NAME}")
++    ELSE (${SYSTEM} MATCHES "Linux")
++        MESSAGE(STATUS "Don't know how to build kernel modules for ${SYSTEM} (yet)")
++    ENDIF (${SYSTEM} MATCHES "Linux")
++ENDFUNCTION(ADD_RATHAXES_LKM NAME RATHAXES_SOURCE)
--- a/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch	Thu Jan 05 20:53:28 2012 +0100
+++ b/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch	Thu Jan 05 23:27:32 2012 +0100
@@ -5,12 +5,16 @@
 diff --git a/rathaxes/samples/lkm/CMakeLists.txt b/rathaxes/samples/lkm/CMakeLists.txt
 --- a/rathaxes/samples/lkm/CMakeLists.txt
 +++ b/rathaxes/samples/lkm/CMakeLists.txt
-@@ -1,3 +1,3 @@
+@@ -1,3 +1,7 @@
  ADD_RATHAXES_SOURCES(lkm lkm.rtx
 -                     RTI log.rti lkm.rti
 -                     BLT log.blt lkm.blt)
 +                     RTI log.rti lkm.rti pci.rti
 +                     BLT log.blt lkm.blt pci.blt)
++
++# We can't name lkm since it's already used as the target name to generate the
++# source (with ADD_RATHAXES_SOURCES).
++ADD_RATHAXES_LKM(lkm_hello lkm)
 diff --git a/rathaxes/samples/lkm/lkm.blt b/rathaxes/samples/lkm/lkm.blt
 --- a/rathaxes/samples/lkm/lkm.blt
 +++ b/rathaxes/samples/lkm/lkm.blt
@@ -48,19 +52,20 @@
 diff --git a/rathaxes/samples/lkm/lkm.rti b/rathaxes/samples/lkm/lkm.rti
 --- a/rathaxes/samples/lkm/lkm.rti
 +++ b/rathaxes/samples/lkm/lkm.rti
-@@ -1,8 +1,9 @@
+@@ -1,8 +1,10 @@
  interface LKM
  {
      provided pointcut   LKM::includes;
 -    provided pointcut   LKM::init;
 -    provided pointcut   LKM::exit;
++    /* maybe it should be possible to use chunk ::decl in sequence templates? */
 +    provided pointcut   LKM::prototypes;
 +    provided pointcut   LKM::data;
 +    provided pointcut   LKM::code;
  
      required variable ::string  LKM::author;
      required variable ::string  LKM::description;
-@@ -11,11 +12,11 @@
+@@ -11,11 +13,11 @@
      required sequence   LKM::init()
      {
          provided chunk  LKM::includes;
@@ -178,7 +183,7 @@
 +                typedef int ${PCI::Device};
 +
 +                int             err;
-+                ${PCI::Device}  *dev = NULL; /* Doesn't work with a pointer */
++                ${PCI::Device}  dev = NULL; /* Doesn't work with a pointer */
 +
 +                err = pci_enable_device(pdev);
 +//              if (err < 0) /* `if' doesn't work */
--- a/series	Thu Jan 05 20:53:28 2012 +0100
+++ b/series	Thu Jan 05 23:27:32 2012 +0100
@@ -1,2 +1,3 @@
 rathaxes_add_a_linux_lkm.patch
 rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch
+maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch