使用 make -O 编译问题
Issue compiling with make -O
我们在重新编译 protobuf v2.6 时遇到问题。它用于工作并且 gmake 将输出以下内容:
...
gmake[3]: Entering directory `/atc/proto/protobuf-2.6.0/src'
depbase=`echo google/protobuf/compiler/main.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
/usr/bin/g++ -DHAVE_CONFIG_H -I. -I.. -pthread -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -m32 -MT google/protobuf/compiler/main.o -MD -MP -MF $depbase.Tpo -c -o google/protobuf/compiler/main.o google/protobuf/compiler/main.cc &&\
mv -f $depbase.Tpo $depbase.Po
depbase=`echo google/protobuf/stubs/atomicops_internals_x86_gcc.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ../libtool --tag=CXX --mode=compile /usr/bin/g++ -DHAVE_CONFIG_H -I. -I.. -pthread -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -m32 -MT google/protobuf/stubs/atomicops_internals_x86_gcc.lo -MD -MP -MF $depbase.Tpo -c -o google/protobuf/stubs/atomicops_internals_x86_gcc.lo google/protobuf/stubs/atomicops_internals_x86_gcc.cc &&\
mv -f $depbase.Tpo $depbase.Plo
...
现在它输出以下内容并且不编译任何东西。所有.o文件都是0字节。
...
gmake[5]: Entering directory `/atc/proto/protobuf-2.6.0/src'
touch google/protobuf/compiler/.dirstamp
touch google/protobuf/compiler/.deps/.dirstamp
touch google/protobuf/compiler/main.o
touch google/protobuf/stubs/.dirstamp
touch google/protobuf/stubs/.deps/.dirstamp
touch google/protobuf/stubs/atomicops_internals_x86_gcc.lo
...
我们希望有使用 google protobuf 经验的人可以解释为什么它接触文件而不是编译它们。知道这一点,我们可能会很快解决问题。我们已经在另一台机器上构建了它,并且我们一直在比较我们能想到的一切,但现在我们正处于使用细齿梳理 autoconf make 文件以了解这种行为的地步。
我们启动 google protobuff make 的脚本非常简单,我们没有对 google protobuf 进行任何更改(我们只是解压然后构建它)。
build_proto.sh
set -x
pb_pkg=protobuf-2.6.0
cc=/usr/bin/g++
if [[ ! -e "$pb_pkg.tar.gz" ]]; then
echo "Can't find $pb_pkg.tar.gz"
exit
fi
tar xvfz $pb_pkg.tar.gz
cd $pb_pkg
export PATH=$PATH:/opt/bb/bin/:/usr/bin
./configure CC=$cc CXX=$cc CFLAGS=-m32 CXXFLAGS=-m32 FFLAGS=-m32 FCFLAGS=-m32
gmake
生成文件
.PHONY: all
all:
./build_proto.sh
clean:
rm -rf protobuf-2.6.0
build: all
test: all
uname -a
Linux atc-build 2.6.32-642.6.2.el6.x86_64 #1 SMP Mon Oct 24 10:22:33 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
更新
问题不在配置中。 运行 自行配置,两个系统的差异是相同的,除了细微的差异。必须在制作中。
问题是由两件事造成的。事后看来,其中一个应该是系统构建失败的明显警告标志。
- 正在使用 -O 标志调用顶级 make。
- build_proto.sh 正在使用 gmake!
将 build_proto.sh 从 gmake 切换到 make 解决了这个问题。 gmake 不理解 -O,因此不仅难以传达回 make 的输出,而且显然 运行 顺序错误(详细输出显示 jobserver 问题)。
我们在重新编译 protobuf v2.6 时遇到问题。它用于工作并且 gmake 将输出以下内容:
...
gmake[3]: Entering directory `/atc/proto/protobuf-2.6.0/src'
depbase=`echo google/protobuf/compiler/main.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
/usr/bin/g++ -DHAVE_CONFIG_H -I. -I.. -pthread -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -m32 -MT google/protobuf/compiler/main.o -MD -MP -MF $depbase.Tpo -c -o google/protobuf/compiler/main.o google/protobuf/compiler/main.cc &&\
mv -f $depbase.Tpo $depbase.Po
depbase=`echo google/protobuf/stubs/atomicops_internals_x86_gcc.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ../libtool --tag=CXX --mode=compile /usr/bin/g++ -DHAVE_CONFIG_H -I. -I.. -pthread -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -m32 -MT google/protobuf/stubs/atomicops_internals_x86_gcc.lo -MD -MP -MF $depbase.Tpo -c -o google/protobuf/stubs/atomicops_internals_x86_gcc.lo google/protobuf/stubs/atomicops_internals_x86_gcc.cc &&\
mv -f $depbase.Tpo $depbase.Plo
...
现在它输出以下内容并且不编译任何东西。所有.o文件都是0字节。
...
gmake[5]: Entering directory `/atc/proto/protobuf-2.6.0/src'
touch google/protobuf/compiler/.dirstamp
touch google/protobuf/compiler/.deps/.dirstamp
touch google/protobuf/compiler/main.o
touch google/protobuf/stubs/.dirstamp
touch google/protobuf/stubs/.deps/.dirstamp
touch google/protobuf/stubs/atomicops_internals_x86_gcc.lo
...
我们希望有使用 google protobuf 经验的人可以解释为什么它接触文件而不是编译它们。知道这一点,我们可能会很快解决问题。我们已经在另一台机器上构建了它,并且我们一直在比较我们能想到的一切,但现在我们正处于使用细齿梳理 autoconf make 文件以了解这种行为的地步。
我们启动 google protobuff make 的脚本非常简单,我们没有对 google protobuf 进行任何更改(我们只是解压然后构建它)。
build_proto.sh
set -x
pb_pkg=protobuf-2.6.0
cc=/usr/bin/g++
if [[ ! -e "$pb_pkg.tar.gz" ]]; then
echo "Can't find $pb_pkg.tar.gz"
exit
fi
tar xvfz $pb_pkg.tar.gz
cd $pb_pkg
export PATH=$PATH:/opt/bb/bin/:/usr/bin
./configure CC=$cc CXX=$cc CFLAGS=-m32 CXXFLAGS=-m32 FFLAGS=-m32 FCFLAGS=-m32
gmake
生成文件
.PHONY: all
all:
./build_proto.sh
clean:
rm -rf protobuf-2.6.0
build: all
test: all
uname -a
Linux atc-build 2.6.32-642.6.2.el6.x86_64 #1 SMP Mon Oct 24 10:22:33 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
更新
问题不在配置中。 运行 自行配置,两个系统的差异是相同的,除了细微的差异。必须在制作中。
问题是由两件事造成的。事后看来,其中一个应该是系统构建失败的明显警告标志。
- 正在使用 -O 标志调用顶级 make。
- build_proto.sh 正在使用 gmake!
将 build_proto.sh 从 gmake 切换到 make 解决了这个问题。 gmake 不理解 -O,因此不仅难以传达回 make 的输出,而且显然 运行 顺序错误(详细输出显示 jobserver 问题)。