LINUX.ORG.RU

Вопрос по sed

 , , ,


0

2

Почему некоторые мейнтейнеры ПО делают makefile'ы, где не наследуются переvенные (CPPFLAGS, CFLAGS, CXXFLAGS, ASFLAGS, LDFLAGS, ...)?

Пришлось придумать такое:

FLAGS2makefile() {

        local _flag flag

        for flag in CPPFLAGS ASFLAGS CFLAGS CXXFLAGS RUSTFLAGS FFLAGS LDFLAGS; do

                _flag=$(printf %q "${!flag}")
                _flag="${_flag//\//\\\/}"

                sed -r "s/^(\s*\S*$flag\s*=.*)/\1 $_flag/" -i "$@"
        done

}
и прописывать в портах для таких мейкфайлов:
FLAGS2makefile {.,doc,misc,test}/Makefile
Помогает, пока не столкнулся с тем, что в Makefile могут быть переносы нужных строк после \
INTERNAL_CFLAGS = -I$(srcdir) -I$(objdir) \
                  -I$(srcdir)/include -I$(objdir)/include \
                  -I$(srcdir)/x86 -I$(objdir)/x86 \
                  -I$(srcdir)/asm -I$(objdir)/asm \
                  -I$(srcdir)/disasm -I$(objdir)/disasm \
                  -I$(srcdir)/output -I$(objdir)/output \
                  $(ZLIBINC)
из-за этого мои CFLAGS вставляются в первую строку после \

Вопрос: как состааить выражение для sed, чтобы вставляло мою строку в самый конец последней строки такой конструкции?

★★★★★

Это будет довольно сложный и хрупкий скрипт. Придётся повозиться с буферами sed.

Проще будет делать что-то типа такого:

INTERNAL_CFLAGS = . . .

INTERNAL_CFLAGS = $(INTERNAL_CFLAGS) blah blah blah

Но вообще, даже этот вариант довольно грязный. Я бы попробовал запустить make, передав ему prebuild-хук, определённый в другом месте.

kaldeon ★★
()

Вместо мазохизма с переносами строк можно вставлять в начало (после '=').

Но вообще идея сама по себе сомнительная - автор сборки уже прописал правильные флаги сборки, совершенно не тестировал работу мейкфайла после их изменения, а ты хочешь вслепую их изменить. Обычно, когда мейкфайлы редактируют, хотя бы смотрят что именно там редактируется.

firkax ★★★★★
()
Ответ на: комментарий от kaldeon

вот такое:

sed -r '/CFLAGS = /,/(^|[^\])$/s/([^\])$/\1 AAAAAAAAAAAAAAAAAAAAA/'
почти как надо, за исключением 1 случая, когда есть строка CFLAGS = в одну строку без \ переноса вконце, в такой ситуации оно почему-то подставляет и в конец 1 следущей строки. думаю, нехватает какого-то символа в ,/(^|[^\])$/

Но вообще, даже этот вариант довольно грязный. Я бы попробовал запустить make, передав ему prebuild-хук, определённый в другом месте.

как это осуществить? где определить хук, который будет фоново прописывать все CFLAGS, LDFLAGS,,, во все мэйкфайлы, т.к. в некоторых мэйкфайлах просто отсутствуют эти переменные и при запуске gcc он их просто не учитывает, даже несмотря на то, что они все всегда экспортируются ПМ'ом при запуске процесса сборки порта?

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 2)