Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2013, 22:32   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Makefile

Доброго дня.
Я не прошу помочь мне в чем-то, хочу сохранить здесь наработки чтобы не потерять.
Код:
SHELL:=/bin/sh

ifneq ($(findstring NDEBUG,$(CXXFLAGS)),)
	OBJ_DIR:=./release/
else
	OBJ_DIR:=./debug/
endif

WPATH_LINE:=$(shell echo $(CXXFLAGS) | sed 's/-o [^ ]*//')

VPATH:=$(OBJ_DIR) $(OBJ_DIR)/output/

all:create_dir $(patsubst %.cpp,%.o,$(wildcard *.cpp))
	#--------linking--------#
	g++ $(addprefix $(OBJ_DIR), $(notdir $(subst create_dir ,,$^))) -o $(OBJ_DIR)output/$@ $(CXXFLAGS)
	#--------success--------#

%.o:%.cpp
	#-------compiling-------#
	cd $(OBJ_DIR); g++ -c -MD ../$< -o $@ $(WPATH_LINE)

.PHONY:clean
clean:
	rm -rf debug release


.PHONY:create_dir
create_dir:
	mkdir -p $(OBJ_DIR); cd $(OBJ_DIR); mkdir -p output

include $(wildcard $(OBJ_DIR)*.d)
Этот makefile сам анализирует зависимости и при необходимости перекомпилирует измененное. При CXXFLAGS='-d NDEBUG' строит в собирает в release иначе в debug. Его нужно кинуть в один каталог с .cpp, компилятор g++.

Последний раз редактировалось 220Volt; 26.11.2013 в 03:13.
220Volt вне форума Ответить с цитированием
Старый 25.11.2013, 23:13   #2
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Для таких целей наверное лучше подойдет: http://pastebin.com/ или - http://codeo.me/ . Или текстовый документ на вашем компьютере, где можете содержать все необходимые напоминания.
halcyon вне форума Ответить с цитированием
Старый 26.11.2013, 06:52   #3
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Use GitHub, Luke!
nikmoon вне форума Ответить с цитированием
Старый 28.06.2014, 12:49   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Код:
#!/usr/bin/colormake -f
##############################################################################################
# Makefile находится в каталоге в котором находятся подкатологи - проекты.                   #
# ${call dep,progect} - создаёт зависимость цели от проекта(ов);                             #
#                       target:${call dep,project_1} ${call dep,project_2}                   #
# Для созания shared library в CXXFLAGS должна присутствывать опиця -fpic/-fPIC (см. ниже).  #
##############################################################################################
override LDFLAGS+=-s
#-Wpedantic -fpic -fPIC
override CXXFLAGS+=-std=c++11 -Wall -Werror -Wfatal-errors -Wextra -Wpedantic -O2 -fpic

dep=${subst .cpp,.d,${wildcard $1/*.cpp}} ${subst .cpp,.o,${wildcard $1/*.cpp}} 
make_exec=${CXX} -o ${@} ${patsubst %.d,,$+} ${LDFLAGS} ${LDLIBS}             # Линковка исполняемого файла.
make_shared=${CXX} -shared -o ${@} ${patsubst %.d,,$+} ${LDFLAGS} ${LDLIBS}   # Линковка shared library.

#begin:------------добавить свои цели------------
temp.so:${call dep,1_common_lib} ${call dep,2_f_lib}
	${make_shared}


draft:${call dep,1_draft}
	${make_exec}
#end  :------------добавить свои цели------------

%.d:%.cpp
	${CXX} -MM -MF $@ -MT $(subst .cpp,.o,$<) $< ${CXXFLAGS}

.PHONY:clean
clean:
	rm ${shell find . -type f -name '*.d'} ${shell find . -type f -name '*.o'}

include ${shell find . -type f -name '*.d'}
220Volt вне форума Ответить с цитированием
Старый 29.06.2014, 10:49   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Ребят, почему не получается выполнить ./makefile clean от root'a? Получается такая ерунда:
Код:
rm ...
make: rm: Команда не найдена
makefile:41: ошибка выполнения рецепта для цели «clean»
make: *** [clean] Ошибка 127
От обычного пользователя удаляется. В makefile от root'a не срабатывает даже rm lala, а find нормально отрабатывает.

Разобрался.

Последний раз редактировалось 220Volt; 29.06.2014 в 11:10.
220Volt вне форума Ответить с цитированием
Старый 09.07.2014, 17:05   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Оставлю еще одну штуку для сборки. Оставляю скорее для себя, удобно вернуться через некоторе время и воспользоваться.
В главный каталог кладем скрипт build:
Код:
#!/bin/bash

# Перечислить все собираемые проекты (директории). Зависимый проект располагать
# правее проекта от которго существует зависимость. Каждый проект должен включать
# makefile_env: include ../makefile_env в первой строке и include ${wildcard *.d} в последней.
# Для передачи ключей из вне: CXXFLAGS=-Wall build
projects='1 2'

MAKE=mingw32-make
# Общии ключи для всех проектов
export LDFLAGS+=' -s'
export CXXFLAGS+=' -std=c++11 -Wall -Wextra -Wpedantic -Werror -Wfatal-errors -O2'

if ! [ -f makefile_env ]; then
    grep -A 1000 '^# ------------- makefile_env data -------------' build > makefile_env
fi
for CUR_PRJ in ${projects};
do
    case "$1" in
    # Построить все проекты.
#    ("")            ;&   # ;& Не работает в mingw::bash !!!!!!!!!!!!!!!!
    ("all")         ${MAKE} -C ${CUR_PRJ}
                    if test $? -ne 0; then exit 1; fi
                    ;;
    # Установка в конечные директории.
    ("install")     ${MAKE} -C ${CUR_PRJ}
                    if test $? -ne 0; then exit 1; fi
                    ${MAKE} -C ${CUR_PRJ} install
                    ;;
    # Удаление из конечных директорий.
    ("uninstall")   ${MAKE} -C ${CUR_PRJ} uninstall
                    ;;
    # Удаление файлов, появившихся во время сборки. Подпроекты должны удалить только конечный файл.
    ("clean")       ${MAKE} -C ${CUR_PRJ} clean
                    rm -f $(find . -type f -name '*.d') $(find . -type f -name '*.o')
                    ;;
    # Модульные тесты.
    ("check")       ${MAKE} -C ${CUR_PRJ} check
                    ;;
    (*)             echo "command for build is not recognized"
    esac
done
#ldconfig # Не нужно в Windows !!!!!!!!!!!!!!!!!!!!
echo "build::end"
exit 0

# ------------- makefile_env data -------------
.RECIPEPREFIX:=
.RECIPEPREFIX+=
#####################################################################################################################
# Линковка исполняемого файла.                                                                                      #
make_exec=${CXX} -o ${@} ${shell echo ${patsubst %.d,,$+} | sed 's/.*makefile//'} ${LDFLAGS} ${LDLIBS}             #
# Линковка shared library. в CXXFLAGS должна присутствывать опиця -fpic/-fPIC.                                      #
make_shared=${CXX} -shared -o ${@} ${shell echo ${patsubst %.d,,$+} | sed 's/.*makefile//'} ${LDFLAGS} ${LDLIBS}   #
# Создание статической библиотеки.                                                                                  #
make_static=${AR} rcu ${@} ${shell echo ${patsubst %.d,,$+} | sed 's/.*makefile//'}                                #
# Создание статической библиотеки содержащей ссылки                                                                 #
# на объектные файлы находящиеся в той же директории.                                                               #
make_thin_static=${AR} rcTu ${shell echo ${patsubst %.d,,$+} | sed 's/.*makefile//'}                               #
#####################################################################################################################

# Создает зависимость цели от объектных файлов текущего проекта.
# Пререквезиты стоящие до ${dep} не линкуются с целью.
dep=makefile ${subst .cpp,.d,${wildcard ./*.cpp}} ${subst .cpp,.o,${wildcard ./*.cpp}}

.PHONY:all install uninstall clean check

%.d:%.cpp
    ${CXX} -MM -MF $@ -MT $(subst .cpp,.o,$<) $< ${CXXFLAGS}
В подкаталоги (проекты) кладем makefile со следующей структурой:
Код:
include ../makefile_env

# Добавляем для данного проекта
#CXXFLAGS+=
#LDLIBS+=

---target---:${dep} ../?/?
    ${make_exec} | ${make_shared} | ${make_static} | ${make_thin_static}

install:
    ${shell cp ---target--- /?}

uninstall:
    ${shell rm -f /?/---target---}

clean:
    ${shell rm -f ---target---}

check:
    ./test_name

include ${wildcard *.d}
Например имеем два проекта - статическая либа lib1.a и exec.exe использующий эту либу.
Код:
projects='1p 2p'
Код:
// 1p/1.cpp
#include <iostream>
void fn()  { std::cout << "lib::fn\n"; }

// 2p/2.cpp
#include <iostream>
void fn();
int main()  { fn(); return 0; }

// 1p/makefile
include ../makefile_env
lib1.a:${dep}
    ${make_thin_static}
install: ;
uninstall: ;
clean:
    ${shell rm -f lib1.a}
check: ;
include ${wildcard *.d}

// 2p/makefile
include ../makefile_env
exec.exe:${dep} ../1p/lib1.a
    ${make_exec}
install: ;
uninstall: ;
clean:
    ${shell rm -f exec.exe}
check: ;
include ${wildcard *.d}
строим:
$ ./build all

Последний раз редактировалось 220Volt; 10.07.2014 в 03:01.
220Volt вне форума Ответить с цитированием
Старый 10.07.2014, 00:47   #7
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

P.S: все пререквизиты стоящии до ${dep} будут проверяться, но в линковке файла-цели учавствовать не будут. Стоящии справа от ${dep} будут проверяться и учавствовать в линковке:
Код:
exex.exe:unit_tes.exe ${dep} ../1/lib1.a
    ${make_exec}
unit_tes.exe:${dep}
    ${make_exec}
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что не так в MakeFile? igormat Помощь студентам 0 21.07.2011 13:22
Makefile и gcc vedro-compota Общие вопросы C/C++ 2 05.05.2011 18:42
Makefile Nostalgia Общие вопросы C/C++ 3 18.10.2010 14:36
makefile Kill-All-N-Thrash Общие вопросы C/C++ 8 29.08.2010 23:15
Создание makefile phpcreator Помощь студентам 0 18.05.2010 17:33