Как использовать автоинструмент для глубоких проектов? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть C проект, имеющий следующую структуру

Main/
  Makefile.am
  bin/
  src/
     Makefile.am
     main.c
     SomeLibrarySource/
         SomeFuncs.c
         SomeFuncs.h

main.c содержит основную функцию, которая использует функции, определенные в SomeFuncs. {H / c} файлах.

Я хочу использовать автоинструменты для этого проекта. Я прочитал пару ресурсов по автоинструментам. Но мне удалось справиться с использованием autotools только для одноуровневого проекта, где все исходные, объектные и другие файлы находятся в одном каталоге.

Затем я получил несколько ссылок, в которых говорилось об использовании автоинструментов для глубоких проектов, подобных этому, и затем я запутался.

Сейчас у меня есть два файла Makefile.am следующим образом

Makefile.am

SUBDIRS=src

ЦСИ / Makefile.am

mainprgdir=../
mainprg_PROGRAMS=main
main_SOURCES=main.c

Я почти уверен, что эти файлы не должны быть такими, как у меня сейчас : P

Как использовать autotools для вышеуказанной структуры проекта? (По крайней мере, что должно быть в этих Makefile.am (s) и где я должен их разместить.

EDIT: Еще кое-что! В конце я хотел бы создать объектные файлы в каталоге bin .

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

mainprogdir=../ не имеет большого смысла (вы не знаете, как это относится к установке). Вероятно, предназначено:

# Main/Makefile.am
# .━━ target for `make install`
# |
# ↓              ↓━━ target for compilation
bin_PROGRAMS = bin/main

# ↓━━ based upon compilation target name
bin_main_SOURCES = src/main.c
1 голос
/ 12 марта 2012

Есть два основных подхода.Если функции в SomeLibrarySource используются только основной, то нет необходимости создавать отдельную библиотеку, и вы можете просто указать исходные файлы в src / Makefile.am

main_SOURCES = main.c SomeLibrarySource/SomeFuncs.c

Однако, если вы действительно хотитеиспользуйте функции из другого кода в вашем дереве, вы не хотите компилировать SomeFuncs.c несколько раз, но должны использовать вспомогательную библиотеку.

# Assigning main_SOURCES is redundant
main_SOURCES = main.c
main_LDADD = SomeLibrarySource/libSomeFuncs.a
noinst_LIBRARIES = SomeLibrarySource/libSomeFuncs.a
AM_CPPFLAGS = -I$(srcdir)/SomeLibrarySource

(для удобства вам понадобится AC_PROG_RANLIB в файле configure.acбиблиотеки.) Если исходный файл называется SomeFuncs.c, automake не потребуется Makefile.am для указания SomeLibrarySource_libSomeFuncs_a_SOURCES, но если имя файла исходного кода не соответствует имени, указанному в noinst_LIBRARIES, SomeLibrarySource_libSomeFuncs_a_SOURCES должнобыть установлен в список файлов, используемых для создания библиотеки.Обратите внимание, что вам не нужно указывать main_SOURCES, так как main.c является значением по умолчанию, если оно не указано (но это не плохая идея, чтобы быть явным.) (Во всем этом мне неудобно использовать имена CamlCase, но системаЯ использую файловую систему без учета регистра (самая большая ошибка, которую когда-либо делала Apple), и примеры, которые я привожу здесь, работают для меня. YMMV) * ​​1010 *

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

...