# in projects where [ $mb_use_custom_cfgdefs = yes ], # cfgdefs.sh is invoked from within ./configure via # . $mb_project_dir/project/cfgdefs.sh # a successful return from cfgdefs.sh will be followed # by a second invocation of the config_copy() function, # reflecting any changes to common config variables # made by cfgdefs.sh. # finally, cfgdefs.sh may update the contents of the # config-time generated cfgdefs.mk. # cfgdefs helper functions . "$mb_project_dir/project/config/cfghost.sh" # sofort's config test framework . "$mb_project_dir/sofort/cfgtest/cfgtest.sh" pycfg_pydebug= pycfg_pymalloc= for arg ; do case "$arg" in --with-pydebug ) pycfg_pydebug='d' ;; --without-pydebug ) pycfg_pydebug= ;; --with-pymalloc ) pycfg_pymalloc='m' ;; --without-pymalloc ) pycfg_pymalloc= ;; *) error_msg ${arg#}: "unsupported config argument." exit 2 esac done cfgdefs_set_python_prefix() { if [ -z "$mb_prefix" ]; then mb_prefix='/.' fi if [ -z "$mb_exec_prefix" ]; then mb_exec_prefix='/.' fi } cfgdefs_set_cfghost_flavors() { cfghost_set_target_cfghost cfghost_set_native_cfghost } cfgdefs_detect_python_version() { mb_internal_verinfo=$(mktemp) if [ -z "$mb_internal_verinfo" ]; then exit 2 fi "$mb_native_cc" -E -dM "$mb_source_dir/Include/patchlevel.h" \ > "$mb_internal_verinfo" python_major=$(grep '#define PY_MAJOR_VERSION ' "$mb_internal_verinfo" | cut -d' ' -f3) python_minor=$(grep '#define PY_MINOR_VERSION ' "$mb_internal_verinfo" | cut -d' ' -f3) python_micro=$(grep '#define PY_MICRO_VERSION ' "$mb_internal_verinfo" | cut -d' ' -f3) if [ -z "$python_major" ] || [ -z "$python_minor" ] || [ -z "$python_micro" ]; then error_msg "Could not properly parse Python's patchlevel.h" exit 2 fi pydist_macros="$mb_project_dir/project/pydist.m4" pydist_helper="$mb_project_dir/sofort/core/modern.m4" pydist_srclst="$mb_project_dir/project/variants/$python_major.$python_minor.$python_micro/pydist.in" if ! [ -f "$pydist_srclst" ]; then exit 2 fi if ! m4 "$pydist_helper" "$pydist_macros" "$pydist_srclst" > pydist.mk ; then exit 2 fi python_ver="$python_major.$python_minor" if [ "$mb_package" = '@' ]; then mb_package= fi if [ "$mb_nickname" = '@' ]; then mb_nickname= fi [ -z "$mb_package" ] && mb_package='python'"$python_ver" [ -z "$mb_nickname" ] && mb_nickname="$mb_package" [ -z "$mb_pkgname" ] && mb_pkgname="$mb_package" [ -z "$mb_pkgdesc" ] && mb_pkgdesc="$mb_package" } cfgdefs_set_option_variables() { python_abifl=$pycfg_pydebug$pycfg_pymalloc } cfgdefs_output_options() { if [ -n "$pycfg_pydebug" ]; then cfgtest_cflags_append '-DPy_DEBUG' fi if [ -n "$pycfg_pymalloc" ]; then cfgtest_cflags_append '-DWITH_PYMALLOC' fi } cfgdefs_output_custom_defs() { sed \ -e 's/@python_ver@/'"$python_ver"'/g' \ -e 's/@python_major@/'"$python_major"'/g' \ -e 's/@python_minor@/'"$python_minor"'/g' \ -e 's/@python_micro@/'"$python_micro"'/g' \ -e 's/@python_abifl@/'"$python_abifl"'/g' \ "$mb_project_dir/project/config/cfgdefs.in" \ | sed -e 's/[ \t]*$//g' \ >> "$mb_pwd/cfgdefs.mk" } cfgdefs_perform_common_tests() { # headers cfgtest_header_absence 'stropts.h' cfgtest_header_presence 'crypt.h' cfgtest_header_presence 'stdatomic.h' cfgtest_header_presence 'endian.h' cfgtest_header_presence 'net/if.h' cfgtest_header_presence 'pthread.h' cfgtest_header_presence 'sched.h' cfgtest_header_presence 'spawn.h' cfgtest_header_presence 'sys/ioctl.h' cfgtest_header_presence 'sys/sendfile.h' cfgtest_header_presence 'sys/syscall.h' cfgtest_header_presence 'sys/sysmacros.h' cfgtest_header_presence 'sys/uio.h' cfgtest_header_presence 'sys/xattr.h' # interfaces mb_cfgtest_headers='crypt.h' cfgtest_interface_presence 'crypt_r' mb_cfgtest_headers='sys/epoll.h' cfgtest_interface_presence 'epoll_create1' mb_cfgtest_headers='sys/uio.h' cfgtest_interface_presence 'preadv' cfgtest_interface_presence 'preadv2' cfgtest_interface_presence 'pwritev' cfgtest_interface_presence 'pwritev2' mb_cfgtest_headers='spawn.h' cfgtest_interface_presence 'posix_spawn' mb_cfgtest_headers='pthread.h time.h' cfgtest_interface_presence 'pthread_getcpuclockid' mb_cfgtest_headers='sched.h' cfgtest_interface_presence 'sched_get_priority_max' cfgtest_interface_presence 'sched_rr_get_interval' cfgtest_interface_presence 'sched_setaffinity' cfgtest_interface_presence 'sched_setparam' cfgtest_interface_presence 'sched_setscheduler' mb_cfgtest_headers='sys/sendfile.h' cfgtest_interface_presence 'sendfile' # size of system types cfgtest_newline cfgtest_comment 'size of system types' cfgtest_type_size 'short' cfgtest_type_size 'int' cfgtest_type_size 'long' cfgtest_type_size 'long long' cfgtest_type_size 'float' cfgtest_type_size 'double' cfgtest_type_size 'long double' cfgtest_type_size 'void *' mb_cfgtest_headers='stdint.h' cfgtest_type_size 'uintptr_t' mb_cfgtest_headers='stdbool.h' cfgtest_type_size '_Bool' mb_cfgtest_headers='stddef.h' cfgtest_type_size 'size_t' cfgtest_type_size 'wchar_t' mb_cfgtest_headers='unistd.h' cfgtest_type_size 'pid_t' cfgtest_type_size 'off_t' mb_cfgtest_headers='time.h' cfgtest_type_size 'time_t' mb_cfgtest_headers='stdio.h' cfgtest_type_size 'fpos_t' mb_cfgtest_headers='pthread.h' cfgtest_type_size 'pthread_t' cfgtest_type_size 'pthread_key_t' # xattrs cfgtest_newline cfgtest_comment 'xattrs' if cfgtest_header_presence 'linux/limits.h'; then cfgtest_cflags_append '--include=linux/limits.h' fi # toolchain cfgtest_newline cfgtest_comment 'toolchain' # x87 mb_code_snippet='' mb_code_snippet="$mb_code_snippet "'void fn(void)' mb_code_snippet="$mb_code_snippet "'{__asm__ __volatile__ ("fnstcw pcw");' mb_code_snippet="$mb_code_snippet "' __asm__ __volatile__ ("fldcw pcw");}' if cfgtest_code_snippet_asm "$mb_code_snippet"; then cfgtest_cflags_append '-DHAVE_GCC_ASM_FOR_X87' fi # x64 mb_code_snippet='' mb_code_snippet="$mb_code_snippet "'void fn(void)' mb_code_snippet="$mb_code_snippet "'{__asm__ __volatile__ ("callq *%rax");}' if cfgtest_code_snippet_asm "$mb_code_snippet"; then cfgtest_cflags_append '-DHAVE_GCC_ASM_FOR_X64' fi # IEEE 754: little endian / big endian if $mb_cfgtest_cc -E -dM - < /dev/null \ | grep '__BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__' \ > /dev/null; then cfgtest_cflags_append '-DDOUBLE_IS_LITTLE_ENDIAN_IEEE754' elif $mb_cfgtest_cc -E -dM - < /dev/null \ | grep '__BYTE_ORDER__ __ORDER_BIG_ENDIAN__' \ > /dev/null; then cfgtest_cflags_append '-DDOUBLE_IS_BIG_ENDIAN_IEEE754' else cfgtest_newline cfgtest_comment 'cfgdefs.sh: cannot detect little/big endian,' cfgtest_comment 'cfgdefs.sh: so defined both macros below.' cfgtest_newline cfgtest_cflags_append '-DDOUBLE_IS_LITTLE_ENDIAN_IEEE754' cfgtest_cflags_append '-DDOUBLE_IS_BIG_ENDIAN_IEEE754' fi # getrandom: easier to simply test, # than to test whether we need to test # (and then test). cfgtest_newline cfgtest_comment 'getrandom' mb_cfgtest_headers='sys/syscall.h' if cfgtest_decl_presence 'SYS_getrandom'; then cfgtest_cflags_append '-DHAVE_GETRANDOM_SYSCALL' fi # libintl cfgtest_newline cfgtest_comment 'libintl' if cfgtest_library_presence -lintl; then cfgtest_ldflags_append '-Wl,--as-needed -lintl -Wl,--no-as-needed' fi # libuuid cfgtest_newline cfgtest_comment 'libuuid' if cfgtest_library_presence -luuid; then cfgtest_ldflags_append '-Wl,--as-needed -luuid -Wl,--no-as-needed' fi # uuid cfgtest_newline cfgtest_comment 'uuid' if cfgtest_header_presence 'uuid.h'; then mb_uuid_header='uuid.h' elif cfgtest_header_presence 'uuid/uuid.h'; then mb_uuid_header='uuid/uuid.h' else mb_uuid_header= fi mb_cfgtest_headers="$mb_uuid_header" cfgtest_interface_presence 'uuid_create' cfgtest_interface_presence 'uuid_enc_be' cfgtest_interface_presence 'uuid_generate_time_safe' # ncurses cfgtest_newline cfgtest_comment 'ncurses/ncursesw' mb_cfgtest_headers='ncurses.h' if [ $mb_cfgtest_cfgtype = 'host' ]; then mb_cfgtest_makevar='CFLAGS_NCURSES' else mb_cfgtest_makevar='NATIVE_CFLAGS' fi cfgtest_unit_header_presence 'curses.h' cfgtest_unit_header_presence 'ncurses.h' cfgtest_unit_header_presence 'ncurses/panel.h' && mb_panel_wrapper='yes' cfgtest_unit_header_presence 'ncursesw/panel.h' && mb_panel_wrapper='yes' cfgtest_unit_header_presence 'ncurses/term.h' && mb_term_wrapper='yes' cfgtest_unit_header_presence 'ncursesw/term.h' && mb_term_wrapper='yes' if cfgtest_unit_interface_presence 'is_term_resized'; then cfgtest_makevar_append '-DHAVE_CURSES_IS_TERM_RESIZED' fi if cfgtest_unit_interface_presence 'resizeterm'; then cfgtest_makevar_append '-DHAVE_CURSES_RESIZETERM' fi if cfgtest_unit_interface_presence 'resize_term'; then cfgtest_makevar_append '-DHAVE_CURSES_RESIZE_TERM' fi if cfgtest_unit_interface_presence 'filter'; then cfgtest_makevar_append '-DHAVE_CURSES_FILTER' fi if cfgtest_unit_interface_presence 'has_key'; then cfgtest_makevar_append '-DHAVE_CURSES_HAS_KEY' fi if cfgtest_unit_interface_presence 'immedok'; then cfgtest_makevar_append '-DHAVE_CURSES_IMMEDOK' fi if cfgtest_unit_interface_presence 'is_pad'; then cfgtest_makevar_append '-DHAVE_CURSES_IS_PAD' fi if cfgtest_unit_interface_presence 'syncok'; then cfgtest_makevar_append '-DHAVE_CURSES_SYNCOK' fi if cfgtest_unit_interface_presence 'typeahead'; then cfgtest_makevar_append '-DHAVE_CURSES_TYPEAHEAD' fi if cfgtest_unit_interface_presence 'use_env'; then cfgtest_makevar_append '-DHAVE_CURSES_USE_ENV' fi if cfgtest_unit_interface_presence 'wchgat'; then cfgtest_makevar_append '-DHAVE_CURSES_WCHGAT' fi # ncursesw if cfgtest_unit_interface_presence 'mvwget_wch'; then cfgtest_makevar_append '-DHAVE_NCURSESW' fi # ncurses: python refers to members of typedef struct _win_st WINDOW cfgtest_makevar_append '-DNCURSES_INTERNALS' # if [ _${mb_panel_wrapper:-} = _yes ]; then cfgtest_makevar_append '-I$(PROJECT_DIR)/wrappers/ncurses' unset mb_panel_wrapper fi # if [ _${mb_term_wrapper:-} = _yes ]; then cfgtest_makevar_append '-I$(PROJECT_DIR)/wrappers/ncurses' unset mb_term_wrapper fi # ncurses libs (common part) mb_ncurses_libs='-lpanelw -lncursesw' mb_ncurses_tinfo='-ltinfow' if cfgtest_library_presence $mb_ncurses_tinfo; then mb_ncurses_libs="$mb_ncurses_libs $mb_ncurses_tinfo" fi } cfgdefs_perform_target_tests() { # init cfgtest_host_section # common tests cfgdefs_perform_common_tests # ncurses libs mb_cfgtest_makevar='LDFLAGS_NCURSES_LIBS' cfgtest_makevar_append $mb_ncurses_libs mb_cfgtest_makevar='LDFLAGS_NCURSES' cfgtest_makevar_append \ '-Wl,--as-needed $(LDFLAGS_NCURSES_LIBS)' \ '-Wl,--no-as-needed' mb_cfgtest_makevar='LDFLAGS_NCURSES_STATIC' cfgtest_makevar_append '$(LDFLAGS_NCURSES)' # openssl cfgtest_newline cfgtest_comment 'openssl/libressl' mb_cfgtest_headers='openssl/x509.h' if cfgtest_interface_presence 'X509_NAME_ENTRY_set'; then cfgtest_cflags_append '-DOPENSSL_VERSION_1_1' fi mb_cfgtest_headers='openssl/x509_vfy.h' cfgtest_interface_presence 'X509_VERIFY_PARAM_set1_host' # tcl/tk libc cfgtest_newline cfgtest_comment 'tcl/tk' mb_tcltk_libs= for mb_tcltk_ver in 8.9 8.8 8.7 8.6 8.5; do if [ -z "$mb_tcltk_libs" ]; then mb_tcltk_libs="-ltk$mb_tcltk_ver -ltcl$mb_tcltk_ver" cfgtest_library_presence $mb_tcltk_libs \ || mb_tcltk_libs='' fi done mb_cfgtest_makevar='LDFLAGS_TCLTK_LIBS' cfgtest_makevar_append "$mb_tcltk_libs" mb_cfgtest_makevar='CFLAGS_TCLTK' cfgtest_makevar_append '-DWITH_APPINIT' mb_cfgtest_makevar='LDFLAGS_TCLTK' cfgtest_makevar_append '$(LDFLAGS_TCLTK_LIBS)' # sqlite cfgtest_newline cfgtest_comment 'sqlite3' mb_cfgtest_makevar='CFLAGS_SQLITE' cfgtest_makevar_append '-DMODULE_NAME=\"sqlite3\"' cfgtest_makevar_append '-DSQLITE_OMIT_LOAD_EXTENSION' mb_cfgtest_makevar='LDFLAGS_SQLITE' cfgtest_makevar_append '-lsqlite3' mb_cfgtest_makevar='LDFLAGS_SQLITE_STATIC' cfgtest_makevar_append '$(LDFLAGS_SQLITE)' # expat cfgtest_newline cfgtest_comment 'expat' mb_cfgtest_makevar='CFLAGS_EXPAT' cfgtest_makevar_append '-DXML_DEV_URANDOM' mb_cfgtest_makevar='LDFLAGS_EXPAT' cfgtest_makevar_append '-lexpat' mb_cfgtest_makevar='LDFLAGS_EXPAT_STATIC' cfgtest_makevar_append '$(LDFLAGS_EXPAT)' # ndbm cfgtest_newline cfgtest_comment 'ndbm' mb_cfgtest_makevar='CFLAGS_DBM' cfgtest_unit_header_presence 'ndbm.h' mb_cfgtest_makevar='LDFLAGS_DBM' cfgtest_makevar_append '-lgdbm_compat' mb_cfgtest_makevar='LDFLAGS_DBM_STATIC' cfgtest_makevar_append '$(LDFLAGS_DBM)' # static python library switches cfgtest_newline cfgtest_comment 'static python library switches' mb_cfgtest_makevar='LDFLAGS_PYEXT_STATIC' cfgtest_makevar_append '-Wl,--as-needed -lssl -lcrypto -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -luuid -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lbz2 -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lffi -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lgdbm -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lreadline -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lintl -Wl,--no-as-needed' cfgtest_makevar_append '-Wl,--as-needed -lz -Wl,--no-as-needed' [ $python_major = '3' ] && \ cfgtest_makevar_append '-Wl,--as-needed -llzma -Wl,--no-as-needed' # options cfgtest_newline cfgtest_comment 'target options' cfgdefs_output_options # pretty cfgdefs.mk cfgtest_newline } cfgdefs_perform_native_tests() { # init cfgtest_native_section # common tests cfgdefs_perform_common_tests # ncurses libs cfgtest_ldflags_append $mb_ncurses_libs # options cfgtest_newline cfgtest_comment '(native) pycompile options' cfgdefs_output_options # pretty cfgdefs.mk cfgtest_newline } # prefix, exec_prefix cfgdefs_set_python_prefix # cfghost cfgdefs_set_cfghost_flavors # python version info cfgdefs_detect_python_version # python-specific configuration cfgdefs_set_option_variables # cfgdefs.in --> cfgdefs.mk cfgdefs_output_custom_defs # strict: some tests might fail set +e # target-specific tests cfgdefs_perform_target_tests # native system tests cfgdefs_perform_native_tests # strict: restore mode set -e # all done return 0