문제

나는 freebsd 호스트에서 컴파일하기 위해 적응하는 C ++ autoconf 관리 프로젝트입니다. 원래 시스템은 Linux이므로 제작 된 호스트를 구별하고 코드를 시스템 별 파일로 분리하기 위해 하나의 AM_Conditional을 만들었습니다.

configure.ac

AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],false)
case $host in
        *free*)    
            AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host])
            AM_CONDITIONAL([IS_FREEBSD],true)
            BP_ADD_LDFLAG([-L/usr/local/lib])
                ;;
esac

makefile.am

lib_LTLIBRARIES=mylib.la
mylib_la_SOURCES=a.cpp \
                 b.cpp

if IS_FREEBSD
    mylib_la_SOURCES+=freebsd/c.cpp
else
    mylib_la_SOURCES+=linux/c.cpp
endif

Automake를 실행하면 이런 종류의 메시지로 실패합니다.

Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp'

makefile 에서도이 조건부를 존중하기 위해 Automake를 구성하는 방법에 대한 아이디어가 있습니까?

파일에 이름이 다르지 만 C ++ 코드이며 필레나 이름을 클래스 이름과 동일하게 유지하려고합니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

해당 하위 디렉토리에 개체를 구축하도록 요청할 수 있습니다.

AUTOMAKE_OPTIONS = subdir-objects

다른 팁

게다가 또 다른 옵션 서브 디르-오브젝트,, 각 하위 프로젝트에 프로젝트 별 구조 별 빌드 플래그를 제공하는 것입니다. 이렇게하면 Automake는 대상 이름을 모듈 이름으로 선출하기 위해 *.o 명명 규칙을 변경합니다. 예를 들어, 이것은 다음과 같습니다.

mylib_la_CXXFLAGS=$(AM_CXXFLAGS)
mylib_la_SOURCES=a.cpp b.cpp

AO 및 BO가 아닌 출력 파일 MyLib_la-Ao 및 MyLib_la-Bo가 발생하므로 각각 B.CPP 파일과 동일한 출력 디렉토리가있는 두 개의 다른 프로젝트를 가질 수 있으며 출력 충돌이 없습니다.

프로젝트 별 CxxFlags를 Automake가 이미 사용했던 AM_CXXFLAGS로 설정하여이를 수행했습니다. Automake는이 트릭을 감지하고 짧은 *.o 이름을 사용하기에 충분히 똑똑하지 않습니다. 프로젝트 당 빌드 옵션이 필요하다면이 해킹 대신 그렇게 할 수 있습니다.

거기에 전체 목록 집행 가능한 기준으로 설정할 때 동일한 효과를 제공하는 Automake 변수의 변수. 예를 들어, 하나의 하위 프로젝트는 이미 특수 링크 플래그가 필요할 수 있으므로 다음과 같은 것을 제공합니다.

mylib_la_LDFLAGS=-lfoo

이렇게하면 AM_CXXFLAGS 트릭이했던 것처럼 접두사 *.O 파일이 제공됩니다. 이제는 자동케이크를 속이는 대신이 기능을 "합법적으로"사용하고 있습니다.

그건 그렇고, 프로그램이 구축중인 OS 만 기반으로 프로그램을 구축하는 방식을 변경하는 것은 잘못된 AutoConf 스타일입니다. 우수한 AutoConf 스타일은 플랫폼이 변경되기 때문에 전체 플랫폼이 아닌 특정 플랫폼 기능 만 확인하는 것입니다. FreeBSD는 오늘날 특정한 방식 일지 모르지만 다음 릴리스에서는 Linux의 기능을 복사하여 프로그램을 두 가지 다른 방법으로 구축 할 필요성을 지울 것입니다. 또는 오늘날 사용하는 기능이 더 이상 사용되지 않으며 다음 버전에서 삭제됩니다.

Autotools, Grasshopper에는 40 년 동안 휴대용 UNIX 프로그래밍 지혜가 있습니다. 내가 위에서 준 "Maybes" 가지다 과거에 일어 났으며 확실히 다시 그렇게 할 것입니다. 개별 기능을 테스트하는 것은 지속적으로 변화하는 플랫폼에 대처하는 가장 중요한 방법입니다.

이 접근법에서도 예기치 않은 보너스를 얻을 수 있습니다. 예를 들어, 귀하의 프로그램에는 작업을 수행하기 위해 2 가지 기능이 필요할 수 있습니다. freebsd에서는 A와 B 기능이며 Linux에서는 X 및 Y 기능입니다. A와 X는 비슷한 메커니즘이지만 다른 인터페이스가 있고 B와 Y의 경우 동일합니다. A 특징 A는 원래 BSD에서 나오고 Solaris는 80 년대 Sunos의 BSD 뿌리를 가지고 있기 때문에 Solaris도 있습니다. 90 년대 초반 시스템 v 기반 재 설계에서 기능 Y를 특징으로합니다. 이러한 기능을 테스트함으로써 프로그램은 FreeBSD 및 Linux와 동일한 조합이 아닌 프로그램 요구 기능이 있기 때문에 Solaris에서도 실행될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top