Получить имя выходного файла библиотеки libtool

Я пытаюсь определить правило Automake, которое будет генерировать текстовый файл, содержащий полный путь к библиотеке libtool, которая будет собрана и установлена ​​тем же Makefile. Есть ли простой способ получить имя выходного файла для библиотеки libtool (с правильным расширением для платформы, на которой создается программа)?

Например, я пытаюсь написать что-то вроде этого:

lib_LTLIBRARIES = libfoo.la

bar.txt:
  echo $(prefix)/lib/$(libfoo_la) >$@ 

Где $(libfoo_la) будет расширяться до libfoo.so, libfoo.dylib или libfoo.dll (или что-то еще), в зависимости от платформы. По сути, это значение параметра dlname в результирующем файле библиотеки libtool. Я потенциально мог бы извлечь имя файла непосредственно из него, но я надеялся, что есть более простой способ добиться этого.


person jprice    schedule 20.05.2014    source источник


Ответы (1)


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

foo.sed

# kill non-dlname lines
/^\(dlname\|libdir\)=/! { d }

/^dlname=/ {

# kill leading/trailing junk
s/^dlname='//

# kill from the last quote to the end
s/'.*$//

# kill blank lines
/./!d

# write out the lib on its own line
s/.*/\/&\n/g

# kill the EOL
s/\n$//

# hold it
h
}

/^libdir=/ {

# kill leading/trailing junk
s/^libdir='//

# kill from the last quote to the end
s/'.*$//

# paste
G

# kill the EOL
s/\n//
p
}

Makefile.am

lib_LTLIBRARIES = libfoo.la

bar.txt: libfoo.la foo.sed
        sed -n -f foo.sed $< > $@ 
person ldav1s    schedule 22.05.2014
comment
Является ли наличие sed более надежным, чем наличие grep и awk? В настоящее время я использую только это: $(GREP) dlname $< | $(AWK) -F "'" '{print $$2}' >$@, которое также достигает желаемого эффекта. - person jprice; 23.05.2014
comment
Нет, не совсем. Они оба находятся в списке обычные инструменты. Однако этот способ также добавляет libdir из файла .la, который должен быть правильным путем, по которому установлена ​​библиотека. Я заметил в вашем правиле сборки bar.txt, что вы записываете $(prefix)/lib/libfoo. расширение в bar.txt. Это не всегда будет правильно (например, на 64-битных платформах $(prefix)/lib64/libfoo. расширение). - person ldav1s; 23.05.2014
comment
Справедливое замечание - я думаю, мне следовало использовать $(libdir) вместо $(prefix)/lib. - person jprice; 23.05.2014