>

크로스 플랫폼 개발을하고 있는데 Linux 용으로 훌륭하고 독립적 인 (!) 패키지를 만들고 싶습니다. 나는 그것이 일반적으로 수행되는 방식이 아니라는 것을 알고 있지만 응용 프로그램은 한 곳에서 모든 데이터를 필요로하므로 다른 많은 독점 소프트웨어 패키지처럼/opt에 설치하고 있습니다. 결국 deb 및 rpm 패키지를 제공 할 것이지만 지금은 .tar.gz 일뿐입니다. 사용자는 어딘가에 추출해야하며 작동해야합니다. 차라리 설치 프로그램이 없습니다.

먼저 나의 질문과 세부 사항 :

<올>
  • 다른 사람들이 Linux 용 독점 소프트웨어를 어떻게 패키지합니까?
  • 공유 라이브러리를 포함한 소프트웨어 패키징 도구가 있습니까?
  • 자세한 내용은이 프로젝트의 레이아웃입니다 (이 목적을 위해foo라고합니다) :

    • foo (이진)
    • config.ini
    • 데이터

    이제 패키지에는 두 가지 추가 요소가 있습니다 :

    • 라이브러리
    • foo.sh

    libs에는 프로젝트에 필요한 모든 공유 라이브러리가 포함되며foo.shlibs를 포함하도록 LD_LIBRARY_PATH를 설정하는 스크립트입니다. 따라서 사용자는foo.sh를 실행하고 프로그램을 시작해야합니다.

    다음 단계에서 소프트웨어를 패키지화하는 쉘 스크립트가 있습니다 :

    <올>
  • 빈 디렉토리를 만들고 foo.sh를 복사하십시오
  • 빌드 프로세스를 호출하고 새 디렉토리에설치하기
  • 파일 시스템에서 공유 라이브러리 복사
  • 모든 것을 .tar.gz로 포장
  • 어떻게 생각하십니까? 이 방법에는 몇 가지 문제가 있습니다 :

    • 모든 종속성을 두 번 하드 코딩해야합니다 (CMake에서는 한 번, 패키징 스크립트에서는 한 번)
    • 버전 번호를 두 번 정의해야합니다 (소스 코드에서 한 번, 패키징 스크립트에서 한 번)

    어떻게하십니까?

    수정 : 방금 나온 또 다른 질문 : 소프트웨어가 의존하는 라이브러리를 어떻게 결정합니까? 나는ldd foo를했지만 많은 것이있다. WorldOfGoo 패키지가 어떻게 보이는지 살펴 보았으며 라이브러리는 거의 없습니다. 사용자 시스템에 어떤 라이브러리가 있고 어떤 라이브러리에 있지 않을지에 대한 가정을 어떻게 만들 수 있습니까? 모든 대상 배포판을 가상 교 배관에 설치하고 무엇이 필요한지 확인하십시오.

    • 답변 # 1

      일반적인 문제

      당신의 것들을 의존 라이브러리와 함께 /opt 에 패키징하는 방법  독점적 (그리고 심지어 오픈 소스) 소프트웨어가 패키지되는 방식입니다. Linux Foundation의 권장 사례입니다 (링크에 대해서는 다른 질문에 대한 답변 참조).

      외부 lib는 처음부터 컴파일되어 별도의 단계 (특히 수정 한 경우)로 빌드 프로세스에 임베드되거나 일부 배포 패키지에서 페치 될 수 있습니다. 두 번째 방법은 더 쉽지만 첫 번째 방법은 더 많은 유연성을 허용합니다.

      실제로 저수준 라이브러리 (glibc, Xorg 등)를 패키지에 포함시킬 필요는 없습니다. 그들은 시스템 벤더에게 조정을 맡겨 두는 편이 좋을 것입니다. 또한 가장 중요한 라이브러리를 문서화 한 Linux Standard Base가 있습니다. 이 라이브러리는 거의 모든 곳에 존재하며 신뢰할 수 있습니다.

      또한 더 새로운 시스템에서 컴파일하면, 구 시스템 사용자는이를 사용할 수 없지만 그 반대는 사실이 아닙니다. 따라서 호환성을 높이려면 오늘보다 2 년이 지난 시스템에서 패키지를 컴파일하는 것이 유용 할 수 있습니다.

      일반적인 내용 만 설명했지만 Linux Developers Network 웹 사이트에는 패키징 및 이식성에 대한 자세한 정보가 포함되어 있다고 생각합니다.

      포장

      오픈 소스 배포 프로젝트에서 본 내용으로 판단하면 스크립트는 배포 공급 업체 패키지 소프트웨어와 동일한 방식으로 스크립트를 수행합니다. 스크립트는 소스를 자동으로 패치하고 소프트웨어 설치를 모방하며 결과 폴더를 DEB 및 RPM으로 패키지합니다.

      Tar.gz 또는 코스도 작동 할 수 있지만, 예를 들어 RPM 생성은 사용자의 삶을 훨씬 쉽게 만들 수있는 기회를 놓치기에 충분히 복잡하지 않습니다.

      질문을 풀고

      예, 종속성을 두 번 하드 코딩해야합니다.

      CMake에서 그것들을 hardocdede 할 때, 패키징 스크립트에서 그것들을 지정할 때와 다른 용어로 그것들을 지정한다는 것입니다. CMake는공유 라이브러리헤더 파일, 패키징 스크립트는패키지를 나타냅니다.

      패키지 이름과 공유 라이브러리 및 헤더 간에는 배포 간 일대일 관계가 없습니다. 분포에 따라 다릅니다. 따라서 두 번 지정해야합니다.

      그러나 배포판 공급 업체가 패키지를 쉽게 다시 포장 할 수 있습니다. 특히 모든 종속 라이브러리를 패키지로 만들려고하면 포트에 대한 외부 종속성이 줄어 듭니다. 또한 한 배포에서 다른 배포로 패키지를 이식 할 수있는 도구가 곧 나타납니다 (릴리스가 릴리스되면 답변을 업데이트하겠습니다).

      예, 버전을 두 번 지정해야합니다.

      하지만패키지 및 소프트웨어 버전이 동기화되지 않는 방식으로 패키징 프로세스를 구성 할 수 있습니다. 패키징 스크립트를 저장소에서 (또는 웹 사이트에서 다운로드하여) 스크립트가 패키지 사양에 쓰는 것과 정확히 동일한 버전으로 체크 아웃하십시오.

      종속성 분석

      귀하의 소프트웨어의 의존성을 분석하기 위해 오픈 소스 무료 Linux Application Checker 도구를 사용할 수 있습니다. 의존하는 라이브러리 목록을보고하고, 소프트웨어와 호환되는 배포판을 보여 주며, 배포판에서 응용 프로그램의 이식성을 향상시킵니다. 적은 노력으로 때때로 더 많은 배포판 호환성을 달성 할 수 있으며, 선택한 배포판 몇 개만 지원할 필요가 없습니다.

  • 이전 python - xaxis 끝에 xlabel을 설정하는 방법
  • 다음 algorithm - 등각 타일링 맵에서 마우스 위치를 변환하는 방법은 무엇입니까?