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


概説

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 [email protected]: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