/DEF:c:\filepath\myLib.def "コマンドラインオプションをbashスクリプトからMSコンパイラ/リンカーに渡す必要があります。パスは、bashスクリプトによってビルドプロセスの一部として生成されます。基本的に、スクリプトの引数パスは:
-DEF:/c/filepath/myLib.def
MSYSパス変換 が理解できないため、適切に処理できません/DEF:
部分。私がやればうまくいく
-DEF=/c/filepath/myLib.def
しかし、msツールはこのパラメーターを理解しません。要するに、MSYS bashでそのパラメーターを書き込んで適切な引数に変換するための適切な方法は何ですか?
Cygwinではcygpathを使用できますが、msysの誰かが(cygpathを使用するcygwinのスクリプトがあっても)必要ないと考えているため、同等のものはありません。
更新(2016年8月):
msys2 がcygpath
とともにインストールされるようになったため、この質問は関係ありません。
...
ここに私の研究を要約します。
の cygpath MSYSでこれに相当するのは、次のコマンドを使用することです。
{ cd /c/some/path && pwd -W; } | sed 's|/|\\|g'
このアプローチの問題は、既存のパスが必要なことです。 c:\some\path
は既存のディレクトリでなければなりません。しかし、本当の cygpath 存在しないパスをサポートします。
したがって、存在しないディレクトリへのパスを取得する必要がある場合は、パスのsed変換にフォールバックできます。
{ cd 2>/dev/null /c/some/path && pwd -W ||
echo /c/some/path | sed 's|^/\([a-z,A-Z]\)/|\1:/|'; } | sed 's|/|\\|g'
一口のスラッシュはsed
の引用規則を満たすためにあります。したがって、c:\some\path
がPCに存在しない場合は、フォワードスラッシュからバックスラッシュに変換し、/c/
をc:\
(またはその他のドライブ文字)に置き換えようとします。これの唯一の欠点は、/bin/does-not-exist
や/usr/bin/does-not-exist
などのマウントされたコンポーネントを含む存在しないパスが正しく機能しないことです。
もう1つのアプローチは、 cygpath MSYSのcygwinから。 cygwinがグローバル環境変数CYGPATHを設定するようです。つまり、通常のcmd.exeから使用できます。
%CYGPATH% -w /c/some/path
C:\some\path
またはMSYSから:
$CYGPATH -w /c/some/path
C:\some\path
cygwinで/c
を/cygdrive/c
にポイントするように設定している限り。ただし、この方法では、MSYSではなくcygwinインストールにある/usr
が出力されます。
要するに、msysは、msysコマンドライン引数変換ロジックによって自動的に処理されない場合のために、デフォルトのツールセットに実際のcygpathを実際に含める必要があると思います
使用する pwd -W
またはmsysのcygpathをここからダウンロード http://mingw.5.n7.nabble.com/enhanced-version-of-cygpath-td28556.html
cygpath -wa
上記のdmitri-rubinstein @と同様に、コードを少し整理し、逆の変換も追加しました。
winpath() {
if [ ${#} -eq 0 ]; then
: skip
Elif [ -f "$1" ]; then
local dirname=$(dirname "$1")
local basename=$(basename "$1")
echo "$(cd "$dirname" && pwd -W)/$basename" \
| sed \
-e 's|/|\\|g';
Elif [ -d "$1" ]; then
echo "$(cd "$1" && pwd -W)" \
| sed \
-e 's|/|\\|g';
else
echo "$1" \
| sed \
-e 's|^/\(.\)/|\1:\\|g' \
-e 's|/|\\|g'
fi
}
unixpath() {
echo "$1" \
| sed -r \
-e 's/\\/\//g' \
-e 's/^([^:]+):/\/\1/'
}
私はmsysgitでこれを使用しています:
winpath() {
if [ -z "$1" ]; then
echo "$@"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
私のbash fooは弱く、bash 3.1で正規表現を機能させることができなかったため、Perlスクリプトをハッキングしました。
#!/bin/env Perl
use strict;
my @r;
foreach my $e (@ARGV) {
$e=~s/\//\\/g;
$e=~s/^\\([A-Za-z])\\/\1:\\/;
Push @r, $e;
}
print join(" ", @r);
cygpath
このプログラムは、DOSパスをUNIXパスに、またはその逆に変換します
#!/bin/env Perl
# DOS to UNIX path conversion
# © John S. Peterson. License GNU GPL 3.
use strict;
use Getopt::Std;
# usage
if ($#ARGV == -1) {
print 'Usage: cygpath (-w) NAME...
Convert Unix and Windows format paths
Output type options:
-w, --windows print Windows form of NAMEs (C:\WINNT)
';
exit 0;
}
# option
my %opt;
getopts('w', \%opt);
# convert path
my @r;
foreach my $e (@ARGV) {
if ($opt{w}) {
# add drive letter suffix
$e =~ s,^\/([A-Za-z])\/,\1:\/,;
$e =~ s,\/,\\,g;
} else {
$e =~ s,\\,\/,g;
# add leading slash
$e = "/$e";
# remove drive letter suffix
$e =~ s,:,,;
}
Push @r, $e;
}
print join("\n", @r);
cygpath
このプログラムからの出力は、MSYSのCygwin cygpath
からの出力よりも優れています。
cygpath
変換されたパスからCygwinホームを削除します。cygpath "$CYGWIN/usr/local/bin"
/usr/local/bin
これは問題です
このプログラムはCygwinホームを削除しません
cygpath "$CYGWIN/usr/local/bin"
/c/file/program/cygwin/usr/local/bin
手動パス変換はMSYSで使用されます。
のために.
これはどう ? cmd //c echo <your path>
常に機能するとは限りませんが、私が見つけた最短のものです