make
and 메소드를 사용하여 프로그램을 설치할 때 make install
(일반적으로) 새 프로그램 설치를 시작하기 전에 설치해야 할 여러 가지 종속성이 있습니다. 따라서 현재는 종속성 누락에 대한 오류 메시지가 나타날 때마다 각 종속성을 수동으로 설치합니다.
매뉴얼 페이지에는 종속성 자동 설치를 진행하기 위한 간단한 옵션이 나열되어 있지 않은 것을 볼 수 있으므로 make
이를 달성하기 위한 해결 방법이나 스크립트가 있는지 궁금합니다.
답변1
이것은 makefile의 목적이 아닙니다. Makefile은 소프트웨어 구축과 이를 일반적인 방식으로(패키지 관리자 없이) 시스템에 설치하는 작업만 처리합니다. 실제로 애플리케이션을 실행하기 위한 요구 사항이 있는지 여부는 상관하지 않습니다(관심해서도 안 됩니다). 이것은 의도적으로 설계된 것입니다. 몇 가지 사항을 고려하십시오.
1) 배포판이 패키지 관리자를 사용하는 경우(거의 모든 배포판이 어떤 방식으로든 이를 수행함) make install
패키지 관리자를 우회하고 시스템을 오염시키므로 이를 직접 호출해서는 안 됩니다. 이 경우 make install
"샌드박스" 환경에서 호출되는 패키지를 빌드하면 설치 내용이 패키징되며, 해당 패키지는 선택한 패키지 관리자에 의해 설치 및 처리됩니다.
2) 모든 것을 "올바른" 순서로 설치해야 한다는 요구 사항은 없습니다. 실제로 이로 인해 순환 종속성이 발생하고 설치가 불가능해집니다. 패키지 관리자조차도 이에 대해 너무 엄격한 경우가 많아 문제가 발생할 수 있습니다. 또한 패키지를 빌드할 때(빌드 스크립트 호출 make install
) 실제로 프로그램을 실행할 의도가 없으며 어쨌든 설치 요구 사항이 없을 수도 있습니다. 결국, 다른 컴퓨터에 설치될 패키지를 만드는 것뿐입니다.
3) 이 작업을 수행할 수 있는 이식 가능한 방법은 없습니다. 귀하의 정의는 플랫폼 독립적입니다. 요구 사항을 어디에서 찾을 수 있는지 어떻게 make install
알 수 있습니까(고정 URL 또는 기타? 빨리 중단됩니다!). 예상하지 못한 향후 가능성을 포함하여 모든 가능성에 대해 작업해야 하기 때문에 패키지 관리자를 통과할 수 없으며 버전 변경도 있을 것입니다.
4) 무엇을 설치할 것인지에 대한 단일 결정은 없습니다. 공유 라이브러리는 다양한 패키지에서 제공될 수 있습니다. 하나 이상 libc
. OpenGL 기능(다양한 그래픽 카드), 다양한 행렬 대수학 패키지, 다양한 미디어 재생 라이브러리(vlc 대 gstreamer)를 제공하는 패키지가 두 개 이상 있으므로 수년 동안 계속 사용할 수 있습니다. 시스템을 설계하는 방법과 사용할 구성 요소를 선택할 수 있습니다. 이것이 이 모듈식 설계의 장점입니다(모든 것을 하나의 CD/DVD에 넣고 각 라이브러리가 서로 다른 패키지를 거치게 하는 기존 Windows 방식과는 다릅니다). 각 애플리케이션은 기가바이트 단위로 설치되며 합리적인 설계에 따라 10MB를 초과해서는 안 됩니다.)
5) 이것은 직업이 아니라 make install
다른 수준의 유지 관리입니다. configure && make && make install
핸들러는 설치된 항목(빌드 시 종속성)을 확인하고 코드를 컴파일한 다음 파일을 배치해야 하는 위치를 표시합니다. 필요한 다른 소프트웨어 버전에 대한 요구 사항은 별도의 프로세스인 패키징 및 배포 영역에 속합니다. 즉, 패키지 관리자 또는 전통적인 방식으로 설치하는 경우 시스템 관리자입니다. 이 두 개념을 혼동해서는 안 됩니다. 혼동을 초래할 수 있습니다. 항목이 잘 정의된 레이어로 분리된 경우 개발자는 패키저 및 배포판 유지 관리 담당자와 독립적으로 항목을 변경할 수 있습니다. 배포판에서 항목을 다른 이름으로 다시 패키징하고 다른 대안을 사용하기로 결정하고 항목을 다른 디렉토리에 넣으면 애플리케이션 개발자를 기 대해서는 안됩니다. makefile이 이를 알고 관심을 가질 책임이 있습니다.
간단히 말해서 종속성이 빌드 타임 종속성(이 없이는 make
실행할 수 없음 - 일반적으로 configure
스크립트로 감지됨)인지 런타임 종속성인지 여부는 makefile 수준에서 수행되어서는 안 됩니다. 잘못된 방식으로 일하지 말고 표준을 고려하십시오. 아직 패키지가 없는 작업을 하고 있다면(사용자가 제공한 패키지를 확인하세요. 이미 있을 수도 있습니다.) 필요한 것이 무엇인지 조사하고 실제로 패키지를 빌드해야 합니다. 그러면 패키지를 만들 수 있는 다른 사람에게도 더 좋습니다. 당신이 만든 패키지를 즐기십시오.
답변2
이것은 내가 의존할 수 있는 설치된 패키지가 무엇인지 정확히 알지 못하는 시스템에 항목을 배포하는 데 가끔 사용하는 Makefile 대상입니다. 나는 이것을 apt와 pacman 이상으로 확장할 수 있어야 합니다.
실제로 수행하는 작업은 원하는 실행 파일에 따라 다릅니다. 실행 파일의 대상은 이를 포함하는 올바른 패키지를 얻으려고 합니다.
ifneq (,$(wildcard /usr/bin/apt))
# USE APT
/usr/bin/apt-file:
$(warning $@ not installed. trying to install via apt ...)
sudo apt install -y apt-file
sudo apt-file update
/usr/bin/%: /usr/bin/apt-file
$(warning $@ not installed. trying to install via apt ...)
sudo apt install -y $(shell apt-file --fixed-string --package-only search $@)
else ifneq (,$(wildcard /usr/bin/pacman))
# USE PACMAN
/usr/bin/%:
$(warning $@ not installed. trying to install via pacman ...)
sudo pacman -Fy
sudo pacman -Sy $(shell sudo pacman -Fq $@)
else
# NO PACKAGE MANAGER SUPPORT
/usr/bin/%:
$(error $@ not installed. please install manually and try again ...)
endif
이것을 makefile에 추가하면 다음과 같은 추가 대상을 쉽게 추가할 수 있습니다.
index.html: | /usr/bin/wget
/usr/bin/wget www.google.de
최종적으로 패키지 데이터베이스를 업데이트하는 것에 대해서만 걱정하면 됩니다.