diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 89337964..4d21087d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,19 +17,21 @@ env: jobs: build-linux: runs-on: ubuntu-latest + # libc++/libc++abi are not prerequsite libraries but specifies to test CXXFLAGS/LDFLAGS are functional env: CC: clang CXX: clang++ + CXXFLAGS: -stdlib=libc++ + LDFLAGS: -lc++abi steps: - name: checkout uses: actions/checkout@v3 with: submodules: recursive + # Assumes clang/cmake/libc++/libc++abi are installed on GitHub Actions Runner - name: setup prerequisite packages run: | sudo apt-get update && sudo apt-get install -y \ - clang \ - cmake \ libasound-dev \ libgtk-3-dev \ libglu1-mesa-dev \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 04b0a63a..d072531d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,6 +210,11 @@ function(nanoem_cmake_bootstrap _project_name_prefix _build_type) set(nanoem_cxxflags "${nanoem_cxxflags} ${CMAKE_CXX_FLAGS_UBSAN}") set(nanoem_exe_linker_flags "${nanoem_exe_linker_flags} ${CMAKE_EXE_LINKER_FLAGS_UBSAN}") set(nanoem_shared_linker_flags "${nanoem_shared_linker_flags} ${CMAKE_SHARED_LINKER_FLAGS_UBSAN}") + else() + set(nanoem_cflags "${nanoem_cflags} ${CMAKE_C_FLAGS}") + set(nanoem_cxxflags "${nanoem_cxxflags} ${CMAKE_CXX_FLAGS}") + set(nanoem_exe_linker_flags "${nanoem_exe_linker_flags} ${CMAKE_EXE_LINKER_FLAGS}") + set(nanoem_shared_linker_flags "${nanoem_shared_linker_flags} ${CMAKE_SHARED_LINKER_FLAGS}") endif() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(nanoem_cflags "${nanoem_cflags} -std=c++14") diff --git a/nanoem/CMakeLists.txt b/nanoem/CMakeLists.txt index a04615fe..1a2efda0 100644 --- a/nanoem/CMakeLists.txt +++ b/nanoem/CMakeLists.txt @@ -56,10 +56,6 @@ endif() # Bullet Physics for optional nanoem prerequisite if(NANOEM_ENABLE_BULLET) - set(__CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}) - set(__CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) nanoem_cmake_get_install_path("bullet3" BULLET_BASE_PATH BULLET_INSTALL_PATH_DEBUG BULLET_INSTALL_PATH_RELEASE) find_path(BULLET_INCLUDE_DIR NAMES btBulletCollisionCommon.h PATH_SUFFIXES include/bullet include PATHS ${BULLET_INSTALL_PATH_RELEASE} NO_DEFAULT_PATH) find_library(BULLET_COLLISION_LIBRARY_DEBUG NAMES BulletCollision PATH_SUFFIXES lib PATHS ${BULLET_INSTALL_PATH_DEBUG} NO_DEFAULT_PATH) @@ -85,8 +81,6 @@ if(NANOEM_ENABLE_BULLET) $<$>:${BULLET_DYNAMICS_LIBRARY_RELEASE}> $<$>:${BULLET_COLLISION_LIBRARY_RELEASE}> $<$>:${BULLET_LINEAR_MATH_LIBRARY_RELEASE}>) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ${__CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${__CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) message(STATUS "[nanoem] bullet is located at ${BULLET_BASE_PATH}") message(STATUS "[nanoem] physics simulation using bullet extension is enabled") endif() diff --git a/scripts/build.cmake b/scripts/build.cmake index 7aebc11d..c5d38d97 100644 --- a/scripts/build.cmake +++ b/scripts/build.cmake @@ -8,6 +8,19 @@ else() set(_make_flags -j1) endif() +function(get_compiler_flags _cflags _cxxflags) + set(_inner_cflags "-std=c99") + if(DEFINED ENV{CFLAGS}) + set(_inner_cflags "${_inner_cflags} $ENV{CFLAGS}") + endif() + set(_inner_cxxflags "-std=c++14") + if(DEFINED ENV{CXXFLAGS}) + set(_inner_cxxflags "${_inner_cxxflags} $ENV{CXXFLAGS}") + endif() + set(${_cflags} ${_inner_cflags} PARENT_SCOPE) + set(${_cxxflags} ${_inner_cxxflags} PARENT_SCOPE) +endfunction() + function(rewrite_ninja_ub_workaround _build_path) if(EXISTS ${_build_path}/build.ninja) file(STRINGS ${_build_path}/build.ninja input_ninja NEWLINE_CONSUME) @@ -390,8 +403,7 @@ function(compile_icu4c _cmake_build_type _generator _toolset_option _arch_option set(_build_flags "${_build_flags} -O2") set(_configure_flags --enable-release) endif() - set(_cflags "${_build_flags} -std=c99") - set(_cxxflags "${_build_flags} -std=c++11") + get_compiler_flags(_cflags _cxxflags) # see https://unicode-org.github.io/icu/userguide/icu_data/buildtool.html#icu-data-configuration-file for more details of ICU_DATA_FILTER_FILE execute_process(COMMAND ${CMAKE_COMMAND} -E env @@ -706,21 +718,26 @@ foreach(arch_item ${ARCH_LIST}) set(global_cmake_flags "${_gcc_flags}") endif() else() + get_compiler_flags(_cflags _cxxflags) if(NOT target_generator) set(target_generator "Ninja") endif() if(target_compiler) - set(global_cmake_flags "-DCMAKE_CXX_FLAGS='-std=c++14'") + list(APPEND _compiler_flags "-DCMAKE_C_FLAGS='${_cflags}'") + list(APPEND _compiler_flags "-DCMAKE_CXX_FLAGS='${_cxxflags}'") + set(global_cmake_flags "${_compiler_flags}") else() if(APPLE) set(target_compiler "clang") - list(APPEND _clang_flags "-DCMAKE_C_FLAGS='-std=c99'") - list(APPEND _clang_flags "-DCMAKE_CXX_FLAGS='-std=c++14'") + list(APPEND _clang_flags "-DCMAKE_C_FLAGS='${_cflags}'") + list(APPEND _clang_flags "-DCMAKE_CXX_FLAGS='${_cxxflags}'") set(global_cmake_flags "${_clang_flags}") else() set(target_compiler "gcc") - list(APPEND _gcc_flags "-DCMAKE_C_FLAGS='-std=c99 -fPIC'") - list(APPEND _gcc_flags "-DCMAKE_CXX_FLAGS='-std=c++14 -fPIC'") + set(_cflags "${_cflags} -fPIC") + set(_cflags "${_cxxflags} -fPIC") + list(APPEND _gcc_flags "-DCMAKE_C_FLAGS='${_cflags}'") + list(APPEND _gcc_flags "-DCMAKE_CXX_FLAGS='${_cxxflags}'") set(global_cmake_flags "${_gcc_flags}") endif() endif()