Как использовать make и компилировать как C99?

Я пытаюсь скомпилировать модуль ядра linux с помощью 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

Что дает мне:

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

Мне нужно переключиться на C99. После прочтения я заметил, что мне нужно добавить флаг -std = c99, не уверен, где он должен быть добавлен.

Как мне изменить Makefile, чтобы он скомпилировался как C99?

Ответы

Ответ 1

Это не имеет никакого отношения к make файлу. ISO C90 запрещает объявление переменных где угодно, но в начале блока или файла - например,

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;
}

Таким образом, это должно быть изменено на это...

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;
}

Вы можете только "исправить" это в исходном коде, а не в make файле.

Это правило было смягчено на C99, но, на мой взгляд, хорошая идея отделить определения переменных, декларации и инициализации от кода ниже:)

Итак, чтобы изменить ваш make файл, чтобы он скомпилировался с C99, вам необходимо изменить Makefile в каталоге "build", на который ссылается ваш make файл, и добавить "-std = c99" в строку "gcc", компилируя исходный файл.

Ответ 2

Правильный способ добавления флагов компилятора при компиляции модулей задается переменной ccflags-y. Вот так:

ccflags-y := -std=gnu99

Для получения дополнительной информации см. Documentation/kbuild/makefiles.txt в дереве ядра.

Обратите внимание, что я использую стандарт gnu99 вместо c99, так как ядро ​​Linux сильно зависит от расширений GNU.

Ответ 3

Вы можете просто добавить

CFLAGS=-std=c99

В начало вашего makefile, или вы можете сделать код совместимым с C90 (как предлагает LukeN).