How can I generate a single header for library PCRE2? I have included a Minimal, Reproducible Example
that demonstrates the problem but for some reason, it will not build correctly.
I suspect the order of the sources and headers. However is there an easier way of doing this? The expected result is a successful build.
SCRIPTPATH=$PWD
CFILES="
$SCRIPTPATH/pcre2_auto_possess.c
$SCRIPTPATH/pcre2_chartables.c
$SCRIPTPATH/pcre2_compile.c
$SCRIPTPATH/pcre2_config.c
$SCRIPTPATH/pcre2_context.c
$SCRIPTPATH/pcre2_convert.c
$SCRIPTPATH/pcre2_dfa_match.c
$SCRIPTPATH/pcre2_error.c
$SCRIPTPATH/pcre2_extuni.c
$SCRIPTPATH/pcre2_find_bracket.c
$SCRIPTPATH/pcre2_fuzzsupport.c
$SCRIPTPATH/pcre2_jit_compile.c
$SCRIPTPATH/sljit/sljitLir.c
$SCRIPTPATH/sljit/sljitUtils.c
$SCRIPTPATH/sljit/sljitExecAllocator.c
$SCRIPTPATH/sljit/sljitNativeX86_common.c
$SCRIPTPATH/sljit/sljitNativeX86_64.c
$SCRIPTPATH/pcre2_jit_match.c
$SCRIPTPATH/pcre2_jit_misc.c
$SCRIPTPATH/pcre2_maketables.c
$SCRIPTPATH/pcre2_match.c
$SCRIPTPATH/pcre2_match_data.c
$SCRIPTPATH/pcre2_newline.c
$SCRIPTPATH/pcre2_ord2utf.c
$SCRIPTPATH/pcre2_pattern_info.c
$SCRIPTPATH/pcre2_script_run.c
$SCRIPTPATH/pcre2_serialize.c
$SCRIPTPATH/pcre2_string_utils.c
$SCRIPTPATH/pcre2_study.c
$SCRIPTPATH/pcre2_substitute.c
$SCRIPTPATH/pcre2_substring.c
$SCRIPTPATH/pcre2_tables.c
$SCRIPTPATH/pcre2_ucd.c
$SCRIPTPATH/pcre2_valid_utf.c
$SCRIPTPATH/pcre2_xclass.c
"
CHEADERS="
$SCRIPTPATH/config.h
$SCRIPTPATH/pcre2.h
$SCRIPTPATH/pcre2_internal.h
$SCRIPTPATH/pcre2_ucp.h
$SCRIPTPATH/pcre2_intmodedep.h
$SCRIPTPATH/sljit/sljitLir.h
$SCRIPTPATH/sljit/sljitConfig.h
$SCRIPTPATH/sljit/sljitConfigInternal.h
$SCRIPTPATH/pcre2_jit_simd_inc.h
"
for i in ${CFILES} ${CHEADERS}; do
test -e $i && continue
echo "FATAL: file [$i] not found."
exit 127
done
DEFINE=(
-D PCRE2_CODE_UNIT_WIDTH=8
-D HAVE_STDLIB_H=1
-D HAVE_MEMMOVE=1
-D HEAP_LIMIT=20000000
-D LINK_SIZE=2
-D MATCH_LIMIT=10000000
-D MATCH_LIMIT_DEPTH=10000000
-D MAX_NAME_COUNT=10000
-D MAX_NAME_SIZE=32
-D NEWLINE_DEFAULT=2
-D PARENS_NEST_LIMIT=250
-D PCRE2_STATIC=1
-D STDC_HEADERS=1
-D SUPPORT_JIT=1
-D SUPPORT_PCRE2_8=1
-D SUPPORT_UNICODE=1
-D HAVE_WINDOWS_H=1
)
OPTS=(
-s
-flto
-mwindows
-luser32
-fmax-errors=5
-xc -
-o main.exe
)
function parse()
{
RELFILE=${1#"$SCRIPTPATH/"}
echo "/* BEGIN FILE $RELFILE */"
sed -e '/# *include *"/d' -e '/# *include *<sljit\//d'< $1
echo "/* END FILE $RELFILE */"
}
echo "Merging files..."
{
for h in ${CHEADERS}; do
parse $h
done
for h in ${CFILES}; do
parse $h
done
} > "output.h"
echo "Building..."
read -r -d '' VAR <<EOF
#include <windows.h>
#include "output.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return 0;
}
EOF
gcc "${DEFINE[@]}""${OPTS[@]}"<<< $VAR