2012-02-25 2 views
0

내가 유지 관리하는 라이브러리에는 pthreads에 의존하는 몇 가지 기능이 있습니다. 이 프로젝트는 automake를 사용합니다. 필자는 pthread에 대한 의존성을 비활성화하기 위해 configure 옵션을 만들고 싶습니다. pthread는 단순히 그 함수를 컴파일하면 안됩니다. (이유는 특정 크로스 컴파일 및 포함 된 대상입니다.)automake를 사용하는 라이브러리에 대해 선택적 public 유형/함수를 처리하는 올바른 방법은 무엇입니까?

이 함수가 포함 된 파일을 컴파일하지 않아도 지금까지는 정상적으로 작동하지만 이제는 이러한 함수와 공용 헤더에서 사용하는 구조체가 공용 헤더에 정의되어 있습니다.

  1. 도서관 유지 관리 관점에서 올바른 접근 방법은 무엇입니까?
  2. 공용 헤더에서 유형 또는 기능을 선택하는 올바른 방법은 무엇입니까?

처음에 나는 autoconf를 입력 (.IN) 파일로 헤더를 설정하고 선택적으로 제거 이러한 기능과 유형 헤더를 생성해야합니다 생각했다.

하지만 다른 버전의 라이브러리가 동시에 설치되는 시스템은 어떻습니까? 일반적으로 이들은 헤더를 공유 할 수 있어야합니다.

이러한 기능을 사용하지 않으려면 헤더에 전 처리기를 사용하고, pkg-config을 사용하여 명령 줄 옵션으로 지정해야합니까?

또 다른 아이디어는 이러한 함수와 유형을 고유 한 헤더로 이동하고 pthreads가 비활성화되었을 때이 헤더를 설치하지 않는 것입니다. 이것은 머리말의 조직을 약간 어지럽히는 것을 의미 할 것이나, 아마 제일 아이디어 일 것입니다. 나는 당신의 의견을 원하지만 라이브러리의 공개 헤더에서 옵션 기능을 처리하는 가장 좋은 방법은 무엇입니까?

답변

0

또 다른 아이디어는 이러한 기능과 유형을 고유 한 헤더로 이동하고 pthreads가 비활성화되었을 때이 헤더를 설치하지 않는 것입니다.

가장 깨끗한 선택입니다. AC_ARG_ENABLE을 통해 옵션을 활성화하면 물론 모든 pthreads 설정도 무시할 수 있습니다.이 옵션을 사용하면 라이브러리에 의존하는 패키지는 (AC_TRY_COMPILE을 통해) pthread 옵션 기능이 AC_TRY_RUN이 아닌 런타임에 쉽게 작동하는지 확인할 수 있습니다.

1

임베디드 플랫폼에 계속 존재하지만 호출 될 경우 오류 코드를 반환하는 스레드 요구 기능을 갖는 것이 한 가지 방법입니다. 이런 식으로 API는 플랫폼간에 동일하게 유지됩니다. 라이브러리 ("프로그램")를 사용하는 코드에 매우 바람직합니다. 프로그램은 라이브러리의 함수 존재에 대해 autoconf와 같은 테스트를 필요로하지 않기 때문에 사용할 수 있습니다 소스 코드 레벨 ifs를 사용하여 기능을 결정합니다.

int mylib_thread_frenzy(void) 
{ 
#ifdef HAVE_PTHREAD_CREATE 
     int ret = pthread_create(...); 
     if (ret < 0) 
       return -errno; 
     return 0; 
#else 
     return -ENOSYS; 
#endif 
} 

. 가 정의와 충돌 할 수 있습니다 귀하의 config.h 파일에 명시된 때문에 어떤 경우

/* Program */ 
int ret = mylib_thread_frenzy(); 
if (ret == -ENOSYS) { 
    /* Hm, castrated platform. Try something else... */ 
    printf("Or just tell the user the platform is too weak.\n"); 
} else { 
    printf("World domination acquired\n"); 
} 

는 mylib.h에서 "config.h 파일을"#include를하지 않으며, 하나이 config.h 파일을 제공하지 않습니다 다른 도서관 및/또는 프로그램의 자료. 이 구성은 mylib.h.in 때마다 다시 실행해야 의미하기 때문에

/* mylib.h.in */ 
#if [email protected][email protected] 
extern int mylib_pthread_frenzy(void); 
#endif 

/* configure.ac */ 
AC_SEARCH_LIBS([pthread_create], [pthread], 
    [HAVE_PTHREAD_CREATE=1 
    AC_SUBST([HAVE_PTHREAD_CREATE]) 
    ]) 
AC_CONFIG_FILES([mylib.h.in]) 
AC_OUTPUT 

내가 그러나 두 번째 방법을 싫어하는 : 당신이 절대적으로 mylib.h에서 기능을 제거 할 경우

, 나는이 마음에 오는 것 같아요 변경.