MBS の projectTypeId をプラグイン開発者の都合で変えたい

正解:ProjectConverterを使う.

例によって,情報が殆どないが,他の部分に比べれば割とマシ.なんとなく想像で乗り越えられる.

   <extension
         point="org.eclipse.cdt.managedbuilder.core.projectConverter">
      <converter
            class="jp.pizzafactory.toppers.kernels.jsp.blackfin.converter.Converter"
            fromId="pizza.toppers.jsp.gnu.blackfin.bf533.exe"
            id="jp.pizzafactory.toppers.kernels.jsp.blackfin.bf533.converter1"
            mbsVersion="3.0.0"
            name="Convert to PF3.1.2 project"
            toId="cdt.managedbuild.target.gnu.bfin.elf.exe"/>
   </extension>

などとしておき,

package jp.pizzafactory.toppers.kernels.jsp.blackfin.converter;

import org.eclipse.cdt.managedbuilder.core.IBuildObject;
import org.eclipse.cdt.managedbuilder.core.IConvertManagedBuildObject;
import org.eclipse.cdt.managedbuilder.core.IProjectType;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject;


public class Converter implements IConvertManagedBuildObject {
	private static final String TO_ID = "cdt.managedbuild.target.gnu.bfin.elf.exe"; //$NON-NLS-1$

	public IBuildObject convert(IBuildObject buildObj, String fromId, String toId, boolean isConfirmed) {
		ManagedProject project = (ManagedProject)buildObj;
		IProjectType projectType =
			ManagedBuildManager.getProjectType(TO_ID);
		project.setProjectType(projectType);

		return project;
	}
}

などとする.本質的でないところでのハマり箇所があるとすれば,plugin.xmlエディタからjavaクラス生成するときに,IConvertManagedBuildObjectが自動的に入らないことくらい? これはスキーマの記述の甘さが原因.この手の抜けと言うか不親切さというか…は,CDTの他の部分でも散見される.困ったもんだ.…バグレポート書けって? (汗

この例では,projectTypeId だけが入れ替わっているので,とてもシンプル.
コマゴマと変えてしまった場合には,IProjectType辺りから手繰って行って,コマゴマと更新する必要がある.
コンテキストメニューに「convertTo」なんていう項目があるので,ユーザに手動を強いるのかと思うかもしれないけれど,

      <projectType
            id="pizza.toppers.jsp.gnu.blackfin.bf533.exe"
            isAbstract="false"
            isTest="false"
            convertToId="cdt.managedbuild.target.gnu.bfin.elf.exe"
            name="%projectType.name.blackfin.bf533">
      </projectType>

などとしておくと,水面下で動的に変換してくれる.ここの肝はconvertToIdアトリビュート
完全にリダイレクトしてくれるので,projectTypeエレメントに含まれるconfigurationその他のエレメントはざっくり消去しても構わない.

ここまでケアすると,殆どのユーザは,きっと気づかない.
プロパティを細かく設定する少数ユーザの,ごく一部が「あれ?」と思うくらいだろう.

これをサボると

プロジェクト非互換問題を引き起こす.
CDT系のソフトウェアをアップデートした後でプロジェクトが壊れていると言われる場合,原因は,十中八九,これ.
某社製品も3.0から3.1へのアップデートでごにょごにょ