빌드시 필요 패키지 버전에 대해 어떻게 관리하시나요?

kmssu4305의 이미지

안녕하세요 패키지 혹은 커널 빌드 시에
개발자들간의 빌드 환경을 일치시키는 것과 관련하여 현재 여러분들은
어떤 방법을 사용하고 계신지 궁금해서 여쭙습니다.

처음 게시하는 글이라 주제나 방식이 맞는지 모르겠네요.

궁금한 내용은 다음과 같습니다.
linux 환경에서 어떤 프로그램을 빌드하고 싶을 때 필요한 패키지들이
있다고 가정해 봅시다. 커널 빌드를 예로 들면 build-essential libncurses5 libncurses5-dev 등이 있겠죠.
문제는 apt-get으로 받는 패키지들이 향후 업데이트되어 버전이 변경이 되었을 때 과연
이전에 빌드하였던 방식대로 되지 않는다면 어떻게 관리 하는것이 좋은가 하는 것입니다.
이러한 현상은 아마 커널 빌드보다는 그 이외의 창작물에 대해서 자주 발생할 것 같습니다.

기존에 잘 빌드 되었다고해서 새로운 호스트PC에 프로그램 소스를 받아 빌드할 때는 관련된 패키지의
버전이 달라져서 빌드에 실패할 수 있기 때문이죠.

제가 생각하기로는 SVN 같은 공간에 커널, 혹은 개발중인 프로그램을 올려두고 관련된 패키지들도
같이 업로드를 하여 이후 개발자가 한번에 다 받아 빌드과정에서 필요 패키지를 설치하는 방향을 생각중인데요.
혹시 이와 비슷한 개념을 사용중인 오픈소스가 있거나 위와같은 상황에서 다른 해결 방법을 사용하시는
분들은 어떤 방식으로 해결하셨는지 궁금합니다. :)

Yi Soo An@Google의 이미지

한가지 방법으론 컨테이너 툴로 빌드 환경을 가상화 시키면 됩니다.
예로 2.6 커널은 gcc 최신 버전에서 빌드가 안되는데 우분투 14.04 컨테이너 내부에서 빌드하고 커널 이미지만 외부 볼륨에 넣어주면 됩니다. 이건 컨테이너가 동작할 수 있는 모든 플랫폼에서 동일한 빌드환경을 제공하는 거라 개발자간에 환경이 달라도 의존성 문제가 생기지 않습니다.

라이브러리의 경우 릴리즈 버전에 따라 tarball로 압축해서 제공하고 master 브랜치는 의존성을 항상 최신으로 관리합니다.

---------------
Happy Hacking!

kmssu4305의 이미지

오.. 컨테이너 툴로 빌드 환경을 가상화 시키는 방법은 처음 들어봤습니다.
관련 자료들을 찾아봐야겠군요! 감사합니다. :)

Hodong Kim@Google의 이미지

텔레그램의 경우, kmssu4305님께서 말씀하신 방법과 유사한 방법으로 빌드하는 것 같습니다.
스태틱 링킹하는 것 같습니다.
https://github.com/telegramdesktop/tdesktop

그리고 또 다른 방법으로는 kmssu4305님께서 만드신 소프트웨어가 library-1.1.1 버전에서 빌드하여 작동하고 library-1.2 에서는 빌드되지 않을 때, 조건부 컴파일로 버전별로 처리하는 방법도 있습니다. 이러한 방법을 권장합니다. 하지만 정답은 없고 윗분이 말씀하신 컨테이너 방법도 있고, kmssu4305님께서 상황에 맞게 여러 방법 중에 선택하시면 되겠습니다.

아래는 GTK 버전 >= 3.22 에서 컴파일 에러가 나서
GTK < 3.22, GTK >= 3.22 일 때 조건부 컴파일을 하는 예입니다.

static void nimf_preedit_window_show (NimfPreeditable *preeditable)
{
  g_debug (G_STRLOC ": %s", G_STRFUNC);
 
  NimfPreeditWindow *preedit_window = NIMF_PREEDIT_WINDOW (preeditable);
 
  GtkRequisition  natural_size;
  int             x, y, w, h;
  int             screen_width, screen_height;
 
  #if GTK_CHECK_VERSION (3, 22, 0)
    GdkRectangle  geometry;
    GdkDisplay   *display = gtk_widget_get_display (preedit_window->window);
    GdkWindow    *window  = gtk_widget_get_window  (preedit_window->window);
    GdkMonitor   *monitor = gdk_display_get_monitor_at_window (display, window);
    gdk_monitor_get_geometry (monitor, &geometry);
    screen_width  = geometry.width;
    screen_height = geometry.height;
  #else
    screen_width  = gdk_screen_width ();
    screen_height = gdk_screen_height ();
  #endif
 
  gtk_widget_show_all (preedit_window->window);
  gtk_widget_get_preferred_size (preedit_window->window, NULL, &natural_size);
  gtk_window_resize (GTK_WINDOW (preedit_window->window),
                     natural_size.width, natural_size.height);
  gtk_window_get_size (GTK_WINDOW (preedit_window->window), &w, &h);
 
  x = preedit_window->cursor_area.x - preedit_window->cursor_area.width;
  y = preedit_window->cursor_area.y + preedit_window->cursor_area.height;
 
  if (x + w > screen_width)
    x = screen_width - w;
 
  if (y + h > screen_height)
    y = preedit_window->cursor_area.y - h;
 
  gtk_window_move (GTK_WINDOW (preedit_window->window), x, y);
}
kmssu4305의 이미지

의견 감사합니다!
만약에 이렇게 빌드를 한다고 가정한다면 개발자 입장에서 빌드에 필요한 패키지의 버전별로
모두 대응을 해주어야 해서 코드의 변경이 자주 일어나야하지 않을까요?
혹시 이런 방법을 사용하셨을 때 버전별로 대응을 해주어야하는 빈도는 어느정도 인지 경험이 있으시다면
공유 부탁드립니다 :) (당연히 패키지마다, 버전마다 경우는 다르겠지만 참고를 하고싶어서요ㅎㅎ)

Hodong Kim@Google의 이미지

nimf 프로젝트의 경우,

gcc 관련 4년 동안 2건.
라이브러리 관련 4년 동안 6건 있었습니다.

아래는 라이브러리 관련 상세

GTK 3건, GLib 1건. Qt 2건

빌드에 사용된 라이브러리는 13개.
libglib2.0-dev,
libgtk-3-dev,
libgtk2.0-dev,
libqt4-dev,
qtbase5-dev, qtbase5-private-dev,
libappindicator3-dev,
libhangul-dev,
libanthy-dev,
librime-dev (>= 1.2.9),
libxkbcommon-dev (>= 0.5.0),
libwayland-dev,
libxklavier-dev,
libm17n-dev,

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.