lesovsky
@lesovsky
System engineer and PostgreSQL DBA

Правильно написать Makefile?

Всем привет!
У меня есть утилитка которая собирается простейшим вызовом gcc
gcc -I/usr/pgsql-9.4/include -lncurses -lpq -L/usr/pgsql-9.4/lib -o hello hello.c

Для сборки я написал вот такой вот Makefile
PROGRAM_NAME = hello
SOURCE = hello.c
PREFIX = /usr
LIBS = -lncurses -lpq -L/usr/pgsql-9.4/lib
INCLUDE = -I/usr/pgsql-9.4/include

.PHONY: all clean install

all: hello

hello: hello.c
        gcc $(INCLUDE) $(LIBS) -o $(PROGRAM_NAME) $(SOURCE)

clean:
        rm -f $(PROGRAM_NAME)

install:
        install $(PROGRAM_NAME) $(PREFIX)/bin


Однако тут у меня возникла проблема, пути в -I и -L в будущем, на разных машинах будут гарантированно отличаться от тех что указаны сейчас. Вопрос, как мне правильно написать Makefile который сможет использовать актуальные пути?
P.S. Вообще Makefile это промежуточая задача, а конечная цель это собрать rpm и deb пакет для установки тулзы.
  • Вопрос задан
  • 1081 просмотр
Решения вопроса 1
Желательно использовать автоматические генераторы параметров.
Для ncurses можно рассмотреть ncurses-config (есть в репозиториях Debian, к примеру). Пример вывода для этой утилиты на моей системе:
froex@froex-desktop:~$ ncurses5-config --cflags

froex@froex-desktop:~$ ncurses5-config --libs
-lncurses -ltinfo
froex@froex-desktop:~$ ncurses5-config --libdir
/usr/lib/x86_64-linux-gnu
froex@froex-desktop:~$ ncurses5-config --includedir
/usr/include
froex@froex-desktop:~$

Полный список команд можно посмотреть по вызову утилиты с флагом "--help".

Аналогичная утилита для Postgre называется pg-config.

В своём Makefile выполняете эти утилиты и подставляете результат их работы в переменные. Синтаксис:
PGLIBS = $(shell pg-config --libs)
NCURSESLIBS = $(shell ncurses5-config --libs)

Подробнее тут

Для возможности указания путей от других пользователей, используйте уже принятые и устоявшиеся имена переменных, как LDFLAGS, например (можно поискать их в интернетах). Это позволит пользователям не копать документации по вашей утилите, чтобы добавить флаги при вызове make.

На будущую перспективу можно изучить утилиты, вроде CMake, которые имеют свои технологии поиска путей библиотек и их подстановки.

Собрать deb и rpm пакет можно с помощью утилиты checkinstall (по умолчанию она не установлена, но есть в стандартных репозиториях Debian).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы