Search code examples
linuxmakefilec99c89kbuild

How to use make and compile as C99?


I'm trying to compile a linux kernel module using a Makefile:

obj-m += main.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Which gives me:

main.c:54: warning: ISO C90 forbids mixed declarations and code

I need to switch to C99. After reading I noticed I need to add a flag -std=c99, not sure where it suppose to be added.

How do I change the Makefile so it will compile as C99?


Solution

  • It's got nothing to do with the makefile. ISO C90 forbids declaring variables anywhere but in the beginning of a block or the file - like this

    int main(int argc, char **argv) {
       int a; /* Ok */
       int b = 3; /* Ok */
    
       printf("Hello, the magic number is %d!\n", b);
       int c = 42; /* ERROR! Can only declare variables in the beginning of the block */
       printf("I also like %d.. but not as much as %d!\n", c, b);
    
       return 0;
    }
    

    Thus it has to be modified to this...

    int main(int argc, char **argv) {
       int a; /* Ok */
       int b = 3; /* Ok */
       int c = 42; /* Ok! */
    
       printf("Hello, the magic number is %d!\n", b);
       printf("I also like %d.. but not as much as %d!\n", c, b);
    
       return 0;
    }
    

    You can only "fix" that in the source code, not in the makefile.

    This rule has been relaxed in C99, but in my opinion it's a good idea to separate variable definitions, declarations and initializations from the code below it :)

    So to change your makefile to make it compile with C99, you need to change the Makefile in the "build" directory that your makefile is referencing, and add the "-std=c99" at the "gcc" line compiling the source file.