mendix / LibSvnSharp

C# wrapper around Subversion based on SharpSvn
Apache License 2.0
25 stars 6 forks source link

Compilation #4

Open unlink2 opened 3 years ago

unlink2 commented 3 years ago

Hello,

we're trying to implement a wrapper around SVN using .Net 5 on Linux and we'd love to give this library a try however we are not certain how to set up a build environment. Any help would be greatly appreciated.

ghost commented 3 years ago

Hi @unlink2 You can find a build script I've been using to build it on a Mac below:

build_mac.sh ```bash #!/usr/bin/env bash script_dir=$(pwd) output_dir=${script_dir}/__output__ echo "Script dir is: " $script_dir echo "Output dir is set to: " $output_dir macos_min_ver=10.12 export SED=sed # ---------------------------------------- # OPENSSL BUILD # ---------------------------------------- if [ -d "${output_dir}/openssl/" ]; then echo "* OpenSSL is already built" else echo "* Downloading OpenSSL" curl -OL "https://www.openssl.org/source/openssl-1.1.0k.tar.gz" echo "* Unpacking OpenSSL" tar xzf ./openssl-1.1.0k.tar.gz echo "* Changing directory to OpenSSL" pushd ./openssl-1.1.0k/ echo "* Building OpenSSL" perl ./Configure \ darwin64-x86_64-cc \ threads \ no-dso \ no-shared \ no-hw \ no-ssl3 \ no-gost \ no-dtls \ no-srp \ no-unit-test \ no-zlib \ no-zlib-dynamic \ enable-static-engine \ -DSSL_FORBID_ENULL \ -mmacos-version-min=${macos_min_ver} \ --prefix="${output_dir}/openssl" \ --openssldir="${output_dir}/openssl" # enable-ec_nistp_64_gcc_128 # no-asm make depend && make && make install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/openssl/" ]; then echo "OpenSSL build has FAILED!" exit fi # ---------------------------------------- # SQLITE BUILD # ---------------------------------------- if [ -d "${output_dir}/sqlite3/" ]; then echo "* SQLite is already built" else echo "* Downloading SQLite" curl -OL "https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz" echo "* Unpacking SQLite" tar xzf ./sqlite-autoconf-3280000.tar.gz echo "* Changing directory to SQLite" pushd ./sqlite-autoconf-3280000/ echo "* Building SQLite" ./configure --prefix="${output_dir}/sqlite3" \ CPPFLAGS="-DNDEBUG \ -DSQLITE_TEMP_STORE=2 \ -DSQLITE_DEFAULT_PAGE_SIZE=4096 \ -DSQLITE_DEFAULT_CACHE_SIZE=20000 \ -DSQLITE_DEFAULT_MEMSTATUS=0 \ -DSQLITE_DEFAULT_RECURSIVE_TRIGGERS=1 \ -DSQLITE_POWERSAFE_OVERWRITE=1 \ -DSQLITE_OMIT_AUTOINIT \ -DSQLITE_OMIT_DEPRECATED \ -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_OMIT_PROGRESS_CALLBACK \ -DSQLITE_OMIT_TCL_VARIABLE \ -DSQLITE_OMIT_TRACE \ -DSQLITE_OMIT_UTF16 \ -DSQLITE_OMIT_DATETIME_FUNCS \ -DSQLITE_OMIT_LOCALTIME \ -DSQLITE_OMIT_SHARED_CACHE \ -DSQLITE_OMIT_BUILTIN_TEST \ -DSQLITE_OMIT_GET_TABLE \ -DSQLITE_OMIT_SCHEMA_PRAGMAS \ -DSQLITE_OMIT_INTEGRITY_CHECK \ -mmacos-version-min=${macos_min_ver}" # -DSQLITE_OMIT_EXPLAIN # -DSQLITE_OMIT_AUTHORIZATION make && make install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/sqlite3/" ]; then echo "SQLite build has FAILED!" exit fi # ---------------------------------------- # APR BUILD # ---------------------------------------- if [ -d "${output_dir}/apr/" ]; then echo "* APR is already built" else echo "* Downloading APR" curl -OL "https://www.apache.org/dist/apr/apr-1.7.0.tar.bz2" echo "* Unpacking APR" tar xjf ./apr-1.7.0.tar.bz2 echo "* Changing directory to APR" pushd ./apr-1.7.0/ echo "* Building APR" ./configure --prefix="${output_dir}/apr" \ CPPFLAGS="-mmacos-version-min=${macos_min_ver}" make && make install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/apr/" ]; then echo "APR build has FAILED!" exit fi # ---------------------------------------- # APR-UTIL BUILD # ---------------------------------------- if [ -d "${output_dir}/apr-util/" ]; then echo "* APR-Util is already built" else echo "* Downloading APR-Util" curl -OL "https://www.apache.org/dist/apr/apr-util-1.6.1.tar.bz2" echo "* Unpacking APR-Util" tar xjf ./apr-util-1.6.1.tar.bz2 echo "* Changing directory to APR-Util" pushd ./apr-util-1.6.1/ echo "* Building APR-Util" ./configure --prefix="${output_dir}/apr-util" \ --with-apr="${output_dir}/apr" \ --with-openssl="${output_dir}/openssl" \ --with-sqlite3="${output_dir}/sqlite3" \ --with-ldap=no \ --with-odbc=no \ CPPFLAGS="-mmacos-version-min=${macos_min_ver}" # --with-crypto make && make install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/apr-util/" ]; then echo "APR-Util build has FAILED!" exit fi # ---------------------------------------- # SERF BUILD # ---------------------------------------- if [ -d "${output_dir}/serf/" ]; then echo "* Serf is already built" else echo "* Downloading Serf" curl -OL "https://www.apache.org/dist/serf/serf-1.3.9.tar.bz2" echo "* Unpacking Serf" tar xjf ./serf-1.3.9.tar.bz2 echo "* Changing directory to Serf" pushd ./serf-1.3.9/ echo "* Building Serf" scons PREFIX="${output_dir}/serf" \ OPENSSL="${output_dir}/openssl" \ APR="${output_dir}/apr" \ APU="${output_dir}/apr-util" \ SOURCE_LAYOUT=no \ APR_STATIC=yes \ install-lib \ install-inc \ CPPFLAGS="-mmacos-version-min=${macos_min_ver}" scons install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/serf/" ]; then echo "Serf build has FAILED!" exit fi # ---------------------------------------- # SUBVERSION BUILD # ---------------------------------------- if [ -d "${output_dir}/subversion/" ]; then echo "* Subversion is already built" else echo "* Downloading Subversion" curl -OL "https://www.apache.org/dist/subversion/subversion-1.10.6.tar.bz2" echo "* Unpacking Subversion" tar xjf ./subversion-1.10.6.tar.bz2 echo "* Changing directory to Subversion" pushd ./subversion-1.10.6/ ./configure --prefix="${output_dir}/subversion" \ --with-apr="${output_dir}/apr" \ --with-apr-util="${output_dir}/apr-util" \ --with-serf="${output_dir}/serf" \ --with-sqlite="${output_dir}/sqlite3" \ --with-lz4=internal \ --with-utf8proc=internal \ --without-berkeley-db \ --without-swig \ --disable-shared \ CPPFLAGS="-DSVN_HI_RES_SLEEP_MS=1 \ -mmacos-version-min=${macos_min_ver}" # --without-apxs # --disable-javahl make && make install echo "* Changing directory back" popd fi if [ ! -d "${output_dir}/subversion/" ]; then echo "Subversion build has FAILED!" exit fi # ---------------------------------------- # DYNAMIC LIBRARY LINKING # ---------------------------------------- echo "* Ignoring exports from dependent libraries" nm -gjU "${output_dir}/openssl/lib/libcrypto.a" \ | grep -v "libcrypto.a" \ >> "${output_dir}/subversion/lib/ignoresym.txt" nm -gjU "${output_dir}/openssl/lib/libssl.a" \ | grep -v "libssl.a" \ >> "${output_dir}/subversion/lib/ignoresym.txt" nm -gjU "${output_dir}/serf/lib/libserf-1.a" \ | grep -v "libserf-1.a" \ >> "${output_dir}/subversion/lib/ignoresym.txt" nm -gjU "${output_dir}/sqlite3/lib/libsqlite3.a" \ | grep -v "libsqlite3.a" \ >> "${output_dir}/subversion/lib/ignoresym.txt" echo "* Linking a dynamic library" /bin/sh "${script_dir}/subversion-1.10.6/libtool" \ --tag=CC --silent --mode=link \ gcc -dynamiclib \ -Werror=unknown-warning-option -g -O2 -g -O2 \ -unexported_symbols_list \ "${output_dir}/subversion/lib/ignoresym.txt" -dead_strip \ -mmacos-version-min=${macos_min_ver} \ -o "${output_dir}/subversion/lib/libSharpSvn.Native.dylib" \ -force_load "${output_dir}/subversion/lib/libsvn_client-1.a" \ "${output_dir}/subversion/lib/libsvn_wc-1.a" \ "${output_dir}/subversion/lib/libsvn_ra-1.a" \ "${output_dir}/subversion/lib/libsvn_ra_local-1.a" \ "${output_dir}/subversion/lib/libsvn_repos-1.a" \ "${output_dir}/subversion/lib/libsvn_fs-1.a" \ "${output_dir}/subversion/lib/libsvn_fs_fs-1.a" \ "${output_dir}/subversion/lib/libsvn_fs_x-1.a" \ "${output_dir}/subversion/lib/libsvn_fs_util-1.a" \ "${output_dir}/subversion/lib/libsvn_ra_svn-1.a" \ "${output_dir}/subversion/lib/libsvn_ra_serf-1.a" \ "${output_dir}/serf/lib/libserf-1.a" \ "${output_dir}/subversion/lib/libsvn_delta-1.a" \ "${output_dir}/subversion/lib/libsvn_diff-1.a" \ "${output_dir}/subversion/lib/libsvn_subr-1.a" \ "${output_dir}/openssl/lib/libcrypto.a" \ "${output_dir}/openssl/lib/libssl.a" \ "${output_dir}/apr-util/lib/libaprutil-1.a" \ "${output_dir}/apr/lib/libapr-1.a" \ "${output_dir}/sqlite3/lib/libsqlite3.a" \ -lsasl2 -lexpat -lz -liconv -lpthread \ -framework CoreFoundation \ -framework Security \ -framework CoreServices if [ ! -f "${output_dir}/subversion/lib/libSharpSvn.Native.dylib" ]; then echo "Dynamic library build has FAILED!" exit fi strip -x "${output_dir}/subversion/lib/libSharpSvn.Native.dylib" echo "The build SUCCEEDED!" # Maybe we should clean up a bit ... ```

Feel free to adapt it for Linux 🙂

unlink2 commented 3 years ago

Hello! Thank you very much I'll give it a try :)

ztatvialto commented 1 week ago

Here is the script I used on Ubuntu 24.04

I remember you should manually install scons and zlib-dev pkgs before executing it.

#!/usr/bin/env bash

script_dir=$(pwd)
output_dir=${script_dir}/__output__

echo "Script dir is: " $script_dir
echo "Output dir is set to: " $output_dir

export SED=sed

# ----------------------------------------
#              OPENSSL BUILD
# ----------------------------------------

if [ -d "${output_dir}/openssl/" ]; then
    echo "* OpenSSL is already built"
else
    echo "* Downloading OpenSSL"
    curl -OL "https://www.openssl.org/source/openssl-1.1.0k.tar.gz"

    echo "* Unpacking OpenSSL"
    tar xzf ./openssl-1.1.0k.tar.gz

    echo "* Changing directory to OpenSSL"
    pushd ./openssl-1.1.0k/

    echo "* Building OpenSSL"
    perl ./Configure                         \
    linux-x86_64                 \
        threads                              \
        no-dso                               \
        no-shared                            \
        no-hw                                \
        no-ssl3                              \
        no-gost                              \
        no-dtls                              \
        no-srp                               \
        no-unit-test                         \
        no-zlib                              \
        no-zlib-dynamic                      \
        enable-static-engine                 \
        -DSSL_FORBID_ENULL                   \
        --prefix="${output_dir}/openssl"     \
        --openssldir="/usr/lib/ssl"
    make depend && make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/openssl/" ]; then
    echo "OpenSSL build has FAILED!"
    exit
fi

# ----------------------------------------
#               SQLITE BUILD
# ----------------------------------------

if [ -d "${output_dir}/sqlite3/" ]; then
    echo "* SQLite is already built"
else
    echo "* Downloading SQLite"
    curl -OL "https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz"

    echo "* Unpacking SQLite"
    tar xzf ./sqlite-autoconf-3280000.tar.gz

    echo "* Changing directory to SQLite"
    pushd ./sqlite-autoconf-3280000/

    echo "* Building SQLite"
    ./configure --prefix="${output_dir}/sqlite3" \
        CPPFLAGS="-fPIC -DNDEBUG                 \
        -DSQLITE_TEMP_STORE=2                    \
        -DSQLITE_DEFAULT_PAGE_SIZE=4096          \
        -DSQLITE_DEFAULT_CACHE_SIZE=20000        \
        -DSQLITE_DEFAULT_MEMSTATUS=0             \
        -DSQLITE_DEFAULT_RECURSIVE_TRIGGERS=1    \
        -DSQLITE_POWERSAFE_OVERWRITE=1           \
        -DSQLITE_OMIT_AUTOINIT                   \
        -DSQLITE_OMIT_DEPRECATED                 \
        -DSQLITE_OMIT_LOAD_EXTENSION             \
        -DSQLITE_OMIT_PROGRESS_CALLBACK          \
        -DSQLITE_OMIT_TCL_VARIABLE               \
        -DSQLITE_OMIT_TRACE                      \
        -DSQLITE_OMIT_UTF16                      \
        -DSQLITE_OMIT_DATETIME_FUNCS             \
        -DSQLITE_OMIT_LOCALTIME                  \
        -DSQLITE_OMIT_SHARED_CACHE               \
        -DSQLITE_OMIT_BUILTIN_TEST               \
        -DSQLITE_OMIT_GET_TABLE                  \
        -DSQLITE_OMIT_SCHEMA_PRAGMAS             \
        -DSQLITE_OMIT_INTEGRITY_CHECK"
    make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/sqlite3/" ]; then
    echo "SQLite build has FAILED!"
    exit
fi

# ----------------------------------------
#                APR BUILD
# ----------------------------------------

if [ -d "${output_dir}/apr/" ]; then
    echo "* APR is already built"
else
    echo "* Downloading APR"
    curl -OL "https://archive.apache.org/dist/apr/apr-1.7.0.tar.bz2"

    echo "* Unpacking APR"
    tar xjf ./apr-1.7.0.tar.bz2

    echo "* Changing directory to APR"
    pushd ./apr-1.7.0/

    echo "* Building APR"
    ./configure --prefix="${output_dir}/apr" CPPFLAGS="-fPIC"
    make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/apr/" ]; then
    echo "APR build has FAILED!"
    exit
fi

# ----------------------------------------
#              EXPAT BUILD
# ----------------------------------------

if [ -d "${output_dir}/expat/" ]; then
    echo "* Expat is already built"
else
    echo "* Downloading Expat"
    curl -OL "https://github.com/libexpat/libexpat/releases/download/R_2_6_2/expat-2.6.2.tar.bz2"

    echo "* Unpacking Expat"
    tar xjf ./expat-2.6.2.tar.bz2

    echo "* Changing directory to Expat"
    pushd ./expat-2.6.2/

    echo "* Building Expat"
    ./configure --prefix="${output_dir}/expat" CPPFLAGS="-fPIC"
    make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/expat/" ]; then
    echo "Expat build has FAILED!"
    exit
fi

# ----------------------------------------
#              APR-UTIL BUILD
# ----------------------------------------

if [ -d "${output_dir}/apr-util/" ]; then
    echo "* APR-Util is already built"
else
    echo "* Downloading APR-Util"
    curl -OL "https://archive.apache.org/dist/apr/apr-util-1.6.1.tar.bz2"

    echo "* Unpacking APR-Util"
    tar xjf ./apr-util-1.6.1.tar.bz2

    echo "* Changing directory to APR-Util"
    pushd ./apr-util-1.6.1/

    echo "* Building APR-Util"
    ./configure --prefix="${output_dir}/apr-util" \
        --with-apr="${output_dir}/apr"            \
        --with-openssl="${output_dir}/openssl"    \
        --with-sqlite3="${output_dir}/sqlite3"    \
    --with-expat="${output_dir}/expat"    \
        --with-ldap=no                            \
        --with-odbc=no                            \
    CPPFLAGS="-fPIC"
    make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/apr-util/" ]; then
    echo "APR-Util build has FAILED!"
    exit
fi

# ----------------------------------------
#                SERF BUILD
# ----------------------------------------

if [ -d "${output_dir}/serf/" ]; then
    echo "* Serf is already built"
else
    echo "* Downloading Serf"
    curl -OL "https://archive.apache.org/dist/serf/serf-1.3.10.tar.bz2"

    echo "* Unpacking Serf"
    tar xjf ./serf-1.3.10.tar.bz2

    echo "* Changing directory to Serf"
    pushd ./serf-1.3.10/

    echo "* Building Serf"
    scons PREFIX="${output_dir}/serf"   \
        OPENSSL="${output_dir}/openssl" \
        APR="${output_dir}/apr"         \
        APU="${output_dir}/apr-util"    \
        SOURCE_LAYOUT=no                \
        APR_STATIC=yes                  \
    CFLAGS="-fPIC"          \
        install-lib                     \
        install-inc
    scons install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/serf/" ]; then
    echo "Serf build has FAILED!"
    exit
fi

# ----------------------------------------
#             SUBVERSION BUILD
# ----------------------------------------

if [ -d "${output_dir}/subversion/" ]; then
    echo "* Subversion is already built"
else
    echo "* Downloading Subversion"
    curl -OL "https://archive.apache.org/dist/subversion/subversion-1.10.6.tar.bz2"

    echo "* Unpacking Subversion"
    tar xjf ./subversion-1.10.6.tar.bz2

    echo "* Changing directory to Subversion"
    pushd ./subversion-1.10.6/

    ./configure --prefix="${output_dir}/subversion" \
        --with-apr="${output_dir}/apr"              \
        --with-apr-util="${output_dir}/apr-util"    \
        --with-serf="${output_dir}/serf"            \
        --with-sqlite="${output_dir}/sqlite3"       \
        --with-lz4=internal                         \
        --with-utf8proc=internal                    \
        --without-berkeley-db                       \
        --without-swig                              \
        --disable-shared                            \
        CPPFLAGS="-fPIC -DSVN_HI_RES_SLEEP_MS=1"

    make && make install

    echo "* Changing directory back"
    popd
fi

if [ ! -d "${output_dir}/subversion/" ]; then
    echo "Subversion build has FAILED!"
    exit
fi

# ----------------------------------------
#         DYNAMIC LIBRARY LINKING
# ----------------------------------------

echo "* Linking a dynamic library"

gcc -shared                                                      \
    -Werror=unknown-warning-option -g -O2                        \
    -o "${output_dir}/subversion/lib/libSharpSvn.Native.so"      \
    -Wl,--whole-archive                                          \
    "${output_dir}/subversion/lib/libsvn_client-1.a"             \
    "${output_dir}/subversion/lib/libsvn_wc-1.a"                 \
    "${output_dir}/subversion/lib/libsvn_ra-1.a"                 \
    "${output_dir}/subversion/lib/libsvn_ra_local-1.a"           \
    "${output_dir}/subversion/lib/libsvn_repos-1.a"              \
    "${output_dir}/subversion/lib/libsvn_fs-1.a"                 \
    "${output_dir}/subversion/lib/libsvn_fs_fs-1.a"              \
    "${output_dir}/subversion/lib/libsvn_fs_x-1.a"               \
    "${output_dir}/subversion/lib/libsvn_fs_util-1.a"            \
    "${output_dir}/subversion/lib/libsvn_ra_svn-1.a"             \
    "${output_dir}/subversion/lib/libsvn_ra_serf-1.a"            \
    "${output_dir}/serf/lib/libserf-1.a"                         \
    "${output_dir}/subversion/lib/libsvn_delta-1.a"              \
    "${output_dir}/subversion/lib/libsvn_diff-1.a"               \
    "${output_dir}/subversion/lib/libsvn_subr-1.a"               \
    "${output_dir}/openssl/lib/libcrypto.a"                      \
    "${output_dir}/openssl/lib/libssl.a"                         \
    "${output_dir}/apr-util/lib/libaprutil-1.a"                  \
    "${output_dir}/apr/lib/libapr-1.a"                           \
    "${output_dir}/sqlite3/lib/libsqlite3.a"                     \
    "${output_dir}/expat/lib/libexpat.a"                         \
    -lz -lpthread -ldl -lrt                                      \
    -Wl,--no-whole-archive

if [ ! -f "${output_dir}/subversion/lib/libSharpSvn.Native.so" ]; then
    echo "Dynamic library build has FAILED!"
    exit
fi

strip -x "${output_dir}/subversion/lib/libSharpSvn.Native.so"

echo "The build SUCCEEDED!"

# Maybe we should clean up a bit ...