最新のMac環境でAMBER24がうまくインストールできない！！！（傾向と対策）

# 経緯
我らが尊師の書[AMBER24とAmberTools24のインストール方法(Ag_smithさん)](https://qiita.com/Ag_smith/items/9526142858f8ea5248c1)において特にSilicon Macでインストールがうまくできないと言う問題があるようです　個人的に原因を探ったので文章にまとめました

# 環境

* Machine: M2 MacBook Air, 16GB RAM
* OS: MacOS Sonoma 14.5 (尊師より少し新しい)
* Xcode: Xcode 15.4 (こちらも尊師より少し新しい)
* 尊師の書を参考にXcodeのcommand line utils的なものを入れておいてください
  * 通常はこれで大体の開発ツールが入ります

# 現象

以下のagsmith.shにおいて次のエラーでmakeが止まる
シェルファイルの名前に尊師の御名を書き記すことを許してほしい（Elton JohnのYour songの気持ちで）

### `agsmith.sh`

```bash
#!/bin/bash

# macOSのHomebrewで必要なソフトウェアをインストールしておく。
brew install cmake gcc wget open-mpi boost cmake-docs
# HomebrewのPrefixを設定
HOMEBREW_PREFIX=`brew --prefix`
echo $HOMEBREW_PREFIX

# HOMEBREW_PREFIXの値は、Intel Macならば/usr/local, M1 Macならば/opt/homebrewとなる。
# Homebrewのgfortran-13をgfortranとしてシンボリックリンクを貼っておく必要がある。
# これなくてよかった（gfortran14）
# ln -sf HOMEBREWPREFIX/bin/gfortran−13{HOMEBREW_PREFIX}/bin/gfortran

# # ダウンロードしてきたソースコードをtar jxvfで解凍する
tar jxvf AmberTools24.tar.bz2 ; tar jxvf Amber24.tar.bz2

cd amber24_src
# # updateを実行する
./update_amber --update
# # cmake用のbuildディレクトリに入る
cd build
# ###############################
# # ここが最重要の設定。-DCMAKE_INSTALL_PREFIXにインストール先ディレクトリを指定する
# # 下の例はホームディレクトリ以下のapps/amber24にインストールする設定。
# # MPIはONにする。Macの場合、COMPILERはCLANGを指定する。
# # -DBoost_DIR=${HOMEBREW_PREFIX}/opt/boostと-DFORCE_EXTERNAL_LIBS="boost"とすることで、
# # Homebrewで入れたBoostを使うようになる。なぜか必須のようだ。
# # 2024年5月2日時点で、macOS Sonoma 14.4とXCode 15.3とOpenMPIを使っている場合、gfortranのMPIのLinker flagsに問題があるようで、
# # -DMPI_Fortran_LINK_FLAGS=-Wl,-ld_classicをつける必要がある。
# ###############################
HOMEBREW_PREFIX=`brew --prefix`
AMBER_PREFIX=$(dirname $(dirname `pwd`))
cmake $AMBER_PREFIX/amber24_src \
    -DCMAKE_INSTALL_PREFIX=${HOME}/apps/amber24 -DCOMPILER=CLANG -DBLA_VENDOR=Apple \
    -DBoost_DIR=${HOMEBREW_PREFIX}/opt/boost -DFORCE_EXTERNAL_LIBS="boost" \
    -DMPI=TRUE -DBUILD_GUI=FALSE -DCUDA=FALSE -DINSTALL_TESTS=TRUE -DMPI_Fortran_LINK_FLAGS=-Wl,-ld_classic \
    -DDOWNLOAD_MINICONDA=TRUE -LA 2>&1 | tee cmake.log
# # Intel Macの人向け：mpi4pyをどうしても入れたい人へ
# # makeが終わってからでも良い
# ./CMakeFiles/miniconda/install/bin/python3.11 -m pip install mpi4py
# # Configureが正常終了していることを確認したらmakeとインストールを実行する
make -j8 install

```

# エラー時のシェル

```bash
[ 96%] Building Fortran object src/pmemd/src/CMakeFiles/pmemd.decomp.dir/dihedrals.F90.o
/Users/kitty/amber24/amber24_src/src/pmemd/src/dihedrals.i:2:7:

    2 |   use ti_decomp_mod
      |       1
Fatal Error: Cannot open module file 'ti_decomp_mod.mod' for reading at (1): No such file or directory
compilation terminated.
make[2]: *** [src/pmemd/src/CMakeFiles/pmemd.decomp.dir/dihedrals.F90.o] Error 1
make[1]: *** [src/pmemd/src/CMakeFiles/pmemd.decomp.dir/all] Error 2
make: *** [all] Error 2


```

# 現象の再現

* 10/10（100%）

# 原因

`hoge.i`というのはFortranのインクルードファイル的なもののようで、その中でamber modulesにあるライブラリ的なものを`use`で使おうとしてファイルが、ない！　って失敗している

つまり`ti_decomp_mod.mod`がないのだ（これが主な原因）

しかしソースコードの周囲を見ると

```fortran
#ifdef TIDECOMP
  use ti_decomp_mod
#endif
  use gbl_constants_mod
  use mdin_ctrl_dat_mod
  use parallel_dat_mod
  use prmtop_dat_mod
  use ti_mod
#ifdef _OPENMP_
  use omp_lib
#endif

  implicit none

```

エラーの原因である`use ti_decomp_mod`は`TIDECOMP`がdefineされているときに限り通過する

## つまりこれを回避してしまえばmakeは通る（makeるが勝ち?）

### `/amber24_src/src/pmemd/src/CMakelists.txt`の二行だけ修正を加えるとこれが可能となる

自分の環境では修正を施した代替ファイルを用意してしまって、まるっとダウンロードしたソースコードに
上書きしている
正直２行を示してこう書き換えてねでもいいのだしパッチファイルを作るのが正しいが
我々は次のファイルを`amber24_src`ディレクトリと同じ階層に配置するとその次に示す
`agsmith.sh`(改)を実行するだけで上書いて`make`が通るようになる（なんと！）

### `CMakeLists.txt.mod` と言う名前で`amber24_src`と同じ階層にこのファイルを配置する

```cmake
#CMake buildfile for PMEMD
add_subdirectory(xray)

set(PMEMD_FORTRAN_SOURCES gbl_constants.F90 gbl_datatypes.F90 state_info.F90 file_io_dat.F90
        external_dat.F90
        mdin_ctrl_dat.F90 mdin_emil_dat.F90 mdin_ewald_dat.F90 mdin_debugf_dat.F90 prmtop_dat.F90
        inpcrd_dat.F90 dynamics_dat.F90 emil.F90 img.F90 nbips.F90 offload_allocation.F90
        parallel_dat.F90 parallel.F90 gb_parallel.F90
        pme_direct.F90 pme_recip_dat.F90 pme_slab_recip.F90 pme_blk_recip.F90
        pme_slab_fft.F90 pme_blk_fft.F90 pme_fft_dat.F90 fft1d.F90
        bspline.F90 nebread.F90 neb.F90 pme_force.F90 pbc.F90 nb_pairlist.F90 gb_ene_hybrid.F90
        nb_exclusions.F90 cit.F90 dynamics.F90 bonds.F90 angles.F90 dihedrals.F90
        extra_pnts_nb14.F90 runmd.F90 resamplekin.F90 loadbal.F90 shake.F90 prfs.F90 mol_list.F90
        runmin.F90 constraints.F90 axis_optimize.F90 gb_ene.F90 veclib.F90 gb_force.F90
        timers.F90 pmemd_lib.F90 runfiles.F90 file_io.F90
        bintraj.F90 binrestart.F90 phmd.F90
        pmemd.F90 random.F90 degcnt.F90 erfcfun.F90 nmr_calls.F90 nmr_lib.F90
        get_cmdline.F90 master_setup.F90 pme_alltasks_setup.F90 pme_setup.F90
        ene_frc_splines.F90 gb_alltasks_setup.F90 nextprmtop_section.F90
        angles_ub.F90 dihedrals_imp.F90 cmap.F90 charmm.F90 charmm_gold.F90
        findmask.F90 remd.F90 multipmemd.F90 remd_exchg.F90 amd.F90 gamd.F90 ti.F90 gbsa.F90
        barostats.F90 scaledMD.F90 constantph.F90 constante.F90 energy_records.F90 constantph_dat.F90
        constante_dat.F90 external.F90 relaxmd.F90 sgld.F90 emap.F90 get_efield_energy.F90
		processor.F90 parallel_processor.F90 pme_fft_midpoint.F90 pme_recip_midpoint.F90
        dihedrals_midpoint.F90 angles_midpoint.F90 bonds_midpoint.F90 runreweight.F90
        dbg_arrays.F90 mcres.F90 ensure_alloc.F90 reservoir.F90 sams.F90 ramd.F90
        asm_CV.F90 asm_multiCV.F90 asm_splines_utilities.F90
        asm_utilities.F90 asm_CV_utilities.F90 asm.F90
        gti.F90 reaf.F90 rmsd.F90
        xray_globals.F90
        xray_interface.F90
        xray_interface_impl_cpu.F90
        xray_interface_pre_init_data.F90
        constants.F90 assert.F90
        hybridsolvent_remd.F90
        md_scheme.F90
        ti_decomp.F90)

set(PMEMD_FORTRAN_GPU_SOURCES
    xray_interface_impl_gpu.F90
)

set(PMEMD_C_SOURCES pmemd_clib.c)

set(PMEMD_CXX_SOURCES boost-gamma-distribution.cpp)

# PLUMED
set(PLUMED_SOURCE Plumed.c)

#Fortran NFE sources
set(PMEMD_NFE_SOURCES nfe_lib.F90 nfe_setup.F90 nfe_colvar.F90 nfe_smd.F90 nfe_abmd.F90 nfe_pmd.F90 nfe_bbmd.F90 nfe_stsm.F90)

message(STATUS "KMMD_LIB: ${KMMD_LIB}")

#build settings
#------------------------------------------------------------------------------------------

set_property(SOURCE ${PMEMD_C_SOURCES} PROPERTY COMPILE_FLAGS "${PMEMD_CFLAGS_SPC}")

set_property(SOURCE ${PMEMD_FORTRAN_SOURCES} ${PMEMD_NFE_SOURCES} PROPERTY COMPILE_FLAGS "${PMEMD_FFLAGS_SPC}")

# compile pmemd prmtop_dat at lower optimization for buggy gnu 5.x: see bug 303.
if(PMEMD_GNU_BUG_303)
	append_compile_flags(-fno-tree-vectorize prmtop_dat.F90)
endif()

# PLUMED
set_property(SOURCE ${PLUMED_SOURCE} PROPERTY COMPILE_FLAGS "${PMEMD_NO_OPT_CFLAGS_SPC}")

if(plumed_ENABLED)
    set_property(SOURCE ${PLUMED_SOURCE} PROPERTY COMPILE_DEFINITIONS __PLUMED_STATIC_KERNEL)
elseif(PLUMED_RUNTIME_LINK)
    set_property(SOURCE ${PLUMED_SOURCE} PROPERTY COMPILE_DEFINITIONS __PLUMED_HAS_DLOPEN)
endif()

#executables
#------------------------------------------------------------------------------------------

include_directories(.)

if(CUDA)
	add_subdirectory(cuda)

	# avoid building all of the source code multiple times by making an object library
	# --------------------------------------------------------------------
	add_library(pmemd_obj_cuda OBJECT ${PMEMD_C_SOURCES} ${PMEMD_CXX_SOURCES} ${PMEMD_FORTRAN_SOURCES} ${PMEMD_FORTRAN_GPU_SOURCES} ${PMEMD_NFE_SOURCES} ${PLUMED_SOURCE})
	config_module_dirs(pmemd_obj_cuda ${PMEMD_MOD_DIR}/cuda ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})

	add_dependencies(pmemd_obj_cuda amber_common netcdff)

	target_compile_definitions(pmemd_obj_cuda PRIVATE ${PMEMD_DEFINITIONS} ${PMEMD_CUDA_DEFINES})
    target_include_directories(pmemd_obj_cuda PRIVATE $<TARGET_PROPERTY:boost_headers,INTERFACE_INCLUDE_DIRECTORIES>)

    if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
        target_include_directories(
                pmemd_obj_cuda
                   PUBLIC
                $<TARGET_PROPERTY:PMEMD::xray_gpu,INTERFACE_INCLUDE_DIRECTORIES>
        )
        target_compile_definitions(
                pmemd_obj_cuda
                    PUBLIC
                $<TARGET_PROPERTY:PMEMD::xray_gpu,INTERFACE_COMPILE_DEFINITIONS>
        )
        add_dependencies(pmemd_obj_cuda PMEMD::xray_gpu)
    else()
        target_link_libraries(pmemd_obj_cuda PUBLIC PMEMD::xray_gpu) # requires CMake-3.12
    endif()

	if(MPI)
		make_mpi_version(pmemd_obj_cuda pmemd_obj_cuda_mpi LANGUAGES Fortran)
        target_compile_options(pmemd_obj_cuda_mpi PRIVATE ${PMEMD_MPI_FLAGS})
        target_compile_definitions(pmemd_obj_cuda_mpi PRIVATE ${PMEMD_MPI_DEFINITIONS})
		config_module_dirs(pmemd_obj_cuda_mpi ${PMEMD_MOD_DIR}/cuda_mpi ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})
	endif()

	# now make the executables
	# --------------------------------------------------------------------
	foreach(PRECISION ${PMEMD_CUDA_PRECISIONS})

		if(HIP)
			set(EXE_NAME pmemd.hip_${PRECISION})
		else()
			set(EXE_NAME pmemd.cuda_${PRECISION})
		endif()

		add_executable(${EXE_NAME} $<TARGET_OBJECTS:pmemd_obj_cuda>)
		set_property(TARGET ${EXE_NAME} PROPERTY LINKER_LANGUAGE Fortran)
        target_link_libraries(${EXE_NAME} pmemd_cuda_${PRECISION} emil amber_common netcdff netlib boost_headers ${KMMD_LIB} PMEMD::xray_gpu)
		cuda_add_cufft_to_target(${EXE_NAME})


        # PLUMED
        if(PLUMED_RUNTIME_LINK)
            target_link_libraries(${EXE_NAME} dl)
            set_target_properties(${EXE_NAME} PROPERTIES ENABLE_EXPORTS TRUE)
        else()
            if(plumed_ENABLED)
                target_link_libraries(${EXE_NAME} plumed)
            endif()
        endif()

		install(TARGETS ${EXE_NAME} DESTINATION ${BINDIR} COMPONENT pmemd_CUDA)

		if(MPI)
			add_executable(${EXE_NAME}.MPI $<TARGET_OBJECTS:pmemd_obj_cuda_mpi>)
			set_property(TARGET ${EXE_NAME}.MPI PROPERTY LINKER_LANGUAGE Fortran)
			target_link_libraries(${EXE_NAME}.MPI pmemd_cuda_${PRECISION}_mpi emil_mpi amber_common netcdff netlib mpi_c mpi_cxx mpi_fortran boost_headers PMEMD::xray_gpu ${KMMD_LIB})

            # PLUMED
            if(PLUMED_RUNTIME_LINK)
                target_link_libraries(${EXE_NAME}.MPI dl)
                set_target_properties(${EXE_NAME}.MPI PROPERTIES ENABLE_EXPORTS TRUE)
            else()
                if(plumed_ENABLED)
                    target_link_libraries(${EXE_NAME}.MPI plumed)
                endif()
            endif()

			install(TARGETS ${EXE_NAME}.MPI DESTINATION ${BINDIR} COMPONENT pmemd_CUDA)
		endif()

	endforeach()

	if(HIP)
	#copy pmemd.hip.SPFP to pmemd.hip.
	install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
                \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.hip_${PMEMD_DEFAULT_PRECISION}
		\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.hip)" COMPONENT pmemd_CUDA)

        if(MPI)
                install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
                        \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.hip_${PMEMD_DEFAULT_PRECISION}.MPI
			\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.hip.MPI)" COMPONENT pmemd_CUDA)
        endif()

        else()
	#copy pmemd.cuda.SPFP to pmemd.cuda.
	#This is actually kind of tricky, as CMake doesn't support renaming targets on install, so we have to do it ourselves.
	install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
		\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.cuda_${PMEMD_DEFAULT_PRECISION}
		\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.cuda)" COMPONENT pmemd_CUDA)

	if(MPI)
		install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
			\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.cuda_${PMEMD_DEFAULT_PRECISION}.MPI
			\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BINDIR}/pmemd.cuda.MPI)" COMPONENT pmemd_CUDA)
	endif()
	endif()
endif()

add_executable(pmemd ${PMEMD_C_SOURCES} ${PMEMD_CXX_SOURCES} ${PMEMD_FORTRAN_SOURCES} ${PMEMD_NFE_SOURCES} ${PLUMED_SOURCE})
config_module_dirs(pmemd ${PMEMD_MOD_DIR} ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})

# Address sanitizer must be first linked library
target_link_libraries(pmemd emil amber_common netcdff netlib boost_headers ${KMMD_LIB} PMEMD::xray_cpu)
target_compile_definitions(pmemd PRIVATE ${PMEMD_DEFINITIONS})
set_property(TARGET pmemd PROPERTY LINKER_LANGUAGE Fortran)


# PLUMED
if(PLUMED_RUNTIME_LINK)
    target_link_libraries(pmemd dl)
    set_target_properties(pmemd PROPERTIES ENABLE_EXPORTS TRUE)
else()
    if(plumed_ENABLED)
        target_link_libraries(pmemd plumed::plumed)
    endif()
endif()

if(mbx_ENABLED)
    target_link_libraries(pmemd MBX::mbx)
    target_compile_definitions(pmemd PRIVATE MBX)
endif()

install(TARGETS pmemd DESTINATION ${BINDIR} COMPONENT pmemd)

add_executable(pmemd.decomp ${PMEMD_C_SOURCES} ${PMEMD_CXX_SOURCES} ${PMEMD_FORTRAN_SOURCES} ${PMEMD_NFE_SOURCES} ${PLUMED_SOURCE})
config_module_dirs(pmemd.decomp ${PMEMD_MOD_DIR} ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})

# Address sanitizer must be first linked library
target_link_libraries(pmemd.decomp emil amber_common netcdff netlib boost_headers ${KMMD_LIB} PMEMD::xray_cpu)
#list(APPEND PMEMD_DEFINITIONS TIDECOMP)
target_compile_definitions(pmemd.decomp PRIVATE ${PMEMD_DEFINITIONS})
set_property(TARGET pmemd.decomp PROPERTY LINKER_LANGUAGE Fortran)

# PLUMED
if(PLUMED_RUNTIME_LINK)
    target_link_libraries(pmemd.decomp dl)
    set_target_properties(pmemd.decomp PROPERTIES ENABLE_EXPORTS TRUE)
else()
    if(plumed_ENABLED)
        target_link_libraries(pmemd.decomp plumed::plumed)
    endif()
endif()

if(mbx_ENABLED)
    target_link_libraries(pmemd.decomp MBX::mbx)
    target_compile_definitions(pmemd.decomp PRIVATE MBX)
endif()

install(TARGETS pmemd.decomp DESTINATION ${BINDIR} COMPONENT pmemd_decomp)

#list(REMOVE_ITEM PMEMD_DEFINITIONS TIDECOMP)

# MPI parallelization
if(MPI)
	make_mpi_version(pmemd pmemd.MPI LANGUAGES Fortran)
	config_module_dirs(pmemd.MPI ${PMEMD_MOD_DIR}/mpi ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})

    target_compile_definitions(pmemd.MPI PRIVATE ${PMEMD_MPI_DEFINITIONS})
    target_compile_options(pmemd.MPI PRIVATE ${PMEMD_MPI_FLAGS})

	install(TARGETS pmemd.MPI DESTINATION ${BINDIR} COMPONENT pmemd_MPI)

    if(OPENMP AND PMEMD_OMP_MPI)
        make_openmp_version(pmemd.MPI pmemd.OMP.MPI LANGUAGES Fortran)
        config_module_dirs(pmemd.OMP.MPI ${PMEMD_MOD_DIR}/omp_mpi ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})
        
        target_compile_definitions(pmemd.OMP.MPI PRIVATE ${PMEMD_OMP_DEFINITIONS})
        target_compile_options(pmemd.OMP.MPI PRIVATE ${PMEMD_OMP_FLAGS})
        target_link_libraries(pmemd.OMP.MPI openmp_fortran ${KMMD_LIB})

        install(TARGETS pmemd.OMP.MPI DESTINATION ${BINDIR} COMPONENT pmemd_MPI)
    endif()

endif()

# MIC parallelization
if(MIC_KL)

    # mic2 only exists as an MPI version
    copy_target(pmemd.MPI pmemd.mic_kl.MPI)
    config_module_dirs(pmemd.mic_kl.MPI ${PMEMD_MOD_DIR}/mic_kl ${AMBER_COMMON_MOD_DIR} ${NETCDF_FORTRAN_MOD_DIR})
    target_link_libraries(pmemd.mic_kl.MPI openmp_fortran)

    # add mic flags
    target_compile_options(pmemd.mic_kl.MPI PRIVATE ${PMEMD_MIC_FLAGS})

    # also add openmp flags
    target_compile_definitions(pmemd.mic_kl.MPI PRIVATE ${PMEMD_OMP_DEFINITIONS})
    target_compile_options(pmemd.mic_kl.MPI PRIVATE ${PMEMD_OMP_FLAGS})

    install(TARGETS pmemd.mic_kl.MPI DESTINATION ${BINDIR} COMPONENT pmemd_MIC)
endif()

```

## 修正箇所

```cmake
223: #list(APPEND PMEMD_DEFINITIONS TIDECOMP) # 223行目をコメントアウト

244: #list(REMOVE_ITEM PMEMD_DEFINITIONS TIDECOMP) # 244行目もコメントアウト
```

## `agsmith.sh`(改)

```bash
#!/bin/bash

# macOSのHomebrewで必要なソフトウェアをインストールしておく。
brew install cmake gcc wget open-mpi boost cmake-docs
# HomebrewのPrefixを設定
HOMEBREW_PREFIX=`brew --prefix`
echo $HOMEBREW_PREFIX

# HOMEBREW_PREFIXの値は、Intel Macならば/usr/local, M1 Macならば/opt/homebrewとなる。
# Homebrewのgfortran-13をgfortranとしてシンボリックリンクを貼っておく必要がある。
# これなくてよかった（gfortran14）
# ln -sf HOMEBREWPREFIX/bin/gfortran−13{HOMEBREW_PREFIX}/bin/gfortran
# # ダウンロードしてきたソースコードをtar jxvfで解凍する
tar jxvf AmberTools24.tar.bz2 ; tar jxvf Amber24.tar.bz2
# つけるタイプの魔法（？）
cp ./CMakelists.txt.mod ./amber24_src/src/pmemd/src/CMakelists.txt

cd amber24_src
# # updateを実行する
./update_amber --update
# # cmake用のbuildディレクトリに入る
cd build
# ###############################
# # ここが最重要の設定。-DCMAKE_INSTALL_PREFIXにインストール先ディレクトリを指定する
# # 下の例はホームディレクトリ以下のapps/amber24にインストールする設定。
# # MPIはONにする。Macの場合、COMPILERはCLANGを指定する。
# # -DBoost_DIR=${HOMEBREW_PREFIX}/opt/boostと-DFORCE_EXTERNAL_LIBS="boost"とすることで、
# # Homebrewで入れたBoostを使うようになる。なぜか必須のようだ。
# # 2024年5月2日時点で、macOS Sonoma 14.4とXCode 15.3とOpenMPIを使っている場合、gfortranのMPIのLinker flagsに問題があるようで、
# # -DMPI_Fortran_LINK_FLAGS=-Wl,-ld_classicをつける必要がある。
# ###############################
HOMEBREW_PREFIX=`brew --prefix`
AMBER_PREFIX=$(dirname $(dirname `pwd`))
cmake $AMBER_PREFIX/amber24_src \
    -DCMAKE_INSTALL_PREFIX=${HOME}/apps/amber24 -DCOMPILER=CLANG -DBLA_VENDOR=Apple \
    -DBoost_DIR=${HOMEBREW_PREFIX}/opt/boost -DFORCE_EXTERNAL_LIBS="boost" \
    -DMPI=TRUE -DBUILD_GUI=FALSE -DCUDA=FALSE -DINSTALL_TESTS=TRUE -DMPI_Fortran_LINK_FLAGS=-Wl,-ld_classic \
    -DDOWNLOAD_MINICONDA=TRUE -LA 2>&1 | tee cmake.log
# # Intel Macの人向け：mpi4pyをどうしても入れたい人へ
# # makeが終わってからでも良い
# ./CMakeFiles/miniconda/install/bin/python3.11 -m pip install mpi4py
# # Configureが正常終了していることを確認したらmakeとインストールを実行する
make -j8 install

```

## そして

* 実はamber24ではわりと最近のアップデートでFortranのソースコードにこの`TIDECOMP`で`ifdef`を切りまくって新しい修正を入れている
* つまりこれを無効化するのは最新の修正（＝私たちの欲しかったもの）が入らないのでコレジャナイ感がすごい

## 本当に必要な修正は

* `amber24_src/build/amber-modules/pmemd`以下に`ti_decomp_mod.mod`があることが望ましい
* またそのファイルをFortranソースコードから作り出すようにcmakeを調整する必要がある
* たぶん配布物を入れ忘れただけのような気がする
* もしLinuxで最新のビルドが問題なければ単純にMac向けアップデータのダウンロードしたペイロードに必要なファイルが入ってなかっただけである

# そして伝説へ...

尊師にはもちろん広島カープにも頑張ってほしい

`Q.E.D`