Я нахожусь в процессе сокращения и карантина моего использования некоторых библиотек.Многие существующие программы, которые я написал, используют эти библиотеки напрямую.Я хотел бы, чтобы компилятор (GCC и / или Clang в данном случае) или какой-либо инструмент помогли бы мне идентифицировать эти применения по всей моей кодовой базе.Короче говоря, я хотел бы отравить использование этих библиотек в кодовой базе, за исключением того, что они будут использоваться одной библиотекой, и что одна библиотека будет видна другим модулям в моей кодовой базе.
Вопрос:
1) Знаете ли вы об инструментах, которые могут помочь мне в этом?
2) или вы можете порекомендовать некоторые стратегии, которые облегчат этот процесс?
Условия и детали:
- Удаление их включений не вариант.
- Поиск не эффективен из-за размера моей кодовой базы и количествасимволов, которые я хочу поместить в карантин.
- Использование инструментов рефакторинга будет слишком утомительным, учитывая сложность кодовой базы и количество удаляемых символов.
- Отдельный устаревший символ не является обязательным вариантом.на количество объявлений в сторонних библиотеках.
- Интерфейсы сторонних библиотек написаны в основном на C.
- Переводы будут C ++ и Objective-C ++.
- Хитрость препроцессора не изящна для конфигурации моих сборок и может изменить слишком много файлов.
- Не нужно исключать каждое последнее использование.В идеале они были бы, но большинство применений удовлетворительно.Это не является обязательным требованием просто потому, что слишком много обновлений.
- Удаление их со стадии связывания в этом случае не является хорошим вариантом (подробно описано в Обновлении № 3).
- В идеале,этот инструмент или стратегия будут доступны в OS X, но я также могу собрать значительную часть программ, ориентированных на Linux.
Некоторые стратегии, которые приходят на ум:
Лучшее, что я до сих пор придумал для этого случая, - это переопределить типы, которые использует библиотека, и украсить их устаревшими атрибутами:
typedef IHREType IHREType __attribute__((__deprecated__));
Но это не охватит все случаии отношение сигнал / шум будет довольно высоким после нескольких итераций.
В качестве альтернативы можно было бы переопределить эти типы в используемых мной корневых пространствах имен:
namespace MON {
typedef t_poisoned IHREType;
}
, но это станетнемного грязно.
Итак, я полагаю, что начну со стратегии устаревших атрибутов, но прежде чем я это сделаю, я думаю, что кто-то другой уже решил бы эту проблему и знал бы о ставкеter solution.
Обновление # 1
- K-Бал упоминал хорошую стратегию (отравление через включение).К сожалению, в моем случае это не сработает. API-интерфейсы, которые я бы хотел поместить в карантин, также можно найти в системных средах, которые включены через API-интерфейсы, которые я не хочу помещать в карантин.
Обновление № 2
Добавлен Linux из-за малого количества ответов.
Обновление # 3
> > Justin: Removing them from the link stage is not a good option in this case.
> thiton: Why not?
Чтобы уточнить этот момент: Iкак то, как библиотеки и проекты размещены в это время.Существует комбинация статических и динамических библиотек.Изменение этой структуры и синхронизация зависимостей отнимает много времени (хотя отдельные случаи могут быть хорошим использованием времени для некоторых библиотек ...).Компоновщик также разрешает большое количество символов, которые я хочу удалить из-за зависимостей (например, в системных библиотеках).
План, который я имею, приближается к этому
Естьсотни проектов Xcode в базе кодов (добавьте к этим проектам для других сборщиков / IDE).
Я сосредоточусь на этих обновлениях в течение нескольких дней здесь и нескольких дней там; 100% охват не является реалистичной целью на данный период времени, и в настоящее время это не является обязательным требованием. Из-за размера задачи и текущего состояния кодовой базы, я бы хотел сосредоточиться на удалении вхождений по номеру в это время. Удаление по номеру также предпочтительнее, потому что это в конечном итоге приведет к сокращению времени (требуется время, чтобы все это выстроить). Как только это уменьшится, я перейду к полной ликвидации - по крайней мере, это мой текущий план. В этом случае у меня есть время, чтобы выполнить обновления, но это еще не срочно. Если ваша рекомендация отличается от этой модели, у меня есть гибкость.