配置脚本中出现“找不到命令”错误如何诊断?

问题描述 投票:0回答:1

我正在维护一个遗留项目,并在构建过程中运行configure脚本时遇到了

问题
。该脚本失败,并出现多个“未找到命令”错误,这些错误指向
configure
config.status
bash 脚本中的某些特定行。我需要帮助诊断和解决这个问题。

这是我在

../configure
目录中运行
build
时的错误输出片段:

../configure: line 24114: : command not found
../configure: line 24114: x86_64-pc-linux-gnu: command not found
../configure: line 24114: linux-gnu: command not found
../configure: line 24114: o: command not found

gcc: fatal error: no input files
compilation terminated.

../configure: line 24114:  -fPIC -g -O2: command not found

configure
脚本的第24114行是一个更大块的一部分,如下所示:

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  printf "%s\n" "$ac_log"
} >&5

以及错误消息:

./config.status: line 798: : command not found
./config.status: line 810: : command not found

参考

# Quote evaled strings.
for var in AS DLLTOOL OBJDUMP SHELL ECHO PATH_SEPARATOR SED GREP EGREP FGREP LD NM LN_S lt_SP2NL lt_NL2SP reload_flag deplibs_check_method file_magic_cmd file_magic_glob want_nocaseglob sharedlib_from_linklib_cmd AR AR_FLAGS archiver_list_spec STRIP RANLIB CC CFLAGS compiler lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl lt_cv_sys_global_symbol_to_import lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix lt_cv_nm_interface nm_file_list_spec lt_cv_truncate_bin lt_prog_compiler_no_builtin_flag lt_prog_compiler_pic lt_prog_compiler_wl lt_prog_compiler_static lt_cv_prog_compiler_c_o need_locks MANIFEST_TOOL DSYMUTIL NMEDIT LIPO OTOOL OTOOL64 shrext_cmds export_dynamic_flag_spec whole_archive_flag_spec compiler_needs_object with_gnu_ld allow_undefined_flag no_undefined_flag hardcode_libdir_flag_spec hardcode_libdir_separator exclude_expsyms include_expsyms file_list_spec variables_saved_for_relink libname_spec library_names_spec soname_spec install_override_mode finish_eval old_striplib striplib compiler_lib_search_dirs predep_objects postdep_objects predeps postdeps compiler_lib_search_path LD_CXX LD_F77 reload_flag_CXX reload_flag_F77 compiler_CXX compiler_F77 lt_prog_compiler_no_builtin_flag_CXX lt_prog_compiler_no_builtin_flag_F77 lt_prog_compiler_pic_CXX lt_prog_compiler_pic_F77 lt_prog_compiler_wl_CXX lt_prog_compiler_wl_F77 lt_prog_compiler_static_CXX lt_prog_compiler_static_F77 lt_cv_prog_compiler_c_o_CXX lt_cv_prog_compiler_c_o_F77 export_dynamic_flag_spec_CXX export_dynamic_flag_spec_F77 whole_archive_flag_spec_CXX whole_archive_flag_spec_F77 compiler_needs_object_CXX compiler_needs_object_F77 with_gnu_ld_CXX with_gnu_ld_F77 allow_undefined_flag_CXX allow_undefined_flag_F77 no_undefined_flag_CXX no_undefined_flag_F77 hardcode_libdir_flag_spec_CXX hardcode_libdir_flag_spec_F77 hardcode_libdir_separator_CXX hardcode_libdir_separator_F77 exclude_expsyms_CXX exclude_expsyms_F77 include_expsyms_CXX include_expsyms_F77 file_list_spec_CXX file_list_spec_F77 compiler_lib_search_dirs_CXX compiler_lib_search_dirs_F77 predep_objects_CXX predep_objects_F77 postdep_objects_CXX postdep_objects_F77 predeps_CXX predeps_F77 postdeps_CXX postdeps_F77 compiler_lib_search_path_CXX compiler_lib_search_path_F77; do
    case `eval \\$ECHO \\""\\$$var"\\"` in
    *[\\\`\"\$]*)
      eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_$var=\\\"\$$var\\\""
      ;;
    esac
done

# Double-quote double-evaled strings.
for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds sys_lib_search_path_spec configure_time_dlsearch_path configure_time_lt_sys_library_path reload_cmds_CXX reload_cmds_F77 old_archive_cmds_CXX old_archive_cmds_F77 old_archive_from_new_cmds_CXX old_archive_from_new_cmds_F77 old_archive_from_expsyms_cmds_CXX old_archive_from_expsyms_cmds_F77 archive_cmds_CXX archive_cmds_F77 archive_expsym_cmds_CXX archive_expsym_cmds_F77 module_cmds_CXX module_cmds_F77 module_expsym_cmds_CXX module_expsym_cmds_F77 export_symbols_cmds_CXX export_symbols_cmds_F77 prelink_cmds_CXX prelink_cmds_F77 postlink_cmds_CXX postlink_cmds_F77; do
    case `eval \\$ECHO \\""\\$$var"\\"` in
    *[\\\`\"\$]*)
      eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_$var=\\\"\$$var\\\""
      ;;
    esac
done

这些错误似乎表明脚本中的命令执行或语法存在问题。我不确定这是否是由于缺少工具、环境问题或脚本中的语法错误造成的。

环境:

  • 操作系统和版本:Windows 10 版本 22H2,在适用于 Linux 的 Windows 子系统 (WSL2) 上运行 Ubuntu 22.04.3 LTS

复制

  1. 在项目文件夹中运行
    autoreconf -fi
  2. mkdir build
    cd build
  3. ../configure

问题:

  1. 如何诊断
    configure
    脚本中这些“未找到命令”错误的确切原因?
  2. 我应该采取哪些步骤来解决这些问题并确保脚本正确运行?

任何指导或建议将不胜感激。

P.S.1. 正如评论中所建议的,我将

configure
bash 脚本中的代码块夹在
set -x ... set +x
之间,结果是我在终端中得到了这个额外的输出:

+ exec
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x'
+ printf '%s\n' '
This file was extended by jmodelica.org config.status 0.0.0, which was
generated by GNU Autoconf 2.71.  Invocation command line was

  CONFIG_FILES    =
  CONFIG_HEADERS  =
  CONFIG_LINKS    =
  CONFIG_COMMANDS =
  $ ./config.status

on DESKTOP-foobar
'
+ set +x

P.S.2.我也尝试使用

scan-build
命令行实用程序进行静态分析。

bash configure autotools autoconf autoreconf
1个回答
0
投票

所有这些都是由

configure.ac
中的 shell 代码生成的,
AC_OUTPUT
扩展为。

AC_OUTPUT
单独写在一行上不会出错,因此之前发生的宏以及为
AC_OUTPUT
设置的宏中存在问题。

总的来说,

configure.ac
使用了不常见的事件序列,并且在其他方面也有点奇怪。不过,我还没有发现触发所有这些失败的 shell 命令的具体奇怪之处。

© www.soinside.com 2019 - 2024. All rights reserved.