문제

플러그인이 몇 년 동안 개발해온 플러그인 프로젝트를 가지고 있으며, 플러그인이 [1 차 응용 프로그램 버전, 제 3 자 라이브러리 버전, 32 비트 대 64 비트]의 수많은 조합으로 작동하는 플러그인 프로젝트를 가지고 있습니다. Autotools를 사용하여 모든 버전의 플러그인을 빌드하는 단일 Makefile을 만드는 (깨끗한) 방법이 있습니까?

Autotools 문서를 통해 스키밍하여 알 수있는 한, 내가 원하는 것과 가장 가까운 근사치는 각각 고유 한 Makefile과 함께 프로젝트의 독립적 인 사본을 갖는 것입니다. (a) 모든 다른 사본에서 코드 변경을 지속적으로 전파해야하며 (b) 프로젝트를 여러 번 복제하는 데 많은 낭비되는 공간이 있기 때문에 테스트 및 개발에 약간의 최적이 보입니다. 더 좋은 방법이 있습니까?

편집하다:

나는 다양한 제 3 자 라이브러리 버전 등을 사냥하기 위해 멋진 Makefile과 일부 Perl 스크립트가있는 곳에서 한동안 내 솔루션을 굴 렸습니다. 다른 빌드 도구의 경우 최종 사용자가 설치하기가 매우 쉽습니다. 이 도구는 또한 엄청난 양의 문제없이 다양한 타사 라이브러리와 헤더를 사냥 할 수있을 정도로 똑똑해야합니다. 나는 주로 Linux 솔루션을 찾고 있지만 Windows 및/또는 Mac에서도 작동하는 솔루션은 보너스입니다.

도움이 되었습니까?

해결책

내가 아는 한, 당신은 그렇게 할 수 없습니다. 그러나 Autotools에 갇혀 있습니까? 도 아닙니다 cmake ...도 아니다 스콘 옵션?

다른 팁

질문이있는 경우 :

일부 머신 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 thecflags` 매크로.

Autotools의 잔류 문제는 32 비트 및 64 비트 플래그를 결정하는 방법을 해결하고 있습니다. 최악의 상황이 최악이되면 직접 매크로를 작성해야합니다. 그러나, 나는 그것을 조사하지 않고 Autotools Suite의 표준 시설을 사용하여 할 수 있다고 기대합니다.

당신이 자신을 신중하게 (무자비하게) 대칭 Makefile을 만들지 않으면 안정적으로 작동하지 않습니다.

우리는 그것을 시도했지만 작동하지 않습니다! 그래서 우리는 지금 사용합니다 스콘.

이 주제에 대한 일부 기사 : 1 그리고 2

편집하다:내가 스콘을 좋아하는 이유 몇 가지 작은 예 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top