SHT30 온습도 모니터링 시스템 전체 소스(서버 PHP, STM32 펌웨어, SQL, 테스트). 전체 코드리뷰에서 도출된 보안 하드닝 10건 반영: - 요청 서명 HMAC-SHA256 전환(펌웨어 sig.c/서버 config.php/호스트 패리티 동시) - 재전송 방어 + 기본 API_KEY fail-closed + 디바이스 문자열 정제(api/sensor_data.php) - 오프라인 SMS 중복 발송 경합 제거(cron_heartbeat.php, 원자적 선점) - CSV 수식 주입 방지(monthly_report.php), 감사로그 회전 락(retention_cleanup.php) - 브루트포스 카운터 원자화(login.php), 예시 TOTP 비밀키 무효화, 마이그레이션 멱등화 _backup/(하드코딩 실 비밀값 포함)·config.local.php·런타임 상태는 .gitignore 제외.
116 lines
5 KiB
PowerShell
116 lines
5 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
SHT30 온습도 STM32F407 펌웨어 빌드 (sht30_fw) — Ninja + arm-none-eabi.
|
|
|
|
.DESCRIPTION
|
|
firmware/ 를 소스 루트로, firmware/build 를 빌드 디렉터리로 CMake(Ninja)
|
|
구성/빌드한다. 크로스 툴체인 파일(cmake/arm-none-eabi-toolchain.cmake)을
|
|
사용하며, sht30_fw 실행 타깃을 산출한다.
|
|
|
|
폐쇄망(air-gapped): 이 스크립트는 네트워크에 접속하지 않는다. 모든 의존성은
|
|
firmware/third_party 에 사전 벤더링되어 있어야 한다(scripts/vendor.ps1 참조).
|
|
third_party 가 없으면 CMake configure 단계에서 즉시 실패한다.
|
|
|
|
.PARAMETER BuildType
|
|
CMAKE_BUILD_TYPE (Release | RelWithDebInfo | Debug). 기본 Release.
|
|
|
|
.PARAMETER Clean
|
|
빌드 디렉터리를 먼저 삭제하고 새로 구성한다(클린 빌드).
|
|
|
|
.PARAMETER ToolchainPrefix
|
|
arm-none-eabi 접두 경로 override (PATH 에 없을 때).
|
|
예) "C:/Program Files (x86)/Arm/GNU Toolchain mingw-w64-i686-arm-none-eabi/bin/arm-none-eabi-"
|
|
|
|
.EXAMPLE
|
|
pwsh firmware/scripts/build.ps1
|
|
pwsh firmware/scripts/build.ps1 -Clean -BuildType RelWithDebInfo
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[ValidateSet('Release', 'RelWithDebInfo', 'Debug')]
|
|
[string]$BuildType = 'Release',
|
|
|
|
[switch]$Clean,
|
|
|
|
[string]$ToolchainPrefix
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
# 빌드 타깃은 SHT30 단일 보드(sht30_fw).
|
|
$Target = 'sht30_fw'
|
|
|
|
# ── 경로 산출 (스크립트 위치 기준, cwd 무관) ─────────────────────────────────
|
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$FwRoot = Split-Path -Parent $ScriptDir # .../firmware
|
|
$BuildDir = Join-Path $FwRoot 'build'
|
|
$Toolchain = Join-Path $FwRoot 'cmake/arm-none-eabi-toolchain.cmake'
|
|
|
|
Write-Host "==== SHT30 STM32F407 펌웨어 빌드 ====" -ForegroundColor Cyan
|
|
Write-Host " firmware root : $FwRoot"
|
|
Write-Host " build dir : $BuildDir"
|
|
Write-Host " build type : $BuildType"
|
|
Write-Host " target : $Target"
|
|
|
|
# ── 사전 점검: 필수 도구 ─────────────────────────────────────────────────────
|
|
function Assert-Tool([string]$name) {
|
|
if (-not (Get-Command $name -ErrorAction SilentlyContinue)) {
|
|
throw "필수 도구를 찾을 수 없습니다: $name (PATH 확인)"
|
|
}
|
|
}
|
|
Assert-Tool 'cmake'
|
|
Assert-Tool 'ninja'
|
|
|
|
# 툴체인 컴파일러 존재 확인(접두 override 미지정 시 PATH 에서 arm-none-eabi-gcc).
|
|
if (-not $ToolchainPrefix) {
|
|
if (-not (Get-Command 'arm-none-eabi-gcc' -ErrorAction SilentlyContinue)) {
|
|
throw "arm-none-eabi-gcc 를 PATH 에서 찾을 수 없습니다. -ToolchainPrefix 로 지정하세요."
|
|
}
|
|
}
|
|
|
|
# ── 폐쇄망 가드: third_party 벤더링 확인 ─────────────────────────────────────
|
|
$ThirdParty = Join-Path $FwRoot 'third_party'
|
|
if (-not (Test-Path $ThirdParty)) {
|
|
throw @"
|
|
third_party 가 없습니다(폐쇄망 빌드 전 벤더링 필요).
|
|
networked 빌드 머신에서 먼저 실행하세요:
|
|
pwsh firmware/scripts/vendor.ps1
|
|
"@
|
|
}
|
|
|
|
# ── 클린 빌드 ────────────────────────────────────────────────────────────────
|
|
if ($Clean -and (Test-Path $BuildDir)) {
|
|
Write-Host " (clean) 기존 빌드 디렉터리 삭제: $BuildDir" -ForegroundColor Yellow
|
|
Remove-Item -Recurse -Force $BuildDir
|
|
}
|
|
|
|
# ── Configure (Ninja + 툴체인) ───────────────────────────────────────────────
|
|
$cfgArgs = @(
|
|
'-S', $FwRoot
|
|
'-B', $BuildDir
|
|
'-G', 'Ninja'
|
|
"-DCMAKE_TOOLCHAIN_FILE=$Toolchain"
|
|
"-DCMAKE_BUILD_TYPE=$BuildType"
|
|
)
|
|
if ($ToolchainPrefix) {
|
|
$cfgArgs += "-DTOOLCHAIN_PREFIX=$ToolchainPrefix"
|
|
}
|
|
|
|
Write-Host "`n[1/2] cmake configure …" -ForegroundColor Green
|
|
& cmake @cfgArgs
|
|
if ($LASTEXITCODE -ne 0) { throw "cmake configure 실패 (exit $LASTEXITCODE)" }
|
|
|
|
# ── Build ────────────────────────────────────────────────────────────────────
|
|
$buildArgs = @('--build', $BuildDir, '--target', $Target)
|
|
|
|
Write-Host "`n[2/2] cmake build ($Target) …" -ForegroundColor Green
|
|
& cmake @buildArgs
|
|
if ($LASTEXITCODE -ne 0) { throw "빌드 실패 (exit $LASTEXITCODE)" }
|
|
|
|
# ── 산출물 요약 ──────────────────────────────────────────────────────────────
|
|
Write-Host "`n==== 빌드 완료. 산출물 ====" -ForegroundColor Cyan
|
|
Get-ChildItem -Path $BuildDir -Recurse -Include '*.elf', '*.bin', '*.hex', '*.map' `
|
|
-ErrorAction SilentlyContinue |
|
|
ForEach-Object {
|
|
'{0,12:N0} {1}' -f $_.Length, $_.FullName
|
|
} | Write-Host
|