Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Make и доступ к топовой директории

Приветствую!

Есть очень большой проект. Он разбит на кучу либ, код каждой сидит в отдельной поддиректории. Есть и под-поддиректории и под-под-под... 
В каждой директории свой мэйкфайл.

Иногда, например для того чтобы узнать путь к какой-либо директории с header files, делается поиск в PWD по названию топовой директории:
SERVICES_ROOT=$(shell echo $(CURR_DIR) | sed 's/\(.*\)services.*/\1services/')
тут services - название проекта. Т.е. тупо берется и в мэйкфайлах в поддиректориях ищется "services" в PWD. Мне это не нравится тем, что есть зависимость от названия топовой директории.
Можно было бы в топовом мэйкфайле сохранить PWD в SERVICES_ROOT и передавать в дочерние мэйкфайлы. Но как тогда билдить только дочерние либы без билда всего проекта?

Может посоветуете что делать в такой ситуации.

Заранее благодарен.
Ответ:
Если известно относительное положение каждого вложенного дира с Makefile'ом относительно топа, то можно взять PWD в нем и сделать необходимое количество ../../.. Но как то это кривовато, на мой взгляд  :wink Увы, других путей не вижу, может уважаемое сообщество найдет?  :wink

Добавлено @ 11:35
Хотя есть еще путь - пройтись вверх по родительским директориям и поискать какой нибудь файл, который должен лежать в топе проекта. 
Хотя решение тоже не фонтан  :nea 


Это сообщение отредактировал(а) xvr - 7.10.2014, 11:36
Вопрос: волшебные boost.fibers, make, ninja

доброго времени :)
у меня тут один непонятный впрос есть. ситуация такая: есть проект на cmake. есть буст 1.61 с boost.fibers, которые используют boost.context (то есть контекст должен идти после фибры) и нормально у меня компилится.

так вот, если сделать с генератором на make, то все собирается, если сделать на ninja - то не выходит, хотя команда одна и та же.

вот листинг ошибок
+ ninja

[3/6] Linking CXX executable tests/cms/itest_2
FAILED: : && /usr/bin/c++ -Wsuggest-override -g -DBUILD_DEBUG tests/cms/CMakeFiles/itest_2.dir/itests/2/blog.cpp.o -o tests/cms/itest_2 -rdynamic libcpphttpx_sockjs.a libcpphttpx_cms.a tests/libcpphttpx_test_start.a /usr/local/lib/libboost_locale.so /usr/local/lib/libboost_system.so /usr/local/lib/cppjson-1.1/Debug/libcppjson.a -ldl -lstdc++fs li
bcpphttpx_h2o.a libcpphttpx.a /usr/local/lib/libboost_fiber.a /usr/local/lib/libboost_context.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_thread.a -lpthread /usr/
local/lib/libh2o.a /usr/local/lib/libwslay.so /usr/local/lib/libuv.so -lssl -lcrypto -lpthread /usr/local/lib/libboost_program_options.so -Wl,-rpath,/usr/local/lib && :
libcpphttpx.a(fiber_starter.cpp.o): In function `boost::fibers::context::context<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}, std::tuple<> >(boost::fibers::worker_context_t, boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}&&, std::tuple<>&&)':
/usr/local/include/boost/fiber/context.hpp:321: undefined reference to `boost::context::execution_context::current()'
libcpphttpx.a(fiber_starter.cpp.o): In function `void boost::fibers::context::run_<cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}, std::tuple<> >(cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}&&, std::tuple<>&&, boost::fibers::context::data_t*)':
/usr/local/include/boost/fiber/context.hpp:206: undefined reference to `boost::fibers::context::terminate()'
libcpphttpx.a(fiber_starter.cpp.o): In function `boost::context::detail::activation_record* boost::context::execution_context::create_context<boost::context::basic_fixedsize_sta
ck<boost::context::stack_traits>, boost::fibers::context::context<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}, std::tuple<> >(boost::fibers::worker_context_t, boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_trai
ts>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}&&, std::tuple<>&&)::{lambda(void*)#1}>(boost::fibers::worker_context_t, boost::context::prealloc
ated, boost::fibers::context::context<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}, std::tuple<> >(boost::fibers::worker_context_t, boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>, cpphttpx::fiber_starter::start(std::function<void ()> const&)::{lambda()#1}&&, std::tuple<>&&)::{lambda(void*)#1})':
/usr/local/include/boost/context/execution_context.hpp:294: undefined reference to `boost::context::execution_context::current()'
libcpphttpx.a(fiber_starter.cpp.o): In function `TLS wrapper function for boost::context::detail::activation_record::current_rec':
fiber_starter.cpp:(.text._ZTWN5boost7context6detail17activation_record11current_recE[_ZTWN5boost7context6detail17activation_record11current_recE]+0x5): undefined reference to `TLS init function for boost::context::detail::activation_record::current_rec'
fiber_starter.cpp:(.text._ZTWN5boost7context6detail17activation_record11current_recE[_ZTWN5boost7context6detail17activation_record11current_recE]+0x15): undefined reference to `
boost::context::detail::activation_record::current_rec'
collect2: error: ld returned 1 exit status

+ verbose make

[ 89%] Linking CXX executable itest_1
cd /home/fleonis/projects/tmp/cpphttpx_srv/build/tests/cms && /usr/bin/cmake -E cmake_link_script CMakeFiles/itest_1.dir/link.txt --verbose=1
/usr/bin/g++ -Wsuggest-override -g -DBUILD_DEBUG CMakeFiles/itest_1.dir/itests/1/itest.cpp.o -o itest_1 -rdynamic ../../libcpphttpx_sockjs.a ../../libcpphttpx_cms.a ../libcpphttpx_test_start.a /usr/local/lib/libboost_locale.so /usr/local/lib/libboost_system.so /usr/local/lib/cppjson-1.1/Debug/libcppjson.a -ldl -lstdc++fs ../../libcpphttpx_h2o.a ../../libcpphttpx.a /usr/local/lib/libboost_fiber.a /usr/local/lib/libboost_context.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_thread.a -lpthread /usr/local/lib/libh2o.a /usr/local/lib/libwslay.so /usr/local/lib/libuv.so -lssl -lcrypto -lpthread /usr/local/lib/libboost_program_options.so -Wl,-rpath,/usr/local/lib


при чем, если исполнить комманды независимо, в директории с make, то все хорошо, а если в ninja - то плохо.

в чем может быть загвоздка?

ЗЫ: это все на дебьян сид
Ответ: а, ну на полностью собранной
make | wc -l
23
Вопрос: О доступе к директории

Проверяю доступ к каждой директории на дисках. disks[i] - это "C:" и "D:".
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var di = new DirectoryInfo(globals.disks[i]);
                    foreach (DirectoryInfo dir in di.EnumerateDirectories())
                    {
                        lines.Add(dir.FullName);
                        DirectorySecurity ds = dir.GetAccessControl(AccessControlSections.Access);
                        foreach (FileSystemAccessRule fsar in ds.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
                        {
                            string userRights = fsar.FileSystemRights.ToString();
 
                            lines.Add("    " + userRights);
                            File.AppendAllLines(Directory.GetCurrentDirectory() + "/1.txt", lines);
 
                            if (userRights == "FullControl")
                            {
                                globals.allowPaths[j] = globals.disks[i] + dir.FullName;
                                j++;
                            }
                        }
                    }
На D у есть папка System Volume Information (во вложениях). Она системная, я даже через проводник не могу в неё зайти. А цель моей программы - это прочёсывание диска. Я сначала получаю имена директорий в каждом диске, затем проверяю доступ к каждой директории. Мне нужно, что бы программа не заходила в эту системную папку, т. к. это вызовет исключение. Я проверяю каждую директорию на права доступа к ней.


C#
1
2
3
4
lines.Add(dir.FullName);
 
lines.Add("    " + userRights);
File.AppendAllLines(Directory.GetCurrentDirectory() + "/1.txt", lines);
^ тут я вывожу права к каждой директории (во вложениях). Для System Volume Information все строки указывают "FullControl".

список этих прав тут:

Я проверяю, наверное не тем методом (во вложениях).
Ответ: b_d, нужно делать проще. Пробовать зайти в каталог, если не получается (генерируется исключение), то пропускать его. Вариант реализации смотри, например, в теме .
Вопрос: Функция make+, make*

Как описать функцию: make+ , make* ???
Функция этого задания должна конструировать для заданного набора аргументов вызов функции,
упомянутой в названии. Функция должна быть определена для корректного числа параметров.
Ответ: И что такое result-test? А если сравнивать, то

Lisp
1
2
3
(equal (make+ 1 2 3) (+ 1 2 3))
 
==> T
Вопрос: Утилита make, сборка проекта

Нужна помощь в освоении make. Есть проект с 4 php файлами, 4 tpl шаблонами и 1 css.
index.php - основная страница
contact.php - форма заполнения сообщения для отправки
e.validation.php - валидация мыла (используется в contact.php)
connetct.php - подключение к базе данных (используется в contact.php)
Так вот, нужно сделать makefile для сборки этого проекта. Нигде не могу найти хорошую документацию для начинающего. Да и везде где ищешь make вылезают другие языки. Если нужен php код скажите. Так же приветствую любые сылки про php make.
Ответ: blaze19, PHP-код не нужно собирать, PHP - интерпретируемый язык. Утилита make же в основном используется для сборки проектов, написанных на компилируемых языках.
Вопрос: mingw32-make игнорирует ошибки (простите за оффтоп)

mingw32-make стал игнорировать ошибки при сборке, пытается выполнить цели до конца, после чего даже и %errorlevel% нулю равен. При чем так себя ведут mingw32-make из всех версий MinGW какие бы я не пробовал на своей машине. Wtf, как побороть?
Ответ: White Owl, спасибо за помощь.
Вопрос: Определить функцию MAKE-EVEN

Определить функцию MAKE-EVEN, которая имеет один аргумент - список числовых значений. Функция MAKE-EVEN превращает четные числа списка в нечетные, добавляя к ним единицу. Если число уже нечетное, то оно остается без изменений.
Ответ: _sg, перебрали все... Вот что остается:

Lisp
1
2
3
4
5
6
7
8
9
10
11
((lambda (x f)
   (cond ((null x) nil)
         ((evenp (car x)) (cons (+ 1 (car x)) (funcall f (cdr x) f)))
         (t (cons (car x) (funcall f (cdr x) f)))))
  '(1 2 3 4 5 6 7 8 9 10)
(lambda (x f)
   (cond ((null x) nil)
         ((evenp (car x)) (cons (+ 1 (car x)) (funcall f (cdr x) f)))
         (t (cons (car x) (funcall f (cdr x) f))))))
 
==> (1 3 3 5 5 7 7 9 9 11)
Добавлено через 1 минуту
Оксана12, странное название (make-even - сделать четным) для функции, которая делает как раз обратное... Догадываюсь о причине: "так препод сказал". Я прав?
Вопрос: visual studio project -> make

Всем привет,

есть консольная программа под win, есть исходники (Visual Studio проект) и документация (на немецком). Согласно кривому переводу доки ничего ОС специфичного в программе нет, соответственно можно собрать и по linux. Задача в этом и состоит.
Опыта в с/с++ и .net нет совсем. (джавер)
Под win скачал visual studuio 2012 и попытался собрать проект: собрал только после замены
#include "afxres.h"

на
#include "WinResrc.h"


теперь надо попытаться собрать все это под linux
проект небольшой (15 .c фалов и 5 .h фалов)
собственно как портировать ? (в предположении что действительно в исходном коде ничего OS специфик нет)
  • пытаться собрать руками (gcc)
  • разбираться как писать make и написать самому (это реально за короткий срок ?)
  • найти тулу которая создает make файл по visual studio проекту
  • смотреть в сторону cmake и разбираться в нем
  • ставить ide (eclise/netbeans/monodevelop) и пытаться завести проект там (честно говоря такой вариант крайне не нравится)
  • Ответ:
    Michael Ponomarev
    like java :),

    И ничего здесь не лайк. Разные исторические эпохи ибо.
    Вопрос: Не работает команда make

    не работает команда make в консоли, что делать?
    Ответ: где брать аналог make, если я пользуюсь сборкой под msvc2013? пытаюсь вот это собрать
    Вопрос: Python: нужно проверить права доступа к директории (OS Windows)

    вопрос: и как же это лучше сделать? (проверяем для пользователя, запустившего скрипт)
    в идеале мне бы подошел функционал os.access(), но в Windows 7 он не работает (нет поддержки effective user id)

    пока попробовала следующее и привожу результаты

    (a)
    пробуем и os.access() и с опцией effective_ids=True и получаем ошибку
    print(os.access(test_dir, os.F_OK, effective_ids=True))
    """
    возвращает
    NotImplementedError: access: effective_ids unavailable on this platform
    не подходит: мне нужен результать именно для пользователя, запустившего скрипт
    """
    

    (b)
    пробуем и os.access() c опцией effective_ids=False
    print(os.access(test_dir, os.F_OK, effective_ids=False))
    """
    возвращает
    True
    не совсем подходит: мы знаем, что папка существует, но мы также хотим знать, что же там можно сделать, и os.access() здесь не помощник (но вопрос существования папки решился, это плюс)
    """
    

    (c)
    пробуем os.path
    print(os.path.isdir(test_dir), os.path.exists(test_dir))
    """
    возвращает
    True, False
    не совсем подходит: мне нужно проверять отдельно read and write permissions
    """
    
    Ответ: 1.
    maxkar
    mini.weblab,
    А где варианты с os.access(os.R_OK) и os.W_OK? Они проверялись и не работают (и почему тогда их в примере нет)? Или не проверялись даже?

    они проверялись, но не дали желаемого результата. проблема описана в первом посте (а): NotImplementedError: access: effective_ids unavailable on this platform.

    Если запускать os.access() с опцией effective_ids=False, то мы получаем True для любой существующей папки вне зависимости от прав доступа, и False для несуществующей. Т.е. папка существует и теоретически в нее можно заглянуть и что-то записать, примерно так. :)

    2.
    я тоже думала, что os.access() по идее, а на практике оказалось, что нет. :)
    в Windows функция os.access() работает некорректно, поэтому я пробую альтернативные решения.
    Интересует effective UID: т.е. все просто, скрипт запускается и работает от имени одного пользователя, и мы хотим проверить есть ли у данного пользователя права чтения-записи в определенную папку.