배경
나는 다음과 같은 문제에 직면해 있습니다: m4_include([some/file.m4])
내 configure.ac 파일에 갇혀 있습니다. 여기서 some/file.m4에는 "AC_INIT" 및 "LT_INIT"와 같이 libtoolize가 작동하는 데 필요한 패턴이 포함되어 있습니다. 즉, 이러한 패턴을 찾기 위해 구성.ac를 전처리한 다음 libtoolllize가 이를 sed에 공급하려면 m4가 필요합니다.
나는 (피할 수 있다면)configure.ac를 생성하고 싶지 않습니다. 나에게 도움이 되었던 libtoolize가 제공한 유일한 후크는 환경 변수 SED를 찾아 /bin/sed 대신 /bin/sed 대신 사용했다는 것입니다.
sed 인수를 구문 분석하여 실제 sed에 전달하는 쉘 스크립트를 작성했습니다. 불행하게도 libtoolize는 m4local.ac와configure.ac를 연결하여 어느 시점에서 $SED에 제공하므로 "configure.ac"라는 입력 파일을 찾는 데 실패합니다. 그럼에도 불구하고 $SED에 전달된 인수를 분석한 후 모든 입력 파일 및/또는 stdin을 연결할 수 있습니다. 왜냐하면 궁극적으로 스트림(stdin)에서 읽어서 작동해야 하기 때문입니다.
남은 질문
그래서 제가 직면하고 있는 문제는 다음과 같습니다.
내 스크립트는 비슷한 줄을 만날 때까지 stdin에서 읽고 stdout에 써야 합니다. m4_include([cwm4/configure_ac_top.m4])
그런 다음 cwm4/configure_ac_top.m4의 내용을 삼켜서 삽입해야 합니다. 추가 m4 전처리가 필요하지 않고 포함만 하면 됩니다. 사실 sed는 셀 수 없이 많은 작은 작업에 사용되기 때문에 m4_include 이외의 다른 전처리를 수행하는 것은 매우 위험합니다. 하지만 재귀적이어야 합니다. 포함된 파일에 한 줄이 포함되어 있으면 m4_sinclude([lt_init.m4])
해당 파일도 포함되어야 합니다.
이 사이트에서 파일을 다른 파일에 삽입하는 방법을 묻는 여러 질문과 답변을 찾았지만 삽입할 파일의 파일 이름이 알려져 있고(원본 파일에서 읽혀지지 않음) 재귀적이지 않으며 많은 경우에 그렇습니다. 표준 입력에서는 읽지 않습니다(그러나 처음으로 알려진 파일 이름에서 읽음).
답변1
마지막으로 m4를 사용하여 이 문제를 해결했습니다. 이 작업에서 가능한 "sed" 명령을 실행하려면 m4는 다음을 실행해서는 안 됩니다.아무것m4_include() 매크로를 처리하는 것 외에도, 일단 그렇게 하면 우리가 실제로 m4 입력을 처리하고 있다고 가정하고 따옴표 제거 및 물론 재귀 포함 등을 제거하는 것과 같은 작업을 수행할 수 있지만 괜찮습니다.
그래서 제가 한 일은 입력 스트림의 모든 "m4_" 항목을 일부 마법 문자열(xyzzy)로 바꾸고, m4_changequote(,)
시작 부분에 a를 삽입하여 따옴표를 없음으로 변경하고 결과를 m4로 파이프하는 것이었습니다. 이는 m4가 입력에 대해 전혀 작업을 수행하지 않음을 보장합니다. 그러나 나는 그것을 처리하기를 원했기 m4_include
때문에 m4로 파이핑하기 전에 m4가 포함된 파일을 처리하기 위해 올바른 참조를 사용하도록 하는 xyzzyinclude([\1])
것으로 대체했습니다. m4_changequote([,])m4_include([\1])m4_changequote(,)
마지막으로 m4 -P
sed의 출력이 다시 처리되어 마법 문자열이 "m4_"로 대체됩니다.
magic="xyzzy"
cat first.txt | /bin/sed "s/m4_/$magic/g;s/$magic""include(\[\([^]]*\)\])/m4_changequote([,])m4_include(\1)m4_changequote(,)/g;1s/^/m4_changequote(,)/" | m4 -P - | sed "s/$magic/m4_/g"
매직 문자열의 제한 사항은 다음과 같습니다. (하위 문자열) m4_를 포함할 수 없고, 밑줄이나 4_로 시작할 수 없으며, m이나 m4로 끝날 수 없습니다. 또한 시작된 문자와 동일한 문자로 끝나서는 안 됩니다. 마지막으로 입력 스트림에 나타나는 경우 "m4_"로 대체할 때 스크립트의 목적이 손상되어서는 안 됩니다.
다음 입력을 사용하면:
A1 m4_dnl Nothing should be changed.
A2 m4___file__
m4_include([second.txt])
A4 m4___line__
A5 [` Unmatched quoting: no problem.
그리고
This is second.txt, an m4 file.
The wizard said xyzzy,
and nothing happened.
"xyzzy"의 "마법" 문자열을 사용하면 다음과 같은 결과를 얻을 수 있습니다.
A1 m4_dnl Nothing should be changed.
A2 m4___file__
This is second.txt, an m4 file.
The wizard said m4_,
and nothing happened.
A4 m4___line__
A5 [` Unmatched quoting: no problem.
libtoolize의 경우 m4_include를 사용하여 구성.ac를 사용하는 것으로 충분합니다. 전체 SED 스크립트는 다음을 참조하세요.https://github.com/CarloWood/cwm4/blob/master/scripts/SED.sh
편집: 그것만으로는 충분하지 않은 것으로 나타났습니다. 또한 m4를 해킹으로 교체해야 했습니다.https://github.com/CarloWood/cwm4/blob/master/scripts/M4.sh