Я хотел бы несколько раз скомпилировать код C через Makefile, передав различные параметры в переменную #define. Куда мне положить руки новичка?
В моем коде C у меня есть определение размера для размеров матрицы через
#define N 500
Я хотел бы скомпилировать его несколько раз в цикле, но я не могу понять, как передать
-DN=(different sizes)
внутри Makefile.
Работа будет структурирована следующим образом: 1. очистить 2. сделать с -DN = определенный размер 3. запустить тест производительности и получить результаты 4. повторить с другим размером.
Мой Makefile теперь выглядит так:
exe_name = exe
CC = gcc
CFLAGS = -g -O2 -ggdb
LDFLAGS = -lm -L. -Wall -Wextra
OMPFLAGS = -fopenmp
OBJS = ompmatmul.o
default: $(exe_name)
$(exe_name): $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS) $(OMPFLAGS)
%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS) $(OMPFLAGS)
clean:
rm -f $(OBJS) $(exe_name) *~
.PHONY: clean #Don't look for a file named 'clean'
В то время как цикл, в который я бы вставил make, выглядит следующим образом:
for size in $(seq 500 500 3000); do
make clean
make #define_new_size
#do_performance_and_acquire_results
done
поэтому make size=$size, тогда команда gcc принимает -DN=$(size)





Чтобы передать параметр в файл make, добавьте параметр следующим образом:
make N=500
Тогда ваш make-файл будет содержать:
ifndef N
# provide a default
N=500
endif
...
$(exe_name): $(OBJS)
$(CC) -DN=$(N) -o $@ $^ $(LDFLAGS) $(OMPFLAGS)
Это сработало как шарм, большое спасибо :)
Чтобы автоматизировать тесты на основе отличного решения, предложенного dbush, вы можете добавить в свой Makefile следующее:
SEQS := $(shell seq 500 500 3000)
TSTS := $(addprefix test-,$(SEQS))
.PHONY: tests $(TSTS)
tests: $(TSTS)
test-%:
$(MAKE) clean
$(MAKE) $(exe_name) N=$*
$(MAKE) performance-test
Возможно, я не понял, извините за это: я хотел бы знать, могу ли я изменить (и особенно как) размер #define N с помощью Makefile для N = 500,1000,1500, .., 3000 за один запуск моего задания bash, чтобы избежать настройки параметра и перекомпиляции для каждого N.