プラットフォーム固有の構成ヘッダー
すべてのビルドで使用されるヘッダーにプラットフォーム固有の構成を生成するシステムが必要です。AutoConf 名は「config.h」です。「platform.h」、「porting.h」、「port.h」、またはテーマの他のバリエーションを見ることができます。このファイルには、構築中のプラットフォームに必要な情報が含まれています。バージョン管理されたプラットフォーム固有のバリアントを標準名にコピーすることで、ファイルを生成できます。コピーの代わりにリンクを使用できます。または、構成スクリプトを実行して、スクリプトがマシン上で検出した内容に基づいて内容を決定することもできます。
構成パラメーターのデフォルト値
コード:
#if (DAN==YES)
char MasterSkipFile[MAXSTR] = "/home/dp120728/tools/testarea/MasterSkipFile";
#endif
#if (UNIX==YES)
char MasterSkipFile[MAXSTR] = "/home/tregrp/tre1/tretools/MasterSkipFile";
#endif
#if (LINUX==YES)
char MasterSkipFile[MAXSTR] = "/ptehome/tregrp/tre1/tretools/MasterSkipFile";
#endif
次のものに置き換えたほうがよいでしょう:
#ifndef MASTER_SKIP_FILE_PATH
#define MASTER_SKIP_FILE_PATH "/opt/tretools/MasterSkipFile"
#endif
const char MasterSkipFile[] = MASTER_SKIP_FILE_PATH;
別の場所にビルドしたい場合は、次の方法で場所を設定できます。
-DMASTER_SKIP_FILE_PATH='"/ptehome/tregtp/tre1/tretools/PinkElephant"'
一重引用符と二重引用符の使用に注意してください。パスにバックスラッシュを使用して、コマンド ラインでこれを行うことは避けてください。同様のデフォルト メカニズムをあらゆる種類のものに使用できます。
#ifndef DEFAULTABLE_PARAMETER
#define DEFAULTABLE_PARAMETER default_value
#endif
デフォルトを適切に選択すると、多くのエネルギーを節約できます。
再配置可能なソフトウェア
1 か所にしかインストールできないソフトウェアの設計についてはよくわかりません。私の本では、製品の古いバージョン 1.12 を新しい 2.1 バージョンと同時にマシンにインストールできる必要があり、それらは独立して動作できる必要があります。ハードコーディングされたパス名はそれを無効にします。
プラットフォームではなく機能でパラメータ化
AutoConf ツールと平均的な代替システムとの主な違いは、プラットフォームではなく、機能に基づいて構成が行われることです。コードをパラメーター化して、使用する機能を識別します。機能はオリジナル以外のプラットフォームに表示される傾向があるため、これは非常に重要です。次のような行があるコードの世話をします:
#if defined(SUN4) || defined(SOLARIS_2) || defined(HP_UX) || \
defined(LINUX) || defined(PYRAMID) || defined(SEQUENT) || \
defined(SEQUENT40) || defined(NCR) ...
#include <sys/types.h>
#endif
持っている方がはるかに良いでしょう:
#ifdef INCLUDE_SYS_TYPES_H
#include <sys/types.h>
#endif
そして、必要なプラットフォームで以下を生成します。
#define INCLUDE_SYS_TYPES_H
(この例のヘッダーを文字通りに解釈しないでください。これは、私が克服しようとしている概念です。)
プラットフォームを機能のバンドルとして扱う
前のポイントの当然の結果として、プラットフォームを検出し、そのプラットフォームに適用可能な機能を定義する必要があります。これは、構成機能を定義するプラットフォーム固有の構成ヘッダーがある場所です。
製品機能はヘッダーで有効にする必要があります
(別の回答に対するコメントについて詳しく説明しています。)
製品に、条件付きで含めたり除外したりする必要がある機能がたくさんあるとします。例えば:
KVLOCKING
B1SECURITY
C2SECURITY
DYNAMICLOCKS
適切な定義が設定されている場合、関連するコードが含まれます。
#ifdef KVLOCKING
...KVLOCKING stuff...
#else
...non-KVLOCKING stuff...
#endif
cscopeなどのソース コード解析ツールを使用している場合は、KVLOCKING が定義されているタイミングを表示できると便利です。それが定義されている唯一の場所が、ビルド システムに散在するいくつかのランダムな Makefile にある場合 (ここで使用されるサブディレクトリが 100 あると仮定しましょう)、コードがまだいずれかで使用されているかどうかを判断するのは困難です。あなたのプラットフォーム。定義がどこかのヘッダー (プラットフォーム固有のヘッダー、または製品リリース ヘッダー) にある場合 (つまり、バージョン 1.x には KVLOCKING を含めることができ、バージョン 2.x には C2SECURITY を含めることができますが、2.5 には B1SECURITY を含めることができます)、そのことがわかります。 KVLOCKING コードはまだ使用されています。
20 年間の開発とスタッフの交代の後、人々は機能がまだ使用されているかどうかを知りません (安定しており、問題が発生しないためです。おそらく使用されていないためです)。また、KVLOCKING がまだ定義されているかどうかを確認する唯一の場所が Makefile 内にある場合、cscope などのツールはあまり役に立ちません。後でクリーンアップしようとすると、コードを変更するとエラーが発生しやすくなります。