Jump to content

    

Сборка из исходников

Вопрос по кросс-сборке.

Задача: на машине с Linux Mint 14 (64 бита) собрать КиКАД для 32-битного виндовса. С wxWidgets проблем нет, указал --host=i686-w64-mingw32 --prefix=$BUILD_DIR/../install/wx-win, все собралось и установилось. Теперь сборка собственно КиКАДа. В доке такой вариант сборки не описан или я его не нашел. Гуглением выяснил, что надо создать файл (win-cross.cmake) примерно следующего содержания

# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_RC_COMPILER  i686-w64-mingw32-windres)
SET(CMAKE_C_COMPILER   i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

и указать его cmake ключем -DCMAKE_TOOLCHAIN_FILE=../win-cross.cmake. Также указал путь к wx согласно инструкции: -DwxWidgets_ROOT_DIR=$BUILD_DIR/../install/wx-win"

Теперь cmake находит работающий компилятор и OpenGL но вылетает на поиске wxWidgets.

 

Возможно кто-то уже имеет опыт такой кросс-сборки? Как его заставить? Я, конечно, могу полезть копать внутренности CMakeModules/FindwxWidgets.cmake, но возможно кто-то уже прошел по этим граблям?

Share this post


Link to post
Share on other sites
Возможно кто-то уже имеет опыт такой кросс-сборки? Как его заставить? Я, конечно, могу полезть копать внутренности CMakeModules/FindwxWidgets.cmake, но возможно кто-то уже прошел по этим граблям?

Делал такую сборку в Linux Debian 6.0.5.

У меня получилась следующая последовательность действий:

sudo apt-get install mingw32

-----------------------------------------
mkdir /home/a-lunev/bzr/toolchain-mingw
touch /home/a-lunev/bzr/toolchain-mingw/TC-mingw.cmake <
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C, C++ and resource files
set(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
set(CMAKE_RC_COMPILER i586-mingw32msvc-windres)

# where is the target environment located
set(CMAKE_FIND_ROOT_PATH
   /usr/i586-mingw32msvc
   /home/a-lunev/bzr/toolchain-mingw)

# adjust the default bahaviour of the FIND_XXX() commands:
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

-----------------------------------------

https://sourceforge.net/projects/wxwindows/files/2.9.3/wxWidgets-2.9.3.tar.bz2/download

cd wxWidgets-2.9.3/include/wx/msw
cp setup.h setup0.h

mkdir wxWidgets-2.9.3/build_msw
cd wxWidgets-2.9.3/build_msw
../configure --enable-unicode --enable-monolithic --enable-shared --enable-aui --with-msw --with-opengl --prefix=/home/a-lunev/bzr/toolchain-mingw --host=i586-mingw32msvc --build=x86_64-linux
make
sudo make install
sudo ldconfig
cd /home/a-lunev/bzr/toolchain-mingw/include/wx-2.9/wx/msw
sudo cp setup0.h ../setup.h

bzr branch lp:kicad
cd kicad
bzr patch mingw_kicad.patch

mkdir Release_win32
cd Release_win32
mkdir /home/a-lunev/bzr/kicad-win
cmake -DCMAKE_BUILD_TYPE=Release -DKICAD_TESTING_VERSION=ON -DCMAKE_TOOLCHAIN_FILE=/home/a-lunev/bzr/toolchain-mingw/TC-mingw.cmake -DCMAKE_INSTALL_PREFIX=/home/a-lunev/bzr/kicad-win ../
make
sudo make install

cp /usr/share/doc/mingw32-runtime/mingwm10.dll.gz .
gzip -d mingwm10.dll.gz
mv mingwm10.dll /home/a-lunev/bzr/kicad-win/bin
cp /home/a-lunev/bzr/toolchain-mingw/lib/wxmsw293u_gcc_custom.dll /home/a-lunev/bzr/kicad-win/bin
cp /home/a-lunev/bzr/toolchain-mingw/lib/wxmsw293u_gl_gcc_custom.dll /home/a-lunev/bzr/kicad-win/bin

kicad_mingw.patch.zip

Share this post


Link to post
Share on other sites
У меня получилась следующая последовательность действий:

Угу. Разница в указании пути к wx через CMAKE_FIND_ROOT_PATH вместо рекомендованного wxWidgets_ROOT_DIR. Попробовал. Не помогло. setup.h у меня оказался в lib/wx/include/i686-w64-mingw32-msw-unicode-static-2.9/wx. Его копирование в include/wx-2.9/wx тоже не помогло. Версия wx отличатеся - у меня 2.9.4. Придется ковырять FindwxWidgets.cmake, смотреть на чем спотыкается.

 

 

Какая-то, простите, бяка. Судя по всему, благодаря set(CMAKE_SYSTEM_NAME Windows) для cmake определен символ WIN32. который заставляет FindwxWidgets.cmake искать файл msw/wx/setup.h в директории lib/gcc_lib. Но у меня setup.h живет в lib/wx/include/i686-w64-mingw32-msw-unicode-static-2.9/wx.

Share this post


Link to post
Share on other sites

добавил SET(MSYS). Еще веселее:

после выполнения

    FIND_PROGRAM(wxWidgets_CONFIG_EXECUTABLE wx-config
      ONLY_CMAKE_FIND_ROOT_PATH
      )

в wxWidgets_CONFIG_EXECUTABLE находится ${BUILD_DIR}/wx-config, где никакого wx-config нет (${BUILD_DIR} - место, где запускается cmake). wx-config живет по адресу /home/serzh/build/kicad/install/wx-win/bin/wx-config, при этом CMAKE_FIND_ROOT_PATH содержит /usr/i686-w64-mingw32;/home/serzh/build/kicad/install/wx-win (проверял выводом), и cmake нифига его там не находит. Проблема в cmake?

 

Сделал ему символическую ссылку оттуда, где wx-config есть туда, где cmake его как бы находит, "нехай подавится". Собралось.

Share this post


Link to post
Share on other sites
добавил SET(MSYS). Еще веселее:

после выполнения

    FIND_PROGRAM(wxWidgets_CONFIG_EXECUTABLE wx-config
      ONLY_CMAKE_FIND_ROOT_PATH
      )

в wxWidgets_CONFIG_EXECUTABLE находится ${BUILD_DIR}/wx-config, где никакого wx-config нет (${BUILD_DIR} - место, где запускается cmake). wx-config живет по адресу /home/serzh/build/kicad/install/wx-win/bin/wx-config, при этом CMAKE_FIND_ROOT_PATH содержит /usr/i686-w64-mingw32;/home/serzh/build/kicad/install/wx-win (проверял выводом), и cmake нифига его там не находит. Проблема в cmake?

 

Сделал ему символическую ссылку оттуда, где wx-config есть туда, где cmake его как бы находит, "нехай подавится". Собралось.

А после сборки wxWidgets делали sudo make install ?

После данной команды в /usr/local/bin должен появиться symlink на wx-config, который cmake по идее должен найти.

То есть на сколько я понимаю, необходимо деинсталлировать (sudo make uninstall) установленные ранее версии wxWidgets. (Скорее всего нужно деинсталлировать также wxWidgets, если был установлен с помощью sudo apt-get install).

После чего собрать с помощью mingw желаемую версию wxWidgets и выполнить ее установку:

sudo make install

sudo ldconfig

 

Если так не делать, то нужно при сборке KiCad передать в качестве параметра путь к wxWidgets, который собран, но не был и не планируется быть установленным.

Share this post


Link to post
Share on other sites
А после сборки wxWidgets делали sudo make install ?
Поскольку папка, указанная как --prefix при конфигурировании wx находится в моей домашней директории и у меня есть права на запись в нее без sudo, то я делал просто make install.

После данной команды в /usr/local/bin должен появиться symlink на wx-config, который cmake по идее должен найти.
Нелогично. А если у меня несколько сборок, каждая следующая своим symlink будет переписывать предыдущий? Зачем тогда --prefix и все эти рассуждения о типа-chroot в cmake? Да и искать она должна согласно описанию _только_ в указанных в CMAKE_FIND_ROOT_PATH папках. И по идее должна найти. А вместо этого возвращает полный путь в совсем другую директорию, где ее некто искать не просил и где искомого файла нет.

То есть на сколько я понимаю, необходимо деинсталлировать (sudo make uninstall) установленные ранее версии wxWidgets.
Не, ну это несерьезно. Я собираю минимум под две архитектуры, и перед каждой сборокой я должен удалять/ставить очередной wxWidgets? Нет. У каждого из них есть свой --prefix и этого должно хватать. Просто конкретно тут cmake споткнулся.

После чего собрать с помощью mingw желаемую версию wxWidgets и выполнить ее установку:
Это я делаю. Только без ldconfig. Я пока слабо понимаю его смысл.

Если так не делать, то нужно при сборке KiCad передать в качестве параметра путь к wxWidgets, который собран, но не был и не планируется быть установленным.
Там как бы два "путя", которыми идет поиск - либо Виндовс-путь, когда местоположение wxWidgets передается в качестве параметра, и он предполагает, что wx был собран при помощи прилагающихся к нему готовых makefiles, без configure. И уних-путь, когда местоположение установленного wx прописывается в path или, как у вас, в CMAKE_FIND_ROOT_PATH и его поиск и вытягиваение параметров происходит через вызов wx-config, которую в моем случае cmake найти не смог. Я же пишу, что cmake-вский FIND_PROGRAM() у меня отрабатывает не так, как написано в его документации.

Share this post


Link to post
Share on other sites

То-то я удивлялся, что сделанный мной deb-пакет для wxWidgets не работает после установки на другую машину! (Потом обнаружил, что make install для wxWidgets отчасти игнорирует параметр --prefix и создаёт какие-то файлы за пределами указанной в --prefix директории.)

Share this post


Link to post
Share on other sites
Не, ну это несерьезно. Я собираю минимум под две архитектуры, и перед каждой сборокой я должен удалять/ставить очередной wxWidgets? Нет. У каждого из них есть свой --prefix и этого должно хватать.

В такой ситуации да, не удобно.

Я пробовал так собирать один раз, было интересно проверить саму идею, получится или нет.

 

Забыл еще прикрепить файл патча, который указан в последовательности действий.

Добавил файл к тому моему сообщению (путь к сообщению с патчем).

 

Не помню деталей уже (это было 2012-07-01). Видимо тоже что-то не получалось и правил руками файл CMakeModules/FindwxWidgets.cmake.

Share this post


Link to post
Share on other sites

До нового года в недалеком 2012 спокойно собирал кикад под WinXP. Однако после очередного обновления не смог собрать исходники. И это тянется по сей день. Пробовал MinGW обновить, виджеты ... и как-то все бестолку.

Может кто натолкнет, куда копать. Сборка заканчивается примерно таким сообщением:

 

I:\temp\tmpKiCADSource\kicad-gost\build>make -j2
[ 41%] Built target bitmaps
[ 41%] Building CXX object common/CMakeFiles/common.dir/dialog_about/AboutDialog_main.cpp.obj
In file included from i:/temp/tmpKiCADSource/kicad-gost/common/dialog_about/AboutDialog_main.cpp:9:0:
I:/temp/tmpKiCADSource/kicad-gost/common/./dialog_about/dialog_about.h:13:29: fatal error: wx/html/htmlwin.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/common.dir/dialog_about/AboutDialog_main.cpp.obj] Error 1
make[1]: *** [common/CMakeFiles/common.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 41%] [ 42%] Building CXX object common/CMakeFiles/pcbcommon.dir/base_screen.cpp.obj
Building CXX object common/CMakeFiles/pcbcommon.dir/eda_text.cpp.obj
In file included from i:/temp/tmpKiCADSource/kicad-gost/common/base_screen.cpp:32:0:
I:/temp/tmpKiCADSource/kicad-gost/include/fctsys.h:7:19: fatal error: wx/wx.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/pcbcommon.dir/base_screen.cpp.obj] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from I:/temp/tmpKiCADSource/kicad-gost/include/eda_text.h:33:0,
                 from i:/temp/tmpKiCADSource/kicad-gost/common/eda_text.cpp:30:
I:/temp/tmpKiCADSource/kicad-gost/include/trigo.h:32:38: fatal error: wx/gdicmn.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/pcbcommon.dir/eda_text.cpp.obj] Error 1
make[1]: *** [common/CMakeFiles/pcbcommon.dir/all] Error 2
make: *** [all] Error 2

I:\temp\tmpKiCADSource\kicad-gost\build>

Все эти заголовочники есть, а чего он их вдруг перестал видеть, я не понимать.

 

Кто как собирает виджеты, с какими опциями? Есть ли уже где-то скомпилированные, чтобы самому не наделать дел?

Share this post


Link to post
Share on other sites
До нового года в недалеком 2012 спокойно собирал кикад под WinXP. Однако после очередного обновления не смог собрать исходники. И это тянется по сей день. Пробовал MinGW обновить, виджеты ... и как-то все бестолку.

Может кто натолкнет, куда копать. Сборка заканчивается примерно таким сообщением:

 

I:\temp\tmpKiCADSource\kicad-gost\build>make -j2
[ 41%] Built target bitmaps
[ 41%] Building CXX object common/CMakeFiles/common.dir/dialog_about/AboutDialog_main.cpp.obj
In file included from i:/temp/tmpKiCADSource/kicad-gost/common/dialog_about/AboutDialog_main.cpp:9:0:
I:/temp/tmpKiCADSource/kicad-gost/common/./dialog_about/dialog_about.h:13:29: fatal error: wx/html/htmlwin.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/common.dir/dialog_about/AboutDialog_main.cpp.obj] Error 1
make[1]: *** [common/CMakeFiles/common.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 41%] [ 42%] Building CXX object common/CMakeFiles/pcbcommon.dir/base_screen.cpp.obj
Building CXX object common/CMakeFiles/pcbcommon.dir/eda_text.cpp.obj
In file included from i:/temp/tmpKiCADSource/kicad-gost/common/base_screen.cpp:32:0:
I:/temp/tmpKiCADSource/kicad-gost/include/fctsys.h:7:19: fatal error: wx/wx.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/pcbcommon.dir/base_screen.cpp.obj] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from I:/temp/tmpKiCADSource/kicad-gost/include/eda_text.h:33:0,
                 from i:/temp/tmpKiCADSource/kicad-gost/common/eda_text.cpp:30:
I:/temp/tmpKiCADSource/kicad-gost/include/trigo.h:32:38: fatal error: wx/gdicmn.h: No such file or directory
compilation terminated.
make[2]: *** [common/CMakeFiles/pcbcommon.dir/eda_text.cpp.obj] Error 1
make[1]: *** [common/CMakeFiles/pcbcommon.dir/all] Error 2
make: *** [all] Error 2

I:\temp\tmpKiCADSource\kicad-gost\build>

Все эти заголовочники есть, а чего он их вдруг перестал видеть, я не понимать.

 

Кто как собирает виджеты, с какими опциями? Есть ли уже где-то скомпилированные, чтобы самому не наделать дел?

Судя по ошибкам, не может найти wxWidgets на компе.

Либо директория с wxWidgets снеслась, либо cmake заглючил.

Если wxWidgets на месте, то предлагаю:

1) удалить содержимое директории I:\temp\tmpKiCADSource\kicad-gost\build

2) удалить файл CMakeCache.txt (если имеется) в директории I:\temp\tmpKiCADSource\kicad-gost

3) заново запустить cmake с нужной конфигурацией

Если cmake успешно найдет wxWidgets, то заново запустить компиляцию с помощью make

Share this post


Link to post
Share on other sites
Если cmake успешно найдет wxWidgets, то заново запустить компиляцию с помощью make

Делал уже раз 30 такое.

Виджеты есть. CMake их находит. Конфиг сделал только что, папка build была чистой.

I:/PF/MinGW/msys/1.0/local/bin/wx-config
I:/PF/MinGW/msys/1.0/local/bin/wxrc.exe

 

AVL, может опишете вкратце как виджеты собираете?

 

У меня есть что-то такое в записках.

Собирал через консоль Msys, вроде.

cd wxWidgets-2.9.1
cd build-release
../configure --enable-unicode --disable-debuge --disable-shared --enable-monolithic --with-opengl --with-odbc --with-aui --without-subdirs
make
make install

Share this post


Link to post
Share on other sites

Я на самом деле под винду делаю следующие простые действия:

download and install http://www.cmake.org/files/v2.8/cmake-2.8.8-win32-x86.exe

download and install https://launchpad.net/bzr/2.5/2.5.1/+downlo...5.1-1-setup.exe

bzr branch lp:kicad-winbuilder

cd kicad-winbuilder

правлю KiCadWinbuilder.cmake (заменяю в двух местах lp:kicad на lp:~kicad-gost-committers/kicad/kicad)

cmake -P KiCadWinbuilder.cmake

 

версии cmake и bzr могут быть не обязательно как указаны, просто на тот момент когда я делал такую установку, были доступны для скачивания указанные версии этих программ.

 

AVL, может опишете вкратце как виджеты собираете?

Под винду собирал либо с помощью MSVC, либо посредством автоматизированного скрипта, который на lp:kicad-winbuilder

С помощью MSVC (пробовал разные версии) я потратил несколько дней, так и не смог собрать KiCad (виджеты собираются нормально).

Share this post


Link to post
Share on other sites
kicad-winbuilder

Этот скрипт ни разу не сработал. Виджеты скачивал и не мог их собрать. И причин тут много.

На компе еще WinAVR стоит и WinARM, а там есть файлики типа make.exe ld.exe.

 

Про CMake старше 2.8. Вроде ставил и там всплыли какие-то грабли. Вобщем он отказался собирать совсем у меня.

 

Share this post


Link to post
Share on other sites
На компе еще WinAVR стоит и WinARM, а там есть файлики типа make.exe ld.exe.
ld.exe мешать не должен, потому что находится в директориях недоступных через PATH. А вот старый и глючный make от WinAVR удалите безжалостно вместе со всей директорией utils (и запить в PATH о ней тоже). Если есть такие же утилиты в комплекте WinARM - прибивайте и их. Используйте те, что идут в mingw/msys. Не уверен, что причина именно в этом, но make от WinAVR действительно глючный и вполне может быть причиной неправильной сборки.

Share this post


Link to post
Share on other sites
WinAVR действительно глючный и вполне может быть причиной неправильной сборки.

Если запускать cmake из консоли, то он не может сгенерировать makefile как раз из-за путей к WinAVR. В версии с GUI эти пути указываются. Но меня малость смущает тот факт, что make.exe берется из msys, а не mingw32-make.exe. Второй собирать отказывается на отрез.

Наверно самый лучший вариант поставить виртуалную машину и там играть в эти игры на чистой системе, ну или как Вы, попытаться сделать кросскомпиляцию.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this