From b4c2494b9a1faee64c52a35938ca2c4c13f69f52 Mon Sep 17 00:00:00 2001 From: ric2k1 Date: Tue, 24 Mar 2026 12:51:34 +0800 Subject: [PATCH] Fix macOS CLT libc++ includes for ABC/Yosys/vcd-parser; add local.cmake hook - Add -isystem SDK libc++ and GV_*_FOR_EXTERNAL for ExternalProject builds - CMake 4.0 policy minimum for FetchContent glucose - Optional local.cmake (see local.cmake.example); ignore local.cmake, make.log, /build* - Merge mac-port ABC line with quoted CC/CXX for embedded flags Made-with: Cursor --- .gitignore | 11 ++++++-- CMakeLists.txt | 65 ++++++++++++++++++++++++++++++++++++++++++--- local.cmake.example | 12 +++++++++ 3 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 local.cmake.example diff --git a/.gitignore b/.gitignore index cb8bbcd2..282c874b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,15 @@ include/ # makefile files src/*/*.mak -# cmake files -build/ +# cmake / local build trees at repo root (leading / so we do not ignore +# .github/workflows/build-linux.yml, build-macos.yml, etc.) +/build* + +# local CMake overrides (see local.cmake.example) +local.cmake + +# full build logs from e.g. make 2>&1 | tee make.log +make.log # object files src/*/*.o # yosys extension files diff --git a/CMakeLists.txt b/CMakeLists.txt index b46900ff..a1c168f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,16 @@ cmake_minimum_required(VERSION 3.19) +# CMake 4.0+ rejects subprojects that still declare cmake_minimum_required(VERSION 3.0) +# (e.g. FetchContent glucose). Raise the policy floor so dependency trees configure. +if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set(CMAKE_POLICY_VERSION_MINIMUM "3.5" CACHE STRING "" FORCE) +endif() + +# Optional per-developer overrides (copy local.cmake.example -> local.cmake; gitignored). +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/local.cmake") + include("${CMAKE_CURRENT_SOURCE_DIR}/local.cmake") +endif() + # * Macro to exclude the directory from source function(EXCLUDE_FROM_LIST REMOVE_LIST TARGET_LIST) message(STATUS "Exclude the directory - ${${REMOVE_LIST}}") @@ -44,9 +55,43 @@ project( LANGUAGES CXX VERSION 0.3.0) +# This project is configured as CXX-only, so CMAKE_C_COMPILER can be empty. +# External C projects (e.g. abc, vcd-parser) still require a valid C compiler. +if(CMAKE_C_COMPILER) + set(GV_C_COMPILER "${CMAKE_C_COMPILER}") +else() + set(GV_C_COMPILER "cc") +endif() + +if(CMAKE_CXX_COMPILER) + set(GV_CXX_COMPILER "${CMAKE_CXX_COMPILER}") +else() + set(GV_CXX_COMPILER "c++") +endif() + +# Apple Clang may default to libc++ under CommandLineTools/include/c++/v1, which is +# absent on some CLT installs; headers live under the macOS SDK instead. Point +# C++ builds at SDK libc++ so FetchContent and ExternalProject sub-builds work. +set(GV_OSX_SYSROOT_FLAG "") +set(GV_APPLE_LIBCXX_DIR "") +if(APPLE AND CMAKE_OSX_SYSROOT) + set(GV_OSX_SYSROOT_FLAG " --sysroot=${CMAKE_OSX_SYSROOT}") + set(GV_APPLE_LIBCXX_DIR "${CMAKE_OSX_SYSROOT}/usr/include/c++/v1") + if(EXISTS "${GV_APPLE_LIBCXX_DIR}/algorithm") + add_compile_options("$<$:-isystem;${GV_APPLE_LIBCXX_DIR}>") + endif() +endif() +set(GV_CC_FOR_EXTERNAL "${GV_C_COMPILER}${GV_OSX_SYSROOT_FLAG}") +set(GV_CXX_FOR_EXTERNAL "${GV_CXX_COMPILER}${GV_OSX_SYSROOT_FLAG}") +if(APPLE AND GV_APPLE_LIBCXX_DIR AND EXISTS "${GV_APPLE_LIBCXX_DIR}/algorithm") + string(APPEND GV_CXX_FOR_EXTERNAL " -isystem ${GV_APPLE_LIBCXX_DIR}") +endif() + # * Git clokne the ABC repo at build time # * Run the BUILD_COMMAND "make libabc.a" for creating the ABC static library set(LIBABC_NAME libabc.a) +set(ABC_CC "${GV_CC_FOR_EXTERNAL}") +set(ABC_CXX "${GV_CXX_FOR_EXTERNAL}") ExternalProject_Add( engine-abc GIT_REPOSITORY https://github.com/berkeley-abc/abc.git @@ -58,7 +103,7 @@ ExternalProject_Add( INSTALL_COMMAND "" UPDATE_COMMAND "" UPDATE_DISCONNECTED TRUE - BUILD_COMMAND $(MAKE) "CC=${CMAKE_C_COMPILER} --sysroot=${CMAKE_OSX_SYSROOT}" "CXX=${CMAKE_CXX_COMPILER} --sysroot=${CMAKE_OSX_SYSROOT}" ABC_USE_STDINT_H=1 ${LIBABC_NAME} + BUILD_COMMAND $(MAKE) "CC=${ABC_CC}" "CXX=${ABC_CXX}" ABC_USE_STDINT_H=1 ${LIBABC_NAME} LOG_CONFIGURE ON LOG_INSTALL ON # LOG_BUILD ON @@ -75,6 +120,11 @@ set_target_properties(libabc PROPERTIES IMPORTED_LOCATION ${LIBABC_PATH}) set(PATCH_DIR ${CMAKE_SOURCE_DIR}/patches) set(YOSYS_PATCH_CMAKE yosys_patch.cmake) set(LIBYOSYS_NAME libyosys.so) +set(_gv_yosys_build_env ${CMAKE_COMMAND} -E env) +if(APPLE AND CMAKE_OSX_SYSROOT) + list(APPEND _gv_yosys_build_env "SDKROOT=${CMAKE_OSX_SYSROOT}") +endif() +list(APPEND _gv_yosys_build_env "CC=${GV_CC_FOR_EXTERNAL}" "CXX=${GV_CXX_FOR_EXTERNAL}") ExternalProject_Add( engine-yosys GIT_REPOSITORY https://github.com/YosysHQ/yosys.git @@ -87,7 +137,7 @@ ExternalProject_Add( UPDATE_COMMAND "" UPDATE_DISCONNECTED TRUE PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_DIR}/${YOSYS_PATCH_CMAKE} - BUILD_COMMAND $(MAKE) ${LIBYOSYS_NAME} && $(MAKE) + BUILD_COMMAND ${_gv_yosys_build_env} $(MAKE) ${LIBYOSYS_NAME} && $(MAKE) LOG_CONFIGURE ON LOG_INSTALL ON # LOG_BUILD ON @@ -113,7 +163,16 @@ ExternalProject_Add( UPDATE_COMMAND "" UPDATE_DISCONNECTED TRUE PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_DIR}/${VCD_PARSER_PATCH_CMAKE} - BUILD_COMMAND $(MAKE) all + # On newer macOS SDKs, the standalone Makefile build of vcd-parser + # may not inherit the correct SDK, causing standard headers like + # / to be missing. Use CMake -E env to inject + # SDKROOT and the same compilers that the top-level project uses. + BUILD_COMMAND + ${CMAKE_COMMAND} -E env + SDKROOT=${CMAKE_OSX_SYSROOT} + CC=${GV_CC_FOR_EXTERNAL} + CXX=${GV_CXX_FOR_EXTERNAL} + $(MAKE) all LOG_CONFIGURE ON LOG_INSTALL ON # LOG_BUILD ON diff --git a/local.cmake.example b/local.cmake.example new file mode 100644 index 00000000..1f46117b --- /dev/null +++ b/local.cmake.example @@ -0,0 +1,12 @@ +# Copy this file to local.cmake in the same directory as CMakeLists.txt. +# local.cmake is gitignored and included automatically when present. +# Put settings here that must run before project(), e.g. toolchain or compilers. +# +# Examples (uncomment and adjust as needed): +# +# set(CMAKE_OSX_SYSROOT "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk" CACHE PATH "" FORCE) +# +# set(CMAKE_C_COMPILER "/usr/bin/cc" CACHE FILEPATH "" FORCE) +# set(CMAKE_CXX_COMPILER "/usr/bin/c++" CACHE FILEPATH "" FORCE) +# +# set(CMAKE_PREFIX_PATH "/opt/homebrew" ${CMAKE_PREFIX_PATH})