├── .project └── src ├── ktool.go └── mmake.cpp /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | ktool 4 | 5 | 6 | 7 | 8 | 9 | com.googlecode.goclipse.goBuilder 10 | 11 | 12 | 13 | 14 | 15 | goclipse.goNature 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/ktool.go: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------- 2 | // ktool.go (An LKM developer's tool for Linux Deepin 12.04) 3 | // 4 | // Building and Running Modules 5 | // This utility compiles the kernel-modules whose source-files 6 | // reside in the current directory (then cleans up afterward). 7 | // 8 | // programmer: Tsuibin 9 | // email: xubin@linuxdeepin.com 10 | // written on: 1 JAN 2012 11 | //------------------------------------------------------------------- 12 | 13 | package main 14 | 15 | import ( 16 | "bufio" 17 | "bytes" 18 | "fmt" 19 | "os" 20 | "os/exec" 21 | "strings" 22 | ) 23 | 24 | func main() { 25 | 26 | file, err := os.Create("Makefile") 27 | 28 | if err != nil { 29 | fmt.Println("Create Makefile error") 30 | os.Exit(1) 31 | 32 | } 33 | 34 | makeFile := bufio.NewWriter(file) 35 | makeFile.WriteString("\nifneq\t($(KERNELRELEASE),)") 36 | makeFile.WriteString("\nobj-m\t:= ") 37 | 38 | var filename string 39 | for i := 1; i < len(os.Args); i++ { 40 | 41 | filename = os.Args[i] 42 | filename = strings.Replace(filename, ".c", ".o ", 1) 43 | makeFile.WriteString(filename) 44 | } 45 | 46 | if len(os.Args) == 1 { 47 | dir, _ := os.Open(".") 48 | files, _ := dir.Readdir(0) 49 | for _, f := range files { 50 | if !f.IsDir() { 51 | filename = f.Name() 52 | if strings.Contains(filename, ".c") { 53 | filename = strings.Replace(filename, ".c", ".o ", 1) 54 | makeFile.WriteString(filename) 55 | } 56 | } 57 | } 58 | } 59 | 60 | makeFile.WriteString("\n") 61 | makeFile.WriteString("\nelse") 62 | makeFile.WriteString("\nKDIR\t:= /lib/modules/$(shell uname -r)/build") 63 | makeFile.WriteString("\nPWD\t:= $(shell pwd)") 64 | makeFile.WriteString("\n") 65 | makeFile.WriteString("default:\t") 66 | makeFile.WriteString("\n\t$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules ") 67 | makeFile.WriteString("\n\trm -r -f .tmp_versions *.mod.c .*.cmd *.o *~ *.order ") 68 | makeFile.WriteString("Modules.symvers ") 69 | makeFile.WriteString("*.symvers ") 70 | makeFile.WriteString("\n") 71 | makeFile.WriteString("clean:\t") 72 | makeFile.WriteString("\n\trm -r -f *.ko mmake *.order ") 73 | makeFile.WriteString("\n") 74 | makeFile.WriteString("\nendif") 75 | makeFile.WriteString("\n\n") 76 | makeFile.Flush() 77 | 78 | cmd := exec.Command("/usr/bin/make") 79 | cmd.Stdin = strings.NewReader("some input") 80 | var out bytes.Buffer 81 | cmd.Stdout = &out 82 | 83 | if err := cmd.Run(); err != nil { 84 | fmt.Println(err.Error()) 85 | } 86 | 87 | fmt.Printf(out.String()) 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/mmake.cpp: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------- 2 | // mmake.cpp (An LKM developer's tool for Linux 2.6) 3 | // 4 | // This utility compiles the kernel-modules whose source-files 5 | // reside in the current directory (then cleans up afterward). 6 | // 7 | // Adapted from: "Building and Running Modules" (Chapter Two), 8 | // in: "Linux Device Drivers (3rd Ed)," by Rubini and Corbett. 9 | // 10 | // programmer: ALLAN CRUSE 11 | // written on: 22 JAN 2005 12 | // revised on: 19 MAR 2005 -- command-line arguments override 13 | // revised on: 27 JUL 2006 -- extra cleanup for kernel 2.6.17 14 | // revised on: 31 MAY 2007 -- adjust extra cleanup for 2.6.18 15 | //------------------------------------------------------------------- 16 | #include // for fopen(), fprintf(), fclose(), perror() 17 | #include // for opendir(), readdir() 18 | #include // for strchr(), strncmp(), strncpy() 19 | #include // for exit() 20 | int main( int argc, char **argv ) 21 | { 22 | DIR *dp = opendir( "." ); // open the current directory 23 | if ( dp == NULL ) { perror( "opendir" ); exit(1); } 24 | FILE *fp = fopen( "Makefile", "w" ); // create 'Makefile' 25 | if ( fp == NULL ) { perror( "Makefile" ); exit(1); } 26 | // write boilerplate statements to compile Linux 2.6 modules 27 | fprintf( fp, "\nifneq\t($(KERNELRELEASE),)" ); 28 | fprintf( fp, "\nobj-m\t:= " ); 29 | // form the list of ".o" files from command-line arguments 30 | char filename[ NAME_MAX ]; 31 | for (int i = 1; i < argc; i++) 32 | { 33 | strncpy( filename, argv[i], NAME_MAX ); 34 | char *suffixp = strchr( filename, '.' ); 35 | if (( suffixp == NULL )&&( strlen(filename) < NAME_MAX-3 )) 36 | strncat( filename, ".o", 3 ); 37 | suffixp = strchr( filename, '.' ); 38 | if ( strncmp( suffixp, ".o", 3 ) != 0 ) 39 | strncpy( suffixp, ".o", 3 ); 40 | fprintf( fp, "%s ", filename ); 41 | } 42 | // or form the list of ".o" files from current ".c" files 43 | struct dirent *entry; 44 | if ( argc == 1 ) while ( entry = readdir( dp ) ) 45 | { 46 | strncpy( filename, entry->d_name, NAME_MAX ); 47 | char *suffixp = strchr( filename, '.' ); 48 | if ( suffixp == NULL ) continue; 49 | if ( strncmp( suffixp, ".c", 3 ) != 0 ) continue; 50 | strncpy( suffixp, ".o", 3 ); 51 | fprintf( fp, "%s ", filename ); 52 | } 53 | // generate the remainder of the 'Makefile' boilerplate 54 | fprintf( fp, "\n" ); 55 | fprintf( fp, "\nelse" ); 56 | fprintf( fp, "\nKDIR\t:= /lib/modules/$(shell uname -r)/build" ); 57 | fprintf( fp, "\nPWD\t:= $(shell pwd)" ); 58 | fprintf( fp, "\n" ); 59 | fprintf( fp, "default:\t" ); 60 | fprintf( fp, "\n\t$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules "); 61 | fprintf (fp, "\n\trm -r -f .tmp_versions *.mod.c .*.cmd *.o *~ "); 62 | //fprintf( fp, "Modules.symvers " ); // <-- added 7/27/2006 63 | fprintf (fp, "*.symvers "); // <-- added 5/31/2007 64 | fprintf (fp, "\n"); 65 | fprintf (fp, "clean:\t"); 66 | fprintf (fp, "\n\trm -r -f *.ko mmake *.order "); 67 | fprintf (fp, "\n"); 68 | fprintf( fp, "\nendif" ); 69 | fprintf( fp, "\n\n" ); 70 | fclose( fp ); 71 | // execute the 'make' utility using our just-created 'Makefile' 72 | system(" make "); 73 | } 74 | --------------------------------------------------------------------------------