8

I need to have a separate CMakeLists.txt for each Android ABI. I tried to use product flavor to set the path for CMakeLists.txt. But I am getting following error on running ./gradlew assembleDebug or any other gradle command from command line.

Could not find method path() for arguments [CMakeLists.txt] on object of type com.android.build.gradle.internal.dsl.ExternalNativeCmakeOptions.

Here is how I have set product flavor in build.gradle.

productFlavors {
    arm64_v8a {
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    x86_64 {
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
}

NOTE - I had initially named the files as "CMakeLists_arm64-v8a.txt" and "CMakeLists_x86_64.txt". But that was failing so tried same name.

How to fix this or is there a workaround for this?

Vinayak Garg
  • 6,518
  • 10
  • 53
  • 80

1 Answers1

12

No, you cannot have CMakeLists.txt paths different for different flavors and/or ABIs, but you can use the arguments to add conditionals in your cmake script, for example like this:

flavorDimensions "abi"
productFlavors {
    arm64_v8a {
        dimension "abi"
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=ARM"
            }
        }
    }
    x86_64 {
        dimension "abi"
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=x86"
            }
        }
    }
}

Now you can check this in your CMakeLists.txt:

if (FLAVOR STREQUAL 'ARM')
  include(arm.cmake)
endif()

But in your case, you can rely on the argument that is defined by Android Studio, and don't need your own parameter:

if (ANDROID_ABI STREQUAL 'arm64-v8a')
  include(arm.cmake)
endif()

Actually, you probably don't need separate productFlavors at all, but rather use splits to produce thin APKs for each ABI.

Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
  • Hello Alex. Would you mind checking this problem (https://stackoverflow.com/questions/57285584/add-cppflags-from-flavor-and-buildtype-then-access-them-in-my-cmakelist), it is the same issue but could not make it work. – user1506104 Jul 31 '19 at 10:51
  • To get it to work, I personally had to use full quotes in the STREQUAL comparaison instead of single quotes. So in my case ``` if (FLAVOR STREQUAL "ARM") ``` works, while ``` if (FLAVOR STREQUAL 'ARM') ``` does **not** works. – Jyaif Aug 01 '22 at 23:12