Как я стенд для сборки с windows на wine мигрировал

    image

    Преамбула


    Есть у меня несколько старых проектов, писанных на С++, которые все еще развиваю по мере сил. Казалось бы — в чем же дело? Увы, это пачка очередных плагинов под мой любимый Adobe InDesign.

    И каждый раз, когда выходит новый Creative Suite, приходится портировать это дело. Что интересно, основные усилия уходят на то, чтобы собрать новую версию по новым правилам, и подогнуть инсталлятор. Потому как уж если дошел до стадии «оно компилируется», то как правило — работает. Хотя конечно есть нюансы — например в один прекрасный момент PlaceGun перестал раскладывать несколько выбранных изображений, только первое. Но об этом — в следующий раз.

    И разумеется — хотелось бы это собирать под все версии и все платформы за раз, а не «открыл вижлу — собрал — закрып — повторил».

    Итак, для сборки, нам нужны одновременно

    • MS VS 2005
    • MS VS 2005 sp1
    • MS VS 2008
    • MS VS 2010
    • MS VS 2012




    image

    Переходим на 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 (и такой же под хакинтошем).

    Расписывать эти страсти от и до смысла как бы не вижу, приведу только наиболее интересные выдержки. Например, вот так вычисляем project root и платформу, на которой сейчас будет выполняться компиляция:

    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 (адобы в каждой версии умудряются переложить, поэтому тут две части — определяем макрос и потом его используем):
    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 component-name [path-to-sources [target-directory]]
    @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 component-name [path-to-sources [target-directory]]
    @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 plugin-name [path-to-sources [target-directory]]
    @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
    


    image

    Ничто не предвещало, и ага


    И все это прекрасно работало до того момента, пока не вышел Adobe InDesign CC 2014. И захотел вижуалстудию 2012. Вот тут-то белый пушной зверь каак выпрыгнул!

    Нет, я конечно в теории знал, что вижуалстудия давным-давно не работает на ХРюше. Но вот то что cl.exe внезапно оказался not valid Win32 image — это был удар.

    Немного поясню — еще со времен двух вижуалстудий 2005 с сервиспаком и без сервиспака одновременно, на билд машинку я ничего честно не ставлю. Для этого есть чистая виртуалка, в которую ставлю вижуалстудию express edition, накатываю правильный platform sdk, и то что получилось (лицензионно чистое и так далее) копирую в соответствующую папочку. А виртиуалку откатываю обратно до состояния «ничего не было».

    И раз инсталлятор 2012 студии захотел поновее — не вопрос, вот вам Windows 8.1. Любой каприз — для микрософт.

    Ставлю, копирую — опаньки.

    image

    Месье знает толк в извращениях



    И тут встал суровой силы вопрос — что делать?

    Вариантов немного.

    1. Поставить и обжить новую виртуалку под Windows 8.1, начиная от MinGW и заканчивая индезигнами. И лицензии найти надо — они конечно у меня все есть, но лежат в совершенно разных местах. Долго и нудно.
    2. Перебраться в амазоново облако — на w2k12, хватит надолго и работать будет быстро. Но снова та же проблема — долго и нудно. И все эти накопившиеся версии и копии — 25 гигов перебрасывать. Лениво.
    3. Извернуться так чтобы не пришлось ничего менять.

    Почесал я маковку, и подумал — а пуркуа бы не па? Ведь хостом у меня опенсусь стоит.

    Набираю
    wine где-там-скопировал-2012-студию\vc\bin\cl.exe /help
    

    и оно таки работает.

    — Ага! — сказали суровые сибирские мужики.

    Не без граблей конечно прошло — выяснилось что некоторые библиотеки от вижуалстудийного рантайма в вайне не совсем такие. Это не проблема — у вижуалстудии есть эталонные, скопировал по папочкам вижуалстудии.

    А вот что удивило, совершенно простой mt.exe не только сам падал, но и вызывал SIGSEGV у wine. Шаманство с библиотеками решения не дало, пришлось по-быстрому написать свой заменитель с поэтессами.

    Скрытый текст
    #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 против ожиданий — сюрпризов не принес, собирает со свистом.

    Пока — так, а далее поеду в облако, момент назрел.

    Но все же решил поделиться с сообществом — вдруг я чего упускаю, вдруг кому пригодится…

    Only registered users can participate in poll. Log in, please.

    Стоила ли овчинка выделки?

    • 18.6%надо было давно перейти на Windows 8, чего автор слоупочит — непонятно85
    • 27.1%давно надо было все перенести на Linux124
    • 27.3%ну вы там и курите ;-)125
    • 26.4%однако, wine — отличная вещь, раз целая ферма из разных версий вижуалстудий в ней работает121
    • 0.7%свой вариант3

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 32

      +11
      Снимаю шляпу, автор знает толк в извращениях =)
        +1
        Осталось теперь сборку для MacOS сделать через maloader.
          +1
          Там самое веселое — зависимости поразгребать, руками. Помню долго искал этот клятый tzcode, ибо нету давно того сайта где он жил. Хвала гитхабу — не дал пропасть…

          sudo zypper install libuuid-devel libicu-devel 
          
          cd tzcode
          make
          sudo make install
          cd ..
          
          cd opencflite-476.19.0
          ./configure
          make
          sudo make install
          cd ..
          
          

          и только потом — шаманства из ридми ;-)
          +5
          Все очень хорошо, советую использовать CMake и выкинуть cygwin.
            0
            Я в статье не нашел упоминания cygwin, вы о чем? Про wine?
              0
              Есть пара батников под спойлерами, внутри sed и awk. Только они из MinGW а не из CygWin.
                0
                Ок, перепутал mingw и cygwin. У меня сложилось впечатление, что одной из причин, толкнувшей вас на эксперименты, были сложности с развертыванием этой среды на всех сборочных машинах.
                  0
                  На самом деле я огород начал городить именно для того чтобы не разводить много сборочных машин.

                  Сначала их было две — мой ноут на котором все собирается до сих пор, и мак-мини под столом чтобы этот клятый PackageMaker попинать мышой over VNC. Однако после того как под столом мак-мини стало три, пришлось смотреть на хакинтош ;-)

                  Я даже одно время собирался сборку под мак выкинуть в облако — но пока не сложилось. И когда уже Apple догадается ферму под своими маками раздавать как микрософт — свой Azure…

                  И вот благодаря микрософту и «компилятору нужна виста+» — перебрался на хост из виртуалок. Компиляет, что забавно. Эдакий странный казус, самому смешно.
                    0
                    Кстати на маке совершенно не обязательно использовать графический PackageMaker. Есть еще как минимум консольные pkgbuild и pkgutil, когда я занимался разработкой на маке использовал их, плюс Jenkins для управления сборочной фермой из маков.
                      0
                      Зато как показывает практика — очень даже обязательно если в инсталляторе надо что-то поменять 8-)

                      А вообще живые маки для тестов нужны. Я бы с огромным удовольствием проверял бы разные версии в облаке, но увы.
            +2
            Но вот то что cl.exe внезапно оказался not valid Win32 image — это был удар.
            Для справки. В PE-заголовке есть поле «версия подсистемы», системный загрузчик в принципе отказывается загружать exe-шники, у которых это поле больше версии системы, именно с ошибкой «not valid Win32 image». Лечится editbin /subsystem:console,5.0 cl.exe (warning LNK4241 можно игнорировать). 2012-й студии под рукой нет, cl.exe из 2013-й студии после такой операции не работает уже по другой, более ясной причине «Точка входа в процедуру InitializeCriticalSectionEx не найдена в библиотеке DLL KERNEL32.dll.» — и действительно, такая API-функция появилась только в Vista.
              0
              а почему не cmake?

              из коробки поддерживает все версии Visual Studio
              Visual Studio 6
              Visual Studio 7
              Visual Studio 7 .NET 2003
              Visual Studio 8 2005
              Visual Studio 9 2008
              Visual Studio 10 2010
              Visual Studio 11 2012
              Visual Studio 12 2013
              и тд
              www.cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html

              для сборки достаточно 2 комманд, открывать visual studio не надо
              cmake -G «имя генератора» «dir»
              cmake --build «dir» --target «tgt» --config «cfg»

              boost ищется так: find_package(BOOST) (можно задать версию, если не в стандартной локации, то чуть длинее)
              в вашем случае правда один раз придётся задать настройки всем компиляторам, т.к. у вас они лежат в отдельных директориях
                +3
                Если бы я это делал сейчас — я бы обязательно прицепил CMake, ну а менять то что работало как часы с 2006 года… я лучше этот кошмар из говна и палок еще потерплю ;-)

                К слову, эти палки выглядят так:

                OSSDK=/Developer/SDKs/MacOSX10.5.sdk
                ASDK=/Developer/SDKs/id8.0sdk
                
                OSX_MIN=10.5
                
                CFLAGS+=-DMACOSX_SDKVERSION=1050 -DSUITE_VER=CS6
                
                ASDK_INCLUDE=-I$(ASDK)/build/mac/Release/SDK/include
                
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/tooltips
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/menus
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/dialogs
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/dialogs/selectabledialogs
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/treeview
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/events
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/includes
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/utils
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/view
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/pageitems
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/pageitems/basicinterfaces
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/trackers
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/widgetbin/graphics
                
                ASDK_INCLUDE+=-I$(ASDK)/external/dva/third_party
                ASDK_INCLUDE+=-I$(ASDK)/external/dva/third_party/boost_libraries
                ASDK_INCLUDE+=-I$(ASDK)/external/dva/third_party/adobe_source_libraries
                
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/objectmodel
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/streaming
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/localization
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/commondata
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/strings
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/structure
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/foundation
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/plugins
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/commands
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/events
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/files
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/utils
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/statics
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/resourcedefs
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/measurementsystem
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/pageitems
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/pageitems/basicinterfaces
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/scripting
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/graphics
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/links
                ASDK_INCLUDE+=-I$(ASDK)/source/public/libs/publiclib/messaging
                
                ASDK_INCLUDE+=-I$(ASDK)/source/public/includes
                
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/sharedcontent
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/colormgmt
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/cjk
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/interactive
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/interactive/ui
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/server
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/preflight
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/tables
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/layout
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/xmedia
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/utils
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/architecture
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/incopy
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/workgroup
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/text
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/graphics
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/contentdropper
                ASDK_INCLUDE+=-I$(ASDK)/source/public/interfaces/ui
                
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/interactive
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/widgets
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/layout
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/utils
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/architecture
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/text
                ASDK_INCLUDE+=-I$(ASDK)/source/open/includes/ui
                
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/interactive
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/preflight
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/layout
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/architecture
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/incopy
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/text
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/graphics
                ASDK_INCLUDE+=-I$(ASDK)/source/open/interfaces/ui
                
                ASDK_INCLUDE+=-I$(ASDK)/source/precomp/gcc
                ASDK_INCLUDE+=-I$(ASDK)/source/precomp/common
                
                ASDK_INCLUDE+=-I$(ASDK)/source/sdksamples/common
                
                ODFRC_DEFS=-d ID_CS6
                
                CFLAGS+=-fmessage-length=0 -pipe -O2 -fpascal-strings
                CFLAGS+=-fasm-blocks
                
                #InDesign specific
                
                CFLAGS+=-Wno-trigraphs -Wreturn-type -Woverloaded-virtual -Wmissing-braces -Wparentheses 
                CFLAGS+=-Wunused-function -Wunused-label -Wunused-value -Wshadow -Wno-deprecated-declarations
                CFLAGS+=-Wchar-subscripts -Wimplicit -Wsequence-point -Winit-self -Wmissing-field-initializers 
                CFLAGS+=-Wpointer-arith -Wcast-align -Wpacked 
                CFLAGS=-fvisibility=hidden -fvisibility-inlines-hidden -fno-threadsafe-statics 
                
                #Defines
                CFLAGS+=-DMACINTOSH -DBIB_NO_THROW -DMACTEL_SKIP
                
                #Includes
                CFLAGS+=-I$(OSSDK)/Developer/Headers/FlatCarbon
                CFLAGS+=$(ASDK_INCLUDE) 
                
                #Frameworks
                CFLAGS+=-F$(ASDK)/build/mac/release/packagefolder/contents/macos 
                CFLAGS+=-F$(ASDK)/build/mac/release/packagefolder/contents/Frameworks 
                
                # odfrc
                ODFRC=$(ASDK)/devtools/bin/odfrc-cmd
                ODFRC_DEFS+=-d NDEBUG -d MACINTOSH -d __GNUC__
                
                LDFLAGS+=-L$(ASDK)/build/mac/release/packagefolder/contents/macos/libs 
                LDFLAGS+=-F$(ASDK)/build/mac/release/packagefolder/contents/macos 
                LDFLAGS+=-F$(ASDK)/build/mac/release/packagefolder/contents/Frameworks 
                LDFLAGS+=-framework InDesignModel
                LDFLAGS+=-Wl,-executable_path -Wl,$(ASDK)/build/mac/Release/packagefolder/contents/macos/ 
                LDFLAGS+=-lPublicPlugIn 
                
                LDFLAGS+=-Wl,-dead_strip
                LDFLAGS+=-Wl,-single_module 
                
                Rez=/Developer/Tools/Rez 
                RezFlags=-o $@ -d SystemSevenOrLater=1 -useDF -script Roman $(CFLAGS) $(ASDK)/samplecode/common/includes/MachOMacrezXcode.h
                
                ifeq (x64,$(ARCH))
                CFLAGS+=-arch x86_64
                LDFLAGS+=-arch x86_64 -dynamiclib
                RezFlags+=-arch x86_64
                else
                CFLAGS+=-arch i386
                LDFLAGS=-arch i386 -dynamiclib
                RezFlags+=-arch i386
                endif
                


                И так 14 (!) раз. Потому что меняется все — порядок, наличие, форма записи, и прочее.

                Под виндой например первых пара каталогов в списке должны быть именно так, иначе вся эта конструкция падает в произвольных местах:

                # FIRST LINE IS FOR odfrc AS IT  DOESN'T SUPPORTS SPACES IN PATHS
                ASDK_INCLUDE=$(AdobeSDK)\source\precomp\common;$(AdobeSDK)\source\precomp\msvc
                ASDK_INCLUDE:=$(ASDK_INCLUDE);$(AdobeSDK)\source\public\includes
                


                Из ~75К мейкфайлов — 65 180 байт это как раз список путей и адобоспецифических флажков. И каждая новая версия — добавляет еще 10-15К ;-)
                  0
                  я надеюсь с всего этого вороха забот Вы хоть на печеньки имеете?
                    0
                    14 раз вас впечатлили? ;-)

                    Это делается один раз в полгода, не чаще, да и дел на вечер каждый раз. А что не на вечер то хуже — надо новый облачный индизайн поставить и проверить, а работает ли. Если да — то поправить инсталляторы (два штука), и все, «запортировал».

                    Последний раз было весело с примером — в cs6 он изменился, там перекрывать надо было на два метода больше. А если не — то дефолтная имплементация мастерски обрабатывала только первый дропнутый на индезигн файл, и все. А все остальные добавляла в линки тихонечко. Вот это был квест на неделю, хех.

                    Ну, вот в этот раз слегка вышел за рамки одного вечера — зато есть тема ;-)
                      0
                      вам похоже возится со скриптами вполне нравится :)
                      я бы уже во второй раз вернувшись к такому проекту, покромсал бы без жалости вдоль и поперёк, чтобы максимально упростить мигрирование на новую версию

                        0
                        Это вы еще скрипты InnoSetup не видели, вот где ад и израиль.

                        function GetPathByCOM(product: string; clsid: string; is32bit: boolean) : string;
                        var
                          v: string;
                          k, e, k1: string;
                          i: integer;
                        begin
                          k := 'CLSID\{' + clsid + '}\LocalServer32';
                          k1:= 'CLSID\{' + clsid + '}\InprocServer32';
                          e := '{pf}';
                          
                          if IsWin64 and Is64BitInstallMode then begin
                            if is32bit then begin
                              e := '{pf32}';
                              k := 'Wow6432Node\' + k;
                              k1:= 'Wow6432Node\' + k1;
                            end;
                          end;
                        
                          if RegQueryStringValue(HKEY_CLASSES_ROOT, k, '', v) then begin
                            i := Pos('/', v);
                            if i > 0 then v := Trim(Copy(v, 1, i - 1));
                            Result:= ExtractFilePath(v);
                          end else if RegQueryStringValue(HKEY_CLASSES_ROOT, k1, '', v) then begin
                            i := Pos('/', v);
                            if i > 0 then v := Trim(Copy(v, 1, i - 1));
                            Result:= ExtractFilePath(v);
                          end else
                            Result := ExpandConstant(e) + '\Adobe\' + product + '\';
                        end;
                        
                        function GetPathByApp(product: string; ver: string; is32bit: boolean): string;
                        var
                          v: string;
                          k, e: string;
                          i: integer;
                        begin
                          k := 'SOFTWARE\Adobe\' + ver + '\ApplicationPath';
                          e := '{pf}';
                          
                          if IsWin64 and Is64BitInstallMode then begin
                            if is32bit then begin
                              e := '{pf32}';
                              k := 'SOFTWARE\Wow6432Node\Adobe\' + ver + '\ApplicationPath';
                            end;
                          end;
                        
                          if RegQueryStringValue(HKEY_LOCAL_MACHINE, k, '', v)
                          then begin
                             i := Pos('/', v);
                             if i > 0 then begin 
                             	v := Trim(Copy(v, 1, i - 1));
                             	v:= ExtractFilePath(v);
                             end;
                             Result:= v;
                          end else
                             Result := ExpandConstant(e) + '\Adobe\' + product + '\';
                        end;
                        
                        function GetPathByShell(product: string; ver: string; is32bit: boolean): string;
                        var
                          v, e, k: string;
                          i: integer;
                        begin
                          k := ver + '\shell\launch\command';
                          e := '{pf}';           \
                          
                          if IsWin64 and Is64BitInstallMode then begin
                            if is32bit then begin
                              e := '{pf32}';
                              k := 'Wow6432Node\' + k;
                            end;
                          end;
                          
                          if RegQueryStringValue(HKEY_CLASSES_ROOT, k, '', v)
                          then begin
                             i := Pos('/', v);
                             if i > 0 then v := Trim(Copy(v, 1, i - 1));
                             Result:= ExtractFilePath(v);
                          end else
                             Result := ExpandConstant(e) + '\Adobe\' + product + '\';
                        end;
                        
                        function GetPathBySetup2(product: string; ver: string; is32bit: boolean): string;
                        var
                          v, e, k: string;
                        begin
                          k := 'SOFTWARE\Adobe\' + ver;
                          e := '{pf}';
                        
                          if IsWin64 and Is64BitInstallMode then begin
                            if is32bit then begin
                              e := '{pf32}';
                              k := 'SOFTWARE\Wow6432Node\Adobe\' + ver;
                            end;
                          end;
                        
                          if RegQueryStringValue(HKEY_LOCAL_MACHINE, k, 'InstallPath', v)
                          then begin
                             Result:= v;
                          end else
                             Result := ExpandConstant(e) + '\Adobe\' + product + '\';
                        end;
                        
                        function GetPathBySetup(product: string; ver: string; is32bit: boolean): string;
                        begin
                          Result := GetPathBySetup2(product, ver + '\Installer', is32bit);
                        end;
                        
                        function GetPathByCOMsAnd32bit(product: string; clsid: string; clsi2: string): string;
                        var
                          v: string;
                          k1, k2, e: string;
                        begin
                          k1 := 'CLSID\{' + clsid + '}\LocalServer32';
                          k2 := 'CLSID\{' + clsi2 + '}\LocalServer32';
                          e := '{pf}';
                          
                          if IsWin64 and Is64BitInstallMode then begin
                            e := '{pf32}';
                            k1 := 'Wow6432Node\' + k1;
                            k2 := 'Wow6432Node\' + k2;
                          end;
                          
                          if RegQueryStringValue(HKEY_CLASSES_ROOT, k1, '', v)
                          then
                            Result := ExtractFilePath(v)
                          else if RegQueryStringValue(HKEY_CLASSES_ROOT, k2, '', v) then
                            Result := ExtractFilePath(v)
                          else
                            Result := ExpandConstant(e) + '\Adobe\' + product + '\';
                        end;
                        
                        function isAdobeAvailable(product: string; is32bit: boolean) : Boolean;
                        var
                          k: string;
                        begin
                          k := 'SOFTWARE\Adobe\' + product;
                          if IsWin64 and Is64BitInstallMode then begin
                            if is32bit then begin
                              k := 'SOFTWARE\Wow6432Node\Adobe\' + product;
                            end;
                          end;
                        
                          if RegKeyExists(HKEY_LOCAL_MACHINE, k)
                          then begin
                            Result:=True;
                          end;
                        end;
                        


                        и таких ужастиков на 250К кода ;-)
                          0
                          а Innosetup можно WIX'ом заменить
                          тоже большей частью в декларативном стиле будет
                            0
                            Оно и так декларативное — вот к примеру

                            ; CS6 64bit
                            
                            Source: ..\..\image\bin\x64\cs6\VDP.pln; DestDir: {code:GetS6Path|{pf}\Adobe\Adobe InDesign Server CS6\}\Plug-ins; DestName: VDP.pln; Flags: ignoreversion overwritereadonly replacesameversion 64bit; Check: CheckedIndesignS6
                            
                            Source: ..\..\image\bin\x64\cs6\(VDP Resources)\idrc_CLST\*.*; DestDir: {code:GetS6Path|{pf}\Adobe\Adobe InDesign Server CS6\}\Plug-ins\(VDP Resources)\idrc_CLST; Flags: ignoreversion overwritereadonly replacesameversion 64bit; Check: CheckedIndesignS6
                            ...
                            
                            ; CS6 32bit in 64bit
                            
                            Source: ..\..\image\bin\x86\cs6\VDP.pln; DestDir: {code:GetS6Path_32in64|{pf32}\Adobe\Adobe InDesign Server CS6\}\Plug-ins; DestName: VDP.pln; Flags: ignoreversion overwritereadonly replacesameversion 64bit; Check: CheckedIndesignS6_32in64
                            
                            Source: ..\..\image\bin\x86\cs6\(VDP Resources)\idrc_CLST\*.*; DestDir: {code:GetS6Path_32in64|{pf32}\Adobe\Adobe InDesign Server CS6\}\Plug-ins\(VDP Resources)\idrc_CLST; Flags: ignoreversion overwritereadonly replacesameversion 64bit; Check: CheckedIndesignS6_32in64
                            ...
                            
                            ; CS6 32bit
                            Source: ..\..\image\bin\x86\cs6\VDP.pln; DestDir: {code:GetS6Path|{pf}\Adobe\Adobe InDesign Server CS6\}\Plug-ins; DestName: VDP.pln; Flags: ignoreversion overwritereadonly replacesameversion; Check: CheckedIndesignS6
                            
                            Source: ..\..\image\bin\x86\cs6\(VDP Resources)\idrc_CLST\*.*; DestDir: {code:GetS6Path|{pf}\Adobe\Adobe InDesign Server CS6\}\Plug-ins\(VDP Resources)\idrc_CLST; Flags: ignoreversion overwritereadonly replacesameversion; Check: CheckedIndesignS6
                            ...
                            


                            Однако это не отменяет кучу функций CheckedXXX + GetXXXX ;-)

                            А в них надо проверить что

                            — соответствующий (в данном случае) индезигн сервер установлен
                            — архитектура соответствует
                            — установка этого компонента не отменена на предыдущем шаге
                            — реальный путь надо найти в реестре, а он зависит от версии адобовского инсталлятора.

                            Вот и получается много.
                  0
                  Cmake не делает сборку!
                  Он всего лишь создаёт проект для соответствующей студии.
                  С ключиком --build он же дёргает winbuilder, чтобы соответствующий проект собрался.
                  Но если нужный компилятор cl.exe не запускается под виндой, cmake ничуть этому не поможет!
                    0
                    с чего вы взяли, что я написал о том что он сам собирает? :)

                    в коментарии вопрос: почему gmake + батники если можно CMake + 2 команды

                    а апгрэйд системы до win7/8 — вполне разумное решения проблемы не работающего VS2012
                  –3
                  Раз уж Вы собираете по Wine, почему бы не попробовать под ReactOS?
                    0
                    wine у меня и так есть, а реактось еще ставить надо. Проще уиндоусь восемь тогда поставить.
                    0
                    Не понял к чему автор вспомнил Windows 8. На семёрке прекрасно работают все студии от 2003 до 2013. Да и вариант поднять билд-сервер в амазоновском облаке — тоже выглядит разумнее, чем городить на локальном линуксе вайновую билд-платформу.
                      0
                      Так что из Visual Studio работает? devenv или cl.exe?
                        0
                        Мне нужен был cl.exe.

                        Однако в свое время devenv у меня работал тоже, 2003 и 2005 так точно.
                        +1
                        Вы уж меня извините, но текст читать что-то уж совсем сложно
                          0
                          А расскажите подробнее, как в итоге «завели» компилятор от 2012-й студии под вайном?
                          Я вот пробую — ничего не выходит.

                          Скопировал папку студии, кинул «родную» либу msvcr110 — и дальше ступор.
                          без параметров — запускается.
                          Microsoft ® C/C++ Optimizing Compiler Version 17.00.61030 for x86
                          Copyright © Microsoft Corporation. All rights reserved.

                          С ключиком /help — работает.
                          Но при попытке запустить реальную компиляцию — вылетает с исключением Unhandled exception 0xc0000417

                          Пробовал с окружениями как 32, так и 64 бита, результат одинаково отрицательный
                            +1
                            Я в папку с компилятором досыпал таких файлов (все — 32битные!)

                            msvcp110.dll
                            msvcr110.dll
                            vccorlib110.dll

                            а также досыпал туда же

                            RcDll.dll

                            И добавил в путь не саму папку с компилятором а вижловую Common7\IDE. В вайне сказал что имитируется Win7.

                            Вроде все…

                            Рекомендую еще запускать это из wineconsole. Саму wineconsole — из терминала, и в терминал поглядывать — оно там пишет чего не хватает.
                              0
                              Да, все сходится.
                              Увы, не функционирует.
                              Возможно, как-то связано еще с характеристиками системы (проц, ядерность и т.д.)
                                +1
                                На всякий случай, Wine prefix architecture = 64bit Win7, но cl.exe строго 32битный. Или VC/bin/cl.exe или VC/bin/x86_amd64/cl.exe. Собственно, cl.exe из VC/amd64 также запускается с ключом /help, но я им не пользуюсь по историческим причинам и потому далее даже не смотрел.

                                Что еще интересного может быть — затрудняюсь, спрашивайте.

                                Машинка стандартная 4x Intel® Core(TM) i5-2400 CPU @ 3.10GHz, так что не в ней дело судя по всему.

                                vik@pc:~> rpm -qa | grep wine
                                wine-mp3-1.1.39-12.12.i586
                                wine-gecko-2.24-43.1.noarch
                                wine-mono-4.5.2-9.6.noarch
                                wine-32bit-1.7.16-334.1.x86_64
                                wine-1.7.16-334.1.x86_64

                                Даавно не апдейтил, да…
                                  0
                                  Вот он, ключевой момент:

                                  wine-1.7

                                  У меня стояла стоковая 1.6.
                                  Апгрейда хватило, чтобы всё взлетело!

                                  Итого: создал префикс с 32-битной архитектурой (64 бита тоже пойдёт, я просто описываю, как завелось).
                                  Скопировал в него из установленной студии папку Microsoft Visual Studio 11, а также Windows Kits.
                                  В папку vc/bin доложил плюсовые рантайм-библиотеки (rt110).

                                  Ну и скрипт-обёртка, чтобы запускать компилятор в нужном окружении:
                                  #!/bin/bash
                                  PROGRAMFILES="c:/Program Files"
                                  WSDK="$PROGRAMFILES/Microsoft Visual Studio 11.0"
                                  export WINEPREFIX="/home/alexey/wine2"
                                  export INCLUDE="$WSDK/VC/INCLUDE;$WSDK/VC/ATLMFC/INCLUDE;$PROGRAMFILES/Windows Kits/8.0/include/shared;$PROGRAMFILES/Windows Kits/8.0/include/um;$PROGRAMFILES/Windows Kits/8.0/include/winrt;"
                                  export LIB="$WSDK/VC/LIB;$WSDK/VC/ATLMFC/LIB;$PROGRAMFILES/Windows Kits/8.0/lib/win8/um/x86;"
                                  export LIBPATH="$WSDK/VC/LIB;$WSDK/VC/ATLMFC/LIB;"
                                  export WINEPATH="c:/windows;c:/windows/system32;$WSDK/Common7/IDE;$WSDK/VC/bin;"
                                  wine cl.exe $@


                                  Сейчас буду думать, как сделать билд-среду через cmake
                                  (видимо, просто тупо запускать его так же из-под wine, покуда родная линуксовая версия справедливо считает, что с проектами MS Visual Studio ей уметь работать незачем)

                          Only users with full accounts can post comments. Log in, please.