LINUX.ORG.RU

Makefile с разными параметрами


0

0

Добрый день. Нужно собрать большой проект, время компиляции которого целиком состовляет несколько десятков секунд, что при большом числе компиляций съедает кучу времени и нервов.

Написан Makefile, который принимает на входе несколько параметров из командной строки, например:

make project VAL=VAL1 или make project VAL=VAL2 VAL1 и VAL2 в программе используются как предпроцессорные условные дефайны (ifdef VAL1 или ifdef VAL2).

Когда собираем проект для одного из значеннией (например VAL1), то при повторной пересборке пересобираются только изменные файлы проекта, то что как раз нужно.

Однако если при пересборке указать VAL2, то возникают проблемы: физически файл проекта не изменялся, но ведь из-за дефайнов внутри него,код для VAL2 другой. Очищать объектники для VAL1 не хочется, ведь придется все собирать сначала.. и так при каждой смене значения. Есть ли какое-то решения для этих случаев.. пока кроме того что компилировать в разные директории или объектные файлы с разными именами в голову ничего не приходит. Если останавливаться на решение собирать в разные файлы, тогда например для VAL1, все объектные файлы будут носить имя *VAL1.o.. то как тогда заставить makefile срвнивать цель с ним, ведь в цели мы указывали *.o

Заранее спасибо за помощь, может немного сумбурно написанно, но если чтото не понятно готов подробно объяснить

$(VAL)/%.o: %.c
        $(CC) -c -o $@ $<

const86 ★★★★★
()

Есть как минимум два решения, одно из которых простое, а второе сложное. Простое заключается в изучении cmake'а и создании профилей сборки на нем (в cmake всё для этого уже есть). Ну а сложное ты уже сам описал -- самому корячиться с директориями и префиксами.

Reset ★★★★★
()
Ответ на: комментарий от Reset

> Есть как минимум два решения, одно из которых простое, а второе сложное.

Есть решение ещё проще -- отделить дерево исходных кодов от дерева сборки. Тогда из одного дерева исходников можно хоть одновременно компилировать сразу несколько вариантов с разными параметрами в разные каталоги.

bvvv
()
Ответ на: комментарий от bvvv

Первое это какая-то жуткая наркомания, которая будет работать только на gnu make.
А второе - совершенно не то.

как мне сделать такое
mkdir release
mkdir debug
mkdif debug-profile
mkdir wtf-build
....
cd release
cmake путь_к_сорцам ключи
make
cd debug
cmake путь_к_сорцам ключи
make
.....


вот это называется полноценное разделение директории проекта и директорий сборки

Reset ★★★★★
()
Ответ на: комментарий от Reset

#!/bin/sh

do_build(){
bld=$1; shift
mkdir builds/$bld
pushd builds/$bld
../../configure --prefix=$(pwd)/ROOT $@ && make && make install
}

do_build debug --maintainer-mode --...
do_build release
do_build test_some_feature --enable-feature



не оно?

Slavaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.