@@ -30,7 +30,7 @@ _CPPFLAGS = "CPPFLAGS"
3030_COMMAND_LINE_TOOLS_PATH_SLUG  =  "commandlinetools" 
3131_WHEEL_ENTRY_POINT_PREFIX  =  "rules_python_wheel_entry_point" 
3232
33- def  _get_xcode_location_cflags (rctx ):
33+ def  _get_xcode_location_cflags (rctx ,  logger   =   None ):
3434    """Query the xcode sdk location to update cflags 
3535
3636    Figure out if this interpreter target comes from rules_python, and patch the xcode sdk location if so. 
@@ -46,6 +46,7 @@ def _get_xcode_location_cflags(rctx):
4646        rctx ,
4747        op  =  "GetXcodeLocation" ,
4848        arguments  =  [repo_utils .which_checked (rctx , "xcode-select" ), "--print-path" ],
49+         logger  =  logger ,
4950    )
5051    if  xcode_sdk_location .return_code  !=  0 :
5152        return  []
@@ -55,9 +56,37 @@ def _get_xcode_location_cflags(rctx):
5556        # This is a full xcode installation somewhere like /Applications/Xcode13.0.app/Contents/Developer 
5657        # so we need to change the path to to the macos specific tools which are in a different relative 
5758        # path than xcode installed command line tools. 
58-         xcode_root  =  "{}/Platforms/MacOSX.platform/Developer" .format (xcode_root )
59+         xcode_sdks_json  =  repo_utils .execute_checked (
60+             rctx ,
61+             op  =  "LocateXCodeSDKs" ,
62+             arguments  =  [
63+                 repo_utils .which_checked (rctx , "xcrun" ),
64+                 "xcodebuild" ,
65+                 "-showsdks" ,
66+                 "-json" ,
67+             ],
68+             environment  =  {
69+                 "DEVELOPER_DIR" : xcode_root ,
70+             },
71+             logger  =  logger ,
72+         ).stdout 
73+         xcode_sdks  =  json .decode (xcode_sdks_json )
74+         potential_sdks  =  [
75+             sdk 
76+             for  sdk  in  xcode_sdks 
77+             if  "productName"  in  sdk  and 
78+                sdk ["productName" ] ==  "macOS"  and 
79+                "darwinos"  not  in   sdk ["canonicalName" ]
80+         ]
81+ 
82+         # Now we'll get two entries here (one for internal and another one for public) 
83+         # It shouldn't matter which one we pick. 
84+         xcode_sdk_path  =  potential_sdks [0 ]["sdkPath" ]
85+     else :
86+         xcode_sdk_path  =  "{}/SDKs/MacOSX.sdk" .format (xcode_root )
87+ 
5988    return  [
60-         "-isysroot {}/SDKs/MacOSX.sdk " .format (xcode_root ),
89+         "-isysroot {}" .format (xcode_sdk_path ),
6190    ]
6291
6392def  _get_toolchain_unix_cflags (rctx , python_interpreter , logger  =  None ):
@@ -84,6 +113,7 @@ def _get_toolchain_unix_cflags(rctx, python_interpreter, logger = None):
84113            "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}', end='')" ,
85114        ],
86115        srcs  =  [],
116+         logger  =  logger ,
87117    )
88118    _python_version  =  stdout 
89119    include_path  =  "{}/include/python{}" .format (
@@ -176,19 +206,23 @@ def _create_repository_execution_environment(rctx, python_interpreter, logger =
176206        Dictionary of environment variable suitable to pass to rctx.execute. 
177207    """ 
178208
179-     # Gather any available CPPFLAGS values 
180-     cppflags  =  []
181-     cppflags .extend (_get_xcode_location_cflags (rctx ))
182-     cppflags .extend (_get_toolchain_unix_cflags (rctx , python_interpreter , logger  =  logger ))
183- 
184209    env  =  {
185210        "PYTHONPATH" : pypi_repo_utils .construct_pythonpath (
186211            rctx ,
187212            entries  =  rctx .attr ._python_path_entries ,
188213        ),
189-         _CPPFLAGS : " " .join (cppflags ),
190214    }
191215
216+     # Gather any available CPPFLAGS values 
217+     # 
218+     # We may want to build in an environment without a cc toolchain. 
219+     # In those cases, we're limited to --download-only, but we should respect that here. 
220+     is_wheel  =  rctx .attr .filename  and  rctx .attr .filename .endswith (".whl" )
221+     if  not  (rctx .attr .download_only  or  is_wheel ):
222+         cppflags  =  []
223+         cppflags .extend (_get_xcode_location_cflags (rctx , logger  =  logger ))
224+         cppflags .extend (_get_toolchain_unix_cflags (rctx , python_interpreter , logger  =  logger ))
225+         env [_CPPFLAGS ] =  " " .join (cppflags )
192226    return  env 
193227
194228def  _whl_library_impl (rctx ):
0 commit comments