2009-06-11 1 views
2

Я новичок в Automake, и я пытаюсь скомпилировать его без ссылки. Моя цель - создать простой Makefile, как показано ниже, используя Automake.Как вы компилируете без ссылки в 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?

ответ

2

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

thread_LINK = true 

Кроме того, я бы не удивляйтесь, если Automake не имеют такой возможности.

+0

Это было простым решением проблемы. Спасибо за совет. – 2009-09-18 15:39:02

2

Для вашего примера вы можете просто попросить 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

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

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 варианты.)

0

Во-первых, Automake является инструментом для автоматической макияж делает Makefiles; сделать сам по себе совершенно другой зверь (и я уверен, что то, что вы искали, было решением).

Вот простой GNU на основе Makefile, чтобы выполнить то, что вы хотите:

all: Thread.o 

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

all: Thread.o 

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

Макросы COMPILE.cpp и OUTPUT_OPTION, разумеется, расширяются по умолчанию до GNU, делают указанные значения и не переносятся; $ < is AT & T Сделайте стандартный синтаксис, хотя в соответствии с man-страницей pmake (1).

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

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