Windowsからワインにどのように移行しましたか?

画像

前文



C ++で書かれた古いプロジェクトがいくつかありますが、それらは可能な限り開発中です。 それは見えるだろう-問題は何ですか? 悲しいかな、これは私のお気に入りのAdobe InDesignの通常のプラグインの束です。



また、新しいCreative Suiteがリリースされるたびに、このビジネスを移植する必要があります。 興味深いことに、主な取り組みは、新しいルールに従って新しいバージョンを組み立て、インストーラーを曲げることです。 なぜなら、「コンパイルする」段階に達した場合、原則として動作するからです。 もちろん微妙な違いがあります-たとえば、ある時点で、PlaceGunは選択された複数の画像のレイアウトを停止しました。最初の画像のみです。 しかし、次回については。



そしてもちろん-私は一度にすべてのバージョンとすべてのプラットフォームのためにそれを収集したいと思います。



したがって、アセンブリには、 両方が必要です











画像

gmakeに行く-利益



なぜそう ああ、私は言いませんでした-まだMacOSXがあります。 さようならnmakeオプションはありません。



そして最終的に、私たちはそのような悪夢を手に入れます。

非表示のテキスト
  1. cl-cs3.mak
  2. cl-cs4.mak
  3. cl-cs5.mak
  4. cl-cs55.mak
  5. cl-cs6.mak
  6. cl-cc.mak
  7. cl-cc2014.mak
  8. cl.mak
  9. commplugs.mak
  10. gcc-cs3.mak
  11. gcc-cs4.mak
  12. gcc-cs5.mak
  13. gcc-cs55.mak
  14. gcc-cs6.mak
  15. gcc-cc.mak
  16. gcc-cc2014.mak
  17. gcc.mak
  18. mac-defs.mak
  19. platform-impl.mak
  20. platform-targets.mak
  21. platform.mak
  22. win-defs.mak






そして、それは次のように始まります:

make ARCH=x64 INDD=cc2014 compile
      
      







明らかなことは、プラットフォームはunameによって定義されていることです。 そして、各パーツはmake -C fooとして標準的な方法で組み立てられます。



各コンポーネントの説明は次のようになります

非表示のテキスト
 include ../../make/platform.mak TARGET=../../../lib/$(ARCH)/$(INDD)/libz.$(LibSuffix) OBJS=\ $(ARCH)/$(INDD)/adler32.$(OBJSuffix) \ $(ARCH)/$(INDD)/compress.$(OBJSuffix) \ $(ARCH)/$(INDD)/crc32.$(OBJSuffix) \ $(ARCH)/$(INDD)/deflate.$(OBJSuffix) \ $(ARCH)/$(INDD)/gzio.$(OBJSuffix) \ $(ARCH)/$(INDD)/infback.$(OBJSuffix) \ $(ARCH)/$(INDD)/inffast.$(OBJSuffix) \ $(ARCH)/$(INDD)/inflate.$(OBJSuffix) \ $(ARCH)/$(INDD)/inftrees.$(OBJSuffix) \ $(ARCH)/$(INDD)/trees.$(OBJSuffix) \ $(ARCH)/$(INDD)/uncompr.$(OBJSuffix) \ $(ARCH)/$(INDD)/zutil.$(OBJSuffix) \ all: $(TARGET) $(TARGET): $(OBJS) $(AR) $(LFLAGS) $(OBJS) clean: $(RMRF) $(TARGET) $(OBJS)
      
      







そしてこれらはすべて、WinXPの下で(およびhackintoshの下でも同じ)別の専用仮想マシンで機能しました。



私はこれらの情熱をその時点からそれまでに描いているわけではないようで、最も興味深い抜粋だけをあげます。 たとえば、プロジェクトルートと、コンパイルが実行されるプラットフォームを計算する方法は次のとおりです。



 PR:=$(subst make/,,$(dir $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))) OSA:=$(shell uname -o) ifeq (Darwin,$(OSA)) OS=mac else OS=win endif
      
      







これが、Boostを探す場所を決定する方法です(バージョンごとに管理しているため、ここには2つの部分があります。マクロを定義してから使用します)。

 ifeq ($(ARCH),x86) BoostARCH=32 else BoostARCH=64 endif BoostLib=$(subst \,/,$(AdobeSDK))/external/dva/third_party/boost_libraries/bin.v2/libs/boost_$1/lib/$(OS)/release/$(BoostARCH)/boost_$1.$(LibSuffix) BoostFilesystemLib=$(call BoostLib,filesystem) BoostThreadLib=$(call BoostLib,threads) BoostRegexLib=$(call BoostLib,regex) BoostSystemLib=$(call BoostLib,system)
      
      







私がこれを自分の手でタイプしたのではなく、バッチファイルのパックを書いたが、MinGWの下で:



genmake-for-dll.batコンポーネント名[ソースへのパス[ターゲットディレクトリ]]
 @echo off rem genmake component-name [path-to-sources [target-directory]] set CN=%1 set FP=%2 if -%1==- set CN=default if -%2==- set FP=. if -%3==- set TD=. echo> MakeF COMPONENT=%CN% echo>> MakeF include ../make/platform.mak echo>> MakeF TARGET=$(OBJDIR)/$(COMPONENT).$(DLLSuffix) echo>> MakeF OBJS=\ find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "\t$(OBJDIR)/" $1 ".$(OBJSuffix)\t\\\"; }' | sed -e 's/\.cpp\./\./' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%??' >> MakeF echo>> MakeF # echo>> MakeF HEADERS=\ find %FP% -type f -name '*.h*' | grep -v .svn | awk '{ print "\t" $1 "\t\\\"; }' > headers >> MakeF echo>> MakeF # echo>> MakeF # echo>> MakeF all: $(TARGET) echo>> MakeF # echo>> MakeF $(TARGET): $(OBJS) echo>> MakeF $(LINK) $(LDFLAGS) $(OBJS) $(XLIBS) echo>> MakeF if [ -f $@.manifest ] ; then mt -nologo -manifest $@.manifest "-outputresource:$@;2"; fi echo>> MakeF # echo>> MakeF clean: echo>> MakeF rm -f $(TARGET) $(OBJS) echo>> MakeF # find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "$(OBJDIR)/" $1 ".$(OBJSuffix) : " $1 " $(HEADERS)\n\t$(CC) $(CFLAGS) " $1 "\n"; }' | sed -e 's/.cpp././' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%/?/?' >> MakeF echo>> MakeF #EOF mv MakeF Makefile
      
      







genmake-for-lib.dllコンポーネント名[ソースへのパス[ターゲットディレクトリ]]
 @echo off rem genmake component-name [path-to-sources [target-directory]] set CN=%1 set FP=%2 if -%1==- set CN=default if -%2==- set FP=. if -%3==- set TD=. echo> MakeF COMPONENT=%CN% echo>> MakeF include ../make/platform.mak echo>> MakeF TARGET=$(OBJDIR)/lib$(COMPONENT).$(LibSuffix) echo>> MakeF OBJS=\ find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "\t$(OBJDIR)/" $1 ".$(OBJSuffix)\t\\\"; }' | sed -e 's/\.cpp\./\./' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%??' >> MakeF echo>> MakeF # echo>> MakeF HEADERS=\ find %FP% -type f -name '*.h*' | grep -v .svn | awk '{ print "\t" $1 "\t\\\"; }' > headers >> MakeF echo>> MakeF # echo>> MakeF # echo>> MakeF $(TARGET): $(OBJS) echo>> MakeF $(AR) $(LFLAGS) $(OBJS) echo>> MakeF # echo>> MakeF clean: echo>> MakeF rm -f $(TARGET) $(OBJS) echo>> MakeF # find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "$(OBJDIR)/" $1 ".$(OBJSuffix) : " $1 " $(HEADERS)\n\t$(CC) $(CFLAGS) " $1 "\n"; }' | sed -e 's/.cpp././' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%/?/?' >> MakeF echo>> MakeF #EOF mv MakeF Makefile
      
      







genmake-for-indd.batプラグイン名[ソースへのパス[ターゲットディレクトリ]]
 @echo off setlocal rem genmake plugin-name [path-to-sources [target-directory]] set CN=%1 set FP=%2 if -%1==- set CN=plugin if -%2==- set FP=. if -%3==- set TD=. echo> MakeF COMPONENT=%CN% echo>> MakeF include ../make/platform.mak echo>> MakeF PluginName=$(COMPONENT) echo>> MakeF TARGET_DIR=$(OBJDIR)/$(PluginPrefix) echo>> MakeF TARGET=$(TARGET_DIR)/$(PluginName)$(PluginSuffix) echo>> MakeF CFLAGS+=-I ../common echo>> MakeF LIBS+=$(call add_component_ref,vl) $(call add_component_ref,common) echo>> MakeF OBJS=\ find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "\t$(OBJDIR)/" $1 ".$(OBJSuffix)\t\\\"; }' | sed -e 's/\.cpp\./\./' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%??' >> MakeF echo>> MakeF $(COMMON_PLUGIN_OBJS) echo>> MakeF # echo>> MakeF HEADERS=\ find %FP% -type f -name '*.h*' | grep -v .svn | awk '{ print "\t" $1 "\t\\\"; }' > headers >> MakeF echo>> MakeF # echo>> MakeF # echo>> MakeF ifeq (win,$(OS)) echo>> MakeF OBJS+= $(OBJDIR)/$(COMPONENT).res echo>> MakeF FRES_TGT=$(OBJDIR)/$(COMPONENT)_w.$(FRES) echo>> MakeF else echo>> MakeF FRES_TGT=$(OBJDIR)/R/$(COMPONENT)_w.$(FRES) echo>> MakeF endif echo>> MakeF # echo>> MakeF ifeq (mac,$(OS)) echo>> MakeF ifeq (x64,$(ARCH)) echo>> MakeF TARGET:= echo>> MakeF endif echo>> MakeF endif echo>> MakeF # echo>> MakeF all: $(TARGET) echo>> MakeF # echo>> MakeF clean: echo>> MakeF rm -rf $(TARGET) $(OBJS) $(TARGET_DIR)/* echo>> MakeF # echo>> MakeF # echo>> MakeF $(TARGET): $(OBJS) $(LIBS) $(FRES_TGT) echo>> MakeF $(LINK) $(LDFLAGS) $(LDFLAGS_InDesignPlugin) $(OBJS) $(LIBS) $(AdobeLIBS) $(XLIBS) echo>> MakeF # echo>> MakeF # echo>> MakeF ifeq ($(OS),win) echo>> MakeF $(OBJDIR)/$(COMPONENT)_w.$(FRES): $(COMPONENT).fr echo>> MakeF $(ODFRC) $(ODFRCFLAGS) -o $(call unix_to_dos,$(OBJDIR)/$(COMPONENT)_w.$(FRES)) $(COMPONENT).fr echo>> MakeF # echo>> MakeF $(OBJDIR)/$(COMPONENT).res: $(COMPONENT).rc $(OBJDIR)/$(COMPONENT)_w.$(FRES) echo>> MakeF $(RSC) $(RSCFLAGS) $(CFLAGS_INCLUDE) $(COMPONENT).rc echo>> MakeF $(AdobeSDK)\devtools\bin\merge_res.cmd $(call unix_to_dos,$(OBJDIR)) $(COMPONENT) $(COMPONENT)_w echo>> MakeF mkdir -p "$(TARGET_DIR)/($(PluginName) Resources)" echo>> MakeF cp -r $(OBJDIR)/idrc_* "$(TARGET_DIR)/($(PluginName) Resources)" echo>> MakeF endif echo>> MakeF ifeq ($(OS),mac) echo>> MakeF $(OBJDIR)/R/$(COMPONENT)_w.$(FRES): $(COMPONENT).fr echo>> MakeF mkdir -p $(TARGET_DIR)/Resources echo>> MakeF mkdir -p $(OBJDIR)/R echo>> MakeF $(ODFRC) $(ODFRCFLAGS) $(CFLAGS_IXA_OF) -o $@ $(COMPONENT).fr echo>> MakeF /Developer/Tools/ResMerger -dstIs DF $@ -o $(OBJDIR)/$(PluginName).$(FRES) echo>> MakeF /Developer/Tools/ResMerger $(OBJDIR)/$(PluginName).$(FRES) -dstIs DF -o $(TARGET_DIR)/Resources/$(PluginName).rsrc echo>> MakeF cp -r $(OBJDIR)/R/idrc_* Info.plist $(TARGET_DIR)/Resources echo>> MakeF ( cd $(TARGET_DIR)/..; ln -s A Current ; cd .. ; ln -s Versions/Current/Resources Resources ; ln -s Versions/Current/$(PluginName) $(PluginName) ) echo>> MakeF endif echo>> MakeF include ../make/commplugs.mak echo>> MakeF # echo>> MakeF # find %FP% -type f -name '*.c*' | grep -v .svn | awk '{ print "$(OBJDIR)/" $1 ".$(OBJSuffix) : " $1 " $(HEADERS)\n\t$(CC) $(CFLAGS) " $1 "\n"; }' | sed -e 's/.cpp././' | sed -e 's/\.cxx\./\./' | sed -e 's?/%FP%/?/?' >> MakeF echo>> MakeF #EOF rem mv MakeF Makefile endlocal
      
      







画像

予見されるものは何もありません



Adobe InDesign CC 2014がリリースされるまで、これらすべてが完璧に機能し、ビジュアルスタジオ2012が欲しかったのです。



いいえ、もちろん、理論上、私はビジュアルスタジオがずっと前にクルシャのために機能しなかったことを知っていました。 しかし、ここでcl.exeは突然有効なWin32イメージではないことが判明しました-それは一撃でした。



私は少し説明します-2005年のサービスパックありとサービスパックなしの2つのビジュアルスタジオの時以来、私は正直なところ何もマシンに置きません。 これを行うには、Visual Studio Express Editionを配置するクリーンな仮想マシンがあり、正しいプラットフォームのSDKをロールアップし、何が起こったのか(クリーンなライセンスなど)を適切なフォルダーにコピーします。 そして、仮想コンピュータを「何もなかった」状態にロールバックします。



2012スタジオのインストーラーは新しいものを望んでいたので、疑いなくWindows 8.1があります。 気まぐれは、Microsoft向けです。



私は賭け、私はコピーする-たわごと。



画像

ムッシューは倒錯について多くを知っています





そして、疑問が生じました-私は何をすべきですか?



いくつかのオプションがあります。



  1. MinGWから始まり、indesignsで終わる、Windows 8.1で新しい仮想マシンにインストールして解決します。 そして、あなたはライセンスを見つける必要があります-もちろん私にはすべてがありますが、それらは全く異なる場所にあります。 長くて退屈。
  2. Amazonクラウドへの移行-w2k12では、長い間十分であり、すぐに動作します。 しかし、再び同じ問題-長く退屈です。 そして、これらすべての蓄積されたバージョンとコピー-25ギガバイトを転送します。 怠け者。
  3. 何も変更する必要がないように回避します。


私はサバに傷をつけて、考えました- 紫斑はそうではないでしょうか? 結局のところ、私はオープンホストです。



タイピング

 wine ---2012-\vc\bin\cl.exe /help
      
      





そしてそれはまだ動作します。



-ああ! -厳しいシベリア人は言いました。



もちろん、レーキがなかったわけではなく、合格しました。VineのVisual Studioランタイムのライブラリの中には、それほど似ていないものもあることがわかりました。 これは問題ではありません-ビジュアルスタジオにはリファレンスがあり、ビジュアルスタジオをパパからコピーしました。



しかし驚いたのは、完全に単純なmt.exeが落ちただけでなく、ワインのSIGSEGVと呼ばれることです。 図書館でのシャーマニズムは解決策を与えませんでした、私は詩人とすぐに私の代替物を書かなければなりませんでした。



非表示のテキスト
 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> static void usage() { printf("Usage: mt.exe -manifest foo.dll.manifest -outputresource:foo.dll[;2]\n"); } static void alert(char* fn, char* msg, int code) { static char* lpstrError; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), LANG_USER_DEFAULT, &lpstrError, 1, NULL); fprintf(stderr, "%s: %s: %s, %d\n", fn, msg, lpstrError, code); LocalFree(lpstrError); } static int update_res(char* ou, int resk, char* mf) { HANDLE hUpdateRes; LPVOID buf; BOOL result; FILE* fp; struct _stat st; int ressz = 0, outk; fp = fopen(mf, "rb"); if(!fp) { alert(mf, "could not open manifest file", errno); return 2; } if(_fstat( fileno(fp), &st) != 0) { fclose(fp); alert(mf, "could not determine manifest file size", errno); return 2; } ressz = st.st_size; buf = (void*)malloc(ressz); if(!buf) { fclose(fp); free(buf); alert(mf, "could not allocate buffer for resource", ressz); return 2; } outk = fread(buf, 1, ressz, fp); if(outk != ressz) { fclose(fp); free(buf); alert(mf, "could not read manifest", ressz - outk); return 2; } fclose(fp); hUpdateRes = BeginUpdateResourceA(ou, FALSE); if (hUpdateRes == NULL) { free(buf); alert(ou, "Could not open file for writing.", 0); return 3; } result = UpdateResourceA(hUpdateRes, RT_MANIFEST, MAKEINTRESOURCE(resk), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), buf, ressz); if (result == FALSE) { alert(ou, "could not add resource", 0); free(buf); return 4; } if (!EndUpdateResource(hUpdateRes, FALSE)) { alert(ou, "could not write changes to file", 0); free(buf); return 4; } free(buf); return 0; } int main(int argc, char** argv) { char* mf = NULL; char* ou = NULL; char* v; int resk = 1; int k; if(argc < 2) { usage(); return 2; } for(k=1; k < argc; ++k) { if(argv[k][0] == '-') { if(argv[k][1] =='m') { // manifest mf = argv[k+1]; ++k; continue; } else if(argv[k][1] == 'o' ) { // outputresource if(argv[k+1]) ou = argv[k+1]; else { ou = strchr(argv[k], ':'); if(!ou) { usage(); return 3; } ++ou; } ++k; v = strchr(ou, ';'); if(v) { resk = atoi(v + 1); *v = '\0'; } else resk = 1; continue; } } usage(); return 2; } if(!mf || !ou) { usage(); return 2; } return update_res(ou, resk, mf); }
      
      







しかし、InnoSetupは予想に反して-驚きをもたらさず、口collectで収集しました。



これまでのところ、そう、そして私は雲に行きます、瞬間は熟しました。



しかし、それでも、私はそれをコミュニティと共有することにしました-突然何かを失い、突然誰かが役に立つでしょう...



All Articles