# CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_BASE_SMALL=0 CONFIG_BITREVERSE=y # CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_SD=y # CONFIG_BONDING is not set CONFIG_BOUNCE=y # CONFIG_BRIDGE is not set # CONFIG_BT is not set # CONFIG_CIFS is not set CONFIG_CLASSIC_RCU=y CONFIG_CRIS=y # CONFIG_CRIS_MACH_ARTPEC3 is not set # CONFIG_CRYPTO_AEAD is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_MD4 is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SEQIV is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TEST is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_ETRAX100LX is not set CONFIG_ETRAX100LX_V2=y # CONFIG_ETRAXFS is not set CONFIG_ETRAX_ARCH_V10=y # CONFIG_ETRAX_ARCH_V32 is not set CONFIG_ETRAX_AXISFLASHMAP=y CONFIG_ETRAX_CMDLINE="root=/dev/mtdblock1 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200" # CONFIG_ETRAX_CSP0_LEDS is not set # CONFIG_ETRAX_DEBUG_PORT0 is not set # CONFIG_ETRAX_DEBUG_PORT1 is not set # CONFIG_ETRAX_DEBUG_PORT2 is not set # CONFIG_ETRAX_DEBUG_PORT3 is not set CONFIG_ETRAX_DEBUG_PORT_NULL=y CONFIG_ETRAX_DEF_R_BUS_CONFIG=0x4 CONFIG_ETRAX_DEF_R_PORT_PA_DATA=0xf0 CONFIG_ETRAX_DEF_R_PORT_PA_DIR=0x1c CONFIG_ETRAX_DEF_R_PORT_PB_CONFIG=0x00 CONFIG_ETRAX_DEF_R_PORT_PB_DATA=0x03 CONFIG_ETRAX_DEF_R_PORT_PB_DIR=0xce CONFIG_ETRAX_DEF_R_SDRAM_CONFIG=0x09603737 CONFIG_ETRAX_DEF_R_SDRAM_TIMING=0x80008002 CONFIG_ETRAX_DEF_R_WAITSTATES=0x95f8 CONFIG_ETRAX_DRAM_SIZE=32 CONFIG_ETRAX_DRAM_VIRTUAL_BASE=c0000000 CONFIG_ETRAX_ETHERNET=y CONFIG_ETRAX_FAST_TIMER=y CONFIG_ETRAX_FLASH1_SIZE=0 CONFIG_ETRAX_FLASH_BUSWIDTH=2 CONFIG_ETRAX_GPIO=y # CONFIG_ETRAX_I2C is not set # CONFIG_ETRAX_KMALLOCED_MODULES is not set CONFIG_ETRAX_LED1G=2 CONFIG_ETRAX_LED1R=2 CONFIG_ETRAX_LED2G=3 CONFIG_ETRAX_LED2R=3 CONFIG_ETRAX_LED3G=2 CONFIG_ETRAX_LED3R=2 CONFIG_ETRAX_NANDFLASH_BUSWIDTH=1 CONFIG_ETRAX_NETWORK_LED_ON_WHEN_ACTIVITY=y # CONFIG_ETRAX_NETWORK_LED_ON_WHEN_LINK is not set # CONFIG_ETRAX_NO_LEDS is not set CONFIG_ETRAX_PA_BUTTON_BITMASK=02 CONFIG_ETRAX_PA_CHANGEABLE_BITS=0xFF CONFIG_ETRAX_PA_CHANGEABLE_DIR=0xFF CONFIG_ETRAX_PA_LEDS=y CONFIG_ETRAX_PB_CHANGEABLE_BITS=0xFF CONFIG_ETRAX_PB_CHANGEABLE_DIR=0xFF # CONFIG_ETRAX_PB_LEDS is not set CONFIG_ETRAX_PTABLE_SECTOR=0 CONFIG_ETRAX_RESCUE_SER0=y # CONFIG_ETRAX_RESCUE_SER1 is not set # CONFIG_ETRAX_RESCUE_SER2 is not set # CONFIG_ETRAX_RESCUE_SER3 is not set # CONFIG_ETRAX_RS485 is not set CONFIG_ETRAX_SDRAM=y CONFIG_ETRAX_SER0_CD_ON_PA_BIT=-1 CONFIG_ETRAX_SER0_CD_ON_PB_BIT=-1 CONFIG_ETRAX_SER0_DSR_ON_PA_BIT=-1 CONFIG_ETRAX_SER0_DSR_ON_PB_BIT=-1 CONFIG_ETRAX_SER0_DTR_ON_PA_BIT=-1 CONFIG_ETRAX_SER0_DTR_ON_PB_BIT=-1 # CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED is not set CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_NONE=y # CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PA is not set # CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB is not set CONFIG_ETRAX_SER0_RI_ON_PA_BIT=-1 CONFIG_ETRAX_SER0_RI_ON_PB_BIT=-1 CONFIG_ETRAX_SER2_CD_ON_PA_BIT=-1 CONFIG_ETRAX_SER2_CD_ON_PB_BIT=-1 CONFIG_ETRAX_SER2_DSR_ON_PA_BIT=-1 CONFIG_ETRAX_SER2_DSR_ON_PB_BIT=-1 CONFIG_ETRAX_SER2_DTR_ON_PA_BIT=-1 CONFIG_ETRAX_SER2_DTR_ON_PB_BIT=-1 # CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED is not set CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_NONE=y # CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PA is not set # CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PB is not set CONFIG_ETRAX_SER2_RI_ON_PA_BIT=-1 CONFIG_ETRAX_SER2_RI_ON_PB_BIT=-1 CONFIG_ETRAX_SER3_CD_ON_PA_BIT=-1 CONFIG_ETRAX_SER3_CD_ON_PB_BIT=-1 CONFIG_ETRAX_SER3_DSR_ON_PA_BIT=-1 CONFIG_ETRAX_SER3_DSR_ON_PB_BIT=-1 CONFIG_ETRAX_SER3_DTR_ON_PA_BIT=-1 CONFIG_ETRAX_SER3_DTR_ON_PB_BIT=-1 # CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED is not set CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_NONE=y # CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_PA is not set # CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_ON_PB is not set CONFIG_ETRAX_SER3_RI_ON_PA_BIT=-1 CONFIG_ETRAX_SER3_RI_ON_PB_BIT=-1 CONFIG_ETRAX_SERIAL=y # CONFIG_ETRAX_SERIAL_FAST_TIMER is not set # CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is not set CONFIG_ETRAX_SERIAL_PORT0=y # CONFIG_ETRAX_SERIAL_PORT0_DMA0_OUT is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA1_IN is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA6_OUT is not set # CONFIG_ETRAX_SERIAL_PORT0_DMA7_IN is not set CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_IN=y CONFIG_ETRAX_SERIAL_PORT0_NO_DMA_OUT=y # CONFIG_ETRAX_SERIAL_PORT1 is not set CONFIG_ETRAX_SERIAL_PORT2=y CONFIG_ETRAX_SERIAL_PORT2_DMA2_OUT=y CONFIG_ETRAX_SERIAL_PORT2_DMA3_IN=y # CONFIG_ETRAX_SERIAL_PORT2_DMA6_OUT is not set # CONFIG_ETRAX_SERIAL_PORT2_DMA7_IN is not set # CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_IN is not set # CONFIG_ETRAX_SERIAL_PORT2_NO_DMA_OUT is not set CONFIG_ETRAX_SERIAL_PORT3=y # CONFIG_ETRAX_SERIAL_PORT3_DMA2_OUT is not set # CONFIG_ETRAX_SERIAL_PORT3_DMA3_IN is not set CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT=y CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN=y # CONFIG_ETRAX_SERIAL_PORT3_DMA8_OUT is not set # CONFIG_ETRAX_SERIAL_PORT3_DMA9_IN is not set # CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_IN is not set # CONFIG_ETRAX_SERIAL_PORT3_NO_DMA_OUT is not set CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS=1 # CONFIG_ETRAX_SOFT_SHUTDOWN is not set # CONFIG_ETRAX_SYNCHRONOUS_SERIAL is not set CONFIG_ETRAX_USB_HOST=y CONFIG_ETRAX_USB_HOST_PORT1=y CONFIG_ETRAX_USB_HOST_PORT2=y # CONFIG_ETRAX_VCS_SIM is not set # CONFIG_ETRAX_WATCHDOG is not set CONFIG_EXT2_FS=y # CONFIG_EXT3_FS is not set CONFIG_FORCE_MAX_ZONEORDER=6 CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_IOMAP=y # CONFIG_GEN_RTC is not set # CONFIG_HAMRADIO is not set CONFIG_HAS_DMA=y CONFIG_HAS_IOMEM=y CONFIG_HAVE_IDE=y # CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_OPROFILE is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HW_RANDOM is not set # CONFIG_I2C is not set # CONFIG_IBM_NEW_EMAC_EMAC4 is not set # CONFIG_IBM_NEW_EMAC_RGMII is not set # CONFIG_IBM_NEW_EMAC_TAH is not set # CONFIG_IBM_NEW_EMAC_ZMII is not set # CONFIG_IDE is not set # CONFIG_IEEE80211 is not set # CONFIG_IFB is not set # CONFIG_IMQ is not set CONFIG_INITRAMFS_SOURCE="" # CONFIG_ISO9660_FS is not set # CONFIG_LLC is not set # CONFIG_MINIX_FS is not set # CONFIG_MSDOS_FS is not set CONFIG_MTD=y CONFIG_MTDRAM_ABS_POS=0x0 CONFIG_MTDRAM_ERASE_SIZE=128 CONFIG_MTDRAM_TOTAL_SIZE=0 # CONFIG_MTD_ABSENT is not set CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_MTD_BLOCK2MTD is not set CONFIG_MTD_CFI=y CONFIG_MTD_CFI_ADV_OPTIONS=y CONFIG_MTD_CFI_AMDSTD=y # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set # CONFIG_MTD_CFI_GEOMETRY is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set # CONFIG_MTD_CFI_INTELEXT is not set # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set CONFIG_MTD_CFI_NOSWAP=y # CONFIG_MTD_CFI_STAA is not set CONFIG_MTD_CFI_UTIL=y CONFIG_MTD_CHAR=y # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_COMPLEX_MAPPINGS=y CONFIG_MTD_CONCAT=y # CONFIG_MTD_DEBUG is not set # CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set CONFIG_MTD_GEN_PROBE=y CONFIG_MTD_JEDECPROBE=y CONFIG_MTD_MAP_BANK_WIDTH_1=y # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set CONFIG_MTD_MAP_BANK_WIDTH_2=y # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set CONFIG_MTD_MTDRAM=y # CONFIG_MTD_ONENAND is not set # CONFIG_MTD_OTP is not set CONFIG_MTD_PARTITIONS=y # CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_PLATRAM is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_SLRAM is not set # CONFIG_NETDEV_1000 is not set # CONFIG_NFSD is not set # CONFIG_NFS_FS is not set CONFIG_NLS=y CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ISO8859_1=y CONFIG_NO_IOPORT=y # CONFIG_OOM_REBOOT is not set # CONFIG_PPP is not set # CONFIG_RTC is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_SCSI=y # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set # CONFIG_SCSI_WAIT_SCAN is not set # CONFIG_SERIAL_8250 is not set CONFIG_SLABINFO=y # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set # CONFIG_SVINTO_SIM is not set # CONFIG_SYSTEM_PROFILER is not set CONFIG_SYSVIPC_SYSCTL=y # CONFIG_TUN is not set # CONFIG_UDF_FS is not set CONFIG_UID16=y CONFIG_USB=y # CONFIG_USB_ACM is not set # CONFIG_USB_ARCH_HAS_EHCI is not set # CONFIG_USB_ARCH_HAS_HCD is not set # CONFIG_USB_ARCH_HAS_OHCI is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_SERIAL is not set CONFIG_USB_STORAGE=y CONFIG_USB_SUPPORT=y # CONFIG_VFAT_FS is not set # CONFIG_VIDEO_V4L2_COMMON is not set # CONFIG_VLAN_8021Q is not set # CONFIG_WLAN_80211 is not set # CONFIG_XFS_FS is not set a> 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
#!/usr/bin/env perl
use FindBin;
use lib "$FindBin::Bin";
use strict;
use metadata;
use Getopt::Long;
my %board;
sub version_to_num($) {
my $str = shift;
my $num = 0;
if (defined($str) && $str =~ /^\d+(?:\.\d+)+$/)
{
my @n = (split(/\./, $str), 0, 0, 0, 0);
$num = ($n[0] << 24) | ($n[1] << 16) | ($n[2] << 8) | $n[3];
}
return $num;
}
sub version_filter_list(@) {
my $cmpver = version_to_num(shift @_);
my @items;
foreach my $item (@_)
{
if ($item =~ s/@(lt|le|gt|ge|eq|ne)(\d+(?:\.\d+)+)\b//)
{
my $op = $1;
my $symver = version_to_num($2);
if ($symver > 0 && $cmpver > 0)
{
next unless (($op eq 'lt' && $cmpver < $symver) ||
($op eq 'le' && $cmpver <= $symver) ||
($op eq 'gt' && $cmpver > $symver) ||
($op eq 'ge' && $cmpver >= $symver) ||
($op eq 'eq' && $cmpver == $symver) ||
($op eq 'ne' && $cmpver != $symver));
}
}
push @items, $item;
}
return @items;
}
sub gen_kconfig_overrides() {
my %config;
my %kconfig;
my $package;
my $pkginfo = shift @ARGV;
my $cfgfile = shift @ARGV;
my $patchver = shift @ARGV;
# parameter 2: build system config
open FILE, "<$cfgfile" or return;
while (<FILE>) {
/^(CONFIG_.+?)=(.+)$/ and $config{$1} = 1;
}
close FILE;
# parameter 1: package metadata
open FILE, "<$pkginfo" or return;
while (<FILE>) {
/^Package:\s*(.+?)\s*$/ and $package = $1;
/^Kernel-Config:\s*(.+?)\s*$/ and do {
my @config = split /\s+/, $1;
foreach my $config (version_filter_list($patchver, @config)) {
my $val = 'm';
my $override;
if ($config =~ /^(.+?)=(.+)$/) {
$config = $1;
$override = 1;
$val = $2;
}
if ($config{"CONFIG_PACKAGE_$package"} and ($config ne 'n')) {
next if $kconfig{$config} eq 'y';
$kconfig{$config} = $val;
} elsif (!$override) {
$kconfig{$config} or $kconfig{$config} = 'n';
}
}
};
};
close FILE;
foreach my $kconfig (sort keys %kconfig) {
if ($kconfig{$kconfig} eq 'n') {
print "# $kconfig is not set\n";
} else {
print "$kconfig=$kconfig{$kconfig}\n";
}
}
}
my %dep_check;
sub __find_package_dep($$) {
my $pkg = shift;
my $name = shift;
my $deps = $pkg->{depends};
return 0 unless defined $deps;
foreach my $vpkg (@{$deps}) {
foreach my $dep (@{$vpackage{$vpkg}}) {
next if $dep_check{$dep->{name}};
$dep_check{$dep->{name}} = 1;
return 1 if $dep->{name} eq $name;
return 1 if (__find_package_dep($dep, $name) == 1);
}
}
return 0;
}
# wrapper to avoid infinite recursion
sub find_package_dep($$) {
my $pkg = shift;
my $name = shift;
%dep_check = ();
return __find_package_dep($pkg, $name);
}
sub package_depends($$) {
my $a = shift;
my $b = shift;
my $ret;
return 0 if ($a->{submenu} ne $b->{submenu});
if (find_package_dep($a, $b->{name}) == 1) {
$ret = 1;
} elsif (find_package_dep($b, $a->{name}) == 1) {
$ret = -1;
} else {
return 0;
}
return $ret;
}
sub mconf_depends {
my $pkgname = shift;
my $depends = shift;
my $only_dep = shift;
my $res;
my $dep = shift;
my $seen = shift;
my $parent_condition = shift;
$dep or $dep = {};
$seen or $seen = {};
my @t_depends;
$depends or return;
my @depends = @$depends;
foreach my $depend (@depends) {
my $m = "depends on";
my $flags = "";
$depend =~ s/^([@\+]+)// and $flags = $1;
my $condition = $parent_condition;
next if $condition eq $depend;
next if $seen->{"$parent_condition:$depend"};
next if $seen->{":$depend"};
$seen->{"$parent_condition:$depend"} = 1;
if ($depend =~ /^(.+):(.+)$/) {
if ($1 ne "PACKAGE_$pkgname") {
if ($condition) {
$condition = "$condition && $1";
} else {
$condition = $1;
}
}
$depend = $2;
}
if ($flags =~ /\+/) {
my $vdep = $vpackage{$depend};
if ($vdep) {
my @vdeps;
foreach my $v (@$vdep) {
next if $v->{buildonly};
if ($v->{variant_default}) {
unshift @vdeps, $v->{name};
} else {
push @vdeps, $v->{name};
}
}
$depend = shift @vdeps;
if (@vdeps > 1) {
$condition = ($condition ? "$condition && " : '') . join("&&", map { "PACKAGE_$_<PACKAGE_$pkgname" } @vdeps);
} elsif (@vdeps > 0) {
$condition = ($condition ? "$condition && " : '') . "PACKAGE_${vdeps[0]}<PACKAGE_$pkgname";
}
}
# Menuconfig will not treat 'select FOO' as a real dependency
# thus if FOO depends on other config options, these dependencies
# will not be checked. To fix this, we simply emit all of FOO's
# depends here as well.
$package{$depend} and push @t_depends, [ $package{$depend}->{depends}, $condition ];
$m = "select";
next if $only_dep;
$flags =~ /@/ or $depend = "PACKAGE_$depend";
} else {
my $vdep = $vpackage{$depend};
if ($vdep && @$vdep > 0) {
$depend = join("||", map { "PACKAGE_".$_->{name} } @$vdep);
} else {
$flags =~ /@/ or $depend = "PACKAGE_$depend";
}
}
if ($condition) {
if ($m =~ /select/) {
next if $depend eq $condition;
$depend = "$depend if $condition";
} else {
next if $dep->{"$depend if $condition"};
$depend = "!($condition) || $depend" unless $dep->{$condition} eq 'select';
}
}
$dep->{$depend} =~ /select/ or $dep->{$depend} = $m;
}
foreach my $tdep (@t_depends) {
mconf_depends($pkgname, $tdep->[0], 1, $dep, $seen, $tdep->[1]);
}
foreach my $depend (keys %$dep) {
my $m = $dep->{$depend};
$res .= "\t\t$m $depend\n";
}
return $res;
}
sub mconf_conflicts {
my $pkgname = shift;
my $depends = shift;
my $res = "";
foreach my $depend (@$depends) {
next unless $package{$depend};
$res .= "\t\tdepends on m || (PACKAGE_$depend != y)\n";
}
return $res;
}
sub print_package_config_category($) {
my $cat = shift;
my %menus;
my %menu_dep;
return unless $category{$cat};
print "menu \"$cat\"\n\n";
my %spkg = %{$category{$cat}};
foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) {
foreach my $pkg (@{$spkg{$spkg}}) {
next if $pkg->{buildonly};
my $menu = $pkg->{submenu};
if ($menu) {
$menu_dep{$menu} or $menu_dep{$menu} = $pkg->{submenudep};
} else {
$menu = 'undef';
}
$menus{$menu} or $menus{$menu} = [];
push @{$menus{$menu}}, $pkg;
}
}
my @menus = sort {
($a eq 'undef' ? 1 : 0) or
($b eq 'undef' ? -1 : 0) or
($a cmp $b)
} keys %menus;
foreach my $menu (@menus) {
my @pkgs = sort {
package_depends($a, $b) or
($a->{name} cmp $b->{name})
} @{$menus{$menu}};
if ($menu ne 'undef') {
$menu_dep{$menu} and print "if $menu_dep{$menu}\n";
print "menu \"$menu\"\n";
}
foreach my $pkg (@pkgs) {
next if $pkg->{src}{ignore};
my $title = $pkg->{name};
my $c = (72 - length($pkg->{name}) - length($pkg->{title}));
if ($c > 0) {
$title .= ("." x $c). " ". $pkg->{title};
}
$title = "\"$title\"";
print "\t";
$pkg->{menu} and print "menu";
print "config PACKAGE_".$pkg->{name}."\n";
$pkg->{hidden} and $title = "";
print "\t\t".($pkg->{tristate} ? 'tristate' : 'bool')." $title\n";
print "\t\tdefault y if DEFAULT_".$pkg->{name}."\n";
unless ($pkg->{hidden}) {
my @def = ("ALL");
if (!exists($pkg->{repository})) {
push @def, "ALL_NONSHARED";
}
if ($pkg->{name} =~ /^kmod-/) {
push @def, "ALL_KMODS";
}
$pkg->{default} ||= "m if " . join("||", @def);
}
if ($pkg->{default}) {
foreach my $default (split /\s*,\s*/, $pkg->{default}) {
print "\t\tdefault $default\n";
}
}
print mconf_depends($pkg->{name}, $pkg->{depends}, 0);
print mconf_depends($pkg->{name}, $pkg->{mdepends}, 0);
print mconf_conflicts($pkg->{name}, $pkg->{conflicts});
print "\t\thelp\n";
print $pkg->{description};
print "\n";
$pkg->{config} and print $pkg->{config}."\n";
}
if ($menu ne 'undef') {
print "endmenu\n";
$menu_dep{$menu} and print "endif\n";
}
}
print "endmenu\n\n";
undef $category{$cat};
}
sub print_package_overrides() {
keys %overrides > 0 or return;
print "\tconfig OVERRIDE_PKGS\n";
print "\t\tstring\n";
print "\t\tdefault \"".join(" ", sort keys %overrides)."\"\n\n";
}
sub gen_package_config() {
parse_package_metadata($ARGV[0]) or exit 1;
print "menuconfig IMAGEOPT\n\tbool \"Image configuration\"\n\tdefault n\n";
print "source \"package/*/image-config.in\"\n";
if (scalar glob "package/feeds/*/*/image-config.in") {
print "source \"package/feeds/*/*/image-config.in\"\n";
}
print_package_config_category 'Base system';
foreach my $cat (sort {uc($a) cmp uc($b)} keys %category) {
print_package_config_category $cat;
}
print_package_overrides();
}
sub and_condition($) {
my $condition = shift;
my @spl_and = split('\&\&', $condition);
if (@spl_and == 1) {
return "\$(CONFIG_$spl_and[0])";
}
return "\$(and " . join (',', map("\$(CONFIG_$_)", @spl_and)) . ")";
}
sub gen_condition ($) {
my $condition = shift;
# remove '!()', just as include/package-ipkg.mk does
$condition =~ s/[()!]//g;
return join("", map(and_condition($_), split('\|\|', $condition)));
}
sub get_conditional_dep($$) {
my $condition = shift;
my $depstr = shift;
if ($condition) {
if ($condition =~ /^!(.+)/) {
return "\$(if " . gen_condition($1) . ",,$depstr)";
} else {
return "\$(if " . gen_condition($condition) . ",$depstr)";
}
} else {
return $depstr;
}
}
sub gen_package_mk() {
my $line;
parse_package_metadata($ARGV[0]) or exit 1;
foreach my $srcname (sort {uc($a) cmp uc($b)} keys %srcpackage) {
my $src = $srcpackage{$srcname};
my $variant_default;
my %deplines = ('' => {});
foreach my $pkg (@{$src->{packages}}) {
foreach my $dep (@{$pkg->{depends}}) {
next if ($dep =~ /@/);
my $condition;
$dep =~ s/\+//g;
if ($dep =~ /^(.+):(.+)/) {
$condition = $1;
$dep = $2;
}
my $vpkg_dep = $vpackage{$dep};
unless (defined $vpkg_dep) {
warn sprintf "WARNING: Makefile '%s' has a dependency on '%s', which does not exist\n",
$src->{makefile}, $dep;
next;
}
# Filter out self-depends
my @vdeps = grep { $srcname ne $_->{src}{name} } @{$vpkg_dep};
foreach my $vdep (@vdeps) {
my $depstr = sprintf '$(curdir)/%s/compile', $vdep->{src}{path};
if (@vdeps > 1) {
$depstr = sprintf '$(if $(CONFIG_PACKAGE_%s),%s)', $vdep->{name}, $depstr;
}
my $depline = get_conditional_dep($condition, $depstr);
if ($depline) {
$deplines{''}{$depline}++;
}
}
}
my $config = '';
$config = sprintf '$(CONFIG_PACKAGE_%s)', $pkg->{name} unless $pkg->{buildonly};
$pkg->{prereq} and printf "prereq-%s += %s\n", $config, $src->{path};
next if $pkg->{buildonly};
printf "package-%s += %s\n", $config, $src->{path};
if ($pkg->{variant}) {
if (!defined($variant_default) or $pkg->{variant_default}) {
$variant_default = $pkg->{variant};
}
printf "\$(curdir)/%s/variants += \$(if %s,%s)\n", $src->{path}, $config, $pkg->{variant};
}
}
if (defined($variant_default)) {
printf "\$(curdir)/%s/default-variant := %s\n", $src->{path}, $variant_default;
}
unless (grep {!$_->{buildonly}} @{$src->{packages}}) {
printf "package- += %s\n", $src->{path};
}
if (@{$src->{buildtypes}} > 0) {
printf "buildtypes-%s = %s\n", $src->{path}, join(' ', @{$src->{buildtypes}});
}
foreach my $type ('', @{$src->{buildtypes}}) {
my $suffix = '';
$suffix = "/$type" if $type;
next unless $src->{"builddepends$suffix"};
defined $deplines{$suffix} or $deplines{$suffix} = {};
foreach my $dep (@{$src->{"builddepends$suffix"}}) {
my $depsuffix = "";
my $deptype = "";
my $condition;
if ($dep =~ /^(.+):(.+)/) {
$condition = $1;
$dep = $2;
}
if ($dep =~ /^(.+)\/(.+)/) {
$dep = $1;
$deptype = $2;
$depsuffix = "/$2";
}
next if $srcname.$suffix eq $dep.$depsuffix;
my $src_dep = $srcpackage{$dep};
unless (defined($src_dep) && (!$deptype || grep { $_ eq $deptype } @{$src_dep->{buildtypes}})) {
warn sprintf "WARNING: Makefile '%s' has a build dependency on '%s', which does not exist\n",
$src->{makefile}, $dep.$depsuffix;
next;
}
my $depstr = sprintf '$(curdir)/%s/compile', $src_dep->{path}.$depsuffix;
my $depline = get_conditional_dep($condition, $depstr);
if ($depline) {
$deplines{$suffix}{$depline}++;
}
}
}
foreach my $suffix (sort keys %deplines) {
my $depline = join(" ", sort keys %{$deplines{$suffix}});
if ($depline) {
$line .= sprintf "\$(curdir)/%s/compile += %s\n", $src->{path}.$suffix, $depline;
}
}
}
if ($line ne "") {
print "\n$line";
}
}
sub gen_package_source() {
parse_package_metadata($ARGV[0]) or exit 1;
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
my $pkg = $package{$name};
if ($pkg->{name} && $pkg->{source}) {
print "$pkg->{name}: ";
print "$pkg->{source}\n";
}
}
}
sub gen_package_auxiliary() {
parse_package_metadata($ARGV[0]) or exit 1;
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
my $pkg = $package{$name};
if ($pkg->{name} && $pkg->{repository}) {
print "Package/$name/subdir = $pkg->{repository}\n";
}
my %depends;
foreach my $dep (@{$pkg->{depends} || []}) {
if ($dep =~ m!^\+?(?:[^:]+:)?([^@]+)$!) {
$depends{$1}++;
}
}
my @depends = sort keys %depends;
if (@depends > 0) {
foreach my $n (@{$pkg->{provides}}) {
print "Package/$n/depends = @depends\n";
}
}
}
}
sub gen_package_license($) {
my $level = shift;
parse_package_metadata($ARGV[0]) or exit 1;
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
my $pkg = $package{$name};
if ($pkg->{name}) {
if ($pkg->{license}) {
print "$pkg->{name}: ";
print "$pkg->{license}\n";
if ($pkg->{licensefiles} && $level == 0) {
print "\tFiles: $pkg->{licensefiles}\n";
}
} else {
if ($level == 1) {
print "$pkg->{name}: Missing license! ";
print "Please fix $pkg->{src}{makefile}\n";
}
}
}
}
}
sub gen_version_filtered_list() {
foreach my $item (version_filter_list(@ARGV)) {
print "$item\n";
}
}
sub gen_usergroup_list() {
parse_package_metadata($ARGV[0]) or exit 1;
for my $name (keys %usernames) {
print "user $name $usernames{$name}{id} $usernames{$name}{makefile}\n";
}
for my $name (keys %groupnames) {
print "group $name $groupnames{$name}{id} $groupnames{$name}{makefile}\n";
}
}
sub gen_package_manifest_json() {
my $json;
parse_package_metadata($ARGV[0]) or exit 1;
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
my %depends;
my $pkg = $package{$name};
foreach my $dep (@{$pkg->{depends} || []}) {
if ($dep =~ m!^\+?(?:[^:]+:)?([^@]+)$!) {
$depends{$1}++;
}
}
my @depends = sort keys %depends;
my $pkg_deps = join ' ', map { qq/"$_",/ } @depends;
$pkg_deps =~ s/\,$//;
my $pkg_maintainer = join ' ', map { qq/"$_",/ } @{$pkg->{maintainer} || []};
$pkg_maintainer =~ s/\,$//;
$json = <<"END_JSON";
${json}{
"name":"$name",
"version":"$pkg->{version}",
"category":"$pkg->{category}",
"license":"$pkg->{license}",
"maintainer": [$pkg_maintainer],
"depends":[$pkg_deps]},
END_JSON
}
$json =~ s/[\n\r]//g;
$json =~ s/\,$//;
print "[$json]";
}
sub parse_command() {
GetOptions("ignore=s", \@ignore);
my $cmd = shift @ARGV;
for ($cmd) {
/^mk$/ and return gen_package_mk();
/^config$/ and return gen_package_config();
/^kconfig/ and return gen_kconfig_overrides();
/^source$/ and return gen_package_source();
/^pkgaux$/ and return gen_package_auxiliary();
/^pkgmanifestjson$/ and return gen_package_manifest_json();
/^license$/ and return gen_package_license(0);
/^licensefull$/ and return gen_package_license(1);
/^usergroup$/ and return gen_usergroup_list();
/^version_filter$/ and return gen_version_filtered_list();
}
die <<EOF
Available Commands:
$0 mk [file] Package metadata in makefile format
$0 config [file] Package metadata in Kconfig format
$0 kconfig [file] [config] [patchver] Kernel config overrides
$0 source [file] Package source file information
$0 pkgaux [file] Package auxiliary variables in makefile format
$0 pkgmanifestjson [file] Package manifests in JSON format
$0 license [file] Package license information
$0 licensefull [file] Package license information (full list)
$0 usergroup [file] Package usergroup allocation list
$0 version_filter [patchver] [list...] Filter list of version tagged strings
Options:
--ignore <name> Ignore the source package <name>
EOF
}
parse_command();