* Merge remaining stuff from the nix-make branch.
* Add support for the creation of shared libraries to `compileC', `link', and `makeLibrary'. * Enable the ATerm library to be made into a shared library.
This commit is contained in:
		
							parent
							
								
									02f2da0142
								
							
						
					
					
						commit
						36fb29f8f0
					
				
					 22 changed files with 347 additions and 0 deletions
				
			
		
							
								
								
									
										73
									
								
								make/lib/compile-c.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								make/lib/compile-c.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,73 @@ | |||
| . $stdenv/setup | ||||
| 
 | ||||
| mainName=$(basename $main | cut -c34-) | ||||
| 
 | ||||
| echo "compiling \`$mainName'..." | ||||
| 
 | ||||
| # Turn $localIncludes into an array. | ||||
| localIncludes=($localIncludes) | ||||
| 
 | ||||
| # Determine how many `..' levels appear in the header file references. | ||||
| # E.g., if there is some reference `../../foo.h', then we have to | ||||
| # insert two extra levels in the directory structure, so that `a.c' is | ||||
| # stored at `dotdot/dotdot/a.c', and a reference from it to | ||||
| # `../../foo.h' resolves to `dotdot/dotdot/../../foo.h' == `foo.h'. | ||||
| n=0 | ||||
| maxDepth=0 | ||||
| for ((n = 0; n < ${#localIncludes[*]}; n += 2)); do | ||||
|     target=${localIncludes[$((n + 1))]} | ||||
| 
 | ||||
|     # Split the target name into path components using some IFS magic. | ||||
|     savedIFS="$IFS" | ||||
|     IFS=/ | ||||
|     components=($target) | ||||
|     depth=0 | ||||
|     for ((m = 0; m < ${#components[*]}; m++)); do | ||||
|         c=${components[m]} | ||||
|         if test "$c" = ".."; then | ||||
|             depth=$((depth + 1)) | ||||
|         fi | ||||
|     done | ||||
|     IFS="$savedIFS" | ||||
| 
 | ||||
|     if test $depth -gt $maxDepth; then | ||||
|         maxDepth=$depth; | ||||
|     fi | ||||
| done | ||||
| 
 | ||||
| # Create the extra levels in the directory hierarchy. | ||||
| prefix= | ||||
| for ((n = 0; n < maxDepth; n++)); do | ||||
|     prefix="dotdot/$prefix" | ||||
| done | ||||
| 
 | ||||
| # Create symlinks to the header files. | ||||
| for ((n = 0; n < ${#localIncludes[*]}; n += 2)); do | ||||
|     source=${localIncludes[n]} | ||||
|     target=${localIncludes[$((n + 1))]} | ||||
| 
 | ||||
|     # Create missing directories.  We use IFS magic to split the path | ||||
|     # into path components. | ||||
|     savedIFS="$IFS" | ||||
|     IFS=/ | ||||
|     components=($prefix$target) | ||||
|     fullPath=(.) | ||||
|     for ((m = 0; m < ${#components[*]} - 1; m++)); do | ||||
|         fullPath=("${fullPath[@]}" ${components[m]}) | ||||
|         if ! test -d "${fullPath[*]}"; then | ||||
|             mkdir "${fullPath[*]}" | ||||
|         fi | ||||
|     done | ||||
|     IFS="$savedIFS" | ||||
|      | ||||
|     ln -sf $source $prefix$target | ||||
| done | ||||
| 
 | ||||
| # Create a symlink to the main file. | ||||
| if ! test "$(readlink $prefix$mainName)" = $main; then | ||||
|     ln -s $main $prefix$mainName | ||||
| fi | ||||
| 
 | ||||
| mkdir $out | ||||
| test "$prefix" && cd $prefix | ||||
| gcc -Wall $cFlags -c $mainName -o $out/$mainName.o | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue