diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bbe8dee --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: cpp +compiler: + - clang +before_script: + - sudo apt-get update -qq + - sudo apt-get install -y python-software-properties + - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/ppa + - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + - sudo apt-get update -qq + - sudo apt-get install -qq g++-4.8 + - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90 + - echo "deb http://llvm.org/apt/precise/ llvm-toolchain-precise-3.5 main" | sudo tee --append /etc/apt/sources.list + - echo "deb-src http://llvm.org/apt/precise/ llvm-toolchain-precise-3.5 main" | sudo tee --append /etc/apt/sources.list + - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - + - sudo apt-get update -qq + - sudo apt-get install -y g++-multilib libc6-dev-i386 lib32stdc++6 lib32z1-dev clang-3.5 + - CHECKOUT_DIR=$PWD && cd .. && $CHECKOUT_DIR/support/checkout-deps.sh && cd $CHECKOUT_DIR +script: + - mkdir build && cd build + - CC=clang-3.5 CXX=clang-3.5 python ../configure.py --enable-optimize + - ambuild \ No newline at end of file diff --git a/AMBuildScript b/AMBuildScript index c4f9d89..895be6b 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -131,6 +131,7 @@ class MMSConfig(object): '-msse', '-m32', ] + cfg.cxxflags += [ '-std=c++11' ] if (cxx.name == 'gcc' and cxx.majorVersion >= 4) or cxx.name == 'clang': cfg.cflags += ['-fvisibility=hidden'] cfg.cxxflags += ['-fvisibility-inlines-hidden'] diff --git a/core/sourcehook/FastDelegate.h b/core/sourcehook/FastDelegate.h index a515f65..8c1cbe5 100644 --- a/core/sourcehook/FastDelegate.h +++ b/core/sourcehook/FastDelegate.h @@ -178,8 +178,8 @@ inline OutputClass horrible_cast(const InputClass input){ // Cause a compile-time error if in, out and u are not the same size. // If the compile fails here, it means the compiler has peculiar // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + static_assert(sizeof(InputClass)==sizeof(u) && sizeof(InputClass)==sizeof(OutputClass), + "Can't use horrible cast"); u.in = input; return u.out; } @@ -294,8 +294,7 @@ struct SimplifyMemFunc { inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + static_assert(N >= 100, "Unsupported memeber function pointer on this compiler"); return 0; } }; @@ -352,7 +351,7 @@ struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { }s; } u; // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + static_assert(sizeof(function_to_bind)==sizeof(u.s), "Can't use horrible cast"); u.func = function_to_bind; bound_func = u.s.funcaddress; return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); @@ -409,9 +408,10 @@ struct SimplifyMemFunc MicrosoftVirtualMFP s; } u2; // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + static_assert(sizeof(function_to_bind)==sizeof(u.s) && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + && sizeof(u2.virtfunc)==sizeof(u2.s), + "Can't use horrible cast."); // Unfortunately, taking the address of a MF prevents it from being inlined, so // this next line can't be completely optimised away by the compiler. u2.virtfunc = &GenericVirtualClass::GetThis; @@ -455,7 +455,7 @@ struct SimplifyMemFunc // We can generate correct code in this case. To prevent an incorrect call from // ever being made, on MSVC6 we generate a warning, and call a function to // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; + static_assert(true, "VC6 Compiler Bug"); return 0; } }; @@ -487,7 +487,7 @@ struct SimplifyMemFunc } s; } u; // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + static_assert(sizeof(XFuncType)==sizeof(u.s), "Can't use horrible cast."); u.func = function_to_bind; bound_func = u.s.funcaddress; int virtual_delta = 0; @@ -781,7 +781,7 @@ public: // Ensure that there's a compilation failure if function pointers // and data pointers have different sizes. // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + static_assert(sizeof(GenericClass *)==sizeof(function_to_bind), "Can't use evil method."); m_pthis = horrible_cast(function_to_bind); // MSVC, SunC++ and DMC accept the following (non-standard) code: // m_pthis = static_cast(static_cast(function_to_bind)); @@ -796,7 +796,7 @@ public: // Ensure that there's a compilation failure if function pointers // and data pointers have different sizes. // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + static_assert(sizeof(UnvoidStaticFuncPtr)==sizeof(this), "Can't use evil method."); return horrible_cast(this); } #endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) diff --git a/support/checkout-deps.sh b/support/checkout-deps.sh new file mode 100755 index 0000000..8fea789 --- /dev/null +++ b/support/checkout-deps.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# This should be run inside a folder that contains MM:S, otherwise, it will checkout things into "mms-dependencies". + +trap "exit" INT + +ismac=0 +iswin=0 + +archive_ext=tar.gz +decomp="tar zxf" + +if [ `uname` = "Darwin" ]; then + ismac=1 +elif [ `uname` != "Linux" ] && [ -n "${COMSPEC:+1}" ]; then + iswin=1 + archive_ext=zip + decomp=unzip +fi + +if [ ! -d "metamod-source" ]; then + echo "Could not find a Metamod:Source repository; make sure you aren't running this script inside it." + exit 1 +fi + +checkout () +{ + if [ ! -d "$name" ]; then + git clone $repo -b $branch $name + if [ -n "$origin" ]; then + cd $name + git remote rm origin + git remote add origin $origin + cd .. + fi + else + cd $name + git checkout $branch + git pull origin $branch + cd .. + fi +} + +sdks=( csgo hl2dm nucleardawn l4d2 dods l4d css tf2 insurgency sdk2013 dota ) + +if [ $ismac -eq 0 ]; then + # Add these SDKs for Windows or Linux + sdks+=( orangebox blade episode1 ) + + # Add more SDKs for Windows only + if [ $iswin -eq 1 ]; then + sdks+=( darkm swarm bgt eye contagion ) + fi +fi + +# Check out a local copy as a proxy. +if [ ! -d "hl2sdk-proxy-repo" ]; then + git clone --mirror https://github.com/alliedmodders/hl2sdk hl2sdk-proxy-repo +else + cd hl2sdk-proxy-repo + git fetch + cd .. +fi + +for sdk in "${sdks[@]}" +do + repo=hl2sdk-proxy-repo + origin="https://github.com/alliedmodders/hl2sdk" + name=hl2sdk-$sdk + branch=$sdk + checkout +done + +`python -c "import ambuild2"` +if [ $? -eq 1 ]; then + repo="https://github.com/alliedmodders/ambuild" + origin= + branch=master + name=ambuild + checkout + + cd ambuild + if [ $iswin -eq 1 ]; then + python setup.py install + else + python setup.py build + echo "About to install AMBuild - press Ctrl+C to abort, otherwise enter your password for sudo." + sudo python setup.py install + fi +fi