<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/154411>154411</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [doc] install target fails if ocaml_doc not built (missing ocamldoc/html directory)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Acture
      </td>
    </tr>
</table>

<pre>
    ### Description
When building with -DLLVM_BUILD_DOCS=ON -DLLVM_ENABLE_OCAMLDOC=ON -DLLVM_INSTALL_DOCS=ON, running
`cmake --build . --target install`
fails with:
```
CMake Error at docs/cmake_install.cmake:41 (file):
  file INSTALL cannot find
 "$HOME/llvm-project/build/docs/ocamldoc/html/.": No such file
  or directory.
Call Stack (most recent call first):
  cmake_install.cmake:162 (include)
```


### Steps to reproduce
Such error does not provoke with no OCAML.
```
mkdir build
cd build
cmake -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD=AArch64 -DLLVM_DEFAULT_TARGET_TRIPLE=arm64-apple-darwin24.5.0 -DCMAKE_BUILD_TYPE="Release" -DLLVM_USE_LINKER=lld -DCMAKE_INSTALL_PREFIX="$HOME/repos/jeandle-llvm-install" -DLLVM_BUILD_DOCS=ON \
      -DLLVM_ENABLE_OCAMLDOC=ON \
 -DLLVM_INSTALL_DOCS=ON -DLLVM_BUILD_LLVM_DYLIB=On -DLLVM_DYLIB_COMPONENTS=all ../llvm
cmake --build . --target install

```

### Actual Behavior

install unconditionally tries to copy ${CMAKE_CURRENT_BINARY_DIR}/ocamldoc/html/. but that directory may not exist yet (the OCaml doc target has not been built), causing the install step to fail.

### Expected Behavior

Either:

- install should build the OCaml docs before installing them, or
- the OCaml docs should only be installed if they were generated (i.e., guarded by feature checks / target existence).

### Root Cause (CMake logic)

In llvm/docs/CMakeLists.txt the OCaml docs are generated by a custom target, but the install rule copies the output directory unconditionally:

```
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ocamldoc/html/.
        COMPONENT ocamldoc-html
        DESTINATION "${LLVM_INSTALL_OCAMLDOC_HTML_DIR}")
```

Unlike the Doxygen path (where doxygen-xxx targets are wired into a top-level doxygen target that participates in ALL), the OCaml docs target (ocaml_doc) is not on the build path that runs before install. As a result, cmake --build . --target install may execute before ${CMAKE_CURRENT_BINARY_DIR}/ocamldoc/html/ exists, and the copy fails.

### Workarounds

- Explicitly build the doc target before install:
```
cmake --build . --target ocaml_doc
cmake --build . --target install
```
- Or temporarily create the directory to unblock installation (not recommended):
```
mkdir -p build/docs/ocamldoc/html
cmake --build . --target install
```

### Environment

- OS: macOS (arm64-apple-darwin24.5.0)
- Toolchain: Apple Clang / lld
- OCaml tooling: ocamlc/ocamldoc/ocamlfind available and detected
- LLVM version/branch: (please fill in, e.g., 20.1.6 / commit SHA)
- Generator: Unix Makefiles


Same as shown in #125437 and #108742

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycV11z4joS_TXipcsuI77CAw8OhhnqEpgCsnfniRJyg3UjSy5ZTuDfb0m2IZCZvbs3xUPA3a3-OOeozcpSnBTihAyeySDpsMpm2kxibiuDnYNOLxNCe_UHEiy5EYUVWpEo_jNDBYdKyFSoE3wIm0GQLJf_etk_vy6WyT5ZT7ekl6xX7c-zVfy8nO3X0_hlmaynd88Wq-0uXi5vToROwVRKCXUiUUyGEc_ZG0IQ-BMhhCCwzJzQglClZVKSYUSi-MiELH0ypBfXjs0niqcvLsLMGG2AWUg1Lwmd-7j7Jkjov5Fe3O8CoU9HIZHQcR0KwH2FJlPgTClt4ShU6h4SSgntf1-_zAidS_meB4XRfyG3hM59yoTOmxM1Z7lMNSd0ntlcEjoPnXcvhpWGsuKZP8ifqA2kwiC32lxCVwKTEraW8TeXXq5LCwY5KgvcPTkKU9pPCf-6tu6QOm-huKxSX999n5rPdexbi0UJVoPBwui04i63rcsTfS9TjSW4XhRGv-s3rLGgNPhJhw_R87dUmBo3JIp5evu3HvA318pXJc7gxuU6URJKW5zs4s232W67361rlJFeEseGZ8N-a5HM5vHrctdY7nebxY_ljPQSZvJhP2BFITFImfkQivbDQRhBkExf4j9mDWp3P384a0LpBiWyEj8d_rqd7ZeL1R-zDeklUqZX1xa9Pzaz-eLftfsNDQYL7eb-FzKVSgw8OlrU3qI_soYMpn6I7u-_Maix-x2R7sPXLfq5XDy7h-raNPfLfrp--bFezVY75-nwFIYNmG_j-T3_oke-3YHIKQqT8IwZexfa1I8bV6gU1yoVTliYlBewRqBHHNfFBQjtk9Fz3enp62YzW-32z4tVvPm5TxYbMkp-zSk4VBZs5pjeUghydvFIxbMoLVzQOiLYDGE9Zbl0kgBNVRmrMX3ARuU8r-gUOKtKJ3jOq82_tFi4dJ36hI-Vz84FcovpQ-0zYTM0jUpFcXALlulKNrSAu9xKOOBRm-u5TRq5S8uHDR7tm1hayQscrn6Ygjg60wt8oEE4oULDXIpOFkIMXcBTxUyKKRwucETmrgPgGfK3Egidt13yfUTFnYp8KXyjtYUpq0p0cWv1lfokeCM5UbxQ4NF1lUZvtBSlLUN7to_VsLtcDxdgwKvS6rxJx6VdD_02GlNJdDDygMoQdGWL6jMkHrB3HchnJF_J-pQsNrPpbr35-U9ReaU0wJVu0NoF3upmkcy2u8Uq3i0czb2kkNHzHc1bKdh_370srwfTX4r6q5LiDX0XEn2-nFBBwWzmhvORORyk9a_B-XxuOlr3_EMYBxllNTCwuggkvqNszVsseKoVzFjBRcEsliAUxMtlw5uHWTZOhD754ve-S2MQNeu08vY1B3ySPrqp1CMHQohLYGCwrKQHwN_plNcAPCOvLLax_tksa_SX7lCmaqp6vfI7yBc2_KnNGzO6UmnZMn52LqTgwjpyXtn-SYPuK_260Py21FtL_zfd_hQzgLUBi3mhDTNCXoAbZLZGzY00VkOlDlLztzYMcwRy43TjM8h1nqNKMb1uI193gKCAv9mM_u_s74VXvQujVY7Kth1fb92alTO-3rpcf7cT1PQJYKe15BkTynnFzgymkqmTl0Dpt5agAbXV2umxM_RV8Pty_L9uVwT2zoRkB4keNClafzn4SI7Z8I6mdAs2nR8MU9ztsS7Vwi8jbjOUIJTDHIYnL9Q0Crvh0Kfkui4sbL_HbQXfarnU7qKBh62q3fS2LEdg_rL4UI60hPa6dNDvjXyK7lv0NOpTEsWddNJLx70x6-CkOxoMhr1ut_fUySaj8aE_TOkxGvdGnB5HA-Tjp0GXs_GwSwfY74gJjeggeuqOu-Pu0-Ap7I2GgyM7DPvMOUU90o8wd_enuxFCbU4dUZYVTrqDfr_b7Uh2QFn61xRKFX6Af-qkbpB0zMTvVIfqVJJ-JP39cQ1jhZX-_cZNYpBcdaABUv3GII430tT3vrvy_ZItSn_fP2DzRgZCx53KyElmbVE6rNM5ofOTsFl1CLnO2xXqy2uBr8DBvinxfUL_EwAA__9x0UDX">