2010-05-20 4 views
7

내 직업은 대부분 엔지니어링 분석으로 이루어져 있지만, 동료들 사이에서 코드 배포가 점점 더 자주 발생하고 있습니다. 큰 어려움은 모든 사용자가 소스 코드 컴파일의 능숙함이 아니며 실행 파일을 배포 할 수 없다는 것입니다.C++/Boost 소스 코드를 간단하고 효율적으로 배포 (합병)

나는 Boost를 사용하여 C++로 작업 해 왔으며 문제는 모든 네트워크의 모든 시스템 관리자에게 라이브러리를 설치하도록 요청할 수 없다는 것입니다. 대신, 사용자가 g++ source.c -o program이 될 수 있도록 단일 소스 파일을 배포하려고합니다.

그래서 질문은 다음과 같습니다. 코드를 사용하여 Boost 라이브러리를 패키징하고 하나의 파일로 끝낼 수 있습니까? 나는 "headers only"또는 "templates only"인 Boost 라이브러리에 대해 이야기하고있다.

영감으로는 SQlite 또는 Lemon Parser Generator의 분포를 살펴보십시오. 저자는 물건을 단일 소스 파일로 합병하여 컴파일하기는 쉽지 않습니다.

감사합니다.

편집는 :

related question in SO는 Windows 환경을위한 것입니다. 나는 리눅스에서 일한다.

+1

이 길을 얼마나 멀리 가고 싶습니까? 그들이 설치하지 않은 다른 라이브러리는 어떻습니까? 패키지 관리자 나 자동화 된 컴파일 메커니즘 (아마도 shar 아카이브 일까?)을보고 싶을 것이다. – KeithB

답변

11

bcp이라는 부스트와 함께 제공되는 유틸리티가 있는데, 소스를 검색하고 부스트 소스에서 사용 된 부스트 헤더 파일을 추출 할 수 있습니다. 이 소스 트리에 추출을 수행하는 스크립트를 설정 했으므로 코드와 함께 필요한 소스를 패키지화 할 수 있습니다. 또한 우리가 사용하는 부스트 라이브러리의 부스트 소스 파일을 복사 할 것이며 헤더는 없으며 직접 응용 프로그램에 컴파일됩니다.

이 작업은 한 번 수행 된 다음 코드를 사용하는 사람이라도 부스트에 의존하는지 알 필요가 없습니다. 여기 우리가 사용하는 것이 있습니다. 아직 빌드되지 않았다면 bjam과 bcp도 빌드 할 것입니다.

#!/bin/sh 
BOOST_SRC=.../boost_1_43_0 
DEST_DIR=../src/boost 
TOOLSET= 
if (test `uname` = "Darwin") then 
    TOOLSET="--toolset=darwin" 
fi 

# make bcp if necessary 
if (! test -x $BOOST_SRC/dist/bin/bcp) then 
    if (test -x $BOOST_SRC/tools/jam/*/bin.*/bjam) then 
     BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam 
    else 
     echo "### Building bjam" 
     pushd $BOOST_SRC/tools/jam 
     ./build_dist.sh 
     popd 
     if (test -x $BOOST_SRC/tools/jam/*/bin.*/bjam) then 
      BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam 
     fi 

    fi 
    echo "BJAM: $BJAM" 
    pushd $BOOST_SRC/tools/bcp 
    echo "### Building bcp" 
    echo "$BJAM $TOOLSET" 
    $BJAM $TOOLSET 
    if [ $? == "0" ]; then 
     exit 1; 
    fi 
    popd 
fi 

if (! test -x $BOOST_SRC/dist/bin/bcp) then 
    echo "### Couldn't find bpc" 
    exit 1; 
fi 

mkdir -p $DEST_DIR 

echo "### Copying boost source" 
MAKEFILEAM=$DEST_DIR/libs/Makefile.am 
rm $MAKEFILEAM 
# Signals 
# copy source libraries 
mkdir -p $DEST_DIR/libs/signals/src 
cp $BOOST_SRC/libs/signals/src/* $DEST_DIR/libs/signals/src/. 
echo -n "boost_sources += " >> $MAKEFILEAM 
for f in `ls $DEST_DIR/libs/signals/src | fgrep .cpp`; do 
    echo -n "boost/libs/signals/src/$f " >> $MAKEFILEAM 
done 
echo >> $MAKEFILEAM 

echo "### Extracting boost includes" 
$BOOST_SRC/dist/bin/bcp --scan --boost=$BOOST_SRC ../src/*/*.[Ch] ../src/boost/libs/*/src/*.cpp ../src/smart_assert/smart_assert/priv/fwd/*.hpp $DEST_DIR 
if [ $? != "0" ]; then 
    echo "### bcp failed" 
    rm -rf $DEST_DIR 
    exit 1; 
fi 
+0

고맙습니다. 이것은 내가 끝낼 일에 매우 가깝습니다. – Escualo

0

SVN에 필요한 모든 파일을 체크 인하 고 동료의 URL을 저장소에 보내지 않는 이유는 무엇입니까? 그런 다음 원하는 때에 언제든지 코드를 체크 아웃하고 최신 버전으로 업데이트 할 때 언제든지 'svn up'을 할 수 있습니다.

+0

이것은 나와 당신에게 도움이 될 것입니다.하지만 제 동료 중 일부에게는 기꺼이/할 시간이 있기보다는 더 정교해야합니다. – Escualo

+1

아마도 스크립트 나 GUI 프론트 엔드의 복잡성을 감안할 수 있습니다. 그것은 정말로 하나의 "svn co"(또는 "svn up") 명령 다음에 configure; make 또는 그 다음에 오는 것입니다. 약간의 작업만으로 아이콘을 두 번 클릭하여 시작할 수 있습니다. –

3

SCons과 같은 빌드 시스템 용 빌드 스크립트 작성 만 고려한 적이 있습니까?
파이썬 스크립트를 작성하여 부스트를 다운로드하고 필요한 파일을 컴파일하고 (필요한 경우 bjam을 실행할 수도 있습니다) 직접 코드를 컴파일하십시오.
동료에게 필요한 유일한 의존성은 Python과 SCons뿐입니다.

1

코드에서 사전 처리기를 실행하고 출력을 저장하십시오. 하나의 main.cpp를 여러개의 include가있는 상태에서 시작했다면, 모든 include가 들어간 하나의 파일로 끝날 것입니다. 여러개의 cpp 파일을 가지고 있다면, 그것들을 함께 concatenate 한 다음 실행해야합니다 concatinated 파일의 전처리 기가 중복 된 전역 심볼 이름이없는 한 작동해야합니다.

더 휴대하기 쉬운 방법으로 sqlite가 수행하는 작업을 수행하고 생성 한 파일을 결합 및 연결하여 시스템에 포함시키지 않고 직접 스크립트를 작성하십시오. mksqlite3c를 참조하십시오.SQLite는 코드는 리눅스 데비안에서 파생 된 다양한 경우
http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl

+0

사실,하지만 그가 묻는 질문에 대답하고 있는데, 하나의 파일로 만드는 방법이었습니다. – Zanson

+0

Tcl 스크립트를 지적 해 주셔서 감사합니다. – Escualo

0

에서 TCL은, 물론이 같은 문제는 그냥 오지해야합니다 포장 시스템 및 정책 매뉴얼 작업을 할 수 있습니다. libboost-dev 또는 다른 패키지가 코드의 빌드 종속성이며 사전에 설치해야한다는 것을 명확히 밝히고 코드에서 찾을 수있는 곳에 /usr/include/boost이 있어야합니다. 배포판보다 더 최신 버전의 배포판을 사용하고 있다면, 직접 패키징하는 방법을 알아 내고 다른 패키지를 다시 작성하지 않고 기존 패키징/종속성 프레임 워크에서 작업 할 가치가있을 것입니다.

일하는 방식에 대해 의견을 말할 수있는 .rpm 기반 배포판에는 익숙하지 않습니다. 그러나 필자가 필요로하는 빌드 환경을 설치 환경으로 쉽게 설정할 수 있다는 것은 Windows보다 데비안 기반 개발의 가장 큰 장점 중 하나입니다.

관련 문제