/[escript]/branches/doubleplusgood/doc/install/srclinux.tex
ViewVC logotype

Diff of /branches/doubleplusgood/doc/install/srclinux.tex

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2455 by jfenwick, Wed Jun 3 03:29:07 2009 UTC revision 2547 by caltinay, Mon Jul 20 05:50:46 2009 UTC
# Line 1  Line 1 
   
1  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2  %  %
3  % Copyright (c) 2003-2008 by University of Queensland  % Copyright (c) 2003-2008 by University of Queensland
# Line 13  Line 12 
12    
13  \section{Installing from source for \linux}  \section{Installing from source for \linux}
14  \label{sec:srclinux}  \label{sec:srclinux}
15    
16    \subsection{Preliminaries}
17    
18  The following instructions assume you are running the \filename{bash} shell.  The following instructions assume you are running the \filename{bash} shell.
19  Comments are indicated with \# characters.  Comments are indicated with \# characters.
20    
21  Make sure you have the following installed:  Make sure you have the following installed:
22  \begin{itemize}  \begin{itemize}
23   \item \filename{g++} and associated tools.   \item \filename{g++} and associated tools.
24  \item \filename{make}   \item \filename{make}
25  \item \filename{libXext.so}\footnote{In Debian this is in the libXext-dev package.}   % I suspect that these are only needed by VTK and if we aren't using it anymore they could be removed
26  \item \filename{libxt.so}\footnote{In Debian this is in the libxt-dev package.}   \item \filename{libXext.so}\footnote{In Debian this is in the libXext-dev package.}
27     \item \filename{libxt.so}\footnote{In Debian this is in the libxt-dev package.}
28  \end{itemize}  \end{itemize}
29    
30  You will also need a copy of the \esfinley source code.  You will also need a copy of the \esfinley source code.
31  If you retrieved the source using subversion, don't forget that one can use the export command instead of checkout to get a smaller copy.  If you retrieved the source using subversion, don't forget that one can use the export command instead of checkout to get a smaller copy.
32  For additional visualisation functionality see Section~\ref{sec:linaddfunc}.  For additional visualization functionality see \Sec{sec:addfunc}.
33    
34  These instructions will produce the following structure:  These instructions will produce the following directory structure:
35  \begin{itemize}  \begin{itemize}
36  \item \filename{stand}: \begin{itemize}   \item[] \filename{stand} \begin{itemize}
37   \item \filename{escript.d}    \item[] \filename{escript.d}
38  \item \filename{packages}    \item[] \filename{pkg}
39  \item \filename{package_src}    \item[] \filename{pkg_src}
40  \item \filename{build}    \item[] \filename{build}
41  \item \filename{doc}    \item[] \filename{doc}
42    \end{itemize}   \end{itemize}
43  \end{itemize}  \end{itemize}
44    
45  The build directory can be removed when you are finished.  Before you start copy the \esfinley source into the \filename{escript.d} directory.
46    The following instructions refer to software versions in the \filename{escript-support-3-src} and \filename{escript-support-visi-3-src} bundles.
47    If you download your own versions of those packages substitute their version numbers and names as appropriate.
48    There are a number of uses of the \filename{make} command in the following instructions.
49    If your computer has multiple cores/processors you can speed up the compilation process by adding -j 2 after the make command.
50    For example to use all processors on a computer with 4 cores:
51    \begin{shellCode}
52     make
53    \end{shellCode}
54    becomes
55    \begin{shellCode}
56     make -j 4
57    \end{shellCode}
58    
59  \begin{shellCode}  \begin{shellCode}
60  mkdir stand  mkdir stand
61  cd stand  cd stand
62  export PKG_ROOT=`pwd`/packages  mkdir build doc pkg pkg_src
63    export PKG_ROOT=$(pwd)/pkg
64    \end{shellCode}
65    
66    \subsection{Building the dependencies}
67    
68    Copy the compressed sources for the packages into \filename{stand/pkg_src}.
69    If you are using the support bundles, decompress them in the stand directory:
70    \begin{shellCode}
71    tar -xjf escript-support-3-src.tar.bz2
72  \end{shellCode}  \end{shellCode}
73    
74  Copy compressed source bundles into \filename{stand/package_src}.  Copy documentation files into \filename{doc} then unpack the archives:
 Copy documentation files into \filename{doc}.  
75    
76  \begin{shellCode}  \begin{shellCode}
 mkdir packages  
 mkdir build  
77  cd build  cd build
78  tar -jxf ../package_src/Python-2.6.1.tar.bz2  tar -jxf ../pkg_src/Python-2.6.1.tar.bz2
79  tar -jxf ../package_src/boost_1_37_0.tar.bz2  tar -jxf ../pkg_src/boost_1_39_0.tar.bz2
80  tar -jxf ../package_src/MesaLib-7.2.tar.bz2  tar -zxf ../pkg_src/scons-1.2.0.tar.gz
81  tar -zxf ../package_src/netcdf-4.0.tar.gz  tar -zxf ../pkg_src/numpy-1.3.0.tar.gz
82  tar -zxf ../package_src/vtk-5.2.1.tar.gz  tar -zxf ../pkg_src/netcdf-4.0.tar.gz
83  tar -zxf ../package_src/vtkdata-5.2.1.tar.gz  tar -zxf ../pkg_src/matplotlib-0.98.5.3.tar.gz
 tar -zxf ../package_src/numarray-1.5.2.tar.gz  
 tar -zxf ../package_src/cmake-2.6.3.tar.gz  
 tar -zxf ../package_src/scons-1.2.0.tar.gz  
84  \end{shellCode}  \end{shellCode}
85    
86  Build python.  \begin{itemize}
87    
88    \item Build Python:
89  \begin{shellCode}  \begin{shellCode}
90  cd Python*  cd Python*
91  ./configure --prefix=$PKG_ROOT/python-2.6.1 --enable-shared 2>&1 \  ./configure --prefix=$PKG_ROOT/python-2.6.1 --enable-shared 2>&1 \
# Line 78  export PATH=$PKG_ROOT/python/bin:$PATH Line 98  export PATH=$PKG_ROOT/python/bin:$PATH
98  export PYTHONHOME=$PKG_ROOT/python  export PYTHONHOME=$PKG_ROOT/python
99  export LD_LIBRARY_PATH=$PKG_ROOT/python/lib:$LD_LIBRARY_PATH  export LD_LIBRARY_PATH=$PKG_ROOT/python/lib:$LD_LIBRARY_PATH
100    
101  pushd ../packages  pushd ../pkg
102  ln -s python-2.6.1/ python  ln -s python-2.6.1/ python
103  popd  popd
   
104  \end{shellCode}  \end{shellCode}
105    
106  Run python to make sure it works.  Run the new python executable to make sure it works.
 Now build numarray.  
107    
108    \item Now build NumPy:
109  \begin{shellCode}  \begin{shellCode}
110  cd numarray-1.5.2  cd numpy-1.3.0
111    python setup.py build
112  python setup.py install \  python setup.py install --prefix $PKG_ROOT/numpy-1.3.0
  --gencode --install-lib=$PKG_ROOT/numarray-1.5.2/lib \  
  --install-headers=$PKG_ROOT=$PKG_ROOT/numarray-1.5.2/include/numarray \  
    2>&1 | tee tt.install.out  
   
   
 export PYTHONPATH=$PKG_ROOT/numarray/lib:$PYTHONPATH  
113  cd ..  cd ..
114  pushd ../packages  pushd ../pkg
115  ln -s numarray-1.5.2 numarray  ln -s numpy-1.3.0 numpy
116  popd  popd
117    export PYTHONPATH=$PKG_ROOT/numpy/lib/python2.6/site-packages:$PYTHONPATH
118  \end{shellCode}  \end{shellCode}
119    
120  Now we build scons.  % \begin{shellCode}
121    % cd numarray-1.5.2
122    %
123    % python setup.py install \
124    %  --gencode --install-lib=$PKG_ROOT/numarray-1.5.2/lib \
125    %  --install-headers=$PKG_ROOT=$PKG_ROOT/numarray-1.5.2/include/numarray \
126    %    2>&1 | tee tt.install.out
127    %
128    %
129    % export PYTHONPATH=$PKG_ROOT/numarray/lib:$PYTHONPATH
130    % cd ..
131    % pushd ../pkg
132    % ln -s numarray-1.5.2 numarray
133    % popd
134    % \end{shellCode}
135    
136    \item Next build scons:
137  \begin{shellCode}  \begin{shellCode}
138  cd scons-1.2.0  cd scons-1.2.0
139  python setup.py install --prefix=$PKG_ROOT/scons-1.2.0  python setup.py install --prefix=$PKG_ROOT/scons-1.2.0
140    
141  export PATH=$PKG_ROOT/scons/bin:$PATH  export PATH=$PKG_ROOT/scons/bin:$PATH
142  cd ..  cd ..
143  pushd ../packages  pushd ../pkg
144  ln -s scons-1.2.0 scons  ln -s scons-1.2.0 scons
145  popd  popd
146  \end{shellCode}  \end{shellCode}
147    
148  ...Boost libraries ...  \item The Boost libraries...:
149  \begin{shellCode}  \begin{shellCode}
150  cd boost_1_37_0  pushd ../pkg
151    mkdir boost_1_39_0
152  ./configure --prefix=$PKG_ROOT/boost_1_37_0 --with-python-root=$PKG_ROOT/python \  ln -s boost_1_39_0 boost
153    --with-python-version=2.6 --with-libraries=python  popd
154    cd boost_1_39_0
155  make  ./bootstrap.sh --with-libraries=python --prefix=$PKG_ROOT/boost
156  make install  ./bjam
157  ln -s $PKG_ROOT/boost_1_37_0 $PKG_ROOT/boost  ./bjam install --prefix=$PKG_ROOT/boost --libdir=$PKG_ROOT/boost/lib
158  export LD_LIBRARY_PATH=$PKG_ROOT/boost/lib:$LD_LIBRARY_PATH  export LD_LIBRARY_PATH=$PKG_ROOT/boost/lib:$LD_LIBRARY_PATH
159  cd ..  cd ..
160  pushd ../packages  pushd ../pkg/boost/lib/
161  ln -s boost_1_37_0 boost  ln *.so.* libboost_python.so
162  popd  popd
163  \end{shellCode}  \end{shellCode}
164    
165  ... and netcdf.  \item ...and NetCDF:
166  \begin{shellCode}  \begin{shellCode}
167  cd netcdf-4.0  cd netcdf-4.0
168  CFLAGS="-O2 fPIC -Df2cFortran" CXXFLAGS="-O2 fPIC -Df2cFortran" \  CFLAGS="-O2 -fPIC -Df2cFortran" CXXFLAGS="-O2 -fPIC -Df2cFortran" \
169  FFLAGS="-O2 fPIC -Df2cFortran" FCFLAGS="-O2 fPIC -Df2cFortran" \  FFLAGS="-O2 -fPIC -Df2cFortran" FCFLAGS="-O2 -fPIC -Df2cFortran" \
170  ./configure --prefix=$PKG_ROOT/netcdf-4.0  ./configure --prefix=$PKG_ROOT/netcdf-4.0
171    
172  make -j2  make
173  make install  make install
174    
175  export LD_LIBRARY_PATH=$PKG_ROOT/netcdf/lib:$LD_LIBRARY_PATH  export LD_LIBRARY_PATH=$PKG_ROOT/netcdf/lib:$LD_LIBRARY_PATH
176  cd ..  cd ..
177  pushd ../packages  pushd ../pkg
178  ln -s netcdf-4.0 netcdf  ln -s netcdf-4.0 netcdf
179  popd  popd
180  \end{shellCode}  \end{shellCode}
181    
182  CMake and Mesa are required for VTK.  \item Finally matplotlib:
183    \begin{shellCode}
184    cd matplotlib-0.98.5.3
185    python setup.py build
186    python setup.py install --prefix=$PKG_ROOT/matplotlib-0.98.5.3
187    cd ..
188    pushd ../pkg
189    ln -s matplotlib-0.98.5.3 matplotlib
190    popd
191    cd ..
192    \end{shellCode}
193    
194    \end{itemize}
195    
196    \subsection{VTK support}
197    VTK is only required for pyvisi. To build it you need CMake and Mesa.
198    The packages can be downloaded independently or in the \filename{escript-support-visi-3-src}.
199    If you will not be using pyvisi, then skip to \Sec{sec:compileescriptlinux}
200    
201    Copy the compressed sources for the packages into \filename{stand/pkg_src}.
202    If you are using the support bundles, decompress them in the stand directory.
203    \begin{shellCode}
204    tar -xjf escript-support-visi-3-src.tar.bz2
205    \end{shellCode}
206    
207    \begin{shellCode}
208    cd build
209    tar -jxf ../pkg_src/MesaLib-7.2.tar.bz2
210    tar -zxf ../pkg_src/vtk-5.2.1.tar.gz
211    tar -zxf ../pkg_src/vtkdata-5.2.1.tar.gz
212    tar -zxf ../pkg_src/cmake-2.6.3.tar.gz
213    \end{shellCode}
214    
215    \begin{itemize}
216    
217    \item Build CMake:
218  \begin{shellCode}  \begin{shellCode}
219  cd cmake-2.6.3  cd cmake-2.6.3
220  ./configure --prefix=$PKG_ROOT/cmake-2.6.3 2>&1 | tee tt.configure  ./configure --prefix=$PKG_ROOT/cmake-2.6.3 2>&1 | tee tt.configure
221  make -j 4  make
222  make install  make install
223    
224  export PATH=$PKG_ROOT/cmake/bin:$PATH  export PATH=$PKG_ROOT/cmake/bin:$PATH
225  cd ..  cd ..
226  pushd ../packages  pushd ../pkg
227  ln -s cmake-2.6.3 cmake  ln -s cmake-2.6.3 cmake
228  popd  popd
229  \end{shellCode}  \end{shellCode}
230    
231  These instructions do not compile MesaDemos or GLUT.  \item Build Mesa:
 If you need to check if Mesa compiled correctly, then the demos are a good test.  
232  \begin{shellCode}  \begin{shellCode}
233  cd Mesa-7.2  cd Mesa-7.2
234  ./configure --prefix=$PKG_ROOT/mesa-7.2 --enable-gl-osmesa --with-driver=xlib  ./configure --prefix=$PKG_ROOT/mesa-7.2 --enable-gl-osmesa --with-driver=xlib
235    
236  make -j 4  make
237  make install  make install
238    
239  export LD_LIBRARY_PATH=$PKG_ROOT/mesa:$LD_LIBRARY_PATH  export LD_LIBRARY_PATH=$PKG_ROOT/mesa/lib:$LD_LIBRARY_PATH
240  cd ..  cd ..
241  pushd ../packages  pushd ../pkg
242  ln -s mesa-7.2 mesa  ln -s mesa-7.2 mesa
243  popd  popd
244  \end{shellCode}  \end{shellCode}
245    These instructions do not compile MesaDemos or GLUT.
246    If you need to check if Mesa compiled correctly, then the demos are a good test.
247    
248    \item Finally, build VTK:
249  \begin{shellCode}  \begin{shellCode}
250  cd VTK  cd VTK
251  cmake .  cmake .
252    \end{shellCode}
253    
254  #Edit the CMakeCache and make the following changes:  Now edit the \filename{CMakeCache.txt} file and make the following changes.
255  #(Please replace .... with an absolute path to the stand directory)  Where .... appears please replace it with the absolute path to the pkg directory.
256    For example, replace \filename{CMAKE_INSTALL_PREFIX:PATH=..../vtk-5.2.1} with
257  #-----------------  \filename{CMAKE_INSTALL_PREFIX:PATH=/home/bob/stand/pkg/vtk-5.2.1}
258    (Search for the text before the =).
259  BUILD_EXAMPLES should be OFF  \begin{shellCode}
260  BUILD_SHARED_LIBS should be ON  BUILD_EXAMPLES:BOOL=OFF
261    BUILD_SHARED_LIBS:BOOL=ON
262  CMAKE_INSTALL_PREFIX    ..../stand/packages/vtk-5.2.1  CMAKE_INSTALL_PREFIX:PATH=..../vtk-5.2.1
263  CMAKE_VERBOSE_MAKEFILE  TRUE  CMAKE_VERBOSE_MAKEFILE:BOOL=TRUE
264    VTK_OPENGL_HAS_OSMESA:BOOL=TRUE
265  #check PYTHON_EXECUTABLE is correct.  VTK_USE_64BIT_IDS:BOOL=ON
266  #but it seems to be when I went through these steps  VTK_WRAP_PYTHON:BOOL=ON
267    VTK_USE_MANGLED_MESA:BOOL=OFF
268  VTK_OPENGL_HAS_OSMESA   TRUE  \end{shellCode}
 VTK_USE_64BIT_IDS   ON  
 # That last one is marked as "May cause some bugs" in the original instructions  
   
 VTK_WRAP_PYTHON ON  
 VTK_USE_MANGLED_MESA    OFF  
269    
270  #--------------------  Now rerun cmake (it won't work but it adds some variables you need).
271    
272    \begin{shellCode}
273  cmake .  cmake .
274  #It won't work but it will put some variables in that you need.  \end{shellCode}
   
 #Edit CMakeCache again and make the following changes  
   
 #----------------  
   
 VTK_USE_TK  OFF  
   
 OSMESA_INCLUDE_DIR  ..../stand/packages/mesa/include  
   
 OSMESA_LIBRARY  ..../stand/packages/mesa/lib/libOSMesa.so  
   
 PYTHON_INCLUDE_PATH ..../stand/packages/python/include/python2.6  
   
 PYTHON_LIBRARY  ..../stand/packages/python/lib/libpython2.6.so  
   
 OPENGL_INCLUDE_DIR  ..../stand/packages/mesa/include  
275    
276  OPENGL_gl_LIBRARY   ..../stand/packages/mesa/lib/libGL.so  Edit \filename{CMakeCache.txt} and change the following variables:
277    
278  #----------------  \begin{shellCode}
279    VTK_USE_OFFSCREEN:BOOL=ON
280    VTK_USE_TK:BOOL=OFF
281    OSMESA_INCLUDE_DIR:PATH=..../mesa/include
282    OSMESA_LIBRARY:FILEPATH=..../mesa/lib/libOSMesa.so
283    PYTHON_INCLUDE_PATH:PATH=..../python/include/python2.6
284    PYTHON_LIBRARY:FILEPATH=..../python/lib/libpython2.6.so
285    OPENGL_INCLUDE_DIR:PATH=..../mesa/include
286    OPENGL_gl_LIBRARY:FILEPATH=..../mesa/lib/libGL.so
287    \end{shellCode}
288    
289    The following steps will take a while so grab a coffee while it compiles.
290    \begin{shellCode}
291  cmake .  cmake .
   
 chmod +w Utilities/vtktiff/tif_fax3sm.c  
   
292  make  make
293    chmod +w Utilities/vtktiff/tif_fax3sm.c
294  make install  make install
295    
296    cd ../../pkg
 cd ../../packages  
297  ln -s vtk-5.2.1 vtk  ln -s vtk-5.2.1 vtk
298  cd ..  cd ..
299  \end{shellCode}  \end{shellCode}
300    
301  Now copy the \esfinley source into an \filename{escript.d} directory in \filename{stand}.  \end{itemize}
302    
303  \subsection{Compiling escript}\label{sec:compileescriptlinux}  \subsection{Compiling escript}\label{sec:compileescriptlinux}
304    
305  Change to the directory containing your escript source (\filename{escript.d}), then:  Change to the directory containing your escript source (\filename{escript.d}), then:
306    
307  \begin{shellCode}  \begin{shellCode}
308  cd scons  cd escript.d/scons
309  cp linux_options_example.py YourMachineName_options.py  cp linux_options_example.py YourMachineName_options.py
310    
311  #edit the options file and make the following changes:  echo $PKG_ROOT
312  #-----------------------------------------------------------------  \end{shellCode}
 declare a PKG_ROOT variable at the top of the file eg:  
 PKG_ROOT='/home/jfenwick/stand/packages'  
   
 python_path     = PKG_ROOT+'python/include/python2.6'  
 python_lib_path     = PKG_ROOT+'python/lib'  
 python_libs     = 'python2.6'  
   
 boost_path      = PKG_ROOT+'boost/include/boost-1_37'  
 boost_lib_path      = PKG_ROOT+'boost/lib'  
 boost_libs      = ['boost_python-gcc43-mt']  
 # You could simlink the boost python library to give a shorter  
 # name but it's not worth it  
   
 usevtk      = 'yes'  
 #-------------------------------------------------------------------  
313    
314  ln -s $PKG_ROOT/vtk-5.2.1 $PKG_ROOT/vtk  Edit the options file and put the value of PKG_ROOT between the quotes in the PKG_ROOT= line.
315    For example:
316    \begin{shellCode}
317    PKG_ROOT="/home/bob/stand/pkg"
318    \end{shellCode}
319    
320  Modify bin/escript  \begin{shellCode}
321    cd ../bin
322    \end{shellCode}
323    
324    Modify the STANDALONE line of \filename{escript} to read:
325    
326  STANDALONE=1  STANDALONE=1
327    
328  #Check to make sure the paths in the if [ $STANDALONE == 1 ]  Start a new terminal and go to the \filename{stand} directory.
 #block are correct  
   
 #-----------------------------------------------------------------  
329    
330  #start a new terminal  \begin{shellCode}
331  cd stand  export PATH=$(pwd)/pkg/scons/bin:$PATH
 export PATH=`pwd`/packages/scons/bin:$PATH  
332  cd escript.d  cd escript.d
333  eval `bin/escript -e`  eval $(bin/escript -e)
334  scons  scons
335  \end{shellCode}  \end{shellCode}
336    
337  If you wish to test your build, then you can do the following.  If you wish to test your build, then you can do the following.
338  Note this may take a while if you have a slow processor and/or less than 1Gb of RAM.  Note this may take a while if you have a slow processor and/or less than 1GB of RAM.
339  \begin{shellCode}  \begin{shellCode}
340  scons all_tests  scons all_tests
341  \end{shellCode}  \end{shellCode}
# Line 298  scons all_tests Line 343  scons all_tests
343  \subsection{Cleaning up}  \subsection{Cleaning up}
344  Once you are satisfied, the \filename{escript.d/build} and \filename{\$PKG_ROOT/build} directories can be removed.  Once you are satisfied, the \filename{escript.d/build} and \filename{\$PKG_ROOT/build} directories can be removed.
345    
346  If you \emph{really} want to save space and do not wish to be able to edit or recompile escript, you can remove the following:  If you \emph{really} want to save space and do not wish to be able to edit or recompile \esfinley, you can remove the following:
347  \begin{itemize}  \begin{itemize}
348   \item From the \filename{escript.d} directory:\begin{itemize}   \item From the \filename{escript.d} directory:\begin{itemize}
349  \item Everything except: \filename{bin}, \filename{include}, \filename{lib}, \filename{esys},  \item Everything except: \filename{bin}, \filename{include}, \filename{lib}, \filename{esys},
# Line 309  find . -name .?* | xargs rm -rf Line 354  find . -name .?* | xargs rm -rf
354  \end{shellCode}  \end{shellCode}
355  in the \filename{escript.d} directory.  in the \filename{escript.d} directory.
356  \end{itemize}  \end{itemize}
357  \item from the \filename{packages} directory:  \item from the \filename{pkg} directory:
358  \begin{itemize}  \begin{itemize}
359  \item  \filename{scons}, \filename{scons-1.2.0}, \filename{cmake-2.6.3} and \filename{cmake}  \item  \filename{scons}, \filename{scons-1.2.0}, \filename{cmake-2.6.3} and \filename{cmake}
360  \end{itemize}  \end{itemize}
# Line 319  in the \filename{escript.d} directory. Line 364  in the \filename{escript.d} directory.
364  Please note that removing all these files may make it more difficult for us to diagnose problems.  Please note that removing all these files may make it more difficult for us to diagnose problems.
365    
366    
   
   
 \section{Additional Functionality}\label{sec:linaddfunc}  
 To perform visualisations you will need some additional tools.  
 Since these do not need to be linked with any of the packages above, you can install versions available for your  
 system, or build them from source.  
 \begin{itemize}  
 \item \filename{ppmtompeg} and \filename{jpegtopnm} from the \filename{netpbm} suite. - To build from source  
 you would also need \filename{libjpeg} and its headers as well as \filename{libpng}\footnote{libpng requires zlib to build} and its headers.  
 \item A tool to visualise VTK files. For example Mayavi or Visit.  
 \end{itemize}  

Legend:
Removed from v.2455  
changed lines
  Added in v.2547

  ViewVC Help
Powered by ViewVC 1.1.26