From 9d977859e2a6bd5ace4b0b807375bbac22161a69 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Mon, 7 May 2018 17:05:11 +0200 Subject: [PATCH 01/15] Ignore system standard path when prepending environment variables Summary: Ignore /usr as prefix or kdedir when prepending environment variables to not overrule user setting of PKG_CONFIG_PATH. For me it was enough to fix my build with prepending CMAKE_PREFIX_PATH conditionally, but in theory the other environment variables should also only be prepended if it is not /usr to prepend. Test Plan: Compiled XCB 1.13 to /opt/xcb and have XCB 1.11 in /usr/.... Set PKG_CONFIG_PATH to /opt/xcb/lib/pkgconfig. Without this patch CMake, called by kdesrc-build, finds XCB 1.11 in /usr/lib/x86_64-linux-gnu according to its log, but sets as version number 1.13 for some reason. On make this fails. It still uses the lib from /opt/xcb> but does not include the correct headers in opt/xcb/include. With the patch CMake directly finds the lib in /opt/xcb and build succeeds. Reviewers: bshah, mpyne Reviewed By: mpyne Subscribers: Tags: Differential Revision: https://phabricator.kde.org/D12739 --- modules/ksb/BuildSystem/KDE4.pm | 7 +++++-- modules/ksb/Module.pm | 15 +++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/ksb/BuildSystem/KDE4.pm b/modules/ksb/BuildSystem/KDE4.pm index a491055..95718e2 100644 --- a/modules/ksb/BuildSystem/KDE4.pm +++ b/modules/ksb/BuildSystem/KDE4.pm @@ -32,8 +32,11 @@ sub prepareModuleBuildEnvironment { my ($self, $ctx, $module, $prefix) = @_; - $ctx->prependEnvironmentValue('CMAKE_PREFIX_PATH', $prefix); - $ctx->prependEnvironmentValue('XDG_DATA_DIRS', "$prefix/share"); + # Avoid moving /usr up in env vars + if ($prefix ne '/usr') { + $ctx->prependEnvironmentValue('CMAKE_PREFIX_PATH', $prefix); + $ctx->prependEnvironmentValue('XDG_DATA_DIRS', "$prefix/share"); + } my $qtdir = $module->getOption('qtdir'); if ($qtdir && $qtdir ne $prefix) { diff --git a/modules/ksb/Module.pm b/modules/ksb/Module.pm index b749af4..2d27ec1 100644 --- a/modules/ksb/Module.pm +++ b/modules/ksb/Module.pm @@ -657,14 +657,17 @@ sub setupEnvironment # Add global set-envs and context $self->buildContext()->applyUserEnvironment(); - my @pkg_config_dirs = ("$kdedir/lib/pkgconfig"); - $ctx->prependEnvironmentValue('PKG_CONFIG_PATH', @pkg_config_dirs); + # Avoid moving /usr up in env vars + if ($kdedir ne '/usr') { + my @pkg_config_dirs = ("$kdedir/lib/pkgconfig"); + $ctx->prependEnvironmentValue('PKG_CONFIG_PATH', @pkg_config_dirs); - my @ld_dirs = ("$kdedir/lib", $self->getOption('libpath')); - $ctx->prependEnvironmentValue('LD_LIBRARY_PATH', @ld_dirs); + my @ld_dirs = ("$kdedir/lib", $self->getOption('libpath')); + $ctx->prependEnvironmentValue('LD_LIBRARY_PATH', @ld_dirs); - my @path = ("$kdedir/bin", $self->getOption('binpath')); - $ctx->prependEnvironmentValue('PATH', @path); + my @path = ("$kdedir/bin", $self->getOption('binpath')); + $ctx->prependEnvironmentValue('PATH', @path); + } # Build system's environment injection my $buildSystem = $self->buildSystem(); From 4a875d8d7877620bc050fda0e67bbd9987e26ba6 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Tue, 15 May 2018 23:22:32 -0400 Subject: [PATCH 02/15] kde-cmake: Add CMAKE_{MODULE,PREFIX}_PATH consistently. Prior to this change, CMAKE_PREFIX_PATH was consistently set (which is preferred for most find_package() calls) but CMAKE_MODULE_PATH was only set for Qt5 (if Qt had a different prefix than the module being installed). This could lead to situations where "simplified" find_package() calls would use "Module" mode (using CMAKE_MODULE_PATH) and end up falling back to a search of system directories. This could result in finding the wrong module if the module being searched for was installed on the system. --- modules/ksb/BuildSystem/KDE4.pm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ksb/BuildSystem/KDE4.pm b/modules/ksb/BuildSystem/KDE4.pm index 95718e2..6f54a0e 100644 --- a/modules/ksb/BuildSystem/KDE4.pm +++ b/modules/ksb/BuildSystem/KDE4.pm @@ -34,13 +34,17 @@ sub prepareModuleBuildEnvironment # Avoid moving /usr up in env vars if ($prefix ne '/usr') { + # Find the normal CMake "config" mode files for find_package() $ctx->prependEnvironmentValue('CMAKE_PREFIX_PATH', $prefix); + # Try to ensure that older "module" mode find_package() calls also point to right directory + $ctx->prependEnvironmentValue('CMAKE_MODULE_PATH', "$prefix/lib64/cmake:$prefix/lib/cmake"); $ctx->prependEnvironmentValue('XDG_DATA_DIRS', "$prefix/share"); } my $qtdir = $module->getOption('qtdir'); if ($qtdir && $qtdir ne $prefix) { # Ensure we can find Qt5's own CMake modules + $ctx->prependEnvironmentValue('CMAKE_PREFIX_PATH', $qtdir); $ctx->prependEnvironmentValue('CMAKE_MODULE_PATH', "$qtdir/lib/cmake"); } } From fe41e0645de89af65aca03af626708f8c2788a28 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sun, 27 May 2018 14:32:37 -0400 Subject: [PATCH 03/15] Fix --ignore-modules with --include-dependencies active. A test case will follow but would clutter the actual fix (which is ensuring that a pass to remove all ignored modules happens immediately prior to forming the final module list). BUG:394497 FIXED-IN:18.08 --- modules/ksb/Application.pm | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/ksb/Application.pm b/modules/ksb/Application.pm index 7d539d4..6dc7cfa 100644 --- a/modules/ksb/Application.pm +++ b/modules/ksb/Application.pm @@ -36,9 +36,6 @@ use IO::Select; ### Package-specific variables (not shared outside this file). -# This is a hash since Perl doesn't have a "in" keyword. -my %ignore_list; # List of packages to refuse to include in the build list. - use constant { # We use a named remote to make some git commands work that don't accept the # full path. @@ -56,6 +53,7 @@ sub new metadata_module => undef, run_mode => 'build', modules => undef, + ignored_selectors => [ ], module_factory => undef, # ref to sub that makes a new Module. # See generateModuleList _base_pid => $$, # See finish() @@ -350,8 +348,11 @@ sub generateModuleList $self->_readCommandLineOptionsAndSelectors($cmdlineOptions, \@selectors, $ctx, @argv); + # NOTE these are both listrefs + $self->{ignored_selectors} = $cmdlineGlobalOptions->{'ignore-modules'}; + my %ignoredSelectors; - @ignoredSelectors{@{$cmdlineGlobalOptions->{'ignore-modules'}}} = undef; + @ignoredSelectors{@{$self->{ignored_selectors}}} = undef; my @startProgramAndArgs = @{$cmdlineGlobalOptions->{'start-program'}}; delete @{$cmdlineGlobalOptions}{qw/ignore-modules start-program/}; @@ -434,7 +435,7 @@ sub generateModuleList $moduleResolver->setCmdlineOptions($cmdlineOptions); $moduleResolver->setDeferredOptions($deferredOptions); $moduleResolver->setInputModulesAndOptions(\@optionModulesAndSets); - $moduleResolver->setIgnoredSelectors([keys %ignoredSelectors]); + $moduleResolver->setIgnoredSelectors($self->{ignored_selectors}); $self->_defineNewModuleFactory($moduleResolver); @@ -602,6 +603,13 @@ sub runAllModulePhases # resolveSelectorsIntoModules) in that event. @modules = _applyModuleFilters($ctx, @modules); + # Remove any ignored modules that crept back in as a dependency + do { # new scope + my %ignoredSelectors; + @ignoredSelectors{@{$self->{ignored_selectors}}} = undef; + @modules = grep { ! exists $ignoredSelectors{$_->name()} } @modules; + }; + if ($ctx->getOption('print-modules')) { info (" * Module list", $metadataModule ? " in dependency order" : ''); for my $m (@modules) { From ca30f09b511e1058a6f47ed43f1e9d1ced118bd8 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sun, 27 May 2018 16:36:22 -0400 Subject: [PATCH 04/15] Add testcase for bug 394497 (ignore-modules/include-dependencies). This adds a testcase that would fail without the bugfix for bug 394497 and now passes. This did require undoing some of the changes to generateModuleList but the only real behavior change (beside merging duplicate ignored module checks) was to move the step that generates module dependencies to occur earlier so that it can happen before the filter steps CCBUG:394497 --- modules/ksb/Application.pm | 89 +++++++++++++++----------------- t/bug-394497-ignore-dep-module.t | 51 ++++++++++++++++++ 2 files changed, 93 insertions(+), 47 deletions(-) create mode 100644 t/bug-394497-ignore-dep-module.t diff --git a/modules/ksb/Application.pm b/modules/ksb/Application.pm index 6dc7cfa..84e5f8c 100644 --- a/modules/ksb/Application.pm +++ b/modules/ksb/Application.pm @@ -53,7 +53,6 @@ sub new metadata_module => undef, run_mode => 'build', modules => undef, - ignored_selectors => [ ], module_factory => undef, # ref to sub that makes a new Module. # See generateModuleList _base_pid => $$, # See finish() @@ -323,11 +322,11 @@ DONE } # Generates the build context and module list based on the command line options -# and module selectors provided, and sets up the module factory. +# and module selectors provided, resolves dependencies on those modules if needed, +# filters out ignored or skipped modules, and sets up the module factory. # # After this function is called all module set selectors will have been -# expanded, and we will know if we need to download kde-projects metadata or -# not. Dependency resolution has not occurred. +# expanded, and we will have downloaded kde-projects metadata. # # Returns: List of Modules to build. sub generateModuleList @@ -348,11 +347,9 @@ sub generateModuleList $self->_readCommandLineOptionsAndSelectors($cmdlineOptions, \@selectors, $ctx, @argv); - # NOTE these are both listrefs - $self->{ignored_selectors} = $cmdlineGlobalOptions->{'ignore-modules'}; - - my %ignoredSelectors; - @ignoredSelectors{@{$self->{ignored_selectors}}} = undef; + # Convert list to hash for lookup + my %ignoredSelectors = + map { $_, 1 } @{$cmdlineGlobalOptions->{'ignore-modules'}}; my @startProgramAndArgs = @{$cmdlineGlobalOptions->{'start-program'}}; delete @{$cmdlineGlobalOptions}{qw/ignore-modules start-program/}; @@ -414,8 +411,13 @@ sub generateModuleList # available. $ctx->setKDEDependenciesMetadataModuleNeeded(); $ctx->setKDEProjectsMetadataModuleNeeded(); - ksb::Updater::Git::verifyGitConfig(); - $self->_downloadKDEProjectMetadata(); + + if (!exists $ENV{HARNESS_ACTIVE}) { + # Running in a test harness, avoid downloading metadata which will be + # ignored in the test or making changes to git config + ksb::Updater::Git::verifyGitConfig(); + $self->_downloadKDEProjectMetadata(); + } # The user might only want metadata to update to allow for a later # --pretend run, check for that here. @@ -435,7 +437,7 @@ sub generateModuleList $moduleResolver->setCmdlineOptions($cmdlineOptions); $moduleResolver->setDeferredOptions($deferredOptions); $moduleResolver->setInputModulesAndOptions(\@optionModulesAndSets); - $moduleResolver->setIgnoredSelectors($self->{ignored_selectors}); + $moduleResolver->setIgnoredSelectors([keys %ignoredSelectors]); $self->_defineNewModuleFactory($moduleResolver); @@ -456,15 +458,40 @@ sub generateModuleList ksb::Module->setModuleSource('config'); } - # Check for ignored modules (post-expansion) - @modules = grep { ! exists $ignoredSelectors{$_->name()} } @modules; - # If modules were on the command line then they are effectively forced to # process unless overridden by command line options as well. If phases # *were* overridden on the command line, then no update pass is required # (all modules already have correct phases) @modules = _updateModulePhases(@modules) unless $commandLineModules; + # TODO: Verify this does anything still + my $metadataModule = $ctx->getKDEDependenciesMetadataModule(); + $ctx->addToIgnoreList($metadataModule->scm()->ignoredModules()); + + # Remove modules that are explicitly blanked out in their branch-group + # i.e. those modules where they *have* a branch-group, and it's set to + # be empty (""). + my $resolver = $ctx->moduleBranchGroupResolver(); + my $branchGroup = $ctx->effectiveBranchGroup(); + + @modules = grep { + my $branch = $_->isKDEProject() + ? $resolver->findModuleBranch($_->fullProjectPath(), $branchGroup) + : 1; # Just a placeholder truthy value + whisper ("Removing ", $_->fullProjectPath(), " due to branch-group") if (defined $branch and !$branch); + (!defined $branch or $branch); # This is the actual test + } (@modules); + + @modules = $self->_resolveModuleDependencies(@modules); + + # Filter --resume-foo options. This might be a second pass, but that should + # be OK since there's nothing different going on from the first pass (in + # resolveSelectorsIntoModules) in that event. + @modules = _applyModuleFilters($ctx, @modules); + + # Check for ignored modules (post-expansion) + @modules = grep { ! exists $ignoredSelectors{$_->name()} } @modules; + return @modules; } @@ -577,41 +604,9 @@ sub runAllModulePhases { my $self = shift; my $ctx = $self->context(); - my $metadataModule = $ctx->getKDEDependenciesMetadataModule(); my @modules = $self->modules(); - $ctx->addToIgnoreList($metadataModule->scm()->ignoredModules()); - - # Remove modules that are explicitly blanked out in their branch-group - # i.e. those modules where they *have* a branch-group, and it's set to - # be empty (""). - my $resolver = $ctx->moduleBranchGroupResolver(); - my $branchGroup = $ctx->effectiveBranchGroup(); - - @modules = grep { - my $branch = $_->isKDEProject() - ? $resolver->findModuleBranch($_->fullProjectPath(), $branchGroup) - : 1; # Just a placeholder truthy value - whisper ("Removing ", $_->fullProjectPath(), " due to branch-group") if (defined $branch and !$branch); - (!defined $branch or $branch); # This is the actual test - } (@modules); - - @modules = $self->_resolveModuleDependencies(@modules); - - # Filter --resume-foo options. This might be a second pass, but that should - # be OK since there's nothing different going on from the first pass (in - # resolveSelectorsIntoModules) in that event. - @modules = _applyModuleFilters($ctx, @modules); - - # Remove any ignored modules that crept back in as a dependency - do { # new scope - my %ignoredSelectors; - @ignoredSelectors{@{$self->{ignored_selectors}}} = undef; - @modules = grep { ! exists $ignoredSelectors{$_->name()} } @modules; - }; - if ($ctx->getOption('print-modules')) { - info (" * Module list", $metadataModule ? " in dependency order" : ''); for my $m (@modules) { say ((" " x ($m->getOption('#dependency-level', 'module') // 0)), "$m"); } diff --git a/t/bug-394497-ignore-dep-module.t b/t/bug-394497-ignore-dep-module.t new file mode 100644 index 0000000..f67d7f5 --- /dev/null +++ b/t/bug-394497-ignore-dep-module.t @@ -0,0 +1,51 @@ +use 5.014; +use strict; +use warnings; + +# Verify that --ignore-modules works for modules that would be included with +# --include-dependencies in effect. +# See bug 394497 -- https://bugs.kde.org/show_bug.cgi?id=394497 + +use Test::More; + +use ksb::Application; +use ksb::Module; + +# Redefine ksb::Application::_resolveModuleDependencies to avoid requiring metadata +# module. +package ksb::Application { + no warnings 'redefine'; + + sub _resolveModuleDependencies { + my ($self, @modules) = @_; + # simulate effect of --include-dependencies, using ksb::Application's + # built-in module-name to ksb::Module resolver. + my $newModule = $self->{module_factory}->('setmod2'); + splice @modules, 1, 0, $newModule; + return @modules; + } +}; + +my @args = qw(--pretend --rc-file t/data/sample-rc/kdesrc-buildrc --include-dependencies setmod1 setmod3); + +{ + my $app = ksb::Application->new(@args); + my @moduleList = @{$app->{modules}}; + + is (scalar @moduleList, 3, 'Right number of modules (include-dependencies)'); + is ($moduleList[0]->name(), 'setmod1', 'mod list[0] == setmod1'); + is ($moduleList[1]->name(), 'setmod2', 'mod list[1] == setmod2'); + is ($moduleList[2]->name(), 'setmod3', 'mod list[2] == setmod3'); +} + +{ + push @args, '--ignore-modules', 'setmod2'; + my $app = ksb::Application->new(@args); + my @moduleList = @{$app->{modules}}; + + is (scalar @moduleList, 2, 'Right number of modules (include-dependencies+ignore-modules)'); + is ($moduleList[0]->name(), 'setmod1', 'mod list[0] == setmod1'); + is ($moduleList[1]->name(), 'setmod3', 'mod list[1] == setmod3'); +} + +done_testing(); From 14b5093bf153b034e68f14250bf565c2c1406ad7 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sun, 1 Jul 2018 17:45:13 -0400 Subject: [PATCH 05/15] Fake a JSON module to make --pretend work without kde-build-metadata. This is mostly to make the testsuite run, which is not supposed to pull down kde-build-metadata, though it may be worth it to construct a suitable "fake metadata" instead. --- modules/ksb/Updater/KDEProjectMetadata.pm | 5 +++-- modules/ksb/Util.pm | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/ksb/Updater/KDEProjectMetadata.pm b/modules/ksb/Updater/KDEProjectMetadata.pm index c0489fc..ddeb9ad 100644 --- a/modules/ksb/Updater/KDEProjectMetadata.pm +++ b/modules/ksb/Updater/KDEProjectMetadata.pm @@ -49,7 +49,8 @@ sub logicalModuleGroups my $self = shift; my $path = $self->module()->fullpath('source') . "/logical-module-structure"; - my $fh = pretend_open($path) or + # The {} is an empty JSON obj to support pretend mode + my $fh = pretend_open($path, '{}') or croak_internal("Unable to read logical module structure: $!"); my ($json_hashref, $e) = do { @@ -61,7 +62,7 @@ sub logicalModuleGroups ($json, $@); # Implicit return }; - croak_runtime ("Unable to load module group data! :(\n\t$e") if $e; + croak_runtime ("Unable to load module group data from $path! :(\n\t$e") if $e; return $json_hashref; } diff --git a/modules/ksb/Util.pm b/modules/ksb/Util.pm index 48d84ce..5331fdd 100644 --- a/modules/ksb/Util.pm +++ b/modules/ksb/Util.pm @@ -628,6 +628,7 @@ sub download_file # # Parameters: # filename - Path to the file to open. +# default - String to use if the file doesn't exist in pretend mode # # Returns: # filehandle on success (supports readline() and eof()), can return boolean @@ -636,11 +637,11 @@ sub download_file sub pretend_open { my $path = shift; + my $defaultText = shift // ''; my $fh; if (pretending() && ! -e $path) { - my $simulatedFile = ''; - open $fh, '<', \$simulatedFile or return; + open $fh, '<', \$defaultText or return; } else { open $fh, '<', $path or return; From 7f92da7b307c784deec804f65137b10733e6a88e Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sun, 1 Jul 2018 19:15:04 -0400 Subject: [PATCH 06/15] Don't double-set CMAKE_PREFIX_PATH if set by user. This fixes bug 395627, where the error is actually that we set CMAKE_PREFIX_PATH twice if qtdir is set to a non-system path and the user is also setting CMAKE_PREFIX_PATH. Unfortunately the second value overrides the first (the one the user set). Also added a test for this, which fails before the fix and passes afterwards. The full test suite (all 5...) pass. BUG:395627 FIXED-IN:18.08 --- modules/ksb/BuildSystem/KDE4.pm | 7 ++- t/bug-395627-keep-cmake-prefix.t | 78 ++++++++++++++++++++++++++++++++ t/data/bug-395627/kdesrc-buildrc | 26 +++++++++++ 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 t/bug-395627-keep-cmake-prefix.t create mode 100644 t/data/bug-395627/kdesrc-buildrc diff --git a/modules/ksb/BuildSystem/KDE4.pm b/modules/ksb/BuildSystem/KDE4.pm index 6f54a0e..181dd2d 100644 --- a/modules/ksb/BuildSystem/KDE4.pm +++ b/modules/ksb/BuildSystem/KDE4.pm @@ -179,9 +179,12 @@ sub _safe_run_cmake push @commands, "-DCMAKE_INSTALL_PREFIX=$prefix"; - # Add custom Qt to the prefix + # Add custom Qt to the prefix (but don't overwrite a user-set prefix) my $qtdir = $module->getOption('qtdir'); - if ($qtdir && $qtdir ne $prefix) { + if ($qtdir && $qtdir ne $prefix && + !grep { /^\s*-DCMAKE_PREFIX_PATH/ } (@commands) + ) + { push @commands, "-DCMAKE_PREFIX_PATH=$qtdir"; } diff --git a/t/bug-395627-keep-cmake-prefix.t b/t/bug-395627-keep-cmake-prefix.t new file mode 100644 index 0000000..4e3a1b3 --- /dev/null +++ b/t/bug-395627-keep-cmake-prefix.t @@ -0,0 +1,78 @@ +use 5.014; +use strict; +use warnings; + +# Verify that a user-set CMAKE_PREFIX_PATH is not removed, even if we supply +# "magic" of our own +# See bug 395627 -- https://bugs.kde.org/show_bug.cgi?id=395627 + +my @savedCommand; +my $log_called = 0; + +# Redefine log_command to capture whether it was properly called. This is all +# very order-dependent, we need to load ksb::Util before kdesrc-build itself +# does to install the new subroutine before it's copied over into the other +# package symbol tables. +BEGIN { + use ksb::Util; + + no strict 'refs'; + no warnings 'redefine'; + + *ksb::Util::log_command = sub { + $log_called = 1; + + my ($module, $filename, $argRef, $optionsRef) = @_; + my @command = @{$argRef}; + @savedCommand = @command; + return 0; # success + }; +} + +use Test::More; + +use ksb::Application; +use ksb::Module; + +my @args = qw(--pretend --rc-file t/data/bug-395627/kdesrc-buildrc); + +{ + my $app = ksb::Application->new(@args); + my @moduleList = @{$app->{modules}}; + + is (scalar @moduleList, 6, 'Right number of modules'); + isa_ok ($moduleList[0]->buildSystem(), 'ksb::BuildSystem::KDE4'); + + my $result; + my @prefixes; + my $prefix; + + # This requires log_command to be overridden above + $result = $moduleList[0]->setupBuildSystem(); + is ($log_called, 1, 'Overridden log_command was called'); + ok ($result, 'Setup build system for auto-set prefix path'); + + # We should expect an auto-set -DCMAKE_PREFIX_PATH passed to cmake somewhere + ($prefix) = grep { /-DCMAKE_PREFIX_PATH/ } @savedCommand; + is ($prefix, '-DCMAKE_PREFIX_PATH=/tmp/qt5', 'Prefix path set to custom Qt prefix'); + + $result = $moduleList[2]->setupBuildSystem(); + ok ($result, 'Setup build system for manual-set prefix path'); + + (@prefixes) = grep { /-DCMAKE_PREFIX_PATH/ } @savedCommand; + is (scalar @prefixes, 1, 'Only one set prefix path in manual mode'); + if (@prefixes) { + is ($prefixes[0], '-DCMAKE_PREFIX_PATH=FOO', 'Manual-set prefix path is as set by user'); + } + + $result = $moduleList[4]->setupBuildSystem(); + ok ($result, 'Setup build system for manual-set prefix path'); + + (@prefixes) = grep { /-DCMAKE_PREFIX_PATH/ } @savedCommand; + is (scalar @prefixes, 1, 'Only one set prefix path in manual mode'); + if (@prefixes) { + is ($prefixes[0], '-DCMAKE_PREFIX_PATH:PATH=BAR', 'Manual-set prefix path is as set by user'); + } +} + +done_testing(); diff --git a/t/data/bug-395627/kdesrc-buildrc b/t/data/bug-395627/kdesrc-buildrc new file mode 100644 index 0000000..ad9891c --- /dev/null +++ b/t/data/bug-395627/kdesrc-buildrc @@ -0,0 +1,26 @@ +global + source-dir /tmp + qtdir /tmp/qt5 + git-repository-base fake git://localhost/git-set/ + override-build-system KDE # Use CMake everywhere w/out source probing +end global + +module-set test + repository fake + use-modules sample1 sample2 + # Should have auto-set CMAKE_PREFIX_PATH +end module-set + +module-set test2-set + repository fake + use-modules sample3 sample4 + cmake-options -DCMAKE_PREFIX_PATH=FOO + # Should not auto-set CMAKE_PREFIX_PATH since it's already set +end module-set + +module-set test3-set + repository fake + use-modules sample5 sample6 + cmake-options -DCMAKE_PREFIX_PATH:PATH=BAR + # Uses a slightly different syntax, should still be retained +end module-set From 3dbada64198c288ce34802ef75f82f19cf49dc42 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Wed, 4 Jul 2018 16:20:19 -0400 Subject: [PATCH 07/15] setup: Make the setup script work with cmake-installed kdesrc-build. This entails installing the sample rc files, and allowing kdesrc-build-setup to find the right path to those files. Note that to fix this bug you'd have to reinstall kdesrc-build and re-run kdesrc-build-setup. BUG:396027 FIXED-IN:18.08 --- CMakeLists.txt | 8 +++++++- kdesrc-build-setup | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43e67b4..8e762ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,7 +91,13 @@ install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/kdesrc-build-setup DESTINATION ${KD install(PROGRAMS ${CMAKE_SOURCE_DIR}/sample-kde-env-master.sh ${CMAKE_SOURCE_DIR}/sample-xsession.sh - DESTINATION ${KDE_INSTALL_DATADIR}/kdesrc-build) + ${CMAKE_SOURCE_DIR}/kf5-applications-build-include + ${CMAKE_SOURCE_DIR}/kf5-extragear-build-include + ${CMAKE_SOURCE_DIR}/kf5-frameworks-build-include + ${CMAKE_SOURCE_DIR}/kf5-kdepim-build-include + ${CMAKE_SOURCE_DIR}/kf5-qt5-build-include + ${CMAKE_SOURCE_DIR}/kf5-workspace-build-include + DESTINATION ${KDE_INSTALL_DATADIR}/kdesrc-build) if (ECM_FOUND) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/kdesrc-build-setup b/kdesrc-build-setup index fdf8fe0..2999c70 100755 --- a/kdesrc-build-setup +++ b/kdesrc-build-setup @@ -374,6 +374,16 @@ EOF # Assume we can refer to files present alongside kdesrc-build in the source # directory my $basedir = dirname(abs_path($0)); +if (! -e "$basedir/kf5-frameworks-build-include") { + # Check if it's installed to a share/ prefix + $basedir = abs_path(dirname($0) . "/../share/kdesrc-build/"); + + if (! -e "$basedir/kf5-frameworks-build-include") { + close $output; + showInfo("Unable to find kdesrc-build installation to build a configuration!"); + exit 1; + } +} if (grep /^frameworks$/, @chosenModules) { print $output < Date: Thu, 5 Jul 2018 00:30:00 +0200 Subject: [PATCH 08/15] doc: it's the software that's being built Most of the time the sentences revolve around any software by KDE. In one case the sentence is about Plasma specifically. --- doc/index.docbook | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index 1f169cd..f1ccd08 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -269,7 +269,7 @@ does not cover this installation type, since we assume you know what you are doi -Ensure your system is ready to build &kde; source +Ensure your system is ready to build &kde; software Before using the &kdesrc-build; script (or any other building strategy) you must install the development tools and libraries needed for &kde;. @@ -545,7 +545,7 @@ it is a good idea to at least load the &kde; project metadata. Loading project metadata -From a terminal window, log in to the user you are using to compile &kde; and +From a terminal window, log in to the user you are using to compile &kde; software and execute the script: @@ -627,8 +627,8 @@ Your logs are saved in /home/kde-src/kdesrc/log/2018-01-20-07 Depending on how many modules you are downloading, it is possible that -&kdesrc-build; will not succeed the first time you compile &kde;. Do not -despair! +&kdesrc-build; will not succeed the first time you compile &kde; software. +Do not despair! &kdesrc-build; logs the output of every command it runs. By default, @@ -660,7 +660,7 @@ to mail the kde-devel@kde.org mailing list (subscription may be required first) in order to report the build failure. You can find more common examples of things that can go wrong and their -solutions, as well as general tips and strategies to build &kde; in the +solutions, as well as general tips and strategies to build &kde; software in the Build from Source. @@ -742,9 +742,9 @@ linkend="conf-include-dependencies">include-dependencies option). Setting the Environment to Run Your &kde; &plasma; Desktop -Assuming you are using a dedicated user to build &kde;, and you already have an -installed &kde; version, running your new &kde; may be a bit tricky, as the new -&kde; has to take precedence over the old. You must change the environment +Assuming you are using a dedicated user to build &kde; &plasma;, and you already have an +installed &plasma; version, running your new &plasma; may be a bit tricky, as the new +&plasma; has to take precedence over the old. You must change the environment variables of your login scripts to make sure the newly-built desktop is used. @@ -1295,7 +1295,7 @@ distribution). &kdesrc-build; does not require a GUI present to operate. So, -you can build &kde; without needing an alternate graphical environment. +you can build &kde; software without needing a graphical environment. @@ -2644,7 +2644,7 @@ installed. Note that using this option can have a significant detrimental impact on -both your bandwidth usage (if you use all) and the time taken to compile &kde;, +both your bandwidth usage (if you use all) and the time taken to compile &kde; software, since &kdesrc-build; will be unable to perform incremental builds. From a3daabf9650d4718c1265c065eee2125824eb703 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 19 Jul 2018 10:08:14 +0200 Subject: [PATCH 09/15] Enable bad flag for poppler; Volker and Albert will work on a solution at akademy --- custom-qt5-libs-build-include | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom-qt5-libs-build-include b/custom-qt5-libs-build-include index b555171..be17e0b 100644 --- a/custom-qt5-libs-build-include +++ b/custom-qt5-libs-build-include @@ -8,7 +8,7 @@ module poppler repository git://git.freedesktop.org/git/poppler/poppler branch master - cmake-options -DWITH_GLIB=OFF -DLIB_SUFFIX=64 + cmake-options -DWITH_GLIB=OFF -DLIB_SUFFIX=64 -DENABLE_XPDF_HEADERS=1 end module # For kaccounts-integration @@ -51,7 +51,7 @@ module sphinxbase end module module qwt6 - override-url svn://svn.code.sf.net/p/qwt/code/branches/qwt-6.1 + override-url svn://svn.code.sf.net/p/qwt/code/branches/qwt-6.2 # The qwt6 build system is very unflexible. # For this to work you need to comment out all lines setting QWT_INSTALL_PREFIX in qwtconfig.pri... qmake-options QWT_INSTALL_PREFIX=${kdedir} From 472490fe0dc9879188739626a37132829e62ed46 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Tue, 14 Aug 2018 16:24:27 -0400 Subject: [PATCH 10/15] Provide detail to make return statement. Right now this only makes some of the code intent a bit clearer (saying "was successful" instead of checking against non-bool values). But this would also be useful for tracking stats on compile warnings. --- modules/ksb/BuildSystem.pm | 39 ++++++++++++++++++--------------- modules/ksb/BuildSystem/KDE4.pm | 2 +- modules/ksb/l10nSystem.pm | 6 ++--- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/modules/ksb/BuildSystem.pm b/modules/ksb/BuildSystem.pm index b52c87b..e9e8bb0 100644 --- a/modules/ksb/BuildSystem.pm +++ b/modules/ksb/BuildSystem.pm @@ -144,7 +144,7 @@ sub buildInternal subdirs => [ split(' ', $self->module()->getOption("checkout-only")) ], - }) == 0; + })->{was_successful}; } # Return value style: boolean @@ -191,7 +191,7 @@ sub installInternal message => 'Installing..', 'prefix-options' => [@cmdPrefix], subdirs => [ split(' ', $module->getOption("checkout-only")) ], - }) == 0; + })->{was_successful}; } # Used to uninstall a previously installed module. @@ -208,7 +208,7 @@ sub uninstallInternal message => "Uninstalling g[$module]", 'prefix-options' => [@cmdPrefix], subdirs => [ split(' ', $module->getOption("checkout-only")) ], - }) == 0; + })->{was_successful}; } # Subroutine to clean the build system for the given module. Works by @@ -319,7 +319,10 @@ sub createBuildSystem # The first argument should be the ksb::Module object to be made. # The second argument should be the reference to the hash described above. # -# Returns 0 on success, non-zero on failure (shell script style) +# Returns a hashref: +# { +# was_successful => $bool, (if successful) +# } sub safe_make (@) { my ($self, $optsRef) = @_; @@ -343,7 +346,7 @@ sub safe_make (@) if (!$buildCommand) { $buildCommand = $userCommand || $self->buildCommands(); error (" r[b[*] Unable to find the g[$buildCommand] executable!"); - return 1; + return { was_successful => 0 }; } # Make it prettier if pretending (Remove leading directories). @@ -404,11 +407,10 @@ sub safe_make (@) p_chdir ($builddir); - my $result = $self->_runBuildCommand($buildMessage, $logname, \@args); - return $result if $result; + return $self->_runBuildCommand($buildMessage, $logname, \@args); }; - return 0; + return { was_successful => 1 }; } # Subroutine to run make and process the build process output in order to @@ -422,12 +424,13 @@ sub safe_make (@) # directory). # Third parameter is a reference to an array with the command and its # arguments. i.e. ['command', 'arg1', 'arg2'] -# The return value is the shell return code, so 0 is success, and non-zero -# is failure. +# +# The return value is a hashref as defined by safe_make sub _runBuildCommand { my ($self, $message, $filename, $argRef) = @_; my $module = $self->module(); + my $resultRef = { was_successful => 0 }; my $ctx = $module->buildContext(); # There are situations when we don't want progress output: @@ -436,7 +439,8 @@ sub _runBuildCommand if (! -t STDERR || debugging()) { note("\t$message"); - return log_command($module, $filename, $argRef); + $resultRef->{was_successful} = (0 == log_command($module, $filename, $argRef)); + return $resultRef; } my $time = time; @@ -448,9 +452,7 @@ sub _runBuildCommand # w00t. Check out the closure! Maks would be so proud. my $log_command_callback = sub { my $input = shift; - if (not defined $input) { - return; - } + return if not defined $input; my ($percentage) = ($input =~ /^\[\s*([0-9]+)%]/); if ($percentage) { @@ -467,16 +469,17 @@ sub _runBuildCommand } }; - my $result = log_command($module, $filename, $argRef, { + $resultRef->{was_successful} = + (0 == log_command($module, $filename, $argRef, { callback => $log_command_callback - }); + })); # Cleanup TTY output. $time = prettify_seconds(time - $time); - my $status = $result == 0 ? "g[b[succeeded]" : "r[b[failed]"; + my $status = $resultRef->{was_successful} ? "g[b[succeeded]" : "r[b[failed]"; $statusViewer->releaseTTY("\t$message $status (after $time)\n"); - return $result; + return $resultRef; } 1; diff --git a/modules/ksb/BuildSystem/KDE4.pm b/modules/ksb/BuildSystem/KDE4.pm index 181dd2d..08fd63a 100644 --- a/modules/ksb/BuildSystem/KDE4.pm +++ b/modules/ksb/BuildSystem/KDE4.pm @@ -126,7 +126,7 @@ sub installInternal message => 'Installing..', 'prefix-options' => [@cmdPrefix], subdirs => [ split(' ', $module->getOption("checkout-only")) ], - }) == 0; + })->{was_successful}; } sub configureInternal diff --git a/modules/ksb/l10nSystem.pm b/modules/ksb/l10nSystem.pm index 4f7e86e..f2a0ea1 100644 --- a/modules/ksb/l10nSystem.pm +++ b/modules/ksb/l10nSystem.pm @@ -111,14 +111,12 @@ sub buildInternal my $self = assert_isa(shift, 'ksb::l10nSystem'); my $builddir = $self->module()->fullpath('build'); my @langs = $self->languages(); - my $result = 0; - - $result = ($self->safe_make({ + my $result = ($self->safe_make({ target => undef, message => "Building localization for language...", logbase => "build", subdirs => \@langs, - }) == 0) || $result; + }))->{was_successful}; return $result; } From b0a2d048bd3b2ab06f591bfeffb7c3f0cc7914fb Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Tue, 14 Aug 2018 16:59:40 -0400 Subject: [PATCH 11/15] Show a message post-build if there were compile warnings. The message gets a bit more annoying as the number of warnings increases. I store the number of warnings as well so that future versions can give a really prominent message if new warnings are introduced since the last build. --- modules/ksb/BuildSystem.pm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ksb/BuildSystem.pm b/modules/ksb/BuildSystem.pm index e9e8bb0..87988e8 100644 --- a/modules/ksb/BuildSystem.pm +++ b/modules/ksb/BuildSystem.pm @@ -449,6 +449,9 @@ sub _runBuildCommand $statusViewer->setStatus("\t$message"); $statusViewer->update(); + # TODO More details + my $warnings = 0; + # w00t. Check out the closure! Maks would be so proud. my $log_command_callback = sub { my $input = shift; @@ -467,18 +470,30 @@ sub _runBuildCommand $statusViewer->setProgress($x); } } + + $warnings++ if ($input =~ /warning: /); }; $resultRef->{was_successful} = (0 == log_command($module, $filename, $argRef, { callback => $log_command_callback })); + $resultRef->{warnings} = $warnings; # Cleanup TTY output. $time = prettify_seconds(time - $time); my $status = $resultRef->{was_successful} ? "g[b[succeeded]" : "r[b[failed]"; $statusViewer->releaseTTY("\t$message $status (after $time)\n"); + if ($warnings) { + my $count = ($warnings < 3 ) ? 1 : + ($warnings < 10 ) ? 2 : + ($warnings < 30 ) ? 3 : 4; + my $msg = sprintf("%s b[y[$warnings] %s", '-' x $count, '-' x $count); + note ("\tNote: $msg compile warnings"); + $self->{module}->setPersistentOption('last-compile-warnings', $warnings); + } + return $resultRef; } From 685e68eab34c9ac7858e1d9194768ecf4bf95acb Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Wed, 15 Aug 2018 18:25:48 -0400 Subject: [PATCH 12/15] logs: Postpone log dir mutable setup until a log is to be generated. The logfiles generated for each module are stored in a log directory (again for each module). The converse is also supposed to apply, a log directory should only exist for a module if it has logs. kdesrc-build enforced this in the past by taking extreme care not to call "getLogDir" unless needed. At some point I missed that nuance and used that call elsewhere, even when no log was to be generated. This had the effect of creating a new log directory for the module that had its log directory looked up, but without ever adding logs to it. kdesrc-build would also move the latest symlink to point to this empty directory, and then later remove the directory containing the actual set of latest logs during cleanup. Even worse, this would happen for every module (since we forced a call to "getLogDir" so that later code in new async processes would all resolve to the same log directory) I fix this by splitting up the "getLogDir" functionality into a read-only part (creates the base log directory but not the module log directory and does not move latest symlinks), and a read-write part for log_command. --- modules/ksb/BuildContext.pm | 45 +++++++++++++++++++++---------------- modules/ksb/Module.pm | 16 +++++++++---- modules/ksb/Util.pm | 16 ++++++------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/modules/ksb/BuildContext.pm b/modules/ksb/BuildContext.pm index 600ad58..8ef5a43 100644 --- a/modules/ksb/BuildContext.pm +++ b/modules/ksb/BuildContext.pm @@ -227,8 +227,6 @@ sub addToIgnoreList { my $self = shift; push @{$self->{ignore_list}}, @_; - - debug ("Set context ignore list to ", join(', ', @_)); } sub setupOperatingEnvironment @@ -261,7 +259,6 @@ sub setupOperatingEnvironment sub resetEnvironment { my $self = assert_isa(shift, 'ksb::BuildContext'); - $self->{env} = { }; } @@ -474,19 +471,31 @@ sub getLogDirFor } $logDir = $self->{logPaths}{$baseLogPath}; - return $logDir if pretending(); + super_mkdir($logDir); + + # global logs go to basedir directly + $logDir .= "/$module" unless $module->isa('ksb::BuildContext'); + + return $logDir; +} + +# Constructs the appropriate full path to a log file based on the given +# basename (including extensions). Use this instead of getLogDirFor when you +# actually intend to create a log, as this function will also adjust the +# 'latest' symlink properly. +sub getLogPathFor +{ + my ($self, $module, $path) = @_; - super_mkdir($logDir) unless -e $logDir; + my $baseLogPath = $module->getSubdirPath('log-dir'); + my $logDir = $self->getLogDirFor($module); - # No symlink munging or module-name-adding is needed for the default - # log dir. - return $logDir if $module->isa('ksb::BuildContext'); + # We create this here to avoid needless empty module directories everywhere + super_mkdir($logDir); - # Add a symlink to the latest run for this module. 'latest' itself is - # a directory under the default log directory that holds module - # symlinks, pointing to the last log directory run for that module. We - # do need to be careful of modules that have multiple directory names - # though (like extragear/foo). + # Add a symlink to the latest run for this module. 'latest' itself is + # a directory under the base log directory that holds symlinks mapping + # each module name to the specific log directoy most recently used. my $latestPath = "$baseLogPath/latest"; @@ -496,22 +505,20 @@ sub getLogDirFor super_mkdir($latestPath); - my $symlinkTarget = "$logDir/$moduleName"; my $symlink = "$latestPath/$moduleName"; - if (-l $symlink and readlink($symlink) ne $symlinkTarget) + if (-l $symlink and readlink($symlink) ne $logDir) { unlink($symlink); - symlink($symlinkTarget, $symlink); + symlink($logDir, $symlink); } elsif(not -e $symlink) { # Create symlink initially if we've never done it before. - symlink($symlinkTarget, $symlink); + symlink($logDir, $symlink); } - super_mkdir($symlinkTarget); - return $symlinkTarget; + return "$logDir/$path"; } # Returns rc file in use. Call loadRcFile first. diff --git a/modules/ksb/Module.pm b/modules/ksb/Module.pm index 2d27ec1..695cc55 100644 --- a/modules/ksb/Module.pm +++ b/modules/ksb/Module.pm @@ -678,16 +678,24 @@ sub setupEnvironment } # Returns the path to the log directory used during this run for this -# ksb::Module. -# -# In addition it handles the 'latest' symlink to allow for ease of access -# to the log directory afterwards. +# ksb::Module, based on an autogenerated unique id. The id doesn't change +# once generated within a single run of the script. sub getLogDir { my ($self) = @_; return $self->buildContext()->getLogDirFor($self); } +# Returns a full path that can be open()'d to write a log +# file, based on the given basename (with extension). +# Updates the 'latest' symlink as well, unlike getLogDir +# Use when you know you're going to create a new log +sub getLogPath +{ + my ($self, $path) = @_; + return $self->buildContext()->getLogPathFor($self, $path); +} + sub toString { my $self = shift; diff --git a/modules/ksb/Util.pm b/modules/ksb/Util.pm index 5331fdd..d1eaaa9 100644 --- a/modules/ksb/Util.pm +++ b/modules/ksb/Util.pm @@ -447,6 +447,9 @@ sub log_command return 0; } + # Do this before we fork so we can see errors + my $logpath = $module->getLogPath("$filename.log"); + # Fork a child, with its stdout connected to CHILD. my $pid = open(CHILD, '-|'); if ($pid) @@ -486,13 +489,6 @@ sub log_command # Apply altered environment variables. $module->buildContext()->commitEnvironmentChanges(); - my $logdir = $module->getLogDir(); - if (!$logdir || ! -e $logdir) - { - # Error creating directory for some reason. - error ("\tLogging to std out due to failure creating log dir."); - } - $SIG{PIPE} = "IGNORE"; $SIG{INT} = sub { close (STDOUT); # This should be a pipe @@ -506,13 +502,15 @@ sub log_command open (STDIN, '<', "/dev/null") unless exists $ENV{'KDESRC_BUILD_USE_TTY'}; if ($callbackRef || debugging()) { - open (STDOUT, "|tee $logdir/$filename.log") or do { + open (STDOUT, "|tee $logpath") or do { error ("Error opening pipe to tee command."); # Don't abort, hopefully STDOUT still works. }; } else { - open (STDOUT, '>', "$logdir/$filename.log"); + open (STDOUT, '>', $logpath) or do { + error ("Error $! opening log to $logpath!"); + }; } # Make sure we log everything. From 9e747e443a86b43a7dd306e9b34a58dc8d093488 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Wed, 22 Aug 2018 18:31:11 +0300 Subject: [PATCH 13/15] Fix minor EBN issues --- modules/ksb/Application.pm | 2 +- modules/ksb/BuildContext.pm | 4 ++-- modules/ksb/Util.pm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ksb/Application.pm b/modules/ksb/Application.pm index 84e5f8c..8e720b9 100644 --- a/modules/ksb/Application.pm +++ b/modules/ksb/Application.pm @@ -1015,7 +1015,7 @@ sub _parseModuleSetOptions # filehandle - The I/O object to read from. Must handle _eof_ and _readline_ # methods (e.g. subclass). # -# deferredOptions - An out paramter: a hashref holding the options set by any +# deferredOptions - An out parameter: a hashref holding the options set by any # 'options' blocks read in by this function. Each key (identified by the name # of the 'options' block) will point to a hashref value holding the options to # apply. diff --git a/modules/ksb/BuildContext.pm b/modules/ksb/BuildContext.pm index 8ef5a43..ad0b90a 100644 --- a/modules/ksb/BuildContext.pm +++ b/modules/ksb/BuildContext.pm @@ -310,7 +310,7 @@ sub commitEnvironmentChanges # queued. Either way the current environment will be unmodified afterward. # # First parameter is the name of the environment variable to modify -# All remaining paramters are prepended to the current environment path, in +# All remaining parameters are prepended to the current environment path, in # the order given. (i.e. param1, param2, param3 -> # param1:param2:param3:existing) sub prependEnvironmentValue @@ -495,7 +495,7 @@ sub getLogPathFor # Add a symlink to the latest run for this module. 'latest' itself is # a directory under the base log directory that holds symlinks mapping - # each module name to the specific log directoy most recently used. + # each module name to the specific log directory most recently used. my $latestPath = "$baseLogPath/latest"; diff --git a/modules/ksb/Util.pm b/modules/ksb/Util.pm index d1eaaa9..ee5f034 100644 --- a/modules/ksb/Util.pm +++ b/modules/ksb/Util.pm @@ -666,7 +666,7 @@ sub unique_items } # Subroutine to delete a directory and all files and subdirectories within. -# Does nothing in pretend mode. An analogue to "rm -rf" from Linux. +# Does nothing in pretend mode. An analog to "rm -rf" from Linux. # Requires File::Find module. # # First parameter: Path to delete From 46f97f2ce65d1834ed3d4ac6a5e240ab041f60d4 Mon Sep 17 00:00:00 2001 From: l10n daemon script Date: Mon, 27 Aug 2018 02:13:35 +0200 Subject: [PATCH 14/15] SVN_SILENT made messages (.desktop file) - always resolve ours In case of conflict in i18n, keep the version of the branch "ours" To resolve a particular conflict, "git checkout --ours path/to/file.desktop" --- doc/kdesrc-build.desktop | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/kdesrc-build.desktop b/doc/kdesrc-build.desktop index 08295fb..e56c4d4 100644 --- a/doc/kdesrc-build.desktop +++ b/doc/kdesrc-build.desktop @@ -25,6 +25,7 @@ Name[mr]=केडीई स्रोतबिल्डर Name[nb]=KDE kildebygger Name[nds]=KDE-Bornkode-Buumoduul Name[nl]=KDE Source Builder +Name[nn]=Byggjar for KDE-kjeldekode Name[pa]=KDE ਸਰੋਤ ਬਿਲਡਰ Name[pl]=Budowanie KDE ze źródeł Name[pt]=Compilação do Código do KDE @@ -65,6 +66,7 @@ Comment[lt]=Kompiliuoja KDE platformą ir susijusią programinę įrangą iš i Comment[nb]=Bygger KDE-plattformen og tilordnede programmer fra kildekoden. Dette er et program med bare kommandolinje. Comment[nds]=Buut de KDE-Systemümgeven un tohören Programmen ut den Bornkode. Bloots en Konsoolprogramm. Comment[nl]=Bouwt het KDE-platform en geassocieerde software uit zijn broncode. Werkt alleen op de opdrachtregel. +Comment[nn]=Byggjer KDE-plattforma og tilhøyrande programvare frå kjeldekoden. Er eit kommandolinjebasert program. Comment[pl]=Budowanie Środowiska KDE i związanego z nim oprogramowania z kodu źródłowego. Program działa tylko w linii poleceń. Comment[pt]=Compila a Plataforma do KDE e os programas associados a partir do seu código-fonte. Um programa apenas para a linha de comandos. Comment[pt_BR]=Compila a Plataforma do KDE e os programas associados a partir do seu código-fonte. Um programa apenas para a linha de comando. From 2373c11d1d5ba23066b37aeca3a0260d83a35ab5 Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 28 Aug 2018 22:44:13 +0200 Subject: [PATCH 15/15] kgraphviewer works --- kf5-extragear-build-include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kf5-extragear-build-include b/kf5-extragear-build-include index 6eb9b44..1363dfa 100644 --- a/kf5-extragear-build-include +++ b/kf5-extragear-build-include @@ -28,7 +28,7 @@ end module-set module-set extragear-graphics repository kde-projects - use-modules kdiagram + use-modules kdiagram kgraphviewer end module-set module-set extragear-multimedia