MyTetra Share
Делитесь знаниями!
C make files
Время создания: 06.04.2017 15:51
Раздел: Computer - Programming

Не забываем, что путь к директории include следует указать в параметрах сборки. Вот примерчик для простого Makefile (include в той же директории, что и Makefile):


@$(CC) $(OBJS) -o networkd -L$(ROMFS)/lib -linteraction -Wall -lpthread -I ./include


Дополнение к предыдущему пункту — файлы сборки круто размещать в каждой из таких отдельных директорий, и просто вызывать их из файла сборки в корневой директории. В таком случае Makefile в корневой директории будет выглядеть примерно так:

.PHONY clean build
build:
    cd sound/ && make clean && make 
    cd graphics/ && make clean && make
    cd engine/ && make clean && make
sound:
    cd sound/ && make clean && make
graphics:
    cd graphics/ && make clean && make
engine:
    cd engine/ && make clean && make
clean:
    cd sound/ && make clean
    cd engine/ && make clean
    cd greaphics/ && make clean
Отвратительно, пусть будет хотя бы так:
.PHONY: build clean

build:
    make -C sound
    make -C graphics
    make -C engine

clean:
    make -C sound clean
    make -C graphics clean
    make -C engine clean

Register — дает компилятору указание по возможности хранить переменную в регистрах процессора, а не в оперативной памяти. Использование модификатора register при объявлении переменной-итератора цикла с небольшим телом может повысить скорость работы всего цикла в несколько раз. 
register byte i = 0;
for (i; i < 256; i++)
    check_value(i);
restrict — при объявлении указателя дает компилятору гарантию (вы, как программист, гарантируете), что ни один указатель не будет указывать на область памяти, на которую указывает целевой указатель. Профит этого модификатора в том, что компилятору не придется проверять, не указывает ли какой-то еще указатель на целевой блок памяти. Если у вас внутри функции несколько указателей одного типа — возможно, он вам пригодится.
void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val);
volatile — указывает компилятору, что переменная может быть изменена неявным для него образом. Даже если компилятор пометит код, зависимый от волатильной переменной, как dead code (код, который никогда не будет выполнен), он не будет выброшен, и в рантайме выполнится в полном объеме. 
int var = 1;
if (!var)             /* Эти 2 строчки будут отброшены компилятором */
    dosmthng();   

volatile int var = 1;
if (!var)            /* А вот эти  - нет */
    dosmthng();  

 
MyTetra Share v.0.53
Яндекс индекс цитирования