- Linux make install is up to date
- Что такое Makefile и как начать его использовать
- Введение
- Что такое make и Makefile
- Синтаксис Makefile
- Продвинутое использование
- Фальшивая цель
- Последовательный запуск команд и игнорирование ошибок
- Переменные
- Заключение
- Дополнительные материалы
- Linux make install is up to date
- Формат
- .PHONY
- Пример из C++
- Переменные
- Запустить Docker container из Makefile
- Параметризация Make
- BUILD_ID
- USER_ID
- Какие альтернативы Make существуют
- Что означает cc -c
Linux make install is up to date
хотя пакадж не установлен и каталога work нет? Где она нашла, что он «up to date?» На одной машине встало с дипендами, а на другой не хочет дипенд поднимать, хоть тресни.
Никто не выправлял сей трабл?
Оглавление |
|
Индекс форумов | Темы | Пред. тема | След. тема |
Сообщения по теме |
1. «А почему make ругается что is up to date» | |
Сообщение от Dead Mustdie | |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
2. «А почему make ругается что is up to date» | |
Сообщение от Lamr | |
Устанавливаю ImageMagick. Есму требуется куча других портов, в частности /usr/ports/graphics/jbigkit . На одной машине, причём с не родными портами ( ОС 5.1 а порты от 5.3 взяты) она сама собрала все дипенды, скачала и поставила. На другой — с родными портами! — отказывается устанавливать дипенды, говорить «is up to date». При попытке поставить их руками, всё проходит нормально, но ImageMagick в итоге нужные ему либы всё равно не находит. | |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
3. «А почему make ругается что is up to date» | |
Сообщение от Сма | |
| |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
4. «А почему make ругается что is up to date» | |||||||||
Сообщение от Lamr | |||||||||
Да умею я make clean. Ни в /var/pkg не зарегистрирован, ни каталога work у порта нету, а всё равно ругается. Где ещё инфа может лежать что пакадж уже стоит? А-а-а. Щас на работу залезу, посмотрю Источник Что такое Makefile и как начать его использоватьВведениеВ жизни многих разработчиков найдётся история про первый рабочий день с новым проектом. После клонирования основного репозитория проекта наступает этап, когда приходится вводить множество команд с определёнными флагами и в заданной последовательности. Без описания команд, в большинстве случаев, невозможно понять что происходит, например: Эти команды являются лишь частью того, что необходимо выполнить при разворачивании проекта. В приведённом примере видно, что команды сами по себе длинные, содержат много флагов, а значит, их трудно не только запомнить, но и вводить вручную. Постоянно вести документацию становится сложнее с ростом проекта, она неизбежно устаревает, а порог входа для новичков становится выше, ведь уже никто не в состоянии вспомнить всех деталей проекта. Некоторые такие команды необходимо использовать каждый день, и даже не один раз в день. Со временем становится понятно, что нужен инструмент, способный объединить в себе подобные команды, предоставить к ним удобные шорткаты (более короткие и простые команды) и обеспечить самодокументацию проекта. Именно таким инструментом стал Makefile и утилита make . Этот гайд расскажет, как использование этих инструментов позволит свести процесс разворачивания проекта к нескольким коротким и понятным командам: Что такое make и MakefileMakefile — это файл, который хранится вместе с кодом в репозитории. Его обычно помещают в корень проекта. Он выступает и как документация, и как исполняемый код. Мейкфайл скрывает за собой детали реализации и раскладывает “по полочкам” команды, а утилита make запускает их из того мейкфайла, который находится в текущей директории. Изначально make предназначалась для автоматизации сборки исполняемых программ и библиотек из исходного кода. Она поставлялась по умолчанию в большинство *nix дистрибутивов, что и привело к её широкому распространению и повсеместному использованию. Позже оказалось что данный инструмент удобно использовать и при разработке любых других проектов, потому что процесс в большинстве своём сводится к тем же задачам — автоматизация и сборка приложений. Применение мейка в проектах стало стандартом для многих разработчиков, включая крупные проекты. Примеры мейкфайла можно найти у таких проектов, как Kubernetes, Babel, Ansible и, конечно же, повсеместно на Хекслете. Синтаксис Makefilemake запускает цели из Makefile, которые состоят из команд: Но недостаточно просто начать использовать мейкфайл в проекте. Чтобы получить эффект от его внедрения, понадобится поработать над разделением команд на цели, а целям дать семантически подходящие имена. Поначалу, перенос команд в Makefile может привести к свалке всех команд в одну цель с «размытым» названием: Здесь происходит сразу несколько действий: создание файла с переменными окружения, подготовка базы данных, генерация ключей, установка зависимостей и запуск проекта. Это невозможно понять из комментариев и названия цели, поэтому будет правильно разделить эти независимые команды на разные цели: Теперь, когда команды разбиты на цели, можно отдельно установить зависимости командой make install или запустить приложение через make start . Но остальные цели нужны только при первом разворачивании проекта и выполнять их нужно в определённой последовательности. Говоря языком мейкфайла, цель имеет пререквизиты: Задачи будут выполняться только в указанной последовательности и только в случае успеха предыдущей задачи. Значит, можно добавить цель setup , чтобы объединить в себе все необходимые действия: Теперь развернуть и запустить проект достаточно двумя командами: Благодаря проделанной работе Makefile, команды проекта вместе с флагами сведены в Makefile. Он обеспечивает правильный порядок выполнения и не важно, какие при этом задействованы языки и технологии. Продвинутое использованиеФальшивая цельИспользование make в проекте однажды может привести к появлению ошибки make: is up to date. , хотя всё написано правильно. Зачастую, её появление связано с наличием каталога или файла, совпадающего с именем цели. Например: Как уже говорилось ранее, изначально make предназначалась для сборок из исходного кода. Поэтому она ищет каталог или файл с указанным именем, и пытается собрать из него проект. Чтобы изменить это поведение, необходимо в конце мейкфайла добавить .PHONY указатель на цель: Последовательный запуск команд и игнорирование ошибокЗапуск команд можно производить по одной: make setup , make start , make test или указывать цепочкой через пробел: make setup start test . Последний способ работает как зависимость между задачами, но без описания её в мейкфайле. Сложности могут возникнуть, если одна из команд возвращает ошибку, которую нужно игнорировать. В примерах ранее такой командой было создание .env-файла при разворачивании проекта: Самый простой (но не единственный) способ «заглушить» ошибку — это сделать логическое ИЛИ прямо в мейкфайле: Добавлять такие хаки стоит с осторожностью, чтобы не «выстрелить себе в ногу» в более сложных случаях. ПеременныеЗачастую в команды подставляют параметры для конфигурации, указания путей, переменные окружения и make тоже позволяет этим управлять. Переменные можно прописать прямо в команде внутри мейкфайла и передавать их при вызове: Переменные могут быть необязательными и содержать значение по умолчанию. Обычно их объявляют в начале мейкфайла. Некоторые переменные в Makefile имеют названия отличные от системных. Например, $PWD называется $CURDIR в мейкфайле: ЗаключениеВ рамках данного гайда было рассказано об основных возможностях Makefile и утилиты make . Более плотное знакомство с данным инструментом откроет множество других его полезных возможностей: условия, циклы, подключение файлов. В компаниях, где имеется множество проектов, написанных разными командами в разное время, мейкфайл станет отличным подспорьем в стандартизации типовых команд: setup start test deploy . . Возможность описывать в мейкфале последовательно многострочные команды позволяет использовать его как «универсальный клей» между менеджерами языков и другими утилитами. Широкая распространённость этого инструмента и общая простота позволяют внедрить его в свой проект достаточно легко, без необходимости доработок. Но мейкфайл может быть по-настоящему большим и сложным, это можно увидеть на примере реальных проектов: Дополнительные материалы
Мейкфайлы, использованные при составлении гайда: Источник Linux make install is up to dateMake-файлы используются, чтобы помочь решить, какие части большой программы должны быть перекомпилированы. В подавляющем большинстве случаев компилируются файлы C или C++ . Другие языки обычно имеют свои собственные инструменты, которые служат той же цели, что и Make. Его можно использовать и за пределами программ, когда вам нужна серия инструкций для запуска в зависимости от того, какие файлы изменились. В этой статье вы узнаете про использование компиляции C/C++. Вот пример графика зависимостей, который вы можете построить с помощью Make. Если какие — либо зависимости файла изменятся, то файл будет перекомпилирован: Граф зависимостей ФорматMakefile состоит из правил (rules). Первым указывается название цели, затем зависимости (prerequisites) и действие (recipe — набор действий), которое нужно выполнить. Зависимости нужны не всегда и указываются по необходимости. Для простоты на первом этапе можно думать о зависимостях как о файлах, которые нужно проверить: если ни один не изменился — заново компилировать не нужно. Отступы по умолчанию нужно ставить табуляцией. Если хотите поменять на другой символ — задайте .RECIPEPREFIX target: prerequisites recipe Типичное применение: какая-то зависимость изменилась → выполнятеся действие в результате которого создаётся таргет файл. output: main.o message.o g++ main.o message.o -o output clean: rm *.o output Как и в статье Configure, make, install в примере выше используются стандартные цели (target)
Если файл вам не нужен, например, вы просто хотите выполнить какие-то команды — можно использовать .PHONY .PHONYРассмотрим следующий Makefile .PHONY: site site: echo «HeiHei.ru» Если теперь выполнить Удалите site из первой строки, а всё остальное не трогайте Вроде бы ничего не изменилось, но теперь создайте файл site рядом с Makefile touch site make: ‘site’ is up to date. Так как таргет теперь реальный make не нашёл изменений и ничего не сделал. Из-за такого простого совпадения имени цели (target) и какого-то файла в директории может перестать работать скрипт. Для защиты от таких неприятностей и применяют PHONY Также PHONY удобен тем, что перечисляет все цели в самом начале файла. Это улучшает читаемость кода. (если пользоваться правильно) Пример из C++Functions.cpp Functions.h Main.cpp #include #include «Functions.h» int main() double add( double x, double y) #pragma once double add(double x, double y); Если один из этих файлов изменился — нужно перекомпилировать проект. Для начала будем пользоваться командой g++ -o output Main.cpp Functions.cpp Эта команда сначала вызывает компиляцию, затем линковку Создайте Makefile и откройте его в текстовом редакторе. Например, в Vim touch Makefile Makefile будет выглядеть следующим образом output: Main.cpp Functions.cpp Functions.h g++ -o output Main.cpp Functions.cpp Теперь для компиляции достаточно выполнить В результате появится исполняемый файл output В этот пример можно добавить ещё два шага — отдельно следить за компиляцией и убираться после работы. Если вам не понятно что происходит в этом файле — изучите статью «Компиляция в C++ .PHONY: clean output: Main.o Functions.o g++ Main.o Functions.o -o output Main.o: Main.cpp g++ -c Main.cpp Functions.o: Functions.cpp g++ -c Functions.cpp clean: rm *.o output To запустить скрипт, достаточно выполнить g++ -c Main.cpp Если нужно скомпилировать Main execute Появится файл Main.o но не появятся остальные (Functions.o, output) Functions.cpp Functions.h Main.cpp Main.o Makefile На примере команды make Main.o можно понять почему в Make-файлах используется термин цели (target) make Main.o говорит — создай файл Main.o а инструкция в Makefile определяет правило по которому это нужно сделать. Если теперь выполнить make Main.o не будет перекомпилироваться. Будут выполнены только последние два шага. g++ -c Functions.cpp Выполните make если ещё не выполняли и не делайте после этого clean Добавим ещё одну функцию в наш проект. Нужно указать её в файлах Functions.* Вызывать пока не будет, поэтому Main.cpp остаётся без изменений bool test( bool x) bool test(bool x); g++ -c Functions.cpp g++ -o output Main.o Functions.o Обратите внимание: Main.cpp не был перекомпилирован так как в нём нет изменений. Таже посмотрите на время изменения файла output оно должно измениться. Не вносите никаких изменений в файлы и execute make: ‘output’ is up to date. Перекомпиляция не нужна и поэтому не выполнена Переменные.PHONY: clean objects = Main.o Functions.o output: $( objects ) g++ -o output $( objects ) Main.o: Main.cpp g++ -c Main.cpp Functions.o: Functions.cpp g++ -c Functions.cpp clean: rm *.o output Запустить Docker container из MakefileЧитайте также статью .PHONY: docker docker: docker-compose -f docker/dev/docker-compose.yml build Параметризация Make?= позволяет переменным быть перезаписанными на существующие переменные окружения := перезаписывает значение переменной PROJECT_NAME ?= myproject ORG_NAME ?= heihei REPO_NAME ?= myproject #Filenames DEV_COMPOSE_FILE := docker/dev/docker-compose.yml REL_COMPOSE_FILE := docker/release/docker-compose.yml .PHONY: test release test: docker-compose -f $(DEV_COMPOSE_FILE) build docker-compose -f $(DEV_COMPOSE_FILE) up agent docker-compose -f $(DEV_COMPOSE_FILE) up test release: docker-compose -f $(REL_COMPOSE_FILE) build docker-compose -f $(REL_COMPOSE_FILE) up agent docker-compose -f $(REL_COMPOSE_FILE) run —rm app manage.py collectstatic —noinput docker-compose -f $(REL_COMPOSE_FILE) run —rm app manage.py migrate —noinput docker-compose -f $(REL_COMPOSE_FILE) up test clean: docker-compose -f $(DEV_COMPOSE_FILE) kill docker-compose -f $(DEV_COMPOSE_FILE) rm -f docker-compose -f $(REL_COMPOSE_FILE) kill docker-compose -f $(DEV_COMPOSE_FILE) rm -f BUILD_IDTo добавить переменным уникальности используют BUILD_ID # Docker Compose Project Names REL_PROJECT := $(PROJECT_NAME)$(BUILD_ID) DEV_PROJECT := $(REL_PROJECT)dev USER_IDTo получить ID пользователя запустившего GNUmakefile USER_ID = $ ( shell id -u $ Какие альтернативы Make существуютПопулярными альтернативными системами сборки C/C++ являются SCons, CMake, Bazel и Ninja. Некоторые редакторы кода, такие как Microsoft Visual Studio , имеют свои собственные встроенные инструменты сборки. Для Java есть Ant, Maven и Gradle. Другие языки, такие как Go и Rust, имеют свои собственные инструменты сборки. Интерпретируемые языки, такие как Python , Ruby и JavaScript , не требуют аналога для создания файлов. Цель Makefile состоит в том, чтобы скомпилировать любые файлы, которые должны быть скомпилированы, основываясь на том, какие файлы изменились. Но когда файлы на интерпретируемых языках меняются, ничего не нужно перекомпилировать. При запуске программы используется самая последняя версия файла. Что означает cc -ccc это C compiler Существует несколько общедоступных компиляторов C Источник |