diff options
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 |