자동 툴은 멀티 플랫폼 makefiles를 생성 할 수 있습니다
-
11-07-2019 - |
문제
플러그인이 몇 년 동안 개발해온 플러그인 프로젝트를 가지고 있으며, 플러그인이 [1 차 응용 프로그램 버전, 제 3 자 라이브러리 버전, 32 비트 대 64 비트]의 수많은 조합으로 작동하는 플러그인 프로젝트를 가지고 있습니다. Autotools를 사용하여 모든 버전의 플러그인을 빌드하는 단일 Makefile을 만드는 (깨끗한) 방법이 있습니까?
Autotools 문서를 통해 스키밍하여 알 수있는 한, 내가 원하는 것과 가장 가까운 근사치는 각각 고유 한 Makefile과 함께 프로젝트의 독립적 인 사본을 갖는 것입니다. (a) 모든 다른 사본에서 코드 변경을 지속적으로 전파해야하며 (b) 프로젝트를 여러 번 복제하는 데 많은 낭비되는 공간이 있기 때문에 테스트 및 개발에 약간의 최적이 보입니다. 더 좋은 방법이 있습니까?
편집하다:
나는 다양한 제 3 자 라이브러리 버전 등을 사냥하기 위해 멋진 Makefile과 일부 Perl 스크립트가있는 곳에서 한동안 내 솔루션을 굴 렸습니다. 다른 빌드 도구의 경우 최종 사용자가 설치하기가 매우 쉽습니다. 이 도구는 또한 엄청난 양의 문제없이 다양한 타사 라이브러리와 헤더를 사냥 할 수있을 정도로 똑똑해야합니다. 나는 주로 Linux 솔루션을 찾고 있지만 Windows 및/또는 Mac에서도 작동하는 솔루션은 보너스입니다.
다른 팁
질문이있는 경우 :
일부 머신 A의 Autotools를 사용하여 다른 모든 컴퓨터에서 작동하는 단일 범용 Makefile을 만들 수 있습니까?
그런 다음 대답은 "아니오"입니다. Autotools는 그렇게하려고 노력하는 데 있어도 척하지 않습니다. 그들은 대상 기계에서 실행 가능한 makefile을 만드는 방법을 결정하는 휴대용 코드를 포함하도록 설계되었습니다.
질문이있는 경우 :
Autotools를 사용하여 플러그인이 작동하는 기본 소프트웨어의 다른 버전과 32 비트 대 64 비트 문제는 말할 것도없이 다양한 제 3 자 라이브러리를 사용하여 다른 시스템에서 실행 해야하는 소프트웨어를 구성 할 수 있습니까?
그런 다음 대답은 "예"입니다. Autotools는 그렇게 할 수 있도록 설계되었습니다. 또한 UNIX, Linux, MacOS X, BSD에서 작업합니다.
IBM Informix 데이터베이스와 함께 작동하는 프로그램 인 SQLCMD (10 년 이상 같은 이름의 Microsoft 프로그램을 사전 데이트 함)를 가지고 있습니다. 클라이언트 소프트웨어 버전 (IBM Informix ESQL/C, IBM Informix ClientsDK 또는 CSDK의 일부)이 설치되었으며 32 비트 또는 64 비트 여부를 감지합니다. 또한 어떤 버전의 소프트웨어가 설치 될지 감지하고, 기능을 지원 제품에서 사용 가능한 것에 맞게 조정합니다. 약 17 년 동안 출시 된 버전을 지원합니다. 그것은 자동으로 구성되어 있습니다 - 나는 Informix 기능과 다른 Gizmos (고해상도 타이밍, /dev /stdin 등)에 대해 Autoconf 매크로를 작성해야했습니다. 그러나 가능합니다.
반면에, 나는 모든 고객 기계와 환경에 맞는 단일 메이크 파일을 시도하고 출시하지 않습니다. 합리적 일 가능성이 너무 많습니다. 그러나 Autotools는 저 (및 사용자)의 세부 사항을 처리합니다. 그들이하는 일은 다음과 같습니다.
./configure
makefile을 편집하는 방법을 작성하는 것보다 쉽습니다. (오, 처음 10 년 동안, 프로그램은 손으로 구성되었습니다. 사람들이 꽤 좋은 기본값을 설정 했음에도 불구하고 사람들이하기가 어려웠습니다. 그래서 자동 구성으로 옮겼습니다. 훨씬 쉬워집니다. 설치하는 사람들.)
Fooz 씨는 다음과 같이 말했습니다.
나는 그 사이에 무언가를 원한다. 고객은 제 경우에 동일한 시스템에서 동일한 기본 애플리케이션의 여러 버전과 Bitnesses를 사용합니다. Linux에 Windows Binaries를 구축하는 것과 같은 크로스 컴파일에 대해 걱정하지 않습니다.
32 비트 및 64 비트 버전에 대한 별도의 플러그인 빌드가 필요합니까? (예라고 가정하지만 당신은 나를 놀라게 할 수 있습니다.) 따라서 사용자가 말할 수있는 메커니즘을 제공해야합니다.
./configure --use-tppkg=/opt/tp/pkg32-1.0.3
(TPPKG가 타사 패키지의 코드이고 사용자가 위치를 지정할 수 있습니다.) 그러나 유용성을 명심하십시오 : 사용자가 이러한 옵션이 적습니다. 가지다 제공하기 위해, 더 나은; 이에 반대하여 설치 위치와 같이 선택 사항이어야하는 하드 코드를 사용하지 마십시오. 반드시 기본 위치를 살펴보십시오. 좋습니다. 그리고 당신이 찾은 것들의 비트에 대한 기본값. 어쩌면 32 비트와 64 비트 버전을 모두 찾으면 두 가지 모두를 구축해야합니다. 그러나 신중한 구성이 필요합니다. 당신은 항상 "TP-Package를 확인하는 것"을 항상 에코하고 당신이 찾은 내용과 어디에서 찾았는지 표시 할 수 있습니다. 그런 다음 설치 프로그램이 옵션을 변경할 수 있습니다. 문서./configure --help
'옵션은 무엇입니까? 이것은 표준 Autotools 연습입니다.
그래도 대화식을하지 마십시오. 구성 스크립트 구성은 실행되어 수행해야합니다. Perl Configure
스크립트 (대문자 참고 - 전적으로 별도의 자동 구성 시스템)는 집중적으로 대화식 구성 시스템 중 하나입니다 (아마도 유산 때문일 것입니다. 새로 시작하는 경우 새롭게 시작하면 비 결과가 될 가능성이 높습니다). . 이러한 시스템은 비 중과 시스템보다 구성하는 데 도움이됩니다.
교차 컴파일은 힘들다. 나는 그것을 할 필요가 없었습니다. 감사합니다.
Fooz 씨도 다음과 같이 말했습니다.
추가 의견에 감사드립니다. 나는 다음과 같은 것을 찾고 있습니다.
./configure --use-tppkg=/opt/tp/pkg32-1.0.3 --use-tppkg=/opt/tp/pkg64-1.1.2
여기서 현재 플랫폼의 한 Makefile에 32 비트 및 64 비트 대상을 생성합니다.
글쎄, 나는 그것이 할 수 있다고 확신한다. 나는 그 사이에 완전히 재건 된 두 개의 개별 구성 실행과 비교하여 할 가치가 있다고 확신하지 못합니다. 당신은 아마 사용하고 싶을 것입니다 :
./configure --use-tppkg32=/opt/tp/pkg32-1.0.3 --use-tppkg64=/opt/tp/pkg64-1.1.2
이것은 두 개의 별도 디렉토리를 나타냅니다. 빌드를 어떻게 수행 할 것인지 결정해야하지만 아마도 '와 같은 두 가지 하위 디렉터가있을 것입니다.obj-32
' 그리고 'obj-64
'별도의 객체 파일 세트를 저장합니다. 또한 라인을 따라 Makefile을 배열합니다.
FLAGS_32 = ...32-bit compiler options...
FLAGS_64 = ...64-bit compiler options...
TPPKG32DIR = @TPPKG32DIR@
TPPKG64DIR = @TPPKG64DIR@
OBJ32DIR = obj-32
OBJ64DIR = obj-64
BUILD_32 = @BUILD_32@
BUILD_64 = @BUILD_64@
TPPKGDIR =
OBJDIR =
FLAGS =
all: ${BUILD_32} ${BUILD_64}
build_32:
${MAKE} TPPKGDIR=${TPPKG32DIR} OBJDIR=${OBJ32DIR} FLAGS=${FLAGS_32} build
build_64:
${MAKE} TPPKGDIR=${TPPKG64DIR} OBJDIR=${OBJ64DIR} FLAGS=${FLAGS_64} build
build: ${OBJDIR}/plugin.so
이것은 플러그인이 공유 객체라고 가정합니다. 여기서 아이디어는 Autotool이 타사 패키지의 32 비트 또는 64 비트 설치를 감지 한 다음 대체 할 것입니다. 32 비트 패키지가 필요한 경우 Build_32 매크로가 Build_32로 설정되어 그렇지 않으면 비워집니다. build_64 매크로도 비슷하게 처리됩니다.
사용자가 실행할 때make all
', 그것은 build_32 대상을 먼저 빌드하고 다음에 build_64 대상을 빌드합니다. build_32 대상을 구축하려면 다시 실행됩니다 make
32 비트 빌드의 플래그를 구성하십시오. 마찬가지로 Build_64 대상을 구축하려면 다시 실행됩니다. make
64 비트 빌드의 플래그를 구성하십시오. 32 비트 대 64 비트 빌드의 영향을받는 모든 플래그가 재귀 적 호출에 설정되어 있어야합니다. make
, 객체 및 라이브러리 구축 규칙은 신중하게 작성됩니다. 예를 들어, 객체로 소스를 컴파일하는 규칙은 객체 파일을 올바른 개체 디렉토리에 배치하려면 조심해야합니다. 예를 들어 GCC를 사용하여 ( .c.o
규칙):
${CC} ${CFLAGS} -o ${OBJDIR}/$*.o -c $*.c
매크로 cflags에는 비트를 다루는 $ {flags} 값이 포함됩니다 (예 : FLAGS_32 = -m32
및 FLAGS_64 = -M64, and so when building the 32-bit version,
플래그 = -m32would be included in the
cflags` 매크로.
Autotools의 잔류 문제는 32 비트 및 64 비트 플래그를 결정하는 방법을 해결하고 있습니다. 최악의 상황이 최악이되면 직접 매크로를 작성해야합니다. 그러나, 나는 그것을 조사하지 않고 Autotools Suite의 표준 시설을 사용하여 할 수 있다고 기대합니다.
당신이 자신을 신중하게 (무자비하게) 대칭 Makefile을 만들지 않으면 안정적으로 작동하지 않습니다.
우리는 그것을 시도했지만 작동하지 않습니다! 그래서 우리는 지금 사용합니다 스콘.
편집하다:내가 스콘을 좋아하는 이유 몇 가지 작은 예 :
env.ParseConfig('pkg-config --cflags --libs glib-2.0')
이 코드 라인을 사용하면 컴파일 환경에 glib을 추가합니다 (env). 그리고 잊지 마세요 사용자 설명서 스콘을 배우는 것이 좋습니다 (실제로 파이썬을 알 필요는 없습니다!). 최종 사용자의 경우 스콘을 사용해 볼 수 있습니다 Pyinstaller 또는 그런 것.
그리고 비교할 때 make
, 당신은 Python을 사용하므로 완전한 프로그래밍 언어입니다! 이것을 염두에두고 당신은 모든 것을 (더 또는 그 이상) 할 수 있습니다.
여러 빌드 디렉토리가있는 단일 프로젝트를 사용한다고 생각한 적이 있습니까? Automake 프로젝트가 올바른 방식으로 구현 된 경우 (예 : GCC와 같지 않음)
다음이 가능합니다.
mkdir build1 build2 build3
cd build1
../configure $(YOUR_OPTIONS)
cd build2
../configure $(YOUR_OPTIONS2)
[...]
디렉토리 및 컴파일러 (크로스 컴파일러 IE)와 같은 다양한 구성 매개 변수를 전달할 수 있습니다.
그런 다음 실행하여 단일 제작으로 이것을 실행할 수도 있습니다.
make -C build1 -C build2 -C build3