『IOS』No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64

本文解决了一个常见的Xcode编译错误:“No architectures to compile for”,提供了详细的步骤来修复此问题,包括调整项目的架构设置及确保支持正确的CPU类型。

问题:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s).


1. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s)

We set ARCHS="armv7 armv7s" ONLY_ACTIVE_ARCH=NO.



2. 

摘要
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA

运行报错


出现的原因:armv7s是应用在iPhone 5 A6 的架构上的
解决的方式:
1,在Project target里“Architectures”设置为“Standard (armv7,armv7s)”
2,修改在Project target里“Build Settings”的“Valid Architectures”添加“i386”和“armv7”(Xcode4.6不再支持armv6,请去掉)
3,设置”Build Active Architecture Only”为“NO”。这样你build你的项目的时候就能在iphoe5和iphoe4s里执行。

1 #!/bin/bash 2 3 # variables, parent script must set it: 4 # SRS_JOBS: the build jobs. 5 # SrsArmMakeOptions: the arm make options for ubuntu12(armhf, v7cpu) 6 7 ##################################################################################### 8 ##################################################################################### 9 # prepare the depends tools and libraries 10 # DEPENDS: options.sh, only when user options parsed, the depends tools are known. 11 ##################################################################################### 12 ##################################################################################### 13 14 ##################################################################################### 15 # Check OS and CPU architectures. 16 ##################################################################################### 17 if [[ $OS_IS_UBUNTU != YES && $OS_IS_CENTOS != YES && $OS_IS_OSX != YES && $SRS_CYGWIN64 != YES ]]; then 18 if [[ $SRS_CROSS_BUILD != YES && $SRS_GENERIC_LINUX != YES ]]; then 19 echo "Your OS `uname -s` is not supported." 20 if [[ $(uname -s) == "Linux" ]]; then 21 echo "Please try --generic-linux=on for other Linux systems." 22 fi 23 exit 1 24 fi 25 fi 26 27 # The absolute path of SRS_OBJS, for prefix and PKG_CONFIG_PATH 28 SRS_DEPENDS_LIBS=$(mkdir -p $SRS_OBJS && cd $SRS_OBJS && pwd) 29 echo -n "SRS_JOBS: $SRS_JOBS, SRS_DEPENDS_LIBS: ${SRS_DEPENDS_LIBS}" 30 if [[ ! -z $OS_IS_LINUX ]]; then echo -n ", OS_IS_LINUX: $OS_IS_LINUX"; fi 31 if [[ ! -z $OS_IS_OSX ]]; then echo -n ", OS_IS_OSX: $OS_IS_OSX"; fi 32 if [[ ! -z $OS_IS_CYGWIN ]]; then echo -n ", OS_IS_CYGWIN: $OS_IS_CYGWIN"; fi 33 if [[ ! -z $OS_IS_UBUNTU ]]; then echo -n ", OS_IS_UBUNTU: $OS_IS_UBUNTU"; fi 34 if [[ ! -z $OS_IS_CENTOS ]]; then echo -n ", OS_IS_CENTOS: $OS_IS_CENTOS"; fi 35 if [[ ! -z $SRS_CROSS_BUILD ]]; then echo -n ", SRS_CROSS_BUILD: $SRS_CROSS_BUILD"; fi 36 if [[ ! -z $OS_IS_LOONGARCH64 ]]; then echo -n ", OS_IS_LOONGARCH64: $OS_IS_LOONGARCH64"; fi 37 if [[ ! -z $OS_IS_MIPS64 ]]; then echo -n ", OS_IS_MIPS64: $OS_IS_MIPS64"; fi 38 if [[ ! -z $OS_IS_LOONGSON ]]; then echo -n ", OS_IS_LOONGSON: $OS_IS_LOONGSON"; fi 39 if [[ ! -z $OS_IS_X86_64 ]]; then echo -n ", OS_IS_X86_64: $OS_IS_X86_64"; fi 40 if [[ ! -z $OS_IS_RISCV ]]; then echo -n ", OS_IS_RISCV: $OS_IS_RISCV"; fi 41 echo "" 42 43 ##################################################################################### 44 # Check dependency tools. 45 ##################################################################################### 46 if [[ $SRS_OSX == YES ]]; then 47 brew --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 48 echo "Please install brew at https://brew.sh/"; exit $ret; 49 fi 50 fi 51 # Check perl, which is depended by automake for building libopus etc. 52 perl --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 53 if [[ $OS_IS_CENTOS == YES ]]; then 54 echo "Please install perl by:" 55 echo " yum install -y perl" 56 elif [[ $OS_IS_UBUNTU == YES ]]; then 57 echo "Please install perl by:" 58 echo " apt install -y perl" 59 else 60 echo "Please install perl" 61 fi 62 exit $ret; 63 fi 64 gcc --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 65 if [[ $OS_IS_CENTOS == YES ]]; then 66 echo "Please install gcc by:" 67 echo " yum install -y gcc" 68 elif [[ $OS_IS_UBUNTU == YES ]]; then 69 echo "Please install gcc by:" 70 echo " apt install -y gcc" 71 else 72 echo "Please install gcc" 73 fi 74 exit $ret; 75 fi 76 g++ --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 77 if [[ $OS_IS_CENTOS == YES ]]; then 78 echo "Please install g++ by:" 79 echo " yum install -y gcc-c++" 80 elif [[ $OS_IS_UBUNTU == YES ]]; then 81 echo "Please install g++ by:" 82 echo " apt install -y g++" 83 else 84 echo "Please install gcc-c++" 85 fi 86 exit $ret; 87 fi 88 make --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 89 if [[ $OS_IS_CENTOS == YES ]]; then 90 echo "Please install make by:" 91 echo " yum install -y make" 92 elif [[ $OS_IS_UBUNTU == YES ]]; then 93 echo "Please install make by:" 94 echo " apt install -y make" 95 else 96 echo "Please install make" 97 fi 98 exit $ret; 99 fi 100 patch --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 101 if [[ $OS_IS_CENTOS == YES ]]; then 102 echo "Please install patch by:" 103 echo " yum install -y patch" 104 elif [[ $OS_IS_UBUNTU == YES ]]; then 105 echo "Please install patch by:" 106 echo " apt install -y patch" 107 else 108 echo "Please install patch" 109 fi 110 exit $ret; 111 fi 112 unzip -v >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 113 if [[ $OS_IS_CENTOS == YES ]]; then 114 echo "Please install unzip by:" 115 echo " yum install -y unzip" 116 elif [[ $OS_IS_UBUNTU == YES ]]; then 117 echo "Please install unzip by:" 118 echo " apt install -y unzip" 119 else 120 echo "Please install unzip" 121 fi 122 exit $ret; 123 fi 124 automake --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 125 if [[ $OS_IS_CENTOS == YES ]]; then 126 echo "Please install automake by:" 127 echo " yum install -y automake" 128 elif [[ $OS_IS_UBUNTU == YES ]]; then 129 echo "Please install automake by:" 130 echo " apt install -y automake" 131 else 132 echo "Please install automake" 133 fi 134 exit $ret; 135 fi 136 if [[ $SRS_VALGRIND == YES ]]; then 137 valgrind --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 138 echo "Please install valgrind"; exit $ret; 139 fi 140 if [[ ! -f /usr/include/valgrind/valgrind.h ]]; then 141 echo "Please install valgrind-dev"; exit $ret; 142 fi 143 fi 144 # Check tclsh, which is depended by SRT. 145 if [[ $SRS_SRT == YES ]]; then 146 tclsh <<< "exit" >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then 147 if [[ $OS_IS_CENTOS == YES ]]; then 148 echo "Please install tclsh by:" 149 echo " yum install -y tcl" 150 elif [[ $OS_IS_UBUNTU == YES ]]; then 151 echo "Please install tclsh by:" 152 echo " apt install -y tclsh" 153 else 154 echo "Please install tclsh" 155 fi 156 exit $ret; 157 fi 158 cmake --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 159 if [[ $OS_IS_CENTOS == YES ]]; then 160 echo "Please install cmake by:" 161 echo " yum install -y cmake" 162 elif [[ $OS_IS_UBUNTU == YES ]]; then 163 echo "Please install cmake by:" 164 echo " apt install -y cmake" 165 else 166 echo "Please install cmake" 167 fi 168 exit $ret; 169 fi 170 fi 171 pkg-config --version >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 172 echo "Please install pkg-config"; exit $ret; 173 fi 174 which ls >/dev/null 2>/dev/null; ret=$?; if [[ 0 -ne $ret ]]; then 175 if [[ $OS_IS_CENTOS == YES ]]; then 176 echo "Please install which by:" 177 echo " yum install -y which" 178 elif [[ $OS_IS_UBUNTU == YES ]]; then 179 echo "Please install which by:" 180 echo " apt install -y which" 181 else 182 echo "Please install which" 183 fi 184 exit $ret; 185 fi 186 187 ##################################################################################### 188 # Try to load cache if exists /usr/local/srs-cache 189 ##################################################################################### 190 # Use srs-cache from base image. See https://github.com/ossrs/dev-docker/blob/ubuntu20-cache/Dockerfile 191 # Note that the cache for cygwin is not under /usr/local, but copy to objs instead. 192 if [[ -d /usr/local/srs-cache/srs/trunk/objs && $(pwd) != "/usr/local/srs-cache/srs/trunk" && $SRS_BUILD_CACHE == YES ]]; then 193 SOURCE_DIR=$(ls -d /usr/local/srs-cache/srs/trunk/objs/Platform-SRS${SRS_MAJOR}-* 2>/dev/null|head -n 1) 194 if [[ -d $SOURCE_DIR ]]; then 195 TARGET_DIR=${SRS_OBJS}/${SRS_PLATFORM} && 196 echo "Build from cache, source=$SOURCE_DIR, target=$TARGET_DIR" && 197 rm -rf $TARGET_DIR && mkdir -p ${SRS_OBJS} && cp -R $SOURCE_DIR $TARGET_DIR && 198 du -sh /usr/local/srs-cache/srs/trunk/objs/Platform-* && 199 du -sh /usr/local/srs-cache/srs/trunk/objs/Platform-*/* && 200 du -sh objs/Platform-* && 201 ls -lh objs 202 fi 203 fi 204 205 ##################################################################################### 206 # Check for address sanitizer, see https://github.com/google/sanitizers 207 ##################################################################################### 208 if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES ]]; then 209 echo 'int main() { return 0; }' > ${SRS_OBJS}/test_sanitizer.c && 210 gcc -fsanitize=address -fno-omit-frame-pointer -g -O0 ${SRS_OBJS}/test_sanitizer.c \ 211 -o ${SRS_OBJS}/test_sanitizer 1>/dev/null 2>&1; 212 ret=$?; rm -rf ${SRS_OBJS}/test_sanitizer* 213 if [[ $ret -ne 0 ]]; then 214 echo "Please install libasan, see https://github.com/google/sanitizers"; 215 if [[ $OS_IS_CENTOS == YES ]]; then echo " sudo yum install -y libasan"; fi 216 exit $ret; 217 fi 218 fi 219 220 if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES && $SRS_SANITIZER_STATIC == NO ]]; then 221 echo 'int main() { return 0; }' > ${SRS_OBJS}/test_sanitizer.c && 222 gcc -fsanitize=address -fno-omit-frame-pointer -static-libasan -g -O0 ${SRS_OBJS}/test_sanitizer.c \ 223 -o ${SRS_OBJS}/test_sanitizer 1>/dev/null 2>&1; 224 ret=$?; rm -rf ${SRS_OBJS}/test_sanitizer* 225 if [[ $ret -eq 0 ]]; then 226 echo "link static-libasan" 227 SRS_SANITIZER_STATIC=YES 228 fi 229 fi 230 231 if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES && $SRS_SANITIZER_LOG == NO ]]; then 232 echo "#include <sanitizer/asan_interface.h>" > ${SRS_OBJS}/test_sanitizer.c && 233 echo "int main() { return 0; }" >> ${SRS_OBJS}/test_sanitizer.c && 234 gcc -fsanitize=address -fno-omit-frame-pointer -g -O0 ${SRS_OBJS}/test_sanitizer.c \ 235 -o ${SRS_OBJS}/test_sanitizer 1>/dev/null 2>&1; 236 ret=$?; rm -rf ${SRS_OBJS}/test_sanitizer* 237 if [[ $ret -eq 0 ]]; then 238 echo "libasan api found ok!"; 239 SRS_SANITIZER_LOG=YES 240 fi 241 fi 242 243 ##################################################################################### 244 # state-threads 245 ##################################################################################### 246 # check the cross build flag file, if flag changed, need to rebuild the st. 247 _ST_MAKE=linux-debug && _ST_OBJ="LINUX_`uname -r`_DBG" 248 # Always alloc on heap, @see https://github.com/ossrs/srs/issues/509#issuecomment-719931676 249 _ST_EXTRA_CFLAGS="-DMALLOC_STACK" 250 # For valgrind to detect memory issues. 251 if [[ $SRS_VALGRIND == YES ]]; then 252 _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DMD_VALGRIND" 253 fi 254 # for osx, use darwin for st, donot use epoll. 255 if [[ $SRS_OSX == YES ]]; then 256 _ST_MAKE=darwin-debug && _ST_OBJ="DARWIN_`uname -r`_DBG" 257 fi 258 # for windows/cygwin 259 if [[ $SRS_CYGWIN64 = YES ]]; then 260 _ST_MAKE=cygwin64-debug && _ST_OBJ="CYGWIN64_`uname -s`_DBG" 261 fi 262 # For Ubuntu, the epoll detection might be fail. 263 if [[ $OS_IS_UBUNTU == YES ]]; then 264 _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DMD_HAVE_EPOLL" 265 fi 266 # Whether enable debug stats. 267 if [[ $SRS_DEBUG_STATS == YES ]]; then 268 _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DDEBUG_STATS" 269 fi 270 # Pass the global extra flags. 271 if [[ $SRS_EXTRA_FLAGS != '' ]]; then 272 _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS $SRS_EXTRA_FLAGS" 273 fi 274 # Whether link as .so 275 if [[ $SRS_SHARED_ST == YES ]]; then 276 _ST_STATIC_ONLY=no; 277 else 278 _ST_STATIC_ONLY=yes; 279 fi 280 # The final args to make st. 281 _ST_MAKE_ARGS="${_ST_MAKE} STATIC_ONLY=${_ST_STATIC_ONLY}" 282 _ST_MAKE_ARGS="${_ST_MAKE_ARGS} CC=${SRS_TOOL_CC} AR=${SRS_TOOL_AR} LD=${SRS_TOOL_LD} RANDLIB=${SRS_TOOL_RANDLIB}" 283 # Patched ST from https://github.com/ossrs/state-threads/tree/srs 284 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st/libst.a ]]; then 285 rm -rf ${SRS_OBJS}/st && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st ${SRS_OBJS}/ && 286 echo "The state-threads is ok." 287 else 288 echo "Building state-threads." && 289 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/st-srs ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st ${SRS_OBJS}/st && 290 cp -rf ${SRS_WORKDIR}/3rdparty/st-srs ${SRS_OBJS}/${SRS_PLATFORM}/ && 291 env EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" make -C ${SRS_OBJS}/${SRS_PLATFORM}/st-srs ${_ST_MAKE_ARGS} && 292 mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st && 293 cp -f ${SRS_OBJS}/${SRS_PLATFORM}/st-srs/${_ST_OBJ}/st.h ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st/ && 294 cp -f ${SRS_OBJS}/${SRS_PLATFORM}/st-srs/${_ST_OBJ}/libst.a ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st/ && 295 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st ${SRS_OBJS}/ && 296 echo "The state-threads is ok." 297 fi 298 # check status 299 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build state-threads failed, ret=$ret"; exit $ret; fi 300 301 ##################################################################################### 302 # nginx for HLS, nginx-1.5.0 303 ##################################################################################### 304 function write_nginx_html5() 305 { 306 cat<<END > ${html_file} 307 <video width="100%" autoplay controls autobuffer type="application/vnd.apple.mpegurl" 308 src="${hls_stream}"> 309 </video> 310 END 311 } 312 # create the nginx dir, for http-server if not build nginx 313 mkdir -p ${SRS_OBJS}/nginx 314 315 # the demo dir. 316 # create forward dir 317 mkdir -p ${SRS_OBJS}/nginx/html/live && 318 html_file=${SRS_OBJS}/nginx/html/live/livestream.html && hls_stream=livestream.m3u8 && write_nginx_html5 && 319 320 # copy players to nginx html dir. 321 rm -rf ${SRS_OBJS}/nginx/html/players && 322 cp -rf $SRS_WORKDIR/research/players ${SRS_OBJS}/nginx/html/ && 323 324 # for favicon.ico 325 rm -rf ${SRS_OBJS}/nginx/html/favicon.ico && 326 cp -f $SRS_WORKDIR/research/api-server/static-dir/favicon.ico ${SRS_OBJS}/nginx/html/favicon.ico && 327 328 # For srs-console. 329 rm -rf ${SRS_OBJS}/nginx/html/console && 330 cp -rf $SRS_WORKDIR/research/console ${SRS_OBJS}/nginx/html/ && 331 332 # For SRS signaling. 333 rm -rf ${SRS_OBJS}/nginx/html/demos && 334 cp -rf $SRS_WORKDIR/3rdparty/signaling/www/demos ${SRS_OBJS}/nginx/html/ && 335 336 # For home page index.html 337 rm -rf ${SRS_OBJS}/nginx/html/index.html && 338 cp -f $SRS_WORKDIR/research/api-server/static-dir/index.html ${SRS_OBJS}/nginx/html/index.html && 339 340 # nginx.html to detect whether nginx is alive 341 echo "Nginx is ok." > ${SRS_OBJS}/nginx/html/nginx.html 342 343 # check status 344 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build web pages failed, ret=$ret"; exit $ret; fi 345 346 ##################################################################################### 347 # Generate default self-sign certificate for HTTPS server, test only. 348 ##################################################################################### 349 if [[ ! -f $SRS_WORKDIR/conf/server.key || ! -f $SRS_WORKDIR/conf/server.crt ]]; then 350 openssl genrsa -out $SRS_WORKDIR/conf/server.key 2048 && 351 openssl req -new -x509 -key $SRS_WORKDIR/conf/server.key -out $SRS_WORKDIR/conf/server.crt -days 3650 \ 352 -subj "/C=CN/ST=Beijing/L=Beijing/O=Me/OU=Me/CN=ossrs.net" && 353 echo "Generate test-only self-sign certificate files" 354 fi 355 356 ##################################################################################### 357 # openssl, for rtmp complex handshake and HLS encryption. 358 ##################################################################################### 359 if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL == YES ]]; then 360 echo "Warning: Use system libssl, without compiling openssl." 361 fi 362 # @see http://www.openssl.org/news/secadv/20140407.txt 363 # Affected users should upgrade to OpenSSL 1.1.0e. Users unable to immediately 364 # upgrade can alternatively recompile OpenSSL with -DOPENSSL_NO_HEARTBEATS. 365 if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL != YES ]]; then 366 OPENSSL_OPTIONS="-no-shared -no-threads -DOPENSSL_NO_HEARTBEATS" 367 OPENSSL_CONFIG="./config" 368 # https://stackoverflow.com/questions/15539062/cross-compiling-of-openssl-for-linux-arm-v5te-linux-gnueabi-toolchain 369 if [[ $SRS_CROSS_BUILD == YES ]]; then 370 OPENSSL_CONFIG="./Configure linux-generic32" 371 if [[ $SRS_CROSS_BUILD_ARCH == "arm" ]]; then OPENSSL_CONFIG="./Configure linux-armv4"; fi 372 if [[ $SRS_CROSS_BUILD_ARCH == "aarch64" ]]; then OPENSSL_CONFIG="./Configure linux-aarch64"; fi 373 if [[ $SRS_CROSS_BUILD_ARCH == "mipsel" ]]; then OPENSSL_CONFIG="./Configure linux-mips32"; fi 374 elif [[ ! -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/lib/libssl.a ]]; then 375 # Try to use exists libraries. 376 if [[ -f /usr/local/ssl/lib/libssl.a && $SRS_SSL_LOCAL == NO ]]; then 377 (mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/lib && cd ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/lib && 378 cp /usr/local/ssl/lib/libssl.a . && cp /usr/local/ssl/lib/libcrypto.a . && 379 mkdir -p /usr/local/ssl/lib/pkgconfig && cp -rf /usr/local/ssl/lib/pkgconfig .) 380 (mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/include && cd ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/include && 381 cp -rf /usr/local/ssl/include/openssl .) 382 fi 383 # Warning if not use the system ssl. 384 if [[ -f /usr/local/ssl/lib/libssl.a && $SRS_SSL_LOCAL == YES ]]; then 385 echo "Warning: Local openssl is on, ignore system openssl" 386 fi 387 fi 388 # Patch for loongarch mips64, disable ASM for build failed message as bellow: 389 # Error: opcode not supported on this processor: mips3 (mips3) 390 if [[ $OS_IS_MIPS64 == YES ]]; then OPENSSL_CONFIG="./Configure linux64-mips64"; fi 391 if [[ $OS_IS_LOONGSON == YES ]]; then OPENSSL_OPTIONS="$OPENSSL_OPTIONS -no-asm"; fi 392 # For RTC, we should use ASM to improve performance, not a little improving. 393 if [[ $SRS_RTC == NO || $SRS_NASM == NO ]]; then 394 OPENSSL_OPTIONS="$OPENSSL_OPTIONS -no-asm" 395 echo "Warning: NASM is off, performance is hurt" 396 fi 397 # Mac OS X can have issues (its often a neglected platform). 398 # @see https://wiki.openssl.org/index.php/Compilation_and_Installation 399 if [[ $SRS_OSX == YES ]]; then 400 export KERNEL_BITS=64; 401 fi 402 # Use 1.0 if required. 403 if [[ $SRS_SSL_1_0 == YES ]]; then 404 OPENSSL_AR="$SRS_TOOL_AR -r" # For openssl 1.0, MUST specifies the args for ar or build faild. 405 OPENSSL_CANDIDATE="openssl-OpenSSL_1_0_2u" && 406 OPENSSL_UNZIP="tar xf ${SRS_WORKDIR}/3rdparty/$OPENSSL_CANDIDATE.tar.gz -C ${SRS_OBJS}/${SRS_PLATFORM}" 407 else 408 OPENSSL_AR="$SRS_TOOL_AR" 409 OPENSSL_CANDIDATE="openssl-1.1-fit" && 410 OPENSSL_UNZIP="cp -R ${SRS_WORKDIR}/3rdparty/$OPENSSL_CANDIDATE ${SRS_OBJS}/${SRS_PLATFORM}/" 411 fi 412 # 413 # https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_Options 414 # Already defined: -no-shared -no-threads -no-asm 415 # Should enable: -no-dtls -no-dtls1 -no-ssl3 416 # Might able to disable: -no-ssl2 -no-comp -no-idea -no-hw -no-engine -no-dso -no-err -no-nextprotoneg -no-psk -no-srp -no-ec2m -no-weak-ssl-ciphers 417 # Note that we do not disable more features, because no file could be removed. 418 #OPENSSL_OPTIONS="$OPENSSL_OPTIONS -no-ssl2 -no-comp -no-idea -no-hw -no-engine -no-dso -no-err -no-nextprotoneg -no-psk -no-srp -no-ec2m -no-weak-ssl-ciphers" 419 # 420 # cross build not specified, if exists flag, need to rebuild for no-arm platform. 421 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl/lib/libssl.a ]]; then 422 rm -rf ${SRS_OBJS}/openssl && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl ${SRS_OBJS}/ && 423 echo "The $OPENSSL_CANDIDATE is ok." 424 else 425 echo "Building $OPENSSL_CANDIDATE." && 426 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/${OPENSSL_CANDIDATE} ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl \ 427 ${SRS_OBJS}/openssl && 428 ${OPENSSL_UNZIP} && 429 ( 430 cd ${SRS_OBJS}/${SRS_PLATFORM}/${OPENSSL_CANDIDATE} && 431 chmod +x ./config ./Configure && 432 ${OPENSSL_CONFIG} --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/openssl $OPENSSL_OPTIONS 433 ) && 434 make -C ${SRS_OBJS}/${SRS_PLATFORM}/${OPENSSL_CANDIDATE} CC=${SRS_TOOL_CC} AR="${OPENSSL_AR}" \ 435 LD=${SRS_TOOL_LD} RANDLIB=${SRS_TOOL_RANDLIB} ${SRS_JOBS} && 436 make -C ${SRS_OBJS}/${SRS_PLATFORM}/${OPENSSL_CANDIDATE} install_sw && 437 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl ${SRS_OBJS}/ && 438 echo "The $OPENSSL_CANDIDATE is ok." 439 fi 440 # check status 441 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build $OPENSSL_CANDIDATE failed, ret=$ret"; exit $ret; fi 442 fi 443 444 ##################################################################################### 445 # srtp 446 ##################################################################################### 447 if [[ $SRS_RTC == YES && $SRS_USE_SYS_SRTP == YES ]]; then 448 echo "Warning: Use system libsrtp, without compiling srtp." 449 fi 450 if [[ $SRS_RTC == YES && $SRS_USE_SYS_SRTP == NO ]]; then 451 SRTP_OPTIONS="" 452 # To eliminate warnings, see https://stackoverflow.com/a/34208904/17679565 453 # was built for newer macOS version (11.6) than being linked (11.0) 454 if [[ $SRS_OSX == YES ]]; then 455 export MACOSX_DEPLOYMENT_TARGET=11.0 456 echo "Set MACOSX_DEPLOYMENT_TARGET to avoid warnings" 457 fi 458 # If use ASM for SRTP, we enable openssl(with ASM). 459 if [[ $SRS_SRTP_ASM == YES ]]; then 460 SRTP_OPTIONS="--enable-openssl" 461 SRTP_CONFIGURE="env PKG_CONFIG_PATH=${SRS_DEPENDS_LIBS}/openssl/lib/pkgconfig ./configure" 462 else 463 SRTP_OPTIONS="--disable-openssl" 464 SRTP_CONFIGURE="./configure" 465 fi 466 if [[ $SRS_CROSS_BUILD == YES ]]; then 467 SRTP_OPTIONS="$SRTP_OPTIONS --host=$SRS_CROSS_BUILD_HOST" 468 fi 469 if [[ $OS_IS_LOONGARCH64 == YES ]]; then 470 SRTP_OPTIONS="$SRTP_OPTIONS --build=loongarch64-unknown-linux-gnu" 471 fi 472 # Copy and patch source files, then build and install libsrtp. 473 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srtp2/lib/libsrtp2.a ]]; then 474 rm -rf ${SRS_OBJS}/srtp2 && 475 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srtp2 ${SRS_OBJS} && 476 echo "The libsrtp-2-fit is ok." 477 else 478 echo "Building libsrtp-2-fit." 479 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srtp2 \ 480 ${SRS_OBJS}/srtp2 && 481 cp -rf ${SRS_WORKDIR}/3rdparty/libsrtp-2-fit ${SRS_OBJS}/${SRS_PLATFORM}/ && 482 # For cygwin64, the patch is not available, so use sed instead. 483 if [[ $SRS_CYGWIN64 == YES ]]; then 484 sed -i 's/char bit_string/static char bit_string/g' ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit/crypto/math/datatypes.c 485 else 486 patch -p0 ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit/crypto/math/datatypes.c ${SRS_WORKDIR}/3rdparty/patches/srtp/gcc10-01.patch 487 fi && 488 # Patch the cpu arch guessing for RISCV. 489 if [[ $OS_IS_RISCV == YES ]]; then 490 patch -p0 ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit/config.guess ${SRS_WORKDIR}/3rdparty/patches/srtp/config.guess-02.patch 491 fi && 492 ( 493 cd ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit && 494 $SRTP_CONFIGURE ${SRTP_OPTIONS} --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/srtp2 495 ) && 496 # Sometimes it might fail because autoconf failed to generate crypto/include.config.h 497 if [[ $SRS_CYGWIN64 == YES ]]; then 498 SRS_PATCH_SOURCE=${SRS_WORKDIR}/3rdparty/patches/srtp/cygwin-crypto-include-config.h 499 if [[ $SRS_SRTP_ASM == YES ]]; then 500 SRS_PATCH_SOURCE=${SRS_WORKDIR}/3rdparty/patches/srtp/cygwin-gcm-crypto-include-config.h 501 fi 502 grep -q 'HAVE_UINT64_T 1' ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit/crypto/include/config.h || 503 cp -f $SRS_PATCH_SOURCE ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit/crypto/include/config.h 504 fi && 505 make -C ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit ${SRS_JOBS} && 506 make -C ${SRS_OBJS}/${SRS_PLATFORM}/libsrtp-2-fit install && 507 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srtp2 ${SRS_OBJS}/ && 508 echo "The libsrtp-2-fit is ok." 509 fi 510 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build libsrtp failed, ret=$ret"; exit $ret; fi 511 fi 512 513 ##################################################################################### 514 # libopus, for WebRTC to transcode AAC with Opus. 515 ##################################################################################### 516 # For cross build, we use opus of FFmpeg, so we don't build the libopus. 517 if [[ $SRS_RTC == YES && $SRS_USE_SYS_FFMPEG != YES && $SRS_FFMPEG_OPUS != YES ]]; then 518 # Only build static libraries if no shared FFmpeg. 519 if [[ $SRS_SHARED_FFMPEG != YES ]]; then 520 OPUS_OPTIONS="--disable-shared --disable-doc" 521 fi 522 if [[ $OS_IS_LOONGARCH64 == YES ]]; then 523 OPUS_OPTIONS="$OPUS_OPTIONS --build=loongarch64-unknown-linux-gnu" 524 fi 525 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/opus/lib/libopus.a ]]; then 526 rm -rf ${SRS_OBJS}/opus && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/opus ${SRS_OBJS}/ && 527 echo "The opus-1.3.1 is ok." 528 else 529 echo "Building opus-1.3.1." && 530 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/opus-1.3.1 ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/opus ${SRS_OBJS}/opus && 531 tar xf ${SRS_WORKDIR}/3rdparty/opus-1.3.1.tar.gz -C ${SRS_OBJS}/${SRS_PLATFORM} && 532 ( 533 # Opus requires automake 1.15, and fails for automake 1.16+, so we run autoreconf to fix it. 534 cd ${SRS_OBJS}/${SRS_PLATFORM}/opus-1.3.1 && autoreconf && 535 ./configure --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/opus --enable-static $OPUS_OPTIONS 536 ) && 537 make -C ${SRS_OBJS}/${SRS_PLATFORM}/opus-1.3.1 ${SRS_JOBS} && 538 make -C ${SRS_OBJS}/${SRS_PLATFORM}/opus-1.3.1 install && 539 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/opus ${SRS_OBJS}/ && 540 echo "The opus-1.3.1 is ok." 541 fi 542 if [ ! -f ${SRS_OBJS}/opus/lib/libopus.a ]; then echo "Build opus-1.3.1 failed."; exit -1; fi 543 fi 544 545 ##################################################################################### 546 # ffmpeg-fit, for WebRTC to transcode AAC with Opus. 547 ##################################################################################### 548 if [[ $SRS_FFMPEG_FIT == YES && $SRS_USE_SYS_FFMPEG == YES ]]; then 549 echo "Warning: Use system ffmpeg, without compiling ffmpeg." 550 fi 551 if [[ $SRS_FFMPEG_FIT == YES && $SRS_USE_SYS_FFMPEG == NO ]]; then 552 FFMPEG_CONFIGURE="env SRS_FFMPEG_FIT=on" 553 if [[ $SRS_FFMPEG_OPUS != YES ]]; then 554 FFMPEG_CONFIGURE="$FFMPEG_CONFIGURE PKG_CONFIG_PATH=${SRS_DEPENDS_LIBS}/opus/lib/pkgconfig" 555 fi 556 FFMPEG_CONFIGURE="$FFMPEG_CONFIGURE ./configure" 557 558 # Disable all features, note that there are still some options need to be disabled. 559 FFMPEG_OPTIONS="--disable-everything" 560 # Disable all asm for FFmpeg, to compatible with ARM CPU. 561 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-asm --disable-x86asm --disable-inline-asm" 562 # Only build static libraries if no shared FFmpeg. 563 if [[ $SRS_SHARED_FFMPEG == YES ]]; then 564 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-shared" 565 fi 566 # For loongson/mips64, disable mips64r6, or build failed. 567 if [[ $OS_IS_MIPS64 == YES && $OS_IS_LOONGSON == YES ]]; then FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-mips64r6"; fi 568 # For cross-build. 569 if [[ $SRS_CROSS_BUILD == YES ]]; then 570 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-cross-compile --target-os=linux --disable-pthreads" 571 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --arch=$SRS_CROSS_BUILD_ARCH"; 572 if [[ $SRS_CROSS_BUILD_CPU != "" ]]; then FFMPEG_OPTIONS="$FFMPEG_OPTIONS --cpu=$SRS_CROSS_BUILD_CPU"; fi 573 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --cross-prefix=$SRS_CROSS_BUILD_PREFIX" 574 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --cc=${SRS_TOOL_CC} --cxx=${SRS_TOOL_CXX} --ar=${SRS_TOOL_AR} --ld=${SRS_TOOL_LD}" 575 fi 576 # For audio codec opus, use FFmpeg native one, or external libopus. 577 if [[ $SRS_FFMPEG_OPUS == YES ]]; then 578 # TODO: FIXME: Note that the audio might be corrupted, see https://github.com/ossrs/srs/issues/3140 579 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=opus --enable-encoder=opus" 580 else 581 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=libopus --enable-encoder=libopus --enable-libopus" 582 fi 583 # Disable features of ffmpeg. 584 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-avdevice --disable-avformat --disable-swscale --disable-postproc --disable-avfilter --disable-network" 585 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-dwt --disable-error-resilience --disable-lsp --disable-lzo --disable-faan --disable-pixelutils" 586 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-hwaccels --disable-devices --disable-audiotoolbox --disable-videotoolbox --disable-cuvid" 587 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-d3d11va --disable-dxva2 --disable-ffnvcodec --disable-nvdec --disable-nvenc --disable-v4l2-m2m --disable-vaapi" 588 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-vdpau --disable-appkit --disable-coreimage --disable-avfoundation --disable-securetransport --disable-iconv" 589 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --disable-lzma --disable-sdl2" 590 # Enable FFmpeg native AAC encoder and decoder. 591 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=aac --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-encoder=aac" 592 # Enable FFmpeg native MP3 decoder, which depends on dct. 593 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=mp3 --enable-dct" 594 595 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/ffmpeg/lib/libavcodec.a ]]; then 596 rm -rf ${SRS_OBJS}/ffmpeg && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/ffmpeg ${SRS_OBJS}/ && 597 echo "The ffmpeg-4-fit is ok." 598 else 599 echo "Building ffmpeg-4-fit." && 600 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/ffmpeg \ 601 ${SRS_OBJS}/ffmpeg && 602 cp -rf ${SRS_WORKDIR}/3rdparty/ffmpeg-4-fit ${SRS_OBJS}/${SRS_PLATFORM}/ && 603 ( 604 cd ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit && 605 $FFMPEG_CONFIGURE --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/ffmpeg \ 606 --pkg-config=pkg-config --pkg-config-flags='--static' --extra-libs='-lpthread' --extra-libs='-lm' \ 607 ${FFMPEG_OPTIONS} 608 ) && 609 # See https://www.laoyuyu.me/2019/05/23/android/clang_compile_ffmpeg/ 610 if [[ $SRS_CROSS_BUILD == YES ]]; then 611 sed -i -e 's/#define getenv(x) NULL/\/\*#define getenv(x) NULL\*\//g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 612 sed -i -e 's/#define HAVE_GMTIME_R 0/#define HAVE_GMTIME_R 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 613 sed -i -e 's/#define HAVE_LOCALTIME_R 0/#define HAVE_LOCALTIME_R 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 614 # For MIPS, which fail with: 615 # ./libavutil/libm.h:54:32: error: static declaration of 'cbrt' follows non-static declaration 616 # /root/openwrt/staging_dir/toolchain-mipsel_24kc_gcc-8.4.0_musl/include/math.h:163:13: note: previous declaration of 'cbrt' was here 617 if [[ $SRS_CROSS_BUILD_ARCH == "mipsel" || $SRS_CROSS_BUILD_ARCH == "arm" || $SRS_CROSS_BUILD_ARCH == "aarch64" ]]; then 618 sed -i -e 's/#define HAVE_CBRT 0/#define HAVE_CBRT 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 619 sed -i -e 's/#define HAVE_CBRTF 0/#define HAVE_CBRTF 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 620 sed -i -e 's/#define HAVE_COPYSIGN 0/#define HAVE_COPYSIGN 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 621 sed -i -e 's/#define HAVE_ERF 0/#define HAVE_ERF 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 622 sed -i -e 's/#define HAVE_HYPOT 0/#define HAVE_HYPOT 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 623 sed -i -e 's/#define HAVE_RINT 0/#define HAVE_RINT 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 624 sed -i -e 's/#define HAVE_LRINT 0/#define HAVE_LRINT 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 625 sed -i -e 's/#define HAVE_LRINTF 0/#define HAVE_LRINTF 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 626 sed -i -e 's/#define HAVE_ROUND 0/#define HAVE_ROUND 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 627 sed -i -e 's/#define HAVE_ROUNDF 0/#define HAVE_ROUNDF 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 628 sed -i -e 's/#define HAVE_TRUNC 0/#define HAVE_TRUNC 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 629 sed -i -e 's/#define HAVE_TRUNCF 0/#define HAVE_TRUNCF 1/g' ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit/config.h && 630 echo "FFmpeg sed ok" 631 fi 632 fi && 633 make -C ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit ${SRS_JOBS} && 634 make -C ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4-fit install && 635 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/ffmpeg ${SRS_OBJS}/ && 636 echo "The ffmpeg-4-fit is ok." 637 fi 638 # check status 639 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build ffmpeg-4-fit failed, ret=$ret"; exit $ret; fi 640 fi 641 642 ##################################################################################### 643 # live transcoding, ffmpeg-4.1, x264-core157, lame-3.99.5, libaacplus-2.0.2. 644 ##################################################################################### 645 # Guess where is the ffmpeg. 646 SYSTEMP_FFMPEG_BIN=`which ffmpeg` 647 # Always link the ffmpeg tools if exists. 648 if [[ -f $SYSTEMP_FFMPEG_BIN && ! -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]]; then 649 mkdir -p ${SRS_OBJS}/ffmpeg/bin && 650 cp -f $SYSTEMP_FFMPEG_BIN ${SRS_OBJS}/ffmpeg/bin/ 651 fi 652 if [[ $SRS_FFMPEG_TOOL == YES ]]; then 653 if [[ -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]]; then 654 cp -f $SYSTEMP_FFMPEG_BIN ${SRS_OBJS}/ffmpeg/bin/ && 655 echo "ffmpeg-4.1 is ok."; 656 else 657 echo -e "${RED}Error: No FFmpeg found at /usr/local/bin/ffmpeg${BLACK}" 658 echo -e "${RED} Please copy it from srs-docker${BLACK}" 659 echo -e "${RED} or download from http://ffmpeg.org/download.html${BLACK}" 660 echo -e "${RED} or disable it by --without-ffmpeg${BLACK}" 661 exit -1; 662 fi 663 fi 664 665 ##################################################################################### 666 # SRT module, https://github.com/ossrs/srs/issues/1147#issuecomment-577469119 667 ##################################################################################### 668 if [[ $SRS_SRT == YES && $SRS_USE_SYS_SRT == YES ]]; then 669 echo "Warning: Use system libsrt, without compiling srt." 670 fi 671 if [[ $SRS_SRT == YES && $SRS_USE_SYS_SRT == NO ]]; then 672 # Always disable c++11 for libsrt, because only the srt-app requres it. 673 LIBSRT_OPTIONS="--enable-apps=0 --enable-static=1 --enable-c++11=0" 674 if [[ $SRS_SHARED_SRT == YES ]]; then 675 LIBSRT_OPTIONS="$LIBSRT_OPTIONS --enable-shared=1" 676 else 677 LIBSRT_OPTIONS="$LIBSRT_OPTIONS --enable-shared=0" 678 fi 679 # For windows build, over cygwin 680 if [[ $SRS_CYGWIN64 == YES ]]; then 681 LIBSRT_OPTIONS="$LIBSRT_OPTIONS --cygwin-use-posix" 682 fi 683 # For cross-build. 684 if [[ $SRS_CROSS_BUILD == YES ]]; then 685 TOOL_GCC_REALPATH=$(realpath $(which $SRS_TOOL_CC)) 686 SRT_COMPILER_PREFIX=$(echo $TOOL_GCC_REALPATH |sed 's/-gcc.*$/-/') 687 LIBSRT_OPTIONS="$LIBSRT_OPTIONS --with-compiler-prefix=$SRT_COMPILER_PREFIX" 688 fi 689 690 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt/lib/libsrt.a ]]; then 691 rm -rf ${SRS_OBJS}/srt && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt ${SRS_OBJS}/ && 692 echo "libsrt-1-fit is ok." 693 else 694 if [[ $SRS_USE_SYS_SSL != YES && ! -d ${SRS_OBJS}/openssl/lib/pkgconfig ]]; then 695 echo "OpenSSL pkgconfig no found, build srt-1-fit failed." 696 exit -1 697 fi 698 echo "Build srt-1-fit" && 699 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/srt-1-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt ${SRS_OBJS}/srt && 700 cp -rf ${SRS_WORKDIR}/3rdparty/srt-1-fit ${SRS_OBJS}/${SRS_PLATFORM}/ && 701 patch -p0 -R ${SRS_OBJS}/${SRS_PLATFORM}/srt-1-fit/srtcore/api.cpp ${SRS_WORKDIR}/3rdparty/patches/srt/api.cpp-01.patch && 702 ( 703 cd ${SRS_OBJS}/${SRS_PLATFORM}/srt-1-fit && 704 env PKG_CONFIG_PATH=${SRS_DEPENDS_LIBS}/openssl/lib/pkgconfig \ 705 ./configure --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/srt $LIBSRT_OPTIONS 706 ) && 707 make -C ${SRS_OBJS}/${SRS_PLATFORM}/srt-1-fit ${SRS_JOBS} && 708 make -C ${SRS_OBJS}/${SRS_PLATFORM}/srt-1-fit install && 709 # If exists lib64 of libsrt, copy it to lib 710 if [[ -d ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt/lib64 ]]; then 711 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt/lib64 ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt/lib 712 fi && 713 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srt ${SRS_OBJS}/ && 714 echo "libsrt-1-fit is ok." 715 fi 716 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build srt-1-fit failed, ret=$ret"; exit $ret; fi 717 fi 718 719 ##################################################################################### 720 # build utest code 721 ##################################################################################### 722 if [[ $SRS_UTEST == YES ]]; then 723 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gtest/googletest/include/gtest/gtest.h ]]; then 724 rm -rf ${SRS_OBJS}/gtest && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gtest ${SRS_OBJS}/ && 725 echo "The gtest-fit is ok." 726 else 727 echo "Build gtest-fit" && 728 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}gtest-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gtest ${SRS_OBJS}/gtest && 729 cp -rf ${SRS_WORKDIR}/3rdparty/gtest-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gtest && 730 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gtest ${SRS_OBJS}/ && 731 echo "The gtest-fit is ok." 732 fi 733 # check status 734 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gtest-1.6.0 failed, ret=$ret"; exit $ret; fi 735 fi 736 737 ##################################################################################### 738 # build gperf code 739 ##################################################################################### 740 if [[ $SRS_GPERF == YES ]]; then 741 if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gperf/bin/pprof ]]; then 742 rm -rf ${SRS_OBJS}/gperf && cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gperf ${SRS_OBJS}/ && 743 cp -f ${SRS_OBJS}/gperf/bin/pprof ${SRS_OBJS}/ && 744 echo "The gperftools-2-fit is ok." 745 else 746 echo "Build gperftools-2-fit" && 747 rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/gperftools-2-fit ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gperf \ 748 ${SRS_OBJS}/gperf ${SRS_OBJS}/pprof && 749 cp -rf ${SRS_WORKDIR}/3rdparty/gperftools-2-fit ${SRS_OBJS}/${SRS_PLATFORM}/ && 750 ( 751 cd ${SRS_OBJS}/${SRS_PLATFORM}/gperftools-2-fit && 752 ./configure --prefix=${SRS_DEPENDS_LIBS}/${SRS_PLATFORM}/3rdparty/gperf --enable-frame-pointers 753 ) && 754 make -C ${SRS_OBJS}/${SRS_PLATFORM}/gperftools-2-fit ${SRS_JOBS} && 755 make -C ${SRS_OBJS}/${SRS_PLATFORM}/gperftools-2-fit install && 756 cp -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/gperf ${SRS_OBJS}/ && 757 cp -f ${SRS_OBJS}/gperf/bin/pprof ${SRS_OBJS}/ && 758 echo "The gperftools-2-fit is ok." 759 fi 760 # check status 761 ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gperftools-2-fit failed, ret=$ret"; exit $ret; fi 762 fi 分析一下这个脚本都是什么功能 如果我想新增一个能编译app/srs_app_jwt.cpp的功能怎么添加,请帮我添加
07-23
cmake_minimum_required(VERSION 3.5) project(nav2_mppi_controller LANGUAGES CXX CUDA) # === 关键策略设置 === cmake_policy(SET CMP0074 NEW) cmake_policy(SET CMP0104 NEW) # === 平台检测与工具链设置 === if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") message(STATUS "Configuring for Jetson ARM64 platform") # 设置CUDA工具包路径 if(NOT DEFINED CUDAToolkit_ROOT) set(CUDAToolkit_ROOT "/usr/local/cuda") endif() # Jetson AGX Orin专用CUDA架构设置 set(CMAKE_CUDA_ARCHITECTURES "87") # Orin的Ampere架构 set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode=arch=compute_87,code=sm_87") set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=-march=armv8.2-a+crypto+fp16+rcpc+dotprod") # 添加Jetson特定优化标志 add_compile_options(-O3 -ffast-math -funroll-loops) add_compile_options($<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-O3>) add_compile_options($<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-ffast-math>) # 确保使用正确的CUDA工具链 message(STATUS "Configuring for Jetson AGX Orin with CUDA architecture 8.7 (Ampere)") endif() # === 编译器标准设置 === set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CUDA_STANDARD 17) set(CMAKE_CUDA_STANDARD_REQUIRED ON) # === 查找依赖项 === find_package(ament_cmake REQUIRED) find_package(CUDAToolkit REQUIRED) find_package(xtensor REQUIRED) find_package(xsimd REQUIRED) # === 添加CUDA支持 === enable_language(CUDA) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --default-stream per-thread") set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --extended-lambda") set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr") set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --generate-line-info") set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --use_fast_math") # === 包含目录 === include_directories( include ${CUDAToolkit_INCLUDE_DIRS} ${xsimd_INCLUDE_DIRS} ) # === 定义编译选项 === add_definitions(-DXTENSOR_ENABLE_XSIMD) add_definitions(-DXTENSOR_USE_XSIMD) # === 依赖包列表 === set(dependencies_pkgs rclcpp nav2_common pluginlib tf2 geometry_msgs visualization_msgs nav_msgs nav2_core nav2_costmap_2d nav2_util tf2_geometry_msgs tf2_eigen tf2_ros ) foreach(pkg IN LISTS dependencies_pkgs) find_package(${pkg} REQUIRED) endforeach() nav2_package() # === 主库构建 === add_library(mppi_controller SHARED src/controller.cpp src/optimizer.cpp src/critic_manager.cpp src/trajectory_visualizer.cpp src/path_handler.cpp src/parameters_handler.cpp src/noise_generator.cpp src/optimizer.cu # 显式添加CUDA源文件 ) # 特别处理CUDA文件 set_source_files_properties(src/optimizer.cu PROPERTIES LANGUAGE CUDA) # 目标特定编译选项 - 移除了不支持的clang参数 target_compile_options(mppi_controller PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fPIC> $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-fPIC> $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-fno-strict-aliasing> ) # 链接选项 target_link_options(mppi_controller PRIVATE $<$<LINK_LANGUAGE:CUDA>:-Wl,--no-as-needed> ) # === 批评器库 === add_library(mppi_critics SHARED src/critics/obstacles_critic.cpp src/critics/cost_critic.cpp src/critics/goal_critic.cpp src/critics/goal_angle_critic.cpp src/critics/path_align_critic.cpp src/critics/path_align_legacy_critic.cpp src/critics/path_follow_critic.cpp src/critics/path_angle_critic.cpp src/critics/prefer_forward_critic.cpp src/critics/twirling_critic.cpp src/critics/constraint_critic.cpp src/critics/velocity_deadband_critic.cpp ) # === 配置所有库 === set(libraries mppi_controller mppi_critics) foreach(lib IN LISTS libraries) target_include_directories(${lib} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) target_compile_definitions(${lib} PRIVATE XTENSOR_ENABLE_XSIMD XTENSOR_USE_XSIMD ) if(${lib} STREQUAL "mppi_controller") target_link_libraries(${lib} xtensor xtensor::optimize xtensor::use_xsimd CUDA::cudart CUDA::cuda_driver ) else() target_link_libraries(${lib} xtensor xtensor::optimize xtensor::use_xsimd ) endif() ament_target_dependencies(${lib} ${dependencies_pkgs}) # 确保所有目标都有正确的C++标准设置 set_target_properties(${lib} PROPERTIES CXX_STANDARD 17 CUDA_STANDARD 17 POSITION_INDEPENDENT_CODE ON ) endforeach() # === 安装与导出 === install(TARGETS ${libraries} EXPORT ${PROJECT_NAME}_targets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include ) install(DIRECTORY include/ DESTINATION include/) # === 测试设置 === if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) find_package(ament_cmake_gtest REQUIRED) set(ament_cmake_copyright_FOUND TRUE) ament_lint_auto_find_test_dependencies() add_subdirectory(test) endif() # === 导出依赖和插件 === ament_export_targets(${PROJECT_NAME}_targets HAS_LIBRARY_TARGET) ament_export_dependencies(${dependencies_pkgs}) ament_export_include_directories(include) pluginlib_export_plugin_description_file(nav2_core mppic.xml) pluginlib_export_plugin_description_file(nav2_mppi_controller critics.xml) ament_package()- stderr: nav2_mppi_controller /usr/lib/gcc/aarch64-linux-gnu/11/include/arm_neon.h(38): error: identifier "__Int8x8_t" is undefined typedef __Int8x8_t int8x8_t;
最新发布
11-28
请修改我的代码,保证我不丢失数据的写到execl中,列是需要可扩展的不能固定 import requests from requests.auth import HTTPBasicAuth from openpyxl import Workbook import pandas as pd import time import re import logging # 抑制 SSL 警告 requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) # 配置 USERNAME = "admin" PASSWORD = "123456" VERIFY_SSL = False # 设置日志格式 logging.basicConfig(level=logging.ERROR, format="%(asctime)s - %(levelname)s - %(message)s") # 安全获取嵌套值 def get_nested(data, *keys, default="未知"): for key in keys: if isinstance(data, dict): data = data.get(key) elif isinstance(data, list): if isinstance(key, int) and key < len(data): data = data[key] else: return default else: return default return data if data is not None else default # 安全转换为整数的函数 def safe_int(value, default=0): if isinstance(value, int): return value elif isinstance(value, str) and value.isdigit(): return int(value) return default # =============== 登录并获取 token ============= def login(session, base_url): login_url = f"{base_url}/redfish/v1/SessionService/Sessions" headers = {"Content-Type": "application/json"} body = {"UserName": USERNAME, "Password": PASSWORD} try: response = session.post( login_url, json=body, headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=VERIFY_SSL ) response.raise_for_status() return response.headers.get("X-Auth-Token") except requests.exceptions.RequestException as e: return None # =============== 获取每个 CPU 的详细信息 ================ def get_cpu_info(session, base_url, auth_token): cpu_url = f"{base_url}/redfish/v1/Systems/1/Processors?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} try: time.sleep(1) response = session.get(cpu_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() cpu_collection = response.json() cpu_details_list = [] for member in cpu_collection["Members"]: cpu_member_url = f"{base_url}{member['@odata.id']}?x-Auth-Token={auth_token}" cpu_response = session.get(cpu_member_url, headers=headers, verify=VERIFY_SSL) cpu_response.raise_for_status() cpu_details = cpu_response.json() cpu_details_list.append(cpu_details) return cpu_details_list except requests.exceptions.RequestException as e: return None # =============== 写入 Excel 的函数 ============= def write_to_excel(ip, cpu_list, ws): if not cpu_list: return cpu_count = len(cpu_list) architectures = set(get_nested(cpu, "ProcessorArchitecture") for cpu in cpu_list) models = set(get_nested(cpu, "Model") for cpu in cpu_list) total_cores = get_nested(cpu_list[0].get("TotalCores")) if cpu_list else None total_threads = get_nested(cpu_list[0].get("TotalThreads")) if cpu_list else None rated_speed_list = [safe_int(get_nested(cpu, "Oem", "Hpe", "RatedSpeedMHz")) for cpu in cpu_list] rated_speed = max(rated_speed_list) if rated_speed_list else 0 max_speed_list = [safe_int(get_nested(cpu, "MaxSpeedMHz")) for cpu in cpu_list] max_speed = max(max_speed_list) if max_speed_list else 0 state = get_nested(cpu_list[0], "Status", "State") caches = get_nested(cpu_list[0], "Oem", "Hpe", "Cache") cache_values = ["未知"] * 3 if caches and isinstance(caches, list): for i in range(min(len(caches), 3)): cache_values[i] = str(caches[i].get('MaximumSizeKB', '未知')) row = ( ip, ", ".join(models) if models else "未知", ", ".join(architectures) if architectures else "未知", total_cores, total_threads, rated_speed, max_speed, state, cache_values[0], cache_values[1], cache_values[2], cpu_count ) ws.append(row) # 处理单个服务器的函数 def process_server(ip, ws): base_url = f"https://{ip}" with requests.Session() as session: auth_token = login(session, base_url) if not auth_token: print(f"❌ 无法登录服务器 {ip}") return time.sleep(1) cpu_details = get_cpu_info(session, base_url, auth_token) if cpu_details: write_to_excel(ip, cpu_details, ws) print(f"✅ 成功处理服务器 {ip}") else: print(f"❌ 服务器 {ip} 登录成功但未获取到 CPU 信息") # 获取内存信息 def get_memory_info(session, base_url, auth_token): memory_url = f"{base_url}/redfish/v1/Systems/1/Memory?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} try: time.sleep(1) response = session.get(memory_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() memory_collection = response.json() memory_details_list = [] for member in memory_collection.get("Members", []): memory_member_url = f"{base_url}{member['@odata.id']}?x-Auth-Token={auth_token}" memory_response = session.get(memory_member_url, headers=headers, verify=VERIFY_SSL) memory_response.raise_for_status() memory_details = memory_response.json() memory_details_list.append(memory_details) return memory_details_list except requests.exceptions.RequestException: return None # 统计内存信息 def summarize_memory(memory_details_list): if not memory_details_list: return { "total_slots": 0, "total_enabled": 0, "total_capacity_gb": 0, "memory_speed_mhz": "未知", "memory_type": "未知" } enabled_modules = [m for m in memory_details_list if get_nested(m, "Status", "State") == "Enabled"] total_capacity_gb = round(sum(get_nested(m, "CapacityMiB", default=0) for m in enabled_modules) / 1024, 2) # 取第一个启用的内存模块用于提取频率和类型 first_module = enabled_modules[0] if enabled_modules else memory_details_list[0] return { "total_slots": len(memory_details_list), "total_enabled": len(enabled_modules), "total_capacity_gb": total_capacity_gb, "memory_speed_mhz": get_nested(first_module, "OperatingSpeedMhz", default="未知"), "memory_type": get_nested(first_module, "MemoryDeviceType", default="未知") } # 获取网络设备信息(白名单 + 黑名单过滤) def get_network_info(session, base_url, auth_token): chassis_id = "1" headers = {"X-Auth-Token": auth_token} pcie_devices_url = f"{base_url}/redfish/v1/Chassis/{chassis_id}/PCIeDevices?x-Auth-Token={auth_token}" # 黑名单正则表达式 BLACKLISTED_PATTERNS = [ re.compile(r".* FC HBA.*", re.IGNORECASE), re.compile(r".*Array.*", re.IGNORECASE), ] # 白名单正则表达式 WHITELISTED_PATTERNS = [ re.compile(r".*Adapter.*", re.IGNORECASE), re.compile(r".*Ethernet.*", re.IGNORECASE), re.compile(r".*10Gb.*", re.IGNORECASE), re.compile(r".*GbE.*", re.IGNORECASE), re.compile(r"Broadcom", re.IGNORECASE), re.compile(r"NetXtreme", re.IGNORECASE), re.compile(r"BCM[0-9]+", re.IGNORECASE), re.compile(r"HPE", re.IGNORECASE), re.compile(r"Intel", re.IGNORECASE), re.compile(r".*Adptr.*", re.IGNORECASE), re.compile(r".*Embedded.*", re.IGNORECASE), ] try: time.sleep(1) response = session.get(pcie_devices_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() pcie_devices = response.json() network_adapters = [] for member in pcie_devices.get("Members", []): device_url = f"{base_url}{member['@odata.id']}?x-Auth-Token={auth_token}" device_response = session.get(device_url, headers=headers, verify=VERIFY_SSL) device_response.raise_for_status() device_info = device_response.json() name = device_info.get("Name", "未知") if name == "未知": continue # 检查黑名单 if any(pattern.search(name) for pattern in BLACKLISTED_PATTERNS): continue # 检查白名单 if is_name_allowed(name, WHITELISTED_PATTERNS): network_adapters.append({"Name": name}) return network_adapters except requests.exceptions.RequestException as e: logging.error(f"❌ 获取网卡信息失败: {e}") return [] # 获取网络设备数量 def count_network_adapters(network_details): from collections import Counter adapter_names = [adapter.get("Name") for adapter in network_details] return dict(Counter(adapter_names)) # 判断 SKU 是否在白名单中 def is_name_allowed(name, patterns): for pattern in patterns: if pattern.search(name): return True return False # 获取服务器序列号(带缓存) def get_server_serial_number(session, base_url, auth_token): system_url = f"{base_url}/redfish/v1/Systems/1?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} try: time.sleep(1) response = session.get(system_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() system_info = response.json() serial_number = get_nested(system_info, 'SerialNumber', default='未知序列号') return [{"SerialNumber": serial_number}] except requests.exceptions.RequestException as e: print(f"❌ 获取服务器基本信息失败: {e}") return [] # 获取服务器阵列卡(带缓存) def get_array_controller_info(session, base_url, auth_token): storage_url = f"{base_url}/redfish/v1/Systems/1/Storage" headers = {"X-Auth-Token": auth_token} try: response = session.get(storage_url, headers=headers, verify=VERIFY_SSL, timeout=10) response.raise_for_status() storage_summary = response.json() array_controllers = [] for member in storage_summary.get("Members", []): controller_url = f"{base_url}{member['@odata.id']}?x-Auth-Token={auth_token}" ctrl_response = session.get(controller_url, headers=headers, verify=VERIFY_SSL) ctrl_response.raise_for_status() controller_data = ctrl_response.json() array_controllers.append({ "Id": controller_data.get("Id", "未知ID"), "Name": controller_data.get("Name", "未知名称"), }) return array_controllers except requests.exceptions.RequestException as e: print(f"❌ 获取 阵列卡 控制器信息失败: {e}") return [] # 获取 RAID 类型与磁盘列表的映射 def get_raid_disk_mapping(session, base_url, auth_token): storage_url = f"{base_url}/redfish/v1/Systems/1/Storage" headers = {"X-Auth-Token": auth_token} raid_disk_map = {} try: response = session.get(storage_url, headers=headers, verify=VERIFY_SSL, timeout=10) response.raise_for_status() storage_summary = response.json() for member in storage_summary.get("Members", []): controller_url = f"{base_url}{member['@odata.id']}" ctrl_response = session.get(controller_url, headers=headers, verify=VERIFY_SSL) ctrl_response.raise_for_status() controller_data = ctrl_response.json() # 获取卷信息 volumes_url = f"{base_url}{controller_data['Volumes']['@odata.id']}" volumes_response = session.get(volumes_url, headers=headers, verify=VERIFY_SSL) volumes_response.raise_for_status() volumes_data = volumes_response.json() for volume_member in volumes_data.get("Members", []): volume_url = f"{base_url}{volume_member['@odata.id']}" volume_response = session.get(volume_url, headers=headers, verify=VERIFY_SSL) volume_response.raise_for_status() volume_detail = volume_response.json() raid_type = volume_detail.get("RAIDType", "None") drives = volume_detail.get("Links", {}).get("Drives", []) raid_disk_map.setdefault(raid_type, []) for drive in drives: drive_url = f"{base_url}{drive['@odata.id']}" drive_response = session.get(drive_url, headers=headers, verify=VERIFY_SSL, timeout=10) drive_response.raise_for_status() drive_data = drive_response.json() raid_disk_map[raid_type].append({ "SerialNumber": drive_data.get("SerialNumber", "0"), "CapacityBytes": drive_data.get("CapacityBytes", 0), "MediaType": drive_data.get("MediaType", "0"), }) # 获取不属于任何卷的磁盘 drives = controller_data.get("Drives", []) for drive in drives: drive_url = f"{base_url}{drive['@odata.id']}" drive_response = session.get(drive_url, headers=headers, verify=VERIFY_SSL, timeout=10) drive_response.raise_for_status() drive_data = drive_response.json() in_volume = False for disks in raid_disk_map.values(): for disk in disks: if disk["SerialNumber"] == drive_data.get("SerialNumber"): in_volume = True break if in_volume: break if not in_volume: raid_disk_map.setdefault("None", []).append({ "SerialNumber": drive_data.get("SerialNumber", "0"), "CapacityBytes": drive_data.get("CapacityBytes", 0), "MediaType": drive_data.get("MediaType", "0"), }) except requests.exceptions.RequestException as e: print(f"❌ 获取 RAID 与磁盘映射失败: {e}") return {} return raid_disk_map # 获取 iLO 信息(固件版本) def get_ilo_info(session, base_url, auth_token): ilo_url = f"{base_url}/redfish/v1/Managers/1/" headers = {"X-Auth-Token": auth_token} try: response = session.get(ilo_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() ilo_data = response.json() firmware_version = get_nested(ilo_data, "FirmwareVersion") return {"Firmware Version": firmware_version} except requests.exceptions.RequestException as e: logging.error(f"❌ 获取 iLO 信息失败: {e}") return {"Firmware Version": "未知"} # 获取 BIOS 版本 def get_bios_info(session, base_url, auth_token): system_url = f"{base_url}/redfish/v1/Systems/1/" headers = {"X-Auth-Token": auth_token} try: response = session.get(system_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() system_data = response.json() bios_version = get_nested(system_data, "BiosVersion") return {"BIOS Version": bios_version} except requests.exceptions.RequestException as e: logging.error(f"❌ 获取 BIOS 信息失败: {e}") return {"BIOS Version": "未知"} # 获取电源信息(仅保留指定字段) def get_power_info(session, base_url, auth_token): power_url = f"{base_url}/redfish/v1/Chassis/1/Power" headers = {"X-Auth-Token": auth_token} try: response = session.get(power_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() power_data = response.json() power_supplies = power_data.get("PowerSupplies", []) power_count = len(power_supplies) power_list = [ps.get("PowerCapacityWatts") for ps in power_supplies if ps.get("PowerCapacityWatts")] total_power = sum(power_list) single_power = round(total_power / power_count, 2) if power_count > 0 else "未知" return { "电源数量": power_count, "总功率(W)": total_power, "单个电源功率(W)": single_power, } except requests.exceptions.RequestException as e: logging.error(f"❌ 获取电源信息失败: {e}") return {} # 获取HBA信息(仅保留指定字段) def get_hba_info(session, base_url, auth_token): chassis_id = "1" pcie_devices_url = f"{base_url}/redfish/v1/Chassis/{chassis_id}/PCIeDevices?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} WHITELISTED_PATTERNS = [ r"Emulex.*", r"QLogic", r"SN.*", ] try: time.sleep(1) response = session.get(pcie_devices_url, headers=headers, verify=False) response.raise_for_status() pcie_devices = response.json() fc_adapters = [] for member in pcie_devices.get("Members", []): device_url = f"{base_url}{member['@odata.id']}?x-Auth-Token={auth_token}" device_response = session.get(device_url, headers=headers, verify=False) device_response.raise_for_status() device_info = device_response.json() name = get_nested(device_info, "Name") if not name: continue matched = False for pattern in WHITELISTED_PATTERNS: regex_pattern = pattern.replace("*", ".*") if re.search(regex_pattern, name): matched = True break if matched: fc_adapters.append({"Name": name}) return fc_adapters except requests.exceptions.RequestException as e: print(f"❌ 获取FC卡失败: {e}") return [] # ================== 新增辅助函数:用于生成动态 RAID/HBA/网卡列名 ================== def get_raid_columns(raid_disk_map): """生成 RAID 列名:每组 RAID 类型 + 其下所有磁盘三列连续排列""" cols = [] sorted_items = sorted(raid_disk_map.items(), key=lambda x: (x[0] != "None", x[0])) # None 排最后 for raid_idx, (raid_type, disks) in enumerate(sorted_items, start=1): cols.append(f"RAID类型_{raid_idx}") for disk_idx in range(1, len(disks) + 1): prefix = f"{raid_idx}_{disk_idx}" cols.extend([ f"磁盘序列号_{prefix}", f"磁盘容量_{prefix}(GB)", f"磁盘类型_{prefix}" ]) return cols def get_raid_data(raid_disk_map): """生成 RAID 数据:每个 RAID 类型后紧跟其磁盘信息""" data = {} sorted_items = sorted(raid_disk_map.items(), key=lambda x: (x[0] != "None", x[0])) for raid_idx, (raid_type, disks) in enumerate(sorted_items, start=1): data[f"RAID类型_{raid_idx}"] = raid_type for disk_idx, disk in enumerate(disks, start=1): prefix = f"{raid_idx}_{disk_idx}" data[f"磁盘序列号_{prefix}"] = disk.get("SerialNumber", "") cap_gb = round(disk.get("CapacityBytes", 0) / (1024**3), 2) if disk.get("CapacityBytes") else 0 data[f"磁盘容量_{prefix}(GB)"] = cap_gb data[f"磁盘类型_{prefix}"] = disk.get("MediaType", "") return data def get_hba_columns(hba_list): return [f"hba{i}卡名" for i in range(1, len(hba_list) + 1)] def get_hba_data(hba_list): return {f"hba{i}卡名": adapter.get("Name", "") for i, adapter in enumerate(hba_list, 1)} def get_nic_columns(nic_list): cols = [f"网卡型号_{i}" for i in range(1, len(nic_list) + 1)] cols.append("网卡数量") # 数量放在网卡列表之后 return cols def get_nic_data(nic_list): data = {f"网卡型号_{i}": adapter.get("Name", "") for i, adapter in enumerate(nic_list, 1)} data["网卡数量"] = len(nic_list) # ✅ 放在网卡字段后面 return data # 主函数:读取文件并处理所有服务器 def main(): wb = Workbook() ws = wb.active ws.title = "CPU 信息汇总" # 表头 ws.append([ "IP 地址", "型号", "CPU架构", "CPU核心数", "线程数", "CPU基本频率(MHz)", "CPU最大频率(MHz)", "CPU状态", "CPU缓存1(KB)", "CPU缓存2(KB)", "CPU缓存3(KB)", "CPU数量" ]) try: with open("server.txt", "r") as f: ips = [line.strip() for line in f if line.strip()] except FileNotFoundError: print("❌ 文件 server.txt 不存在,请确保文件存在并包含 IP 地址。") return for ip in ips: print(f"\n🔄 正在处理服务器:{ip}") process_server(ip, ws) wb.save("HPE_DL380_Gen10_PLUS_info.xlsx") print("✅ 所有服务器的 CPU 信息已成功写入 HPE_DL380_Gen10_PLUS_info.xlsx") # ========== 第一步:收集所有数据,并构建全局列集合 ========== all_server_data = [] all_columns_set = set() # 固定基础列(必须存在) base_columns = [ "IP 地址", "型号", "CPU架构", "CPU核心数", "线程数", "CPU基本频率(MHz)", "CPU最大频率(MHz)", "CPU状态", "CPU缓存1(KB)", "CPU缓存2(KB)", "CPU缓存3(KB)", "CPU数量", "总内存插槽数", "已启用内存数", "可用内存插槽数", "内存总容量(GB)", "内存频率(MHz)", "内存类型", "序列号", "阵列卡id", "阵列卡名称", "BIOS Version", "Firmware Version", "电源数量", "总功率(W)", "单个电源功率(W)" ] all_columns_set.update(base_columns) try: # ====== 🔴 添加这一段:重新读取 ips ====== try: with open("server.txt", "r") as f: ips = [line.strip() for line in f if line.strip()] except FileNotFoundError: print("❌ 文件 server.txt 不存在") sys.exit(1) # 终止程序 with requests.Session() as session: for ip in ips: print(f"\n🔄 正在处理服务器:{ip}") base_url = f"https://{ip}" auth_token = login(session, base_url) if not auth_token: print(f"❌ 登录失败,跳过 {ip}") continue time.sleep(1) # ========== 采集所有信息 ========== cpu_details = get_cpu_info(session, base_url, auth_token) memory_details = get_memory_info(session, base_url, auth_token) network_details = get_network_info(session, base_url, auth_token) or [] # 防空 server_info = get_server_serial_number(session, base_url, auth_token) or [] array_info = get_array_controller_info(session, base_url, auth_token) or [] raid_disk_map = get_raid_disk_mapping(session, base_url, auth_token) or {} ilo_details = get_ilo_info(session, base_url, auth_token) or {} bios_details = get_bios_info(session, base_url, auth_token) or {} power_details = get_power_info(session, base_url, auth_token) or {} fc_details = get_hba_info(session, base_url, auth_token) or [] # ========== 汇总内存 ========== memory_summary = summarize_memory(memory_details) if memory_details else {} # ========== CPU 处理 ========== if not cpu_details: model = "未知" arch = "未知" cores = threads = rated_speed = max_speed = 0 state = "未知" cache_values = ["未知"] * 3 cpu_count = 0 else: models = {get_nested(cpu, "Model") for cpu in cpu_details} archs = {get_nested(cpu, "ProcessorArchitecture") for cpu in cpu_details} cores = get_nested(cpu_details[0], "TotalCores") or 0 threads = get_nested(cpu_details[0], "TotalThreads") or 0 rated_speed = max((safe_int(get_nested(cpu, "Oem", "Hpe", "RatedSpeedMHz")) for cpu in cpu_details), default=0) max_speed = max((safe_int(get_nested(cpu, "MaxSpeedMHz")) for cpu in cpu_details), default=0) state = get_nested(cpu_details[0], "Status", "State") or "未知" caches = get_nested(cpu_details[0], "Oem", "Hpe", "Cache") or [] cache_values = ["未知"] * 3 for i in range(min(len(caches), 3)): cache_values[i] = str(caches[i].get('MaximumSizeKB', '未知')) cpu_count = len(cpu_details) model = ", ".join(models) if models else "未知" arch = ", ".join(archs) if archs else "未知" # ========== 初始化当前行 ========== row = { "IP 地址": ip, "型号": model, "CPU架构": arch, "CPU核心数": cores, "线程数": threads, "CPU基本频率(MHz)": rated_speed, "CPU最大频率(MHz)": max_speed, "CPU状态": state, "CPU缓存1(KB)": cache_values[0], "CPU缓存2(KB)": cache_values[1], "CPU缓存3(KB)": cache_values[2], "CPU数量": cpu_count, "总内存插槽数": memory_summary.get("total_slots", 0), "已启用内存数": memory_summary.get("total_enabled", 0), "可用内存插槽数": memory_summary.get("total_slots", 0) - memory_summary.get("total_enabled", 0), "内存总容量(GB)": memory_summary.get("total_capacity_gb", 0), "内存频率(MHz)": memory_summary.get("memory_speed_mhz", "未知"), "内存类型": memory_summary.get("memory_type", "未知"), "序列号": (server_info[0]["SerialNumber"] if server_info else "未知"), "阵列卡id": (array_info[0]["Id"] if array_info else "未知"), "阵列卡名称": (array_info[0]["Name"] if array_info else "未知"), "BIOS Version": bios_details.get("BIOS Version", "未知"), "Firmware Version": ilo_details.get("Firmware Version", "未知"), "电源数量": power_details.get("电源数量", "未知"), "总功率(W)": power_details.get("总功率(W)", "未知"), "单个电源功率(W)": power_details.get("单个电源功率(W)", "未知"), } # ========== 动态添加 RAID ========== raid_data = get_raid_data(raid_disk_map) row.update(raid_data) all_columns_set.update(get_raid_columns(raid_disk_map)) # ========== 动态添加 HBA ========== hba_data = get_hba_data(fc_details) row.update(hba_data) all_columns_set.update(get_hba_columns(fc_details)) # ========== 动态添加 网卡(包含数量)========= nic_data = get_nic_data(network_details) row.update(nic_data) all_columns_set.update(get_nic_columns(network_details)) all_server_data.append(row) # ========== 第二步:构建最终列顺序 ========== final_columns = list(base_columns) # 添加 RAID 组(每组:类型 + 所有磁盘三列连续) raid_cols = [c for c in sorted(all_columns_set) if c.startswith("RAID类型_")] for col in raid_cols: raid_idx = col.split("_")[1] final_columns.append(col) # 添加该 RAID 组下的所有磁盘列(按编号升序) disk_cols = [f"磁盘序列号_{raid_idx}_", f"磁盘容量_{raid_idx}_", f"磁盘类型_{raid_idx}_"] matching = [c for c in sorted(all_columns_set) if any(c.startswith(prefix) and f"_{raid_idx}_" in c for prefix in ["磁盘序列号_", "磁盘容量_", "磁盘类型_"])] final_columns.extend(matching) # 移除已添加的 RAID 列 all_columns_set -= set(raid_cols) for c in [col for col in all_columns_set if col.startswith("磁盘")]: if any(f"_{raid_idx}_" in c for raid_idx in map(str, range(1, 10))): all_columns_set.discard(c) # 添加 HBA hba_cols = sorted([c for c in all_columns_set if c.startswith("hba")]) final_columns.extend(hba_cols) all_columns_set -= set(hba_cols) # 添加 网卡(先型号,再数量) nic_cols = sorted([c for c in all_columns_set if c.startswith("网卡型号_")]) nic_count_col = "网卡数量" if "网卡数量" in all_columns_set else None final_columns.extend(nic_cols) if nic_count_col: final_columns.append(nic_count_col) all_columns_set.discard(nic_count_col) all_columns_set -= set(nic_cols) # 其他未分类字段(极少) final_columns.extend(sorted(all_columns_set)) # ========== 第三步:构造 DataFrame 并补全缺失列 ========== df = pd.DataFrame(all_server_data, columns=final_columns).fillna("") # ========== 第四步:保存到 Excel ========== try: df.to_excel("HPE_DL380_Gen10_PLUS_info.xlsx", index=False, engine="openpyxl") print(f"✅ 成功写入 {len(df)} 台服务器信息到 Excel") print(f"📊 总计列数: {len(final_columns)}") except Exception as e: print(f"❌ 写入 Excel 失败: {e}") except Exception as e: print(f"❌ 主流程异常: {e}") if __name__ == "__main__": main()
11-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值