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

# 概説

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

## 必要な一手間

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

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

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

# CMake/ExternalProject 記述例

## bullet.cmake

```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
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

- https://github.com/bulletphysics/bullet3
- http://bulletphysics.org/
    - http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=10827
    - http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=6762
    - http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=5483