diff options
author | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2020-08-17 00:28:08 +0100 |
---|---|---|
committer | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2020-08-20 02:00:32 +0100 |
commit | 3480a74b077f599389fd54a453791a0373568171 (patch) | |
tree | 76e472534d729301ad480e3777c91a7c24a5d331 /reproduce/software/make | |
parent | b79c430c82b6c3a40817caac13bf8665cfa9c6a3 (diff) | |
parent | 9573d4e4d4754e629b73be4bd6846a049d57f427 (diff) |
Imported recent updates in Maneage, minor conflicts fixed
Some very minor conflicts came up and were easily corrected. They were
mostly in parts that are also shared with the demonstration in the core
Maneage branch.
Diffstat (limited to 'reproduce/software/make')
-rw-r--r-- | reproduce/software/make/basic.mk | 138 | ||||
-rw-r--r-- | reproduce/software/make/build-rules.mk | 29 | ||||
-rw-r--r-- | reproduce/software/make/high-level.mk | 63 | ||||
-rw-r--r-- | reproduce/software/make/python.mk | 7 | ||||
-rw-r--r-- | reproduce/software/make/xorg.mk | 1 |
5 files changed, 170 insertions, 68 deletions
diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk index 453eddb..0b672d8 100644 --- a/reproduce/software/make/basic.mk +++ b/reproduce/software/make/basic.mk @@ -130,9 +130,17 @@ backupservers = $(filter-out $(topbackupserver),$(backupservers_all)) # Low-level (not built) programs # ------------------------------ # -# For the time being, some components of the project on some systems, so we -# are simply making a symbolic link to the system's files here. We'll do -# this after building GNU Coreutils to have trustable elements. +# For the time being, some components of the project aren't being built on +# some systems (primarily on proprietary operating systems). So we are +# simply making a symbolic link to the system's programs/libraries in the +# build directory. +# +# The logical position of this rule is irrelevant in this Makefile (because +# programs being built here have full access to the system's PATH +# already). This is done for the high-level programs installed in +# 'high-level.mk', 'xorg.mk' or 'python.mk'. So this step is done after +# building our own GNU Grep (which is the highest-level program used in +# 'makelink') to have trustable elements. # # About ccache: ccache acts like a wrapper over the C compiler and is made # to avoid/speed-up compiling of identical files in a system (it is @@ -142,19 +150,25 @@ backupservers = $(filter-out $(topbackupserver),$(backupservers_all)) # thus remove any part of PATH of that has `ccache' in it before making # symbolic links to the programs we are not building ourselves. # -# We'll need the system's PATH for making links to low-level programs we -# won't be building ourselves. +# The double quotations after the starting 'export PATH' are necessary in +# case the user's PATH has space-characters in it. +# +# We use 'realpath' here (part of GNU Coreutils which is already installed +# by the time we use 'makelink') to avoid linking to a link (on the +# host). 'realpath' will follow a link (and possibly other links in the +# middle) to an actual file and return its address. When the location isn't +# a link, it will just return it. syspath := $(PATH) makelink = origpath="$$PATH"; \ - export PATH=$$(echo $(syspath) \ - | tr : '\n' \ - | grep -v ccache \ - | tr '\n' :); \ + export PATH="$$(echo $(syspath) \ + | tr : '\n' \ + | grep -v ccache \ + | tr '\n' :)"; \ if type $(1) > /dev/null 2> /dev/null; then \ if [ x$(3) = x ]; then \ - ln -sf $$(which $(1)) $(ibdir)/$(1); \ + ln -sf "$$(realpath $$(which $(1)))" $(ibdir)/$(1); \ else \ - ln -sf $$(which $(1)) $(ibdir)/$(3); \ + ln -sf "$$(realpath $$(which $(1)))" $(ibdir)/$(3); \ fi; \ else \ if [ "x$(strip $(2))" = xmandatory ]; then \ @@ -166,13 +180,12 @@ makelink = origpath="$$PATH"; \ export PATH="$$origpath" $(ibdir) $(ildir):; mkdir $@ -$(ibidir)/low-level-links: $(ibidir)/coreutils-$(coreutils-version) \ +$(ibidir)/low-level-links: $(ibidir)/grep-$(grep-version) \ | $(ibdir) $(ildir) - # Not-installed (but necessary in some cases) compilers. - # Clang is necessary for CMake. - $(call makelink,clang) - $(call makelink,clang++) + # Hardware specific + $(call makelink,lp) # For printing, necessary for R. + $(call makelink,lpr) # For printing, necessary for R. # Mac OS specific $(call makelink,mig) @@ -913,7 +926,7 @@ $(ibidir)/gettext-$(gettext-version): \ $(ibidir)/ncurses-$(ncurses-version) \ $(ibidir)/libiconv-$(libiconv-version) \ $(ibidir)/libunistring-$(libunistring-version) - tarball=gettext-$(gettext-version).tar.xz + tarball=gettext-$(gettext-version).tar.lz $(call import-source, $(gettext-url), $(gettext-checksum)) $(call gbuild, gettext-$(gettext-version), static,, \ V=1 -j$(numthreads)) @@ -950,7 +963,7 @@ $(ibidir)/libtool-$(libtool-version): $(ibidir)/m4-$(m4-version) $(call import-source, $(libtool-url), $(libtool-checksum)) $(call gbuild, libtool-$(libtool-version), static, \ --program-prefix=g, V=1 -j$(numthreads)) - ln -s $(ibdir)/glibtoolize $(ibdir)/libtoolize + ln -sf $(ibdir)/glibtoolize $(ibdir)/libtoolize echo "GNU Libtool $(libtool-version)" > $@ $(ibidir)/grep-$(grep-version): $(ibidir)/coreutils-$(coreutils-version) @@ -1202,6 +1215,7 @@ $(ibidir)/binutils-$(binutils-version): \ $(call makelink,ld) $(call makelink,nm) $(call makelink,ps) + $(call makelink,strip) $(call makelink,ranlib) echo "" > $@ else @@ -1211,14 +1225,15 @@ $(ibidir)/binutils-$(binutils-version): \ --with-lib-path=$(sys_library_path), \ -j$(numthreads) ) - # The `ld' linker of Binutils needs several `*crt*.o' file to - # run. On some systems these object files aren't installed in - # standard places. We defined `LIBRARY_PATH' and that fixed the - # problem for many systems. However, some software (for example - # ImageMagick) over-write `LIBRARY_PATH', therefore there is no - # other way than to put a link to these necessary files in our - # local build directory. IMPORTANT NOTE: later, when we build the - # GNU C Library in the project, we should remove this step. + # The `ld' linker of Binutils needs several `*crt*.o' files from + # the host's GNU C Library to run. On some systems these object + # files aren't installed in standard places. We defined + # `LIBRARY_PATH' and that fixed the problem for many + # systems. However, some software (for example ImageMagick) + # over-write `LIBRARY_PATH', therefore there is no other way than + # to put a link to these necessary files in our local build + # directory. IMPORTANT NOTE: later, when we build the GNU C + # Library in the project, we should remove this step. if ! [ x"$(sys_library_path)" = x ]; then for f in $(sys_library_path)/*crt*.o; do b=$$($(ibdir)/basename $$f) @@ -1270,6 +1285,16 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version) tarball=gcc-$(gcc-version).tar.xz $(call import-source, $(gcc-url), $(gcc-checksum)) + # To avoid any previous build in '.local/bin' causing problems in + # this build/links of this GCC, we'll first delete all the possibly + # built/existing compilers in this project. Note that GCC also + # installs several executables like this 'x86_64-pc-linux-gnu-gcc', + # 'x86_64-pc-linux-gnu-gcc-ar' or 'x86_64-pc-linux-gnu-g++'. + rm -f $(ibdir)/*g++ $(ibdir)/cpp $(ibdir)/gfortran + rm -rf $(ildir)/gcc $(ildir)/libcc* $(ildir)/libgcc* + rm -f $(ibdir)/*gcc* $(ibdir)/gcov* $(ibdir)/cc $(ibdir)/c++ + rm -rf $(ildir)/libgfortran* $(ildir)/libstdc* rm $(idir)/x86_64* + # GCC builds is own libraries in '$(idir)/lib64'. But all other # libraries are in '$(idir)/lib'. Since this project is only for a # single architecture, we can trick GCC into building its libraries @@ -1277,34 +1302,52 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version) # link to '$(idir)/lib'. if [ $(host_cc) = 1 ]; then - # Make sure we don't have any of the program we want to link to - # in the '.local/bin' directory. - rm -f $(ibdir)/cc - rm -f $(ibdir)/c++ - rm -f $(ibdir)/gcc - rm -f $(ibdir)/cpp - rm -f $(ibdir)/strip; - rm -f $(ibdir)/gfortran; - - # Put links to the host's tools in '.local/bin'. - $(call makelink,cc) - $(call makelink,cpp) - $(call makelink,cc,,gcc) + # Put links to the host's tools in '.local/bin'. Note that some + # macOS systems have both a native clang *and* a GNU C Compiler + # (note that this is different from the "normal" macOS situation + # where 'gcc' actually points to clang, here we mean when 'gcc' + # is actually the GNU C Compiler). + # + # In such cases, the GCC isn't complete and using it will cause + # problems when building high-level tools (for example openBLAS, + # rpcsvc-proto, CMake, xlsxio, Python or Matplotlib among + # others). To avoid such situations macOSs are configured like + # this: we'll simply set 'gcc' to point to 'clang' and won't set + # 'gcc' to point to the system's 'gcc'. + # + # Also, note that LLVM's clang doesn't have a C Pre-Processor. So + # we will only put a link to the host's 'cpp' if the system is + # not macOS. On macOS systems that have a real GCC installed, + # having GNU CPP in the project build directory is known to cause + # problems with 'libX11'. $(call makelink,gfortran) - $(call makelink,c++,,g++) - $(call makelink,strip,mandatory) + if [ x$(on_mac_os) = xyes ]; then + $(call makelink,clang) + $(call makelink,clang++) + $(call makelink,clang,,gcc) + $(call makelink,clang++,,g++) + else + $(call makelink,cpp) + $(call makelink,gcc) + $(call makelink,g++) + fi + + # We also want to have the two 'cc' and 'c++' in the build + # directory that point to the selected compiler. With the checks + # above, 'gcc' and 'g++' will point to the proper compiler, so + # we'll use them to define 'cc' and 'c++'. + $(call makelink,gcc,,cc) + $(call makelink,g++,,c++) + + # Get the first line of the compiler's '--version' output and put + # that into the target (so we know want compiler was used). ccinfo=$$(gcc --version | awk 'NR==1') echo "C compiler (""$$ccinfo"")" > $@ else - # We are building GCC, so to avoid any previous build in - # '.local/bin', we'll delete all the files that GCC builds from - # there. + # Mark the current directory. current_dir=$$(pwd) - rm -f $(ibdir)/gcc* $(ibdir)/g++ $(ibdir)/gfortran $(ibdir)/gcov* - rm -rf $(ildir)/gcc $(ildir)/libcc* $(ildir)/libgcc* - rm -rf $(ildir)/libgfortran* $(ildir)/libstdc* rm $(idir)/x86_64* # We don't want '.local/lib' and '.local/lib64' to be separate. ln -fs $(ildir) $(idir)/lib64 @@ -1398,6 +1441,7 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version) # Set 'cc' to point to 'gcc'. ln -sf $(ibdir)/gcc $(ibdir)/cc + ln -sf $(ibdir)/g++ $(ibdir)/c++ # Write the final target. echo "GNU Compiler Collection (GCC) $(gcc-version)" > $@ diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk index 7471e5b..d50c301 100644 --- a/reproduce/software/make/build-rules.mk +++ b/reproduce/software/make/build-rules.mk @@ -44,7 +44,12 @@ import-source = final=$(tdir)/$$tarball; \ unchecked="$$final.unchecked"; \ rm -f "$$unchecked"; \ if [ -f $(DEPENDENCIES-DIR)/$$tarball ]; then \ - cp $(DEPENDENCIES-DIR)/$$tarball "$$unchecked"; \ + if type realpath > /dev/null 2> /dev/null; then \ + ln -sf "$$(realpath $(DEPENDENCIES-DIR)/$$tarball)" \ + "$$unchecked"; \ + else \ + cp $(DEPENDENCIES-DIR)/$$tarball "$$unchecked"; \ + fi; \ else \ if [ x"$$url" = x ]; then \ bservers="$(backupservers)"; \ @@ -70,7 +75,7 @@ import-source = final=$(tdir)/$$tarball; \ if [ x"$$checksum" = x"$$exp_checksum" ]; then \ mv "$$unchecked" "$$final"; \ else \ - echo "ERROR: Non-matching checksum for '$$tarball'."; \ + echo "ERROR: Non-matching checksum: $$tarball"; \ echo "Checksum should be: $$exp_checksum"; \ echo "Checksum is: $$checksum"; \ exit 1; \ @@ -170,11 +175,21 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \ \ echo; echo "Using '$$confscript' to configure:"; echo; \ echo "$$confscript $(3) $$configop"; echo; \ - $$confscript $(3) $$configop; \ - make "$$shellop" $(4); \ - $$check; \ - make "$$shellop" install $(7); \ - cd ..; \ + if [ x$$configure_in_different_directory = x1 ]; then \ + mkdir build; \ + cd build; \ + ../$$confscript $(3) $$configop; \ + make "$$shellop" $(4); \ + $$check; \ + make "$$shellop" install $(7); \ + cd ../..; \ + else \ + $$confscript $(3) $$configop; \ + make "$$shellop" $(4); \ + $$check; \ + make "$$shellop" install $(7); \ + cd ..; \ + fi; \ rm -rf $(1) diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk index cf104e6..9f434bc 100644 --- a/reproduce/software/make/high-level.mk +++ b/reproduce/software/make/high-level.mk @@ -52,6 +52,7 @@ ildir = $(BDIR)/software/installed/lib ibidir = $(BDIR)/software/installed/version-info/proglib # Basic directories (specific to this Makefile). +il64dir = $(BDIR)/software/installed/lib64 iidir = $(BDIR)/software/installed/include shsrcdir = $(shell pwd)/reproduce/software/shell dtexdir = $(shell pwd)/reproduce/software/bibtex @@ -555,7 +556,7 @@ $(ibidir)/libidn-$(libidn-version): $(call import-source, $(libidn-url), $(libidn-checksum)) $(call gbuild, libidn-$(libidn-version), static, \ --disable-doc, -j$(numthreads) V=1) - echo "Libjpeg $(libjpeg-version)" > $@ + echo "Libidn $(libidn-version)" > $@ $(ibidir)/libjpeg-$(libjpeg-version): tarball=jpegsrc.$(libjpeg-version).tar.gz @@ -640,7 +641,10 @@ $(ibidir)/openblas-$(openblas-version): $(ibidir)/openmpi-$(openmpi-version): tarball=openmpi-$(openmpi-version).tar.gz $(call import-source, $(openmpi-url), $(openmpi-checksum)) - $(call gbuild, openmpi-$(openmpi-version), static, , \ + $(call gbuild, openmpi-$(openmpi-version), static, \ + --with-pmix=internal \ + --with-hwloc=internal \ + --without-verbs, \ -j$(numthreads) V=1) echo "Open MPI $(openmpi-version)" > $@ @@ -759,8 +763,8 @@ $(ibidir)/libgit2-$(libgit2-version): $(ibidir)/cmake-$(cmake-version) -DUSE_SSH=OFF -DBUILD_CLAR=OFF \ -DTHREADSAFE=ON -DUSE_ICONV=OFF ) if [ x$(on_mac_os) = xyes ]; then - install_name_tool -id $(ildir)/libgit2.28.dylib \ - $(ildir)/libgit2.28.dylib + install_name_tool -id $(ildir)/libgit2.1.0.dylib \ + $(ildir)/libgit2.1.0.dylib fi echo "Libgit2 $(libgit2-version)" > $@ @@ -781,8 +785,8 @@ $(ibidir)/wcslib-$(wcslib-version): $(ibidir)/cfitsio-$(cfitsio-version) --with-cfitsioinc=$(idir)/include \ --without-pgplot $$fortranopt) if [ x$(on_mac_os) = xyes ]; then - install_name_tool -id $(ildir)/libwcs.6.4.dylib \ - $(ildir)/libwcs.6.4.dylib + install_name_tool -id $(ildir)/libwcs.7.3.dylib \ + $(ildir)/libwcs.7.3.dylib fi echo "WCSLIB $(wcslib-version)" > $@ @@ -849,7 +853,7 @@ $(ibidir)/automake-$(automake-version): $(ibidir)/autoconf-$(autoconf-version) echo "GNU Automake $(automake-version)" > $@ $(ibidir)/bison-$(bison-version): $(ibidir)/help2man-$(help2man-version) - tarball=bison-$(bison-version).tar.xz + tarball=bison-$(bison-version).tar.lz $(call import-source, $(bison-url), $(bison-checksum)) $(call gbuild, bison-$(bison-version), static, ,V=1 -j$(numthreads)) echo "GNU Bison $(bison-version)" > $@ @@ -912,6 +916,7 @@ $(ibidir)/flex-$(flex-version): $(ibidir)/bison-$(bison-version) $(ibidir)/gdb-$(gdb-version): $(ibidir)/python-$(python-version) tarball=gdb-$(gdb-version).tar.gz + export configure_in_different_directory=1; $(call import-source, $(gdb-url), $(gdb-checksum)) $(call gbuild, gdb-$(gdb-version),,,V=1 -j$(numthreads)) echo "GNU Project Debugger (GDB) $(gdb-version)" > $@ @@ -1092,10 +1097,17 @@ $(ibidir)/minizip-$(minizip-version): $(ibidir)/automake-$(automake-version) rm -rf $$unpackdir echo "Minizip $(minizip-version)" > $@ +# The Astromatic software packages (including missfits, sextractor, swarp +# and others) need the '-fcommon' flag to compile properly on GCC 10 and +# after. Previous to GCC 10, it was the default, but from GCC 10, the +# default is '-fno-common'. This is known by the author (as SExtractor +# issue 12: https://github.com/astromatic/sextractor/issues/12) and will +# hopefully be fixed in the future. $(ibidir)/missfits-$(missfits-version): tarball=missfits-$(missfits-version).tar.gz $(call import-source, $(missfits-url), $(missfits-checksum)) - $(call gbuild, missfits-$(missfits-version), static) + $(call gbuild, missfits-$(missfits-version), static, \ + CFLAGS="-fcommon") cp $(dtexdir)/missfits.tex $(ictdir)/ echo "MissFITS $(missfits-version) \citep{missfits}" > $@ @@ -1159,11 +1171,25 @@ $(ibidir)/R-$(R-version): \ $(ibidir)/libpaper-$(libpaper-version) tarball=R-$(R-version).tar.gz $(call import-source, $(R-url), $(R-checksum)) + cd $(ddir) + tar xf $(tdir)/$$tarball + cd R-$(R-version) + # We need to manually remove the lines with '~autodetect~', they + # cause the configure script to crash in version 4.0.2. They are + # used in relation to Java, and we don't use Java anyway. + sed -i -e '/\~autodetect\~/ s/^/#/g' configure export R_SHELL=$(SHELL) - $(call gbuild, R-$(R-version), static, \ - --without-x --with-readline \ - --disable-openmp, -j$(numthreads)) + ./configure --prefix=$(idir) \ + --without-x \ + --with-pcre1 \ + --disable-java \ + --with-readline \ + --disable-openmp + make -j$(numthreads) + make install + cd .. + rm -rf R-$(R-version) echo "R $(R-version)" > $@ # SCAMP documentation says ATLAS is a mandatory prerequisite for using @@ -1177,7 +1203,10 @@ $(ibidir)/scamp-$(scamp-version): \ $(ibidir)/cdsclient-$(cdsclient-version) tarball=scamp-$(scamp-version).tar.lz $(call import-source, $(scamp-url), $(scamp-checksum)) + + # See comment above 'missfits' for '-fcommon'. $(call gbuild, scamp-$(scamp-version), static, \ + CFLAGS="-fcommon" \ --enable-threads \ --enable-openblas \ --enable-plplot=no \ @@ -1205,13 +1234,20 @@ $(ibidir)/scons-$(scons-version): $(ibidir)/python-$(python-version) # libraries. But we can override this issue since we have Openblas # installed, it is just necessary to explicity tell sextractor to use it in # the configuration step. +# +# The '-fcommon' is a necessary C compilation flag for GCC 10 and above. It +# is necessary for astromatic libraries, otherwise their build will crash. $(ibidir)/sextractor-$(sextractor-version): \ $(ibidir)/fftw-$(fftw-version) \ $(ibidir)/openblas-$(openblas-version) tarball=sextractor-$(sextractor-version).tar.lz $(call import-source, $(sextractor-url), $(sextractor-checksum)) + + # See comment above 'missfits' for '-fcommon'. $(call gbuild, sextractor-$(sextractor-version), static, \ - --enable-threads --enable-openblas \ + CFLAGS="-fcommon" \ + --enable-threads \ + --enable-openblas \ --with-openblas-libdir=$(ildir) \ --with-openblas-incdir=$(idir)/include) ln -fs $(ibdir)/sex $(ibdir)/sextractor @@ -1221,7 +1257,10 @@ $(ibidir)/sextractor-$(sextractor-version): \ $(ibidir)/swarp-$(swarp-version): $(ibidir)/fftw-$(fftw-version) tarball=swarp-$(swarp-version).tar.gz $(call import-source, $(swarp-url), $(swarp-checksum)) + + # See comment above 'missfits' for '-fcommon'. $(call gbuild, swarp-$(swarp-version), static, \ + CFLAGS="-fcommon" \ --enable-threads) cp $(dtexdir)/swarp.tex $(ictdir)/ echo "SWarp $(swarp-version) \citep{swarp}" > $@ diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk index ccfbc72..d39208f 100644 --- a/reproduce/software/make/python.mk +++ b/reproduce/software/make/python.mk @@ -331,7 +331,7 @@ $(ipydir)/h5py-$(h5py-version): \ # and just ask for `healpy'. To avoid confusion in such cases, we'll just # set `healpy' to be dependent on `healpix' and not download any tarball # for it, or write anything in the final target. -$(ipydir)/healpy-$(healpy-version): $(ibidir)/healpix-$(healpy-version) +$(ipydir)/healpy-$(healpy-version): $(ibidir)/healpix-$(healpix-version) touch $@ $(ipydir)/html5lib-$(html5lib-version): \ @@ -431,6 +431,7 @@ $(ipydir)/mpmath-$(mpmath-version): $(ipydir)/setuptools-$(setuptools-version) $(ipydir)/numpy-$(numpy-version): \ $(ibidir)/unzip-$(unzip-version) \ + $(ipydir)/cython-$(cython-version) \ $(ibidir)/openblas-$(openblas-version) \ $(ipydir)/setuptools-$(setuptools-version) tarball=numpy-$(numpy-version).zip @@ -528,7 +529,9 @@ $(ipydir)/requests-$(requests-version): $(ipydir)/idna-$(idna-version) \ $(call pybuild, tar xf, requests-$(requests-version), , \ Requests $(requests-version)) -$(ipydir)/scipy-$(scipy-version): $(ipydir)/numpy-$(numpy-version) +$(ipydir)/scipy-$(scipy-version): \ + $(ipydir)/numpy-$(numpy-version) \ + $(ipydir)/pybind11-$(pybind11-version) tarball=scipy-$(scipy-version).tar.gz $(call import-source, $(scipy-url), $(scipy-checksum)) if [ x$(on_mac_os) = xyes ]; then diff --git a/reproduce/software/make/xorg.mk b/reproduce/software/make/xorg.mk index e3b1f71..f59fb04 100644 --- a/reproduce/software/make/xorg.mk +++ b/reproduce/software/make/xorg.mk @@ -15,6 +15,7 @@ # ------------------------------------------------------------------------ # # Copyright (C) 2020 Mohammad Akhlaghi <mohammad@akhlaghi.org> +# Copyright (C) 2020 Raul Infante-Sainz <infantesainz@gmail.com> # # This Makefile is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by |