Как вы компилируете без ссылок в Automake? - PullRequest
3 голосов
/ 11 июня 2009

Я новичок в Automake и пытаюсь скомпилировать без ссылок. Моя цель - создать простой Makefile, как показано ниже, с помощью Automake.

CFLAG = -Wall

build: Thread.o

Thread.o: Thread.cc Thread.h
    g++ $(CFLAG) -c Thread.cc

clean:
    rm -f *.o

Моя попытка привела меня к следующему Makefile.ac.

noinst_PROGRAMS = thread

thread_SOURCES = Thread.cc

EXTRA_DIST= Thread.h

Как мне смоделировать мой оригинальный Makefile?

Ответы [ 4 ]

2 голосов
/ 12 июня 2009

Например, вы можете просто попросить Automake создать файл .o напрямую, например, :

$ make Thread.o

Я считаю, что это неявное правило, поэтому вы не увидите его в выходном Makefile.

Как правило, Automake генерирует переменные, содержащие все объекты, необходимые для каждого исполняемого файла или цели библиотеки. Использовать их в вашем Makefile довольно просто, поскольку он просто генерирует их имена, добавляя _OBJECTS к целевому имени. Вы можете сделать свою собственную цель в Makefile.am следующим образом:

build-thread: $(thread_OBJECTS)

Тогда вы можете создать только Thread.o (и любые другие объекты, необходимые для thread), например:

$ make build-thread

Или, если у вас было несколько целей foo, bar и baz, вы можете сделать свою цель только для компиляции в Makefile.am следующим образом:

build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS)

Единственная боль здесь в том, что вам нужно вести этот список самостоятельно, основываясь на целях в вашем Makefile.am. Вы можете вызвать его в командной строке следующим образом:

$ make build
2 голосов
/ 15 июня 2009

Automake не предназначен для производства объекта. Он будет собирать либо программы, либо библиотеки. Трудно ответить на ваш вопрос, не зная, почему вы хотите скомпилировать один объектный файл, а не что-то еще. Может быть, есть более четкий ответ на вашу "реальную" проблему.

A Makefile.am вы можете написать это

noinst_LIBRARIES = libThread.a
libThread_a_SOURCES = Thread.cc Thread.h   # No need to put headers in EXTRA_DIST

В результате Makefile создаст библиотеку libThread.a, содержащую только libThread.o, и потому, что библиотеки *.a представляют собой просто набор объектных файлов, в которых нет ссылок. Приведенный выше Makefile.am также приводит к тому, что выдаваемый Makefile содержит правила для компиляции libThread.o, поэтому вы можете добавить правило build:, если хотите.

Если вы действительно хотите, чтобы Automake выпустил это правило компиляции, но не собирал библиотеку, вы можете использовать

EXTRA_LIBRARIES = libThread.a  # EXTRA here means "output build rules but don't
                               # build unless something depends on it".
libThread_a_SOURCES = Thread.cc Thread.h
build: Thread.$(OBJEXT)

Теперь вам явно требуется, чтобы файл Thread.$(OBJEXT) создавался только при вводе make build, как в исходном Makefile.

(Automake использует .$(OBJEXT) вместо .o для поддержки расширений, таких как .obj в вариантах DOS.)

2 голосов
/ 12 июня 2009

Один из способов сделать это - обмануть Automake, предоставив команду link, которая не связывает:

thread_LINK = true

Кроме этого, я бы не удивился, если бы в Automake не было такой функции.

0 голосов
/ 10 июня 2010

Во-первых, automake - это инструмент для автоматического создания Make-файлов; Сам по себе make - это совершенно другой зверь (и я уверен, что то, что вы искали, было решением make).

Вот самый простой Makefile на основе GNU для достижения того, что вы хотите:

all: Thread.o

Это заполняет что-то (по умолчанию), как показано ниже (пожалуйста, измените 4 пробела на жесткие вкладки):

all: Thread.o

Thread.o: Thread.cc
     $(COMPILE.cpp) $(OUTPUT_OPTION) $<

Макросы COMPILE.cpp и OUTPUT_OPTION, конечно, по умолчанию расширяются до GNU, образуют заданные значения и не являются переносимыми; $

В GNU make есть концепция неявных и явных правил, шаблонов, суффиксов и т. Д., Которые вы можете использовать, но это не переносимо для всех версий make, и, следовательно, поэтому весь Makefile четко прописан в терминах целей и переменные как POSIX не описывают многие из желаемых сценариев того, как нужно написать Makefile.

Запустите gmake -p для получения более подробной информации и посмотрите руководство по texinfo для gmake в теме неявных, явных правил, шаблонов, суффиксов и т. Д.

...