поколение иждивенцев в Makefile


Мне нужна автоматическая зависимостей поколение было сделано в мой make-файл. Итак, я попытался писать один, после Googling для подобных. Я нашел несколько способов сделать это, но проблема в том, что они, как правило, слишком сложно для меня (из-за использования СЭД команду и т. д. и мне нужен способ для меня, чтобы создать make-файл , без необходимости ссылаться на другие файлы Makefile).

Ниже находится файл Makefile, я надеюсь, должны выполнять ту же работу, т. е. автоматически находит все зависимости объектные файлы и создавать их. Не могли бы вы, пожалуйста, просмотрите этот make-файл и указать случаи, когда сборка может дать сбой, когда он не должен?

Gpp=g++
srcs=$(wildcard *.cpp)
objs=$(srcs:.cpp=.o)
deps=$(srcs:.cpp=.d)

default:test

%.o:%.d
    $(Gpp) -c $*.cpp

%.d:%.cpp
    echo -n "$*.d ">$*.d
    $(Gpp) -MM $*.cpp>>$*.d

test: $(objs)
    $(Gpp) $^ -o $@

-include $(deps)

.PHONY:clean default

clean:
    -rm -rf *.o test *.d

Одно место, где Makefile и не когда например a.cpp изначально включены А1.ч но он был обновлен, чтобы исключить А1.ч и А1.час файл был удален из файловой системы. Так, за исключением того, что есть в любом месте, что такой Makefile не удается?



13485
18
задан 22 мая 2011 в 10:05 Источник Поделиться
Комментарии
3 ответа

Чтобы не быть слишком грубым, но вы собираетесь об этом неправильный путь. Посмотрите в командную строку параметр -ММД для ССЗ, укажите это при составлении своего источника; и оставить заявление о включении зависимостей.

Кроме того, нет необходимости для умолчанию цель. Первая цель по умолчанию цель.

Пример:

Gpp = g++
srcs = $(wildcard *.cpp)
objs = $(srcs:.cpp=.o)
deps = $(srcs:.cpp=.d)

test: $(objs)
$(Gpp) $^ -o $@

%.o: %.cpp
$(Gpp) -MMD -MP -c $< -o $@

.PHONY: clean

# $(RM) is rm -f by default
clean:
$(RM) $(objs) $(deps) test

-include $(deps)

12
ответ дан 23 апреля 2012 в 10:04 Источник Поделиться

Что, вероятно, генерировать дэпс все время, даже если ваша цель - "чистые".
Ставить цели ДЭП и включает в ifeq блок, который проверяет целевой файл Makefile, то есть не будет никакого поколения иждивенцев до чистки (так как эти файлы должны быть удалены с помощью чистой, это пустая трата для их создания до очистки).

ifeq ($(MAKECMDGOALS),clean)
# doing clean, so dont make deps.
deps=
else
# doing build, so make deps.
deps=$(srcs:.cpp=.d)

%.d:%.cpp
echo -n "$*.d ">$*.d
$(Gpp) -MM $*.cpp>>$*.d

-include $(deps)
endif # ($(MAKECMDGOALS),clean)

Также это намного чище, чтобы создать подкаталоги и место .D и .o файлы в подкаталоги. Затем директории с исходным кодом (т. е. 'Источник', ...) остаются незапятнанными и опасные "-РМ-РФ *.о тест *.д" - это полностью избегать.

Также "РМ -РФ *.о тест *.д" само по себе не является оптимальным. Лучше всего удалить то, что определено, не удалить произвольные файлы (и нет необходимости в "-р" тоже). Новый код:

target=test  
rm -f $(objs) $(srcs:.cpp=.d) $(target)

7
ответ дан 20 июля 2011 в 09:07 Источник Поделиться

Не совсем то, что вы просите, но я хотел бы предложить, используя с CMake для генерации Make-файла. с CMake хорош на автоматический поиск зависимостей, а также позволяет создавать в отдельной директории сборки.

http://www.cmake.org

Сначала создайте файл с именем CMakeLists.txt с таким содержанием:

cmake_minimum_required(VERSION 2.8)
project(test)
file(GLOB files *.cpp)
add_executable(test ${files})
install(TARGETS test RUNTIME DESTINATION bin)

после сборки и установки вашей программы Тест такой

erik@linux:~$ ls ~/codereview/
file.cpp file.h CMakeLists.txt main.cpp
erik@linux:~$ mkdir /tmp/build
erik@linux:~$ mkdir /tmp/install
erik@linux:~$ cd /tmp/build/
erik@linux:/tmp/build$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/install ~/codereview/
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
erik@linux:/tmp/build$ make
Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.o
[100%] Building CXX object CMakeFiles/test.dir/file.cpp.o
Linking CXX executable test
[100%] Built target test
erik@linux:/tmp/build$ ls -l /tmp/build/test
-rwxrwxr-x 1 erik erik 7702 2012-04-12 16:58 /tmp/build/test
erik@linux:/tmp/build$ make install
[100%] Built target test
Install the project...
-- Install configuration: ""
-- Installing: /tmp/install/bin/test
erik@linux:/tmp/build$ ls -l /tmp/install/bin/test
-rwxr-xr-x 1 erik erik 7702 2012-04-12 16:58 /tmp/install/bin/test

3
ответ дан 12 апреля 2012 в 03:04 Источник Поделиться