Files
FESADev/phases/linear-static-3d-euler-beam/step7.md
T
2026-08-09 01:35:44 +09:00

104 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Step 7: CMake and GoogleTest Foundation
## 담당 역할과 필수 스킬
- 담당 역할: `implementation-agent`
- 필수 스킬: `fesa-cpp-msvc-tdd`
- 구현 전에 스킬과 Step 6 implementation plan을 끝까지 읽어라.
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/implementation-plans/linear-static-3d-euler-beam.md`
- `/docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md`
- `/docs/HARNESS_WORKFLOW.md`
- `/docs/HARNESS.md`
- `/CMakeLists.txt`가 이미 생겼다면 그 파일
## 소유 파일
- Create: `/CMakeLists.txt`
- Create: `/cmake/FesaDependencies.cmake`
- Create: `/include/fesa/build_info.hpp`
- Create: `/src/fesa/build_info.cpp`
- Create: `/src/fesa/CMakeLists.txt`
- Create: `/tests/CMakeLists.txt`
- Create: `/tests/unit/build_info_test.cpp`
- Create: `/docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`
## 작업
MSVC x64 Debug에서 이후 모든 C++ step을 TDD로 실행할 최소 build/test foundation을
구현하라. Step 6이 정한 exact file layout을 우선하되 최소 책임은 다음과 같다.
- `CMakeLists.txt`: C++17, `enable_testing()`, FESA target 구성과 하위 CMake 진입점.
- `cmake/FesaDependencies.cmake`: cache variable `FESA_GTEST_SOURCE_DIR`을 검증하고
`C:/git/googletest`를 source tree로 받을 수 있게 한다. 이 절대경로를 default나
production source에 하드코딩하지 않는다. oneMKL, oneTBB, HDF5 CONFIG package를 찾고
dependency target 차이는 이 파일 안에서 정규화한다.
- `include/fesa/build_info.hpp`, `src/fesa/build_info.cpp`: HDF5 metadata가 재사용할
`std::string_view solverVersion() noexcept`의 최소 안정 API.
- `src/fesa/CMakeLists.txt`: `fesa_solver` static library와 FESA에만 `/W4 /WX` 적용.
- `tests/CMakeLists.txt`, `tests/unit/build_info_test.cpp`: GoogleTest 연결,
`gtest_discover_tests`, `BuildInfo` regex와 공통 `linear-static-3d-euler-beam` label을 가진
최소 제품 test. 이후 이 phase의 모든 CTest는 같은 공통 label을 상속한다.
- `docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md`:
feature metadata, dependency/configure evidence와 Step 724별 RED/GREEN/VERIFY command,
exit code, 핵심 output, 변경 파일, requirement/test trace를 누적할 implementation report.
GoogleTest external target에는 `/W4 /WX`를 전파하지 않는다. MKL/TBB/HDF5 header나 type을
`build_info.hpp` 또는 다른 public header에 노출하지 않는다. 외부 checkout을 수정하거나
network fetch를 하지 않는다.
## Acceptance Criteria
먼저 `C:/git/googletest`의 revision을 read-only로 확인하라.
```powershell
if (-not (Test-Path 'C:/git/googletest/CMakeLists.txt')) { throw 'GoogleTest checkout is missing' }
$gtestRevision = git -C C:/git/googletest rev-parse HEAD
if ($gtestRevision -ne '04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4') {
throw "Unexpected GoogleTest revision: $gtestRevision"
}
```
구성·build·discovery·test를 실행한다.
```powershell
cmake -S . -B .harness/build -A x64 `
-DFESA_GTEST_SOURCE_DIR=C:/git/googletest `
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug -R BuildInfo --output-on-failure
$discovery = ctest --test-dir .harness/build -C Debug --show-only=json-v1 | ConvertFrom-Json
if ($discovery.tests.Count -lt 1) { throw 'CTest discovered zero tests' }
ctest --test-dir .harness/build -C Debug --output-on-failure
if (-not (Test-Path 'docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md')) {
throw 'Missing implementation evidence report'
}
```
## 검증 절차
1. build_info test를 먼저 작성하고 API가 없어 compile RED가 발생하는지 확인한 뒤
`build_info` production 파일을 추가한다.
2. 위 명령을 실행해 GREEN과 전체 VERIFY를 확인한다.
3. MSVC compiler metadata와 FESA target `/W4 /WX`, third-party warning 격리를 확인한다.
4. implementation report에 Step 7 RED/GREEN/VERIFY의 실제 command, exit code와 핵심
output을 기록한다.
5. Step 7을 `completed`로 바꾸고 build files, target names, dependency resolution을
`summary`에 기록한다. 설치 경로/환경이 실제로 없으면 `blocked`, 반복 구현 실패는
`error`로 기록한다.
## 금지사항
- dependency source를 vendor하거나 download하지 마라. 이유: 승인된 local install을 사용한다.
- GoogleTest 절대경로를 CMake default로 하드코딩하지 마라. 이유: cache variable 계약이다.
- FESA warning option을 third-party target에 적용하지 마라. 이유: 외부 코드 경고는 제품 책임이 아니다.
- 이후 solver module을 미리 만들지 마라. 이유: 이 step은 build/test foundation만 소유한다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.