Automake 및 동일한 이름의 파일
문제
나는 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에서도 실행될 수 있습니다.