Исходники в системе каталогов

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Исходники в системе каталогов

Сообщение dedm0zaj »

Недавно мне пришлось скачать библиотеку Vampyre Imaging Library для работы с изображениями, которую мне советует вики фрипаскаля http://wiki.freepascal.org/OpenGL_Tutorial/ru

Вопрос в раскидывании исходников по каталогам. Почему если в корневом каталоге какой либо юнит ссылается на юнит в подкаталоге, то это явно не указывается? Т.е. к примеру в корневом каталоге есть юнит ImagingJpeg.pas, который в uses ссылается на imjpeglib. А этот imjpeglib находится не в корневом каталоге, а в подкаталоге JpegLib. Как ImagingJpeg.pas самостоятельно найдет imjpeglib? Приходится прописывать все пути всех подкаталогов для поиска исходников.

Почему нельзя этот процесс автоматизировать? Ведь можно же писать как то так:

Код: Выделить всё

uses
  imjpeglib in '/JpegLib/imjpeglib.pas';
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

В параметрах проекта указать папки поиска.
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Сообщение dedm0zaj »

alexs писал(а):В параметрах проекта указать папки поиска.


так я о том и говорю, что приходится прописывать пути для поиска исходников.

вопрос в том почему это не делается на уровне исходников? например:

Код: Выделить всё

uses
  imjpeglib in '/JpegLib/imjpeglib.pas';
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

dedm0zaj, потому что имена модулей, как правило, индивидуальны.
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Сообщение dedm0zaj »

Лекс Айрин писал(а):dedm0zaj, потому что имена модулей, как правило, индивидуальны.


не понял объяснения. можно поподробней?

а если я скачаю биьлиотеку, в которой тысячи подкаталогов с разной вложеностью? для каждого подкаталога указывать путь в настройках проекта?
почему не делают, как в той же java, где зависимости между каталогами сделана на уровне исходников? там достаточно один раз указать библиотеку и в ней всё автоматически находится.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

dedm0zaj, так как имена модулей уникальны, то нет необходимости выбирать один из двух. Соответственно, нет необходимости указывать нужный каталог. Не факт, кстати, что это так уж невозможно.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

dedm0zaj писал(а):Недавно мне пришлось скачать библиотеку Vampyre Imaging Library для работы с изображениями, которую мне советует вики фрипаскаля http://wiki.freepascal.org/OpenGL_Tutorial/ru

Вопрос в раскидывании исходников по каталогам. Почему если в корневом каталоге какой либо юнит ссылается на юнит в подкаталоге, то это явно не указывается? Т.е. к примеру в корневом каталоге есть юнит ImagingJpeg.pas, который в uses ссылается на imjpeglib. А этот imjpeglib находится не в корневом каталоге, а в подкаталоге JpegLib. Как ImagingJpeg.pas самостоятельно найдет imjpeglib? Приходится прописывать все пути всех подкаталогов для поиска исходников.

Команда добавить файлы из каталога в IDE есть, правда у меня не работает до конца. А вообще, лично мне удобнее чтобы в исходниках не было упоминаний путей, а так же чтобы без прямого указания пути поиска не добавлялись самовольно юниты, чтобы не засорять проект подключенными неиспользуемыми модулями. Я так связи отслеживаю, может не прав где то.
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Кстати - правильно написанная библиотека в лазаре не требует ручного определения путей. Достаточно пакет добавить в зависимости. Или положить любой визуальный компонент из библиотеки на на форму программы (при визуальной разработке)
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

alexs писал(а):(при визуальной разработке)

Вот именно. Я кстати то же сталкивался, когда хотел обойтись без установки библиотеки, но из за разветвлённой системы каталогов библиотеки отказывался от такого подхода.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Еще кстати. Есть возможность добавлять в пути проекта каталоги с подкаталогами? например добавил "/mysuperpuperlib/*/" и компилятор ищет юниты во всех подкаталогах?
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

qivi писал(а):Я кстати то же сталкивался, когда хотел обойтись без установки библиотеки


Мне кажется, что лучше оформить библиотеку по правилам и зарегистрировать её в IDE.
И после этого пользоваться всеми приятностями, которые будут предоставлены после этого.
А так - папка с файлами - это не библиотека - это файлопомойка.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

в зависимости от текущей целевой платформы в библиотеке могут браться разные пути
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

дефайны?
инклуды?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

это делается двумя возможными путями: первый через $(TargetCPU)-$(TargetOS) в путях, они подставляются, но тогда надо чтобы в точности совпадали названия папок с названия платформ в FPC, типа i386-win32 или как-то так. Это работает без Lazarus

Вторая возможность реализуется через лазарус-пакеты, там такая фича есть, пишутся такие типа скрипты

Код: Выделить всё

// LCLWidgetType
if LCLWidgetType+''='' then begin
  if GetIDEValue('OS')=TargetOS then begin
    // use the same widgettype as the IDE
    LCLWidgetType := GetIDEValue('LCLWidgetType');
    if LCLWidgetType='nogui' then
      LCLWidgetType:='';
  end;
  if LCLWidgetType+''='' then begin
    if (TargetOS='win32') or (TargetOS='win64') then
      LCLWidgetType := 'win32'
    else if TargetOS='wince' then
      LCLWidgetType := 'wince'
    else if TargetOS='darwin' then
      LCLWidgetType := 'carbon'
    else
      LCLWidgetType:='gtk2';
  end;
end;

// widget set specific options
base := LCLWidgetType+'/';
if LCLWidgetType='gtk3' then
begin
  CustomOptions := '-dgtk3';
  UnitPath := base + 'gtk3bindings';
end else
if LCLWidgetType='gtk' then
  CustomOptions := '-dgtk1'
else if LCLWidgetType='carbon' then begin
  CustomOptions := '-dcarbon';
  UnitPath := base+'objc;'
             +base+'pascocoa/appkit;'
             +base+'pascocoa/foundation';
  IncPath := UnitPath;
end else if LCLWidgetType='cocoa' then begin
  CustomOptions := '-dcocoa';
  if TargetCPU<>'i386' then
    CustomOptions += ' -dNoCarbon';
end else if LCLWidgetType='wince' then begin
  CustomOptions := '-dDisableChecks';
end else if LCLWidgetType='fpgui' then begin
  if undefined(fpGUIPlatform) then begin
    if SrcOS='win32' then
      fpGUIPlatform := 'gdi;'
    else
      fpGUIPlatform := 'x11;';
  end;
  CustomOptions := ' -dfpgui'+fpGUIPlatform;
  UnitPath := base+'src/gui;'
             +base+'src/corelib;'
             +base+'src/corelib/'+fpGUIPlatform
             +base+'src/corelib/reportengine;';
  IncPath := UnitPath+base+'src;';
end else if LCLWidgetType='customdrawn' then begin
  UnitPath := base+'android;';
end;

// linker options
if TargetOS='darwin' then begin
  if LCLWidgetType='gtk' then
    UsageLibraryPath := '/usr/X11R6/lib;/sw/lib'
  else if LCLWidgetType='gtk2' then
    UsageLibraryPath := '/usr/X11R6/lib;/sw/lib;/sw/lib/pango-ft219/lib'
  else if LCLWidgetType='carbon' then begin
    UsageLinkerOptions := '-framework Carbon'
      +' -framework OpenGL'
      +' ''-dylib_file'' ''/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib''';
  end else if LCLWidgetType='cocoa' then
    UsageLinkerOptions := '-framework Cocoa';
end else if TargetOS='solaris' then begin
  UsageLibraryPath:='/usr/X11R6/lib';
end else if TargetOS='linux' then begin
  if (LCLWidgetType='gtk') or (LCLWidgetType='gtk2') then
    UsageLibraryPath := '/opt/gnome/lib'; // for SuSE
end;

- из пакета LCL
Такие скрипты назначают пути в лазарус-пакетах в зависимости от платформы

Добавлено спустя 34 секунды:
Ну или через дефайны-инклуды, эт третья возможность

Добавлено спустя 10 секунд:
так сказать
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Сообщение dedm0zaj »

zub писал(а): Есть возможность добавлять в пути проекта каталоги с подкаталогами? например добавил "/mysuperpuperlib/*/" и компилятор ищет юниты во всех подкаталогах?

тоже кстати не нашел как такое сделать. в лазарусе имеется ввиду.

alexs писал(а):Мне кажется, что лучше оформить библиотеку по правилам и зарегистрировать её в IDE.
А так - папка с файлами - это не библиотека - это файлопомойка

а если допустим я юзаю geany? вики фрипаскаля называет файлопомойку "Vampyre Imaging Library" библиотекой. как быть?
Ответить