Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18331] ファイルの概要

このコミットは、Go言語の標準ライブラリarchive/tarパッケージにおける、ファイルシステム統計情報(特にアクセス時刻 atime)の取り扱いに関する変更です。具体的には、DragonFly BSDオペレーティングシステム向けのビルドタグを追加し、当該OS上でのarchive/tarパッケージの互換性と正確な動作を保証することを目的としています。

コミット

archive/tarパッケージにDragonFly BSD向けのビルドタグを追加。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/bdd78a088dd07f1182dac2a17f9ff0d2353cc429

元コミット内容

commit bdd78a088dd07f1182dac2a17f9ff0d2353cc429
Author: Michael Gehring <mg@ebfe.org>
Date:   Wed Jan 22 10:58:38 2014 -0800

    archive/tar: add dragonfly build tag
    
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/55720044
---
 src/pkg/archive/tar/stat_atim.go | 2 +-\
 src/pkg/archive/tar/stat_unix.go | 2 +-\
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pkg/archive/tar/stat_atim.go b/src/pkg/archive/tar/stat_atim.go
index 72342ef37a..cf9cc79c59 100644
--- a/src/pkg/archive/tar/stat_atim.go
+++ b/src/pkg/archive/tar/stat_atim.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n \n-// +build linux openbsd solaris\n+// +build linux dragonfly openbsd solaris\n \n package tar\n \ndiff --git a/src/pkg/archive/tar/stat_unix.go b/src/pkg/archive/tar/stat_unix.go\nindex e5ba673ccf..cb843db4cf 100644\n--- a/src/pkg/archive/tar/stat_unix.go\n+++ b/src/pkg/archive/tar/stat_unix.go\n@@ -2,7 +2,7 @@\n // Use of this source code is governed by a BSD-style\n // license that can be found in the LICENSE file.\n \n-// +build linux darwin freebsd openbsd netbsd solaris\n+// +build linux darwin dragonfly freebsd openbsd netbsd solaris\n \n package tar\n \n```

## 変更の背景

このコミットの背景には、Go言語が様々なオペレーティングシステム(OS)をサポートする上で、OS固有のシステムコールやデータ構造の違いを吸収する必要があるという点があります。`archive/tar`パッケージは、TARアーカイブの作成と読み取りを行うためのものであり、ファイルシステム上のファイルのメタデータ(パーミッション、タイムスタンプなど)を正確に扱う必要があります。

特に、ファイルのアクセス時刻(`atime`)のような情報は、OSによってその取得方法や構造が異なる場合があります。Goの標準ライブラリは、このようなOS間の差異を吸収するために、ビルドタグ(build tags)というメカニズムを使用しています。

DragonFly BSDは、FreeBSDからフォークしたオープンソースのUnix系オペレーティングシステムであり、独自のカーネル設計やファイルシステム(HAMMER)などの特徴を持っています。GoがDragonFly BSDをサポートする際、`archive/tar`パッケージがこのOS上で正しく動作するためには、DragonFly BSD固有のファイルシステム統計情報の取得方法に対応する必要がありました。

このコミットは、DragonFly BSD環境で`archive/tar`パッケージが適切にビルドされ、ファイルシステム操作が正確に行われるようにするための対応の一環として行われました。これにより、GoアプリケーションがDragonFly BSD上でTARアーカイブを扱う際に、互換性の問題が発生するのを防ぎます。

## 前提知識の解説

### 1. Go言語のビルドタグ (Build Tags)

Go言語には「ビルドタグ」という機能があります。これは、ソースコードファイルの先頭に`// +build tagname`のようなコメントを記述することで、特定の環境でのみそのファイルをコンパイル対象とするための仕組みです。

*   **目的**: OS、アーキテクチャ、Goのバージョン、またはカスタムの条件に基づいて、条件付きコンパイルを実現します。これにより、OS固有のシステムコールやライブラリを使用するコードを、そのOSでのみビルドするように制御できます。
*   **記述方法**: ファイルの先頭に`// +build tag1 tag2`のように記述します。複数のタグをスペースで区切って記述すると、それらのタグの**いずれか**が有効な場合にファイルがコンパイルされます(論理OR)。`// +build tag1,tag2`のようにカンマで区切ると、それらのタグの**すべて**が有効な場合にコンパイルされます(論理AND)。
*   **OS/アーキテクチャタグ**: `linux`, `darwin` (macOS), `windows`, `freebsd`, `openbsd`, `netbsd`, `solaris`, `dragonfly`などのOS名や、`amd64`, `arm`, `386`などのアーキテクチャ名がよく使われます。これらはGoツールチェインによって自動的に設定されます。
*   **使用例**:
    *   `// +build linux`:Linuxでのみコンパイル。
    *   `// +build windows,amd64`:WindowsかつAMD64アーキテクチャでのみコンパイル。
    *   `// +build !windows`:Windows以外でコンパイル。

### 2. `archive/tar`パッケージ

Goの標準ライブラリに含まれる`archive/tar`パッケージは、TAR (Tape ARchive) ファイルフォーマットを読み書きするための機能を提供します。TARファイルは、複数のファイルを一つのアーカイブにまとめるための一般的なフォーマットで、Unix系システムで広く利用されています。

*   **主な機能**:
    *   `tar.NewReader`: TARアーカイブを読み取るためのリーダーを作成。
    *   `tar.NewWriter`: TARアーカイブを書き込むためのライターを作成。
    *   `tar.Header`: TARアーカイブ内の各ファイル(エントリ)のメタデータ(ファイル名、サイズ、パーミッション、タイムスタンプなど)を表す構造体。
*   **ファイルシステム統計情報**: TARアーカイブには、元のファイルのメタデータが含まれます。これには、ファイルの最終アクセス時刻(`atime`)、最終更新時刻(`mtime`)、作成時刻(`ctime`、Unix系ではinode変更時刻)などが含まれます。これらの時刻情報を正確に取得・設定するためには、OS固有のシステムコール(例: `stat`, `lstat`, `fstat`)を使用する必要があります。

### 3. DragonFly BSD

DragonFly BSDは、2003年にFreeBSD 4.8からフォークして開発が始まったオープンソースのUnix系オペレーティングシステムです。

*   **特徴**:
    *   **HAMMERファイルシステム**: DragonFly BSD独自の高性能なファイルシステムで、スナップショット、データ整合性、耐障害性などの機能を提供します。
    *   **メッセージパッシングカーネル**: よりモジュール化されたカーネル設計を目指しており、FreeBSDとは異なるアプローチを取っています。
    *   **目標**: 大規模なマルチプロセッサシステムでのパフォーマンスとスケーラビリティの向上を目指しています。
*   **Goとの関連**: Go言語は、Linux、macOS、Windowsだけでなく、FreeBSD、OpenBSD、NetBSD、Solaris、そしてDragonFly BSDといった様々なUnix系OSも公式にサポートしています。Goの標準ライブラリがこれらのOSで正しく動作するためには、OS固有の差異を適切に扱う必要があります。

## 技術的詳細

このコミットは、Goの`archive/tar`パッケージがファイルシステム統計情報を扱う際に、DragonFly BSD環境を適切に認識し、対応するためのものです。

Unix系OSでは、ファイルのメタデータ(サイズ、パーミッション、所有者、タイムスタンプなど)は`stat`システムコールによって取得されます。この`stat`システムコールが返す構造体(`struct stat`)は、OSによって微妙に異なる場合があります。特に、タイムスタンプ(アクセス時刻 `st_atime`、変更時刻 `st_mtime`、inode変更時刻 `st_ctime`)の精度や表現方法(秒単位かナノ秒単位かなど)が異なることがあります。

Goの`archive/tar`パッケージ内には、これらのOS固有の差異を吸収するためのファイルが存在します。

*   `src/pkg/archive/tar/stat_atim.go`: このファイルは、ファイルのアクセス時刻(`atime`)を扱うためのロジックを含んでいます。`atime`は、ファイルが最後に読み取られた時刻を示すもので、一部のOSではデフォルトで無効になっていたり、更新頻度が低かったりすることがあります。このファイルは、`atime`の取得方法が他のOSと異なる、または特別な考慮が必要なOS向けに、特定のビルドタグでコンパイルされるように設計されています。
*   `src/pkg/archive/tar/stat_unix.go`: このファイルは、一般的なUnix系OSにおけるファイルシステム統計情報(`stat`構造体)の取り扱いに関するロジックを含んでいます。多くのUnix系OSで共通の`stat`構造体を使用するものの、細かな違いがあるため、このファイルも複数のOSのビルドタグをまとめて指定しています。

このコミットでは、これらのファイルに`dragonfly`ビルドタグを追加することで、GoコンパイラがDragonFly BSD上でビルドを行う際に、これらのファイルがコンパイル対象に含まれるように指示しています。これにより、`archive/tar`パッケージはDragonFly BSDの`stat`構造体やタイムスタンプの取り扱いに関する特性を考慮したコードパスを使用できるようになり、正確なTARアーカイブの読み書きが可能になります。

具体的には、`stat_atim.go`は元々`linux openbsd solaris`のビルドタグを持っていましたが、これに`dragonfly`が追加されました。これは、DragonFly BSDにおける`atime`の挙動が、これらのOSと類似しているか、または特別な処理が必要であることを示唆しています。同様に、`stat_unix.go`はより広範なUnix系OS(`linux darwin freebsd openbsd netbsd solaris`)をカバーしていましたが、ここにも`dragonfly`が追加され、DragonFly BSDが一般的なUnix系システム統計情報の取り扱いにおいて、これらのOSのグループに属することを示しています。

この変更は、Go言語がより多くのプラットフォームで安定して動作するための継続的な努力の一環であり、特定のOSの特性に合わせた細かな調整が行われていることを示しています。

## コアとなるコードの変更箇所

このコミットによる変更は、以下の2つのファイルのビルドタグの行に限定されています。

1.  **`src/pkg/archive/tar/stat_atim.go`**
    ```diff
    --- a/src/pkg/archive/tar/stat_atim.go
    +++ b/src/pkg/archive/tar/stat_atim.go
    @@ -2,7 +2,7 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
     
    -// +build linux openbsd solaris
    +// +build linux dragonfly openbsd solaris
     
     package tar
     ```

2.  **`src/pkg/archive/tar/stat_unix.go`**
    ```diff
    --- a/src/pkg/archive/tar/stat_unix.go
    +++ b/src/pkg/archive/tar/stat_unix.go
    @@ -2,7 +2,7 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
     
    -// +build linux darwin freebsd openbsd netbsd solaris
    +// +build linux darwin dragonfly freebsd openbsd netbsd solaris
     
     package tar
     ```

## コアとなるコードの解説

変更されたのは、各ファイルの先頭にあるGoのビルドタグの行です。

*   **`stat_atim.go`**:
    *   変更前: `// +build linux openbsd solaris`
    *   変更後: `// +build linux dragonfly openbsd solaris`
    *   この変更は、`stat_atim.go`ファイルが、Linux、OpenBSD、Solarisに加えて、DragonFly BSD環境でもコンパイルされるべきであることを示しています。このファイルには、ファイルのアクセス時刻(`atime`)を扱うためのOS固有のロジックが含まれていると推測されます。DragonFly BSDの`atime`の挙動が、これらの既存のOSと共通のコードパスで処理できる、または処理すべき特性を持っているため、このタグが追加されました。

*   **`stat_unix.go`**:
    *   変更前: `// +build linux darwin freebsd openbsd netbsd solaris`
    *   変更後: `// +build linux darwin dragonfly freebsd openbsd netbsd solaris`
    *   この変更は、`stat_unix.go`ファイルが、Linux、macOS (darwin)、FreeBSD、OpenBSD、NetBSD、Solarisに加えて、DragonFly BSD環境でもコンパイルされるべきであることを示しています。このファイルは、一般的なUnix系OSにおけるファイルシステム統計情報(`stat`構造体)の取り扱いに関する共通のロジックを含んでいます。DragonFly BSDがこれらのOSと類似した`stat`構造体や関連するシステムコールを使用するため、このタグが追加されました。

これらの変更により、GoコンパイラはDragonFly BSD上で`archive/tar`パッケージをビルドする際に、これらのOS固有のファイルシステム操作を適切に処理するコードを含めることができるようになります。結果として、DragonFly BSD環境でのTARアーカイブの作成や展開が、より正確かつ互換性のある形で行われるようになります。

## 関連リンク

*   Go言語のビルドタグに関する公式ドキュメント: [https://pkg.go.dev/cmd/go#hdr-Build_constraints](https://pkg.go.dev/cmd/go#hdr-Build_constraints)
*   `archive/tar`パッケージのGoDoc: [https://pkg.go.dev/archive/tar](https://pkg.go.dev/archive/tar)
*   DragonFly BSD公式サイト: [https://www.dragonflybsd.org/](https://www.dragonflybsd.org/)

## 参考にした情報源リンク

*   Go言語の公式ドキュメント
*   DragonFly BSDの公式情報
*   Unix系OSにおける`stat`システムコールに関する一般的な知識
*   Go言語のソースコードリポジトリ (golang/go)
*   Goのコードレビューシステム (golang.org/cl)