Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SCons, build directory, log, сравниваю с cmake, есть вопросы... 
:(
    Опции темы
kamre
Дата 29.5.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Вообщем имеется у меня проект, типа такого:
Код

Project
  lib1
    src
  lib2
    src
  tests
    src
  application
    src

При работе с cmake у меня CMakeLists.txt лежит в директории Project, а сборка разных конфигураций делается в Project/build_<config>.

Написал аналогичный файл Project/SConstruct. Но никак не пойму, как мне делать сборки в Project/build. Сейчас у меня все объектники после компиляции появляются там же, где и исходники, а все бинарники прям в Project.  В документации что-то говорится про VariantDir, но у меня не получается с ней ничего. Что там передается вторым аргументом? Подскажите, пожалуйста, как делать сборку в отдельной директории, чтобы в дереве исходников ничего лишнего не появлялось.

И еще один небольшой вопрос по логу сборки. Сейчас когда запускаю scons, то он вываливает запуск компилятора и линкера со всеми параметрами, которые им передаются. Чаще всего это лишняя информация (когда процесс сборки уже работает), а интересно видеть только то, какой сейчас файл компилируется и сколько еще осталось в процентах. Как это можно настроить в scons?

P.S. Еще нашел waf, это вроде как форк scons. Чем он отличается? Может в нем все это проще делается?

PM MAIL   Вверх
Lazin
Дата 29.5.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



 smile 
если уже все собирается в cmake, зачем еще и SCons?
 smile 
PM MAIL Skype GTalk   Вверх
kamre
Дата 29.5.2008, 12:03 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(Lazin @ 29.5.2008,  11:52)
если уже все собирается в cmake, зачем еще и SCons?

Ну на самом деле изначально было вообще все исключительно на проектах под MSVC. На CMake я просто по быстрому переписал, уже работает почти все как надо (под mingw собирается, под линуксом тоже). Т.к. по быстрому, то не очень аккуратно и правильно. Да и пришлось ставить не стабильный cmake, т.к. некоторые фичи нужны были.

Вот и думаю теперь, как это все лучше правильно сделать. Дальше разбираться с CMake или же разобраться с чем-то другим. Вроде про Scons много хорошего пишут, решил и его посмотреть. С другой стороны, те же KDE в итоге от него отказались и перешли на CMake. Так что не все так однозначно получается smile
PM MAIL   Вверх
nickless
Дата 30.5.2008, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Цитата(kamre @  29.5.2008,  09:54 Найти цитируемый пост)
как мне делать сборки в Project/build

ИМХО лучше всего напиши отдельные SConscript файлы для каждой директории, а в корне вызывай их с указанием build directory
Код

SConscript('src/SConscript', build_dir='build')

или
Код

SConscript('src/SConscript', variant_dir='build')

(в новых версиях поменялось название)

Читать тут


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
kamre
Дата 30.5.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Переделал, значит, через SConsript для каждого проекта:
Код

import os

#create an environment that uses mingw tools
env = Environment(ENV=os.environ, tools=['mingw'])

build_dir = 'build'

SConscript('lib1/SConscript',
           variant_dir=build_dir + '/lib1',
           duplicate=0,
           exports='env')

SConscript('lib2/SConscript',
           variant_dir=build_dir + '/lib2',
           duplicate=0,
           exports='env')

SConscript('tests/SConscript',
           variant_dir=build_dir + '/tests',
           duplicate=0,
           exports='env')

SConscript('application/SConscript',
           variant_dir=build_dir + '/application',
           duplicate=0,
           exports='env')


а сами SConsctipt примерно так выглядят:
Код

Import('env')

lib1_src = ...

lib1_inc = ...

env.SharedLibrary(target='../lib1',  # put result to parent dir
                  source=lib1_src,
                  CPPPATH=lib1_inc,
                  CPPDEFINES=['_LIB1'])

и
Код

Import('env')

tests_src = ...

tests_inc = ...

env.Program(target='../tests', # put result to parent dir
            source=tests_src,
            CPPPATH=tests_inc,
            LIBS=['lib1', 'lib2'],
            LIBPATH='..') # search libraries in parent dir


Вопросы:
 - при линковке выдает ошибку "Слишком длинная строка символов", что делать?
 - зависимости между разными target SCons мне сам определит, или надо смому? как самому, если надо?
 - и все таки на счет лога компиляции, умеет ли показывать прогресс в процентах и текущий компилируемый файл?
PM MAIL   Вверх
nickless
Дата 31.5.2008, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
"Слишком длинная строка символов", что делать?

Для начала найти где она слишком длинная, там видно будет.

Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
зависимости между разными target SCons мне сам определит

По идее он для этого и предназначен, но если что можно и помочь, там есть 
Код

Depends(target, [dependency1, dependency2, ...])


Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
умеет ли показывать прогресс в процентах

ИМХО нет, этим cmake мне нравится больше smile

Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
текущий компилируемый файл? 

Код

env.Replace(
        CXXCOMSTR               = '\nCompiling $SOURCE:\n$CXXCOM\n',
        LINKCOMSTR              = '\nLinking $TARGET:\n$LINKCOM\n',
        GZIPCOMSTR              = '\nCompressing file $SOURCE:\n$GZIPCOM')



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
kamre
Дата 31.5.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(nickless @ 31.5.2008,  02:39)

Для начала найти где она слишком длинная, там видно будет.

Длинная строка получается при линковке: g++ -shared -o ... <many-many object files>

Цитата(nickless @ 31.5.2008,  02:39)

По идее он для этого и предназначен, но если что можно и помочь, там есть 
Код

Depends(target, [dependency1, dependency2, ...])


На небольших примерах вроде пока он сам все разруливает. А если что, то target придется из SConscript возвращать и Depends добавлять?


Цитата(nickless @ 31.5.2008,  02:39)

Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
умеет ли показывать прогресс в процентах

ИМХО нет, этим cmake мне нравится больше smile

Плохо, хотя и не критично. MSVC тоже при сборке не показывает.

Цитата(nickless @ 31.5.2008,  02:39)

Цитата(kamre @  30.5.2008,  11:23 Найти цитируемый пост)
текущий компилируемый файл? 

Код

env.Replace(
        CXXCOMSTR               = '\nCompiling $SOURCE:\n$CXXCOM\n',
        LINKCOMSTR              = '\nLinking $TARGET:\n$LINKCOM\n',
        GZIPCOMSTR              = '\nCompressing file $SOURCE:\n$GZIPCOM')


Спасибо за подсказку, до этого я еще не успел тогда в мануале прочитать.
Только все равно у меня вылазит небольшая проблема. При линковке shared library вываливает всю строку, хотя стоит:
Код

env.Replace(CXXCOMSTR    = 'Compiling $SOURCE',
            LINKCOMSTR   = 'Linking executable $TARGET',
            SHCXXCOMSTR  = 'Compiling $SOURCE',
            SHLINKCOMSTR = 'Linking shared library $TARGET')

выводит:
Код

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Compiling hello_lib\src\hello.cpp
g++ -shared -o build\hello.dll build\hello_lib\src\hello.o -Wl,--out-implib,build\libhello.a -Wl,--output-def,build\hello.def
Creating library file: build\libhello.a
Compiling hello_app\src\hello_app.cpp
Linking executable build\hello.exe
scons: done building targets.

почему не просто "Linking shared library build/hello.dll"?
PM MAIL   Вверх
kamre
Дата 31.5.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(kamre @ 31.5.2008,  10:34)

Длинная строка получается при линковке: g++ -shared -o ... <many-many object files>

Нашел на scons wiki workaround: http://www.scons.org/wiki/LongCmdLinesOnWin32
Хотя там же пишут, что win32 api не позволяет передать строку длиннее 32766. Но мне пока хватает...
Пришлось доставлять pywin32 и добавлять в SConstruct:
Код

# some workaround for line too long error
if env['PLATFORM'] == 'win32':
  import win32file
  import win32event
  import win32process
  import win32security
  import string

  def my_spawn(sh, escape, cmd, args, spawnenv):
    for var in spawnenv:
      spawnenv[var] = spawnenv[var].encode('ascii', 'replace')

      sAttrs = win32security.SECURITY_ATTRIBUTES()
      StartupInfo = win32process.STARTUPINFO()
      newargs = string.join(map(escape, args[1:]), ' ')
      cmdline = cmd + " " + newargs

      # check for any special operating system commands
      if cmd == 'del':
          for arg in args[1:]:
              win32file.DeleteFile(arg)
          exit_code = 0
      else:
          # otherwise execute the command.
          hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(None, cmdline, None, None, 1, 0, spawnenv, None, StartupInfo)
          win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
          exit_code = win32process.GetExitCodeProcess(hProcess)
          win32file.CloseHandle(hProcess);
          win32file.CloseHandle(hThread);
      return exit_code

  env['SPAWN'] = my_spawn

env.Replace(CXXCOMSTR    = 'Compiling $SOURCE',
            LINKCOMSTR   = 'Linking executable $TARGET',
            SHCXXCOMSTR  = 'Compiling $SOURCE',
            SHLINKCOMSTR = 'Linking shared library $TARGET')
...

Придется такое всегда с собой таскать в скрипте сборки?

P.S. В CMake как-то уже само по себе обходилось это ограничение и ничего дополнительно не надо было делать...
PM MAIL   Вверх
Любитель
Дата 2.6.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(nickless @  31.5.2008,  02:39 Найти цитируемый пост)
ИМХО нет, этим cmake мне нравится больше 

Может waf?

Добавлено через 13 секунд
Всмысле попробовать smile


--------------------
PM MAIL ICQ Skype   Вверх
kamre
Дата 2.6.2008, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Еще заметил такой косяк: после первой сборки, если еще раз запускаю scons, то он опять часть targets перелинковывает. Зачем он это делает? Есле еще раз запускаю, то больше не делает этого.

И еще, почему на уже собраном проекте, т.е. когда нужно просто показать 
Код
scons: `.' is up to date.
 он это делает аж 10.7 секунд в противовес 2.7 секунд для CMake? В SConstruct стоит:
Код

...
Decider('timestamp-match')
...


P.S. похоже придется вернуться на CMake и уже с ним доразбираться... А то получается, что scons без костылей в скрипте сборки линковать не умеет, тормозит, проценты не показывает...
PM MAIL   Вверх
nickless
Дата 2.6.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Цитата(kamre @  31.5.2008,  09:34 Найти цитируемый пост)
А если что, то target придется из SConscript возвращать и Depends добавлять?

Где добавлять всё равно, надо только чтобы были видны и то и другое, если это файлы, то будет достаточно пути к ним.

Цитата(kamre @  31.5.2008,  09:34 Найти цитируемый пост)
почему не просто "Linking shared library build/hello.dll"? 

А тот env , в котором заменили строку линковки виден в том файле, где происходит сама линковка?

Цитата(kamre @  31.5.2008,  11:29 Найти цитируемый пост)
Придется такое всегда с собой таскать в скрипте сборки?

Раз это ограничение scons-а, то скорее всего да. Я не сталкивался, не знаю smile 

Цитата(Любитель @  1.6.2008,  23:15 Найти цитируемый пост)
Всмысле попробовать

Всмысле мне? Мне не надо, я на CMake перехожу smile 

Цитата(kamre @  2.6.2008,  05:34 Найти цитируемый пост)
он это делает аж 10.7 секунд в противовес 2.7 секунд для CMake?

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


Вообще ИМХО scons - интересная штука, для него можно написать всё что угодно (python на порядок удобнее по сравнению с кхм.. странным "языком" cmake), но к сожалению этим слишком часто приходится заниматься.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Любитель
Дата 3.6.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(nickless @  2.6.2008,  20:40 Найти цитируемый пост)
Всмысле мне?

Всмысле топикстартеру smile

Это сообщение отредактировал(а) Любитель - 3.6.2008, 12:15


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.