1*3f982cf4SFabien Sanglard# Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard# found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardtoolchain("clang") { 6*3f982cf4SFabien Sanglard c_command = "clang" 7*3f982cf4SFabien Sanglard cpp_command = "clang++" 8*3f982cf4SFabien Sanglard 9*3f982cf4SFabien Sanglard lib_switch = "-l" 10*3f982cf4SFabien Sanglard lib_dir_switch = "-L" 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard tool("cc") { 13*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 14*3f982cf4SFabien Sanglard command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" 15*3f982cf4SFabien Sanglard depsformat = "gcc" 16*3f982cf4SFabien Sanglard description = "CC {{output}}" 17*3f982cf4SFabien Sanglard outputs = 18*3f982cf4SFabien Sanglard [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 19*3f982cf4SFabien Sanglard } 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard tool("cxx") { 22*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 23*3f982cf4SFabien Sanglard command = "$cpp_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" 24*3f982cf4SFabien Sanglard depsformat = "gcc" 25*3f982cf4SFabien Sanglard description = "CXX {{output}}" 26*3f982cf4SFabien Sanglard outputs = 27*3f982cf4SFabien Sanglard [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 28*3f982cf4SFabien Sanglard } 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard tool("asm") { 31*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 32*3f982cf4SFabien Sanglard command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" 33*3f982cf4SFabien Sanglard depsformat = "gcc" 34*3f982cf4SFabien Sanglard description = "ASM {{output}}" 35*3f982cf4SFabien Sanglard outputs = 36*3f982cf4SFabien Sanglard [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 37*3f982cf4SFabien Sanglard } 38*3f982cf4SFabien Sanglard 39*3f982cf4SFabien Sanglard tool("objc") { 40*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 41*3f982cf4SFabien Sanglard precompiled_header_type = "gcc" 42*3f982cf4SFabien Sanglard command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}" 43*3f982cf4SFabien Sanglard depsformat = "gcc" 44*3f982cf4SFabien Sanglard description = "OBJC {{output}}" 45*3f982cf4SFabien Sanglard outputs = 46*3f982cf4SFabien Sanglard [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard 49*3f982cf4SFabien Sanglard tool("objcxx") { 50*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 51*3f982cf4SFabien Sanglard precompiled_header_type = "gcc" 52*3f982cf4SFabien Sanglard command = "$cpp_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}" 53*3f982cf4SFabien Sanglard depsformat = "gcc" 54*3f982cf4SFabien Sanglard description = "OBJCXX {{output}}" 55*3f982cf4SFabien Sanglard outputs = 56*3f982cf4SFabien Sanglard [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ] 57*3f982cf4SFabien Sanglard } 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglard tool("alink") { 60*3f982cf4SFabien Sanglard # Note about -filelist: Apple's linker reads the file list file and 61*3f982cf4SFabien Sanglard # interprets each newline-separated chunk of text as a file name. It 62*3f982cf4SFabien Sanglard # doesn't do the things one would expect from the shell like unescaping 63*3f982cf4SFabien Sanglard # or handling quotes. In contrast, when Ninja finds a file name with 64*3f982cf4SFabien Sanglard # spaces, it single-quotes them in $inputs_newline as it would normally 65*3f982cf4SFabien Sanglard # do for command-line arguments. Thus any source names with spaces, or 66*3f982cf4SFabien Sanglard # label names with spaces (which GN bases the output paths on) will be 67*3f982cf4SFabien Sanglard # corrupted by this process. Don't use spaces for source files or labels. 68*3f982cf4SFabien Sanglard rspfile = "{{output}}.rsp" 69*3f982cf4SFabien Sanglard rspfile_content = "{{inputs_newline}}" 70*3f982cf4SFabien Sanglard command = "rm -f {{output}} && libtool -static {{arflags}} -o {{output}} -filelist $rspfile" 71*3f982cf4SFabien Sanglard description = "LIBTOOL-STATIC {{output}}" 72*3f982cf4SFabien Sanglard outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] 73*3f982cf4SFabien Sanglard default_output_dir = "{{target_out_dir}}" 74*3f982cf4SFabien Sanglard default_output_extension = ".a" 75*3f982cf4SFabien Sanglard output_prefix = "lib" 76*3f982cf4SFabien Sanglard } 77*3f982cf4SFabien Sanglard 78*3f982cf4SFabien Sanglard tool("solink") { 79*3f982cf4SFabien Sanglard soname = "{{target_output_name}}{{output_extension}}" 80*3f982cf4SFabien Sanglard dylib = "{{output_dir}}/$soname" # e.g. "libfoo.dylib" 81*3f982cf4SFabien Sanglard rspfile = soname + ".rsp" 82*3f982cf4SFabien Sanglard 83*3f982cf4SFabien Sanglard # These variables are not built into GN but are helpers that implement 84*3f982cf4SFabien Sanglard # (1) linking to produce a .dylib, (2) extracting the symbols from that 85*3f982cf4SFabien Sanglard # file to a temporary file, (3) if the temporary file has differences from 86*3f982cf4SFabien Sanglard # the existing .TOC file, overwrite it, otherwise, don't change it. 87*3f982cf4SFabien Sanglard # 88*3f982cf4SFabien Sanglard # As a special case, if the library reexports symbols from other dynamic 89*3f982cf4SFabien Sanglard # libraries, we always update the .TOC and skip the temporary file and 90*3f982cf4SFabien Sanglard # diffing steps, since that library always needs to be re-linked. 91*3f982cf4SFabien Sanglard tocname = dylib + ".TOC" 92*3f982cf4SFabien Sanglard temporary_tocname = dylib + ".tmp" 93*3f982cf4SFabien Sanglard 94*3f982cf4SFabien Sanglard does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB" 95*3f982cf4SFabien Sanglard link_command = "$cpp_command -shared -Wl,-install_name,@rpath/\"$soname\" {{ldflags}} -o \"$dylib\" -Wl,-filelist,\"$rspfile\" {{libs}} {{solibs}} {{frameworks}}" 96*3f982cf4SFabien Sanglard replace_command = "if ! cmp -s \"$temporary_tocname\" \"$tocname\"; then mv \"$temporary_tocname\" \"$tocname\"" 97*3f982cf4SFabien Sanglard extract_toc_command = "{ otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; nm -gP \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }" 98*3f982cf4SFabien Sanglard command = "if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command; fi; fi" 99*3f982cf4SFabien Sanglard 100*3f982cf4SFabien Sanglard # See comment in tool("alink") about content of the rspfile. 101*3f982cf4SFabien Sanglard rspfile_content = "{{inputs_newline}}" 102*3f982cf4SFabien Sanglard 103*3f982cf4SFabien Sanglard description = "DYLIB {{output}}" 104*3f982cf4SFabien Sanglard 105*3f982cf4SFabien Sanglard # Use this for {{output_extension}} expansions unless a target manually 106*3f982cf4SFabien Sanglard # overrides it (in which case {{output_extension}} will be what the target 107*3f982cf4SFabien Sanglard # specifies). 108*3f982cf4SFabien Sanglard default_output_extension = ".dylib" 109*3f982cf4SFabien Sanglard 110*3f982cf4SFabien Sanglard # Use this for {{output_dir}} expansions unless a target manually overrides 111*3f982cf4SFabien Sanglard # it (in which case {{output_dir}} will be what the target specifies). 112*3f982cf4SFabien Sanglard default_output_dir = "{{root_out_dir}}" 113*3f982cf4SFabien Sanglard 114*3f982cf4SFabien Sanglard # Link to the dylib but have GN use the tocname for dependency management. 115*3f982cf4SFabien Sanglard # Tell GN about the output files. It will link to the dylib but use the 116*3f982cf4SFabien Sanglard # tocname for dependency management. 117*3f982cf4SFabien Sanglard outputs = [ 118*3f982cf4SFabien Sanglard dylib, 119*3f982cf4SFabien Sanglard tocname, 120*3f982cf4SFabien Sanglard ] 121*3f982cf4SFabien Sanglard link_output = dylib 122*3f982cf4SFabien Sanglard depend_output = tocname 123*3f982cf4SFabien Sanglard output_prefix = "lib" 124*3f982cf4SFabien Sanglard 125*3f982cf4SFabien Sanglard # Since the above commands only updates the .TOC file when it changes, ask 126*3f982cf4SFabien Sanglard # Ninja to check if the timestamp actually changed to know if downstream 127*3f982cf4SFabien Sanglard # dependencies should be recompiled. 128*3f982cf4SFabien Sanglard restat = true 129*3f982cf4SFabien Sanglard } 130*3f982cf4SFabien Sanglard 131*3f982cf4SFabien Sanglard tool("link") { 132*3f982cf4SFabien Sanglard outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 133*3f982cf4SFabien Sanglard rspfile = "$outfile.rsp" 134*3f982cf4SFabien Sanglard 135*3f982cf4SFabien Sanglard # These extra ldflags allow an executable to search for shared libraries in 136*3f982cf4SFabien Sanglard # the current working directory. 137*3f982cf4SFabien Sanglard additional_executable_ldflags = "-Wl,-rpath,@loader_path/." 138*3f982cf4SFabien Sanglard command = "$cpp_command {{ldflags}} $additional_executable_ldflags -o \"$outfile\" -Wl,-filelist,\"$rspfile\" {{solibs}} {{libs}} {{frameworks}}" 139*3f982cf4SFabien Sanglard description = "LINK $outfile" 140*3f982cf4SFabien Sanglard default_output_dir = "{{root_out_dir}}" 141*3f982cf4SFabien Sanglard rspfile_content = "{{inputs_newline}}" 142*3f982cf4SFabien Sanglard outputs = [ outfile ] 143*3f982cf4SFabien Sanglard } 144*3f982cf4SFabien Sanglard 145*3f982cf4SFabien Sanglard tool("stamp") { 146*3f982cf4SFabien Sanglard command = "touch {{output}}" 147*3f982cf4SFabien Sanglard description = "STAMP {{output}}" 148*3f982cf4SFabien Sanglard } 149*3f982cf4SFabien Sanglard 150*3f982cf4SFabien Sanglard tool("copy") { 151*3f982cf4SFabien Sanglard command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})" 152*3f982cf4SFabien Sanglard description = "COPY {{source}} {{output}}" 153*3f982cf4SFabien Sanglard } 154*3f982cf4SFabien Sanglard} 155