cpptasksで文字列をdefineする

問題

C++言語*1のビルドに ant cpptasks を使ってます.C++build.xmlからパス(文字列)を渡したいと思いましたが,なかなか上手くいきませんでした.

対策

「"${basedir}"」ではなく,「"¥"${basedir}¥""」などとします(「¥&」は半角で)

テスト用C++ソースコード

次のコードの「__BUILD_ROOT__」に文字列(path;フォルダ名)を与えるということです.

#include <iostream>
using namespace std;

int main()
{
  cout <<__BUILD_ROOT__ <<endl;
}

ビルド用 build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test00" default="build"  basedir="."
	 xmlns:cpptasks="antlib:net.sf.antcontrib.cpptasks">

  <pathconvert targetos="windows" property="build.root" dirsep="\\">
    <path location="."/>
  </pathconvert>

  <target name="build">
    <cpptasks:cc outtype="executable" subsystem="console" outfile="Test00">
      <defineset>
	<define name="__BUILD_ROOT__" value="\&quot;${build.root}\&quot;"/>
      </defineset>
      <fileset dir="." includes="*.cpp"/>
      <libset libs="stdc++"/>
      <linkerarg value="--enable-auto-import"/>
    </cpptasks:cc>
  </target>
</project>

  • 」で windows風のパスを「build.root」プロパティに設定します.
    • 「dirsep="¥¥"」として,エスケープさせた「¥」をフォルダ区切りに使います(「¥」はすべて半角で).
    • 設定するパスは,「location="."」,つまり,「ここ」,build.xmlのあるところです.
  • で文字列を渡します.
    • C言語コンパイラオプションの「-D __BUILD_ROOT__="パス"」に当たります.
    • 中のvalue=で「¥&quote;」(全部半角です)を付すことで,C言語に文字列として渡ります.
結果

etc@etcpc /cygdrive/e/home(etc)/projects/地デジ/test_ant_cpp_define_string
$ ant
Buildfile: E:\home(etc)\projects\地デジ\test_ant_cpp_define_string\build.xml

build:
1 total files to be compiled.
Starting link

BUILD SUCCESSFUL
Total time: 1 second

etc@etcpc /cygdrive/e/home(etc)/projects/地デジ/test_ant_cpp_define_string
$ ./Test00.exe
e:\home(etc)\projects\地デジ\test_ant_cpp_define_string

*1:cygwinMinGWwin7環境です