diff --git a/.gitignore b/.gitignore index e69de29..37b1973 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/scl-utils-20111214.tar.gz diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a4ccb6f --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +NAME=scl-utils +VERSION=`date +%Y%m%d` +WARNINGS?=-Wall -Wshadow -Wcast-align -Winline -Wextra -Wmissing-noreturn +CFLAGS?=-O2 +CFILES=scl.c +OTHERFILES=Makefile scl_enabled macros.dsc +SOURCES=$(CFILES) $(OTHERFILES) +OBJECTS=scl.o + +BINDIR=/usr/bin +MANDIR=/usr/share/man +CNFDIR=/etc + +all: $(NAME) + +$(NAME): $(SOURCES) $(OBJECTS) $(OTHERFILES) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(WARNINGS) -o scl + +clean: + rm -f *.o scl + +distclean: clean + rm -f *~ + +dist: + LANG=C + rm -rf $(NAME)-$(VERSION) + mkdir $(NAME)-$(VERSION) + cp $(SOURCES) $(NAME)-$(VERSION) + tar fcz $(NAME)-$(VERSION).tar.gz $(NAME)-$(VERSION) + rm -rf $(NAME)-$(VERSION) + +install: $(NAME) + mkdir -p $(DESTDIR)/$(BINDIR) + mkdir -p $(DESTDIR)/$(CNFDIR)/rpm + cp macros.dsc $(DESTDIR)/$(CNFDIR)/rpm + cp scl $(DESTDIR)/$(BINDIR) + cp scl_enabled $(DESTDIR)/$(BINDIR) + +uninstall: + rm -f $(BINDIR)/$(NAME) + rm -f $(CNFDIR)/rpm/macros.dsc diff --git a/macros.dsc b/macros.dsc new file mode 100644 index 0000000..cebce43 --- /dev/null +++ b/macros.dsc @@ -0,0 +1,131 @@ +# Dynamic Software Collections RPM macros +# +# Copyright (C) 2012 Red Hat, Inc. +# Written by Jindrich Novy . + +# "scl" prefixed macros are kept for compatibility please use "dsc" +# prefixed ones for production + +%dsc_package() %{expand:%{!?_root_prefix: +%global pkg_name %1 +%global dsc_short_prefix dsc +%global dsc_name %{dsc_short_prefix}_%{dsc} +%global dsc_runtime %{dsc_name}-runtime +%global dsc_prefix %{dsc_name}_ +%{!?_dsc_prefix: %global _dsc_prefix /opt/rh} +%global _dsc_scripts %{_dsc_prefix}/%{dsc} +%global _dsc_root %{_dsc_prefix}/%{dsc}/root +%global _root_prefix %{_prefix} +%global _root_exec_prefix %{_root_prefix} +%global _root_bindir %{_exec_prefix}/bin +%global _root_sbindir %{_exec_prefix}/sbin +%global _root_libexecdir %{_exec_prefix}/libexec +%global _root_datadir %{_prefix}/share +%global _root_sysconfdir %{_sysconfdir} +%global _root_sharedstatedir %{_prefix}/com +%global _root_localstatedir %{_prefix}/var +%global _root_libdir %{_exec_prefix}/%{_lib} +%global _root_includedir %{_prefix}/include +%global _root_infodir %{_datadir}/info +%global _root_mandir %{_datadir}/man +%global _root_initddir %{_sysconfdir}/rc.d/init.d +%global _prefix %{_dsc_root}/usr +%global _exec_prefix %{_prefix} +%global _bindir %{_exec_prefix}/bin +%global _sbindir %{_exec_prefix}/sbin +%global _libexecdir %{_exec_prefix}/libexec +%global _datadir %{_prefix}/share +%global _sysconfdir %{_dsc_root}/etc +%global _sharedstatedir %{_prefix}/com +%global _localstatedir %{_prefix}/var +%global _libdir %{_exec_prefix}/%{_lib} +%global _includedir %{_prefix}/include +%global _infodir %{_datadir}/info +%global _mandir %{_datadir}/man +%global _docdir %{_datadir}/doc +%global _defaultdocdir %{_docdir} +%global dsc_pkg_name %{dsc_short_prefix}_%{dsc}_%{pkg_name} +}} + +%dsc_require() %{_dsc_prefix}/%1/enable + +%dsc_files %{expand: +%{_dsc_root} +%{_dsc_scripts} +%{_dsc_scripts}/enable +%{_root_sysconfdir}/scl/prefixes/%dsc +} + +%dsc_install %{expand: +mkdir -p %{buildroot}%{_root_sysconfdir}/{rpm,scl/prefixes} +echo -n '%' > %{buildroot}%{_root_sysconfdir}/rpm/macros.%{dsc}-config +cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{dsc}-config << EOF +scl %dsc +EOF +cat >> %{buildroot}%{_root_sysconfdir}/scl/prefixes/%{dsc} << EOF +%_dsc_prefix +EOF +} + +# compatibility macros follow + +%scl_package() %{expand:%{!?_root_prefix: +%global pkg_name %1 +%global scl_short_prefix dsc +%global scl_name %{scl_short_prefix}_%{scl} +%global scl_runtime %{scl_name}-runtime +%global scl_prefix %{scl_name}_ +%{!?_scl_prefix: %global _scl_prefix /opt/rh} +%global _scl_scripts %{_scl_prefix}/%{scl} +%global _scl_root %{_scl_prefix}/%{scl}/root +%global _root_prefix %{_prefix} +%global _root_exec_prefix %{_root_prefix} +%global _root_bindir %{_exec_prefix}/bin +%global _root_sbindir %{_exec_prefix}/sbin +%global _root_libexecdir %{_exec_prefix}/libexec +%global _root_datadir %{_prefix}/share +%global _root_sysconfdir %{_sysconfdir} +%global _root_sharedstatedir %{_prefix}/com +%global _root_localstatedir %{_prefix}/var +%global _root_libdir %{_exec_prefix}/%{_lib} +%global _root_includedir %{_prefix}/include +%global _root_infodir %{_datadir}/info +%global _root_mandir %{_datadir}/man +%global _root_initddir %{_sysconfdir}/rc.d/init.d +%global _prefix %{_scl_root}/usr +%global _exec_prefix %{_prefix} +%global _bindir %{_exec_prefix}/bin +%global _sbindir %{_exec_prefix}/sbin +%global _libexecdir %{_exec_prefix}/libexec +%global _datadir %{_prefix}/share +%global _sysconfdir %{_scl_root}/etc +%global _sharedstatedir %{_prefix}/com +%global _localstatedir %{_prefix}/var +%global _libdir %{_exec_prefix}/%{_lib} +%global _includedir %{_prefix}/include +%global _infodir %{_datadir}/info +%global _mandir %{_datadir}/man +%global _docdir %{_datadir}/doc +%global _defaultdocdir %{_docdir} +%global scl_pkg_name %{scl_short_prefix}_%{scl}_%{pkg_name} +}} + +%scl_require() %{_scl_prefix}/%1/enable + +%scl_files %{expand: +%{_scl_root} +%{_scl_scripts} +%{_scl_scripts}/enable +%{_root_sysconfdir}/scl/prefixes/%scl +} + +%scl_install %{expand: +mkdir -p %{buildroot}%{_root_sysconfdir}/{rpm,scl/prefixes} +echo -n '%' > %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl}-config +cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl}-config << EOF +scl %scl +EOF +cat >> %{buildroot}%{_root_sysconfdir}/scl/prefixes/%{scl} << EOF +%_scl_prefix +EOF +} diff --git a/scl-utils.spec b/scl-utils.spec new file mode 100644 index 0000000..1b9a367 --- /dev/null +++ b/scl-utils.spec @@ -0,0 +1,119 @@ +Summary: Utilities for alternative packaging +Name: scl-utils +Version: 20111214 +Release: 1%{?dist} +License: GPLv2+ +Group: Applications/File +URL: http://jnovy.fedorapeople.org/scl-utils/ +Source0: http://jnovy.fedorapeople.org/scl-utils/%{name}-%{version}.tar.gz +Provides: dsc-utils = %version +Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +%description +Run-time utility for alternative packaging. + +%package build +Summary: RPM build macros for alternative packaging +Group: Applications/File +Provides: dsc-utils-build = %version + +%description build +Essential RPM build macros for alternative packaging. + +%prep +%setup -q + +%build +export CFLAGS="$RPM_OPT_FLAGS" +make + +%install +rm -rf %buildroot +mkdir -p %buildroot%{_sysconfdir}/rpm +mkdir -p %buildroot%{_sysconfdir}/scl/prefixes +mkdir -p %buildroot/opt/rh +make install DESTDIR=%buildroot + +%clean +rm -rf %buildroot + +%files +%defattr(-,root,root,-) +%dir /opt/rh +%dir %{_sysconfdir}/scl/prefixes +%{_bindir}/scl +%{_bindir}/scl_enabled + +%files build +%defattr(-,root,root,-) +%{_sysconfdir}/rpm/macros.dsc + +%changelog +* Wed Dec 14 2011 Jindrich Novy 20111214-1 +- initial review fixes (#767556) + +* Fri Dec 9 2011 Jindrich Novy 20111209-1 +- allow to use dsc_* macros and dsc* package naming + +* Wed Nov 16 2011 Jindrich Novy 20111116-1 +- package is now named scl-utils + +* Mon Oct 17 2011 Jindrich Novy 20111017-1 +- initial packaging for upstream + +* Thu Sep 21 2011 Jindrich Novy 0.1-14 +- define %%_defaultdocdir to properly relocate docs into + a stack +- document a way how to pass command to stack via stdin + +* Wed Jun 22 2011 Jindrich Novy 0.1-13 +- fix Stack meta config configuration + +* Fri Jun 17 2011 Jindrich Novy 0.1-12 +- use own Stack path configuration mechanism + +* Fri Jun 17 2011 Jindrich Novy 0.1-11 +- avoid redefinition of %%_root* macros by multiple + occurence of %%stack_package +- make the Stack root path configurable + +* Tue Jun 14 2011 Jindrich Novy 0.1-10 +- stack utility allows to read command from stdin + +* Mon Jun 13 2011 Jindrich Novy 0.1-9 +- introduce stack enablement tracking +- introduce "stack_enabled" helper utility to let a stack + application figure out which stacks are actually enabled +- disallow running stacks recursively + +* Mon Jun 13 2011 Jindrich Novy 0.1-8 +- stack utility returns executed commands' exit value + +* Fri Jun 10 2011 Jindrich Novy 0.1-7 +- fix possible segfault in the stack utility + +* Fri Jun 10 2011 Jindrich Novy 0.1-6 +- %%stack_name: initial part of stack prefix and name of + meta package providing scriptlets +- %%stack_prefix: stack namespacing part to be prepended to + original non-stack package name, can be used for Provides + namespacing as well +- %%stack_runtime: run-time package name providing scriptlets +- %%stack_require: macro to define dependency to other stacks + +* Thu Jun 09 2011 Jindrich Novy 0.1-5 +- split the package into two - runtime and build part +- decrease verbosity when enabling a stack + +* Wed Jun 08 2011 Jindrich Novy 0.1-4 +- prepend stack package with stack_* to prevent namespace + conflicts with core packages + +* Thu Jun 02 2011 Jindrich Novy 0.1-3 +- introduce metapackage concept + +* Wed Jun 01 2011 Jindrich Novy 0.1-2 +- modify macros so that they don't change preamble tags + +* Sun May 08 2011 Jindrich Novy 0.1-1 +- initial packaging diff --git a/scl.c b/scl.c new file mode 100644 index 0000000..5409a68 --- /dev/null +++ b/scl.c @@ -0,0 +1,160 @@ +/* Copyright (C) 2011 Red Hat, Inc. + + Written by Jindrich Novy . + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; see the file COPYING. If not, + write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void check_asprintf( char **strp, const char *fmt, ... ) { + va_list args; + + va_start(args, fmt); + + if (vasprintf(strp, fmt, args) == -1 || !*strp) { + fprintf(stderr, "Allocation failed.\n"); + exit(EXIT_FAILURE); + } + + va_end(args); +} + +static void write_script( int tfd, char *s ) { + if (write(tfd, s, strlen(s)) == -1) { + fprintf(stderr, "Error writing to temporary file\n"); + exit(EXIT_FAILURE); + } +} + +int main(int argc, char **argv) { + struct stat st; + char *path, *enablepath; + char tmp[] = "/var/tmp/sclXXXXXX"; + char *cmd = NULL, *bash_cmd, *echo, *enabled; + int i, tfd, ffd, stdin_read = 0; + + if (!strcmp(argv[argc-1], "-")) { /* reading command from stdin */ + size_t r = 0; + cmd = malloc(BUFSIZ); + + if (!cmd) { + fprintf(stderr, "Can't allocate memory.\n"); + exit(EXIT_FAILURE); + } + + for (;(r += fread(cmd+r, 1, BUFSIZ, stdin));) { + if (feof(stdin)) break; + cmd = realloc(cmd, r); + if (!cmd) { + fprintf(stderr, "Can't reallocate memory.\n"); + exit(EXIT_FAILURE); + } + } + if (!r) { + fprintf(stderr, "Error reading command from stdin.\n"); + exit(EXIT_FAILURE); + } + stdin_read = 1; + } + + if (!stdin_read) { + if (argc < 4) { + fprintf(stderr, "Usage: %s [, ...] \n" + "If is '-' then the command will be read from standard input.\n", argv[0]); + exit(EXIT_FAILURE); + } + cmd = argv[argc-1]; + } + + tfd = mkstemp(tmp); + + check_asprintf(&enabled, "scl_enabled %s\n[ $? == 0 ] && exit 1\n" + "eval \"SCLS=( ${x_scls[*]} )\"\n" + "SCLS+=(%s)\n" + "export X_SCLS=$(printf '%%q ' \"${SCLS[@]}\")\n", argv[2], argv[2]); + write_script(tfd, enabled); + free(enabled); + + for (i=2; i