LoginSignup
1

More than 5 years have passed since last update.

TDM-GCC64(MinGW-w64) 処理系で bullet をビルドする CMake/ExternalProject の記述例

Last updated at Posted at 2016-05-18

概説

Bullet を TDM-GCC64 や mingw-w64 でビルドするには一手間必要だった。本項ではその一手間について解説し、 bullet を用いたい何らかのプロジェクトに対し CMake/ExternalProject により対応する方法を示す。

必要な一手間

Bullet のソース一式を github から回収して CMake しようとするとオプションをライブラリーのビルドに必要な最小限としてもソースコードへのパッチ(または翻訳時のエラーの無効化)が必要となる。

Bullet のソースディレクトリー src/Bullet3Serialize/Bullet2FileLoader/ に含まれる b3DNA.cppb3File.cpp についてほぼ同様のソース部分として、 long nr の宣言に対してポインター型の cp から nr = (long)cp; のようにポインターサイズのオブジェクトを long サイズのオブジェクトへ押し込んでしまうことになるコードが存在する。このコード部分について TDM-GCC64 などでも問題が起こらないようパッチする。

パッチは下記に具体的に例示し、適用は CMake/ExternalProject 機能の PATCH_COMMAND から patch コマンドにて行い CMake 処理で Bullet のソースコード一式の取得、パッチ、ビルドまでを簡単に対応する。

CMake/ExternalProject 記述例

bullet.cmake

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)

include(ExternalProject)

set(bullet_cxx_flags "${CMAKE_CXX_FLAGS} -DUSE_ADDR64 -DBT_NO_PROFILE")

ExternalProject_Add(external_bullet
  GIT_REPOSITORY git@github.com:bulletphysics/bullet3.git
  PATCH_COMMAND  COMMAND patch -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/patch/bullet.patch
  PREFIX         ${CMAKE_CURRENT_BINARY_DIR}/external/bullet
  INSTALL_DIR    ${CMAKE_CURRENT_BINARY_DIR}
  CMAKE_ARGS     -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                 -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                 -DCMAKE_CXX_FLAGS=${bullet_cxx_flags}

                 -DBUILD_CPU_DEMOS=off
                 -DUSE_GLUT=off
                 -DBUILD_OPENGL3_DEMOS=off
                 -DBUILD_BULLET2_DEMOS=off
                 -DBUILD_EXTRAS=off
                 -DBUILD_UNIT_TESTS=off
)

patch/bullet.patch

diff --git src/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp src/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
index 6b332f5..d9b5784 100644
--- src/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
+++ src/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
@@ -348,7 +348,7 @@ static int name_is_array(char* name, int* dim1, int* dim2) {
 void bDNA::init(char *data, int len, bool swap)
 {
        int *intPtr=0;short *shtPtr=0;
-       char *cp = 0;int dataLen =0;long nr=0;
+       char *cp = 0;int dataLen =0;size_t nr=0;
        intPtr = (int*)data;

        /*
@@ -390,7 +390,7 @@ void bDNA::init(char *data, int len, bool swap)


        {
-               nr= (long)cp;
+               nr= (size_t)cp;
        //long mask=3;
                nr= ((nr+3)&~3)-nr;
                while (nr--)
@@ -426,7 +426,7 @@ void bDNA::init(char *data, int len, bool swap)
        }

 {
-               nr= (long)cp;
+               nr= (size_t)cp;
        //      long mask=3;
                nr= ((nr+3)&~3)-nr;
                while (nr--)
diff --git src/Bullet3Serialize/Bullet2FileLoader/b3File.cpp src/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
index 01d3a69..4666927 100644
--- src/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
+++ src/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
@@ -391,7 +391,7 @@ void bFile::swapDNA(char* ptr)
        char* data = &ptr[20];
 //     void bDNA::init(char *data, int len, bool swap)
        int *intPtr=0;short *shtPtr=0;
-       char *cp = 0;int dataLen =0;long nr=0;
+       char *cp = 0;int dataLen =0;size_t nr=0;
        intPtr = (int*)data;

        /*
@@ -429,7 +429,7 @@ void bFile::swapDNA(char* ptr)


        {
-               nr= (long)cp;
+               nr= (size_t)cp;
        //long mask=3;
                nr= ((nr+3)&~3)-nr;
                while (nr--)
@@ -466,7 +466,7 @@ void bFile::swapDNA(char* ptr)
        }

 {
-               nr= (long)cp;
+               nr= (size_t)cp;
        //      long mask=3;
                nr= ((nr+3)&~3)-nr;
                while (nr--)

Reference

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1